2009-12-07 19 views
9

Ultimamente ho studiato un po 'le mie strutture di dati fondamentali, cercando di assicurarmi di farle raffreddare.Elenco delle strutture di dati fondamentali: cosa mi manca?

Per "fondamentale", intendo i reali di base. Quelli fantastici come i Red-Black Trees e Bloom Filters sono chiaramente degni di nota, ma di solito sono o miglioramenti di quelli fondamentali (gli alberi Red-Black sono alberi di ricerca binari con proprietà speciali per tenerli in equilibrio) o sono utili solo in molto situazioni specifiche (filtri Bloom).

Finora, io sono "fluente" nei seguenti strutture di dati:

  • Array
  • liste concatenate
  • Stacks/code
  • Binary Search Trees
  • Heaps code/Priority
  • Hash Tabelle

Tuttavia, mi sento come se mi mancasse qualcosa. Ci sono dei fondamentali di cui mi sto dimenticando?

EDIT: Aggiunta questi dopo aver postato la questione

  • Strings (suggerito da catchmeifyoutry)
  • Sets (suggerito da Peter)
  • grafici (suggerito da Nick D e AJ)
  • B-Trees (suggerito da tloach)
    • Sono un po 'fuori discussione sul fatto che questi ar Sono troppo stravagante o no, ma penso che siano abbastanza diversi dalle strutture fondamentali (e abbastanza importanti) da meritare di essere studiate come fondamentali.
+2

cumuli e le code prio possono essere classificati come fantasiosi: P –

+1

Probabilmente qualsiasi cosa che vada oltre gli array e le liste concatenate potrebbe essere classificata come fantasia: P – jakeboxer

+1

"fantasia" è quasi certamente una scala analogica piuttosto che una scelta binaria, se può anche essere ben definito. –

risposta

9

Sets

In linea di principio non ho mai dire provare [anySearhEngine] su di esso, ma è possibile verifica questa lista: http://en.wikipedia.org/wiki/List_of_data_structures

+0

Un set è più un costrutto di modellazione che una struttura di dati fondamentale. –

+4

IMHO è una struttura dati fondamentale – Peter

+0

Oh wow. Ho cercato cose del genere (sia su Wikipedia che su Google), ma in qualche modo non mi sono imbattuto in questa lista. Grazie mille. – jakeboxer

0

Hai dimenticato quelli di base: struct, object e enums.

+0

Questi costrutti sono specifici della lingua e possono essere serializzati su tipi fondamentali. –

+0

Ritengo che si tratti di tipi di dati, non di strutture di dati. Immagino che ci siano grandi argomenti da entrambe le parti, ma conosco anche questi raffreddori, quindi è irrilevante per i miei scopi. Buona chiamata però :) – jakeboxer

+0

Le strutture sono una sorta di mappatura da nome a valore. Mentre il linguaggio C 'struct' è specifico della lingua. Il "record" (in gergo COBOL o Pascal) esiste in più lingue. Questa è la base per le definizioni di "classe". Quindi direi che non è un linguaggio specifico, ma esiste quasi ovunque. –

4

B-Alberi e altre multi-alberi

+0

B-Alberi sono coperti, stai insinuando quelli di fantasia? –

+0

Vainstah: gli alberi B sono diversi dagli alberi di ricerca binaria. Mi piace chiamare, è passato un po 'da quando mi sono rinfrescato con quelli. – jakeboxer

+0

In tal caso dovrebbero essere fantasiosi secondo la sua definizione. –

0

Vorrei aggiungere mappe a meno che non si voglia considerare che ad essere sotto insiemi.

0

Matrices in quanto servono come base per problemi di modellazione, quali:

  • Grafici
  • Affine trasformazioni di
  • risoluzione di sistemi lineari catene
  • Markov
  • ecc
+0

Non fondamentale, in quanto possono essere emulati utilizzando matrici. –

+0

cosa non può essere emulato usando gli array? –

+0

@jk tutto può essere, forse dovresti cambiare la risposta per essere matrici "sparse". Questi non dovrebbero essere emulati usando gli array e penso che siano fondamentali. –

10

anche lo Graph data structure è fondamentale.

+0

I grafici sono un costrutto globale e una struttura dati. +1 –

+0

Fantastico. Ho studiato vari algoritmi di grafi, ma dovrei aggiornare sulla struttura dati stessa. – jakeboxer

0

Per informazioni, leggere la documentazione di Java Collections. Scompongono le cose in un livello astratto (Set, List e Map) e un livello di implementazione (ArraySet, HashSet, ArrayList, LinkedList, TreeMap, HashMap).

Per informazioni, leggere la documentazione delle raccolte Python. Rompono le cose in classi di base astratte come Set, Sequence e Map che sono costruite dalle caratteristiche di mix di una collezione.

+0

post offline, non sta chiedendo i nomi dei manuali di programmazione. –

+0

Ci dispiace, ma il materiale di riferimento in questi riferimenti linguistici risponderà alla domanda. –

+0

Beh, la maggior parte di questi tipi esiste per fornire garanzie di complessità, e come tale non è fondamentale. Dubito che anche i manuali parleranno dei contenitori in un linguaggio neutro. –

4

stringhe, anche se possono essere implementate come array sotto il cofano (come sono diverse altre strutture di dati).

Qualsiasi programma che interagisce con l'utente utilizzerà stringhe. È importante sapere come manipolare le stringhe.

+0

I tipi di dati Variadic, un sacco di implementazione cruft da considerare un tipo di dati fondamentale .... ma +1 in quanto sono troppo importanti da ignorare. –

+0

Abbastanza giusto. Sono un po 'fuori di testa sul fatto che gli stringhe meritino una considerazione separata dagli array, ma non può ferire, soprattutto dal momento che sono così importanti. – jakeboxer

1

alcuni possono essere considerati meno fondamentale rispetto ad altri: vettori

  • matematiche/da matrici
  • grafici, liste di adiacenza/da matrici
  • tries alberi prefisso/suffisso
  • spaziali indicizzazione - alberi Quad/kd -trees r-alberi
  • flussi/sequenze stringhe terminate null/big ints
+0

Ci sono cose abbastanza strane:/ –

2

Quadtree s, come il tipo più semplice di indice spaziale.

+0

interessanti e complesse, ma poiché si applica strettamente allo spazio bidimensionale è fondamentale. –

+0

potrei suggerire anche alberi R o alberi QR? sono un'interessante estensione di quadri. http://en.wikipedia.org/wiki/R-tree – rmeador

+0

ok, per chiarire, l'albero R è più simile a un'estensione di un albero B, e l'albero QR è una fusione di un quadrifoglio e una R -tree – rmeador

1

Bit array non è fondamentale, ma è molto utile e può rappresentato in modo efficiente utilizzando numeri interi (e operatori bit per bit)

+0

+1 li usi tutti i giorni - molto facile e veloce! –

1

Tuples.

Inoltre, se potessi nominare una struttura di dati non di base, sarebbe il prefisso di partizione bit persistente Hash Tries di Clojure.In generale, credo che la persistenza sia una proprietà molto importante e spesso trascurata di qualsiasi struttura di dati.

3

Penso che la tua domanda non è chiara, perché si sta mescolando implementazione e lo scopo ...

il seguente tipi descrivono implementazione:

  • lista collegata
  • doppia lista collegata
  • skip list
  • matrice
  • dynamic array
  • tabella hash
  • (binario) albero
  • "gestito" alberi (binari) (cumuli, livellati alberi, ecc, cioè alberi dove inserimento e cancellazione non viene effettuata direttamente ma attraverso una procedura che garantisca determinati vincoli per l'albero)
  • grafico (anche se molto elegante)

seguente descrive scopo:

  • pila (significa FILO & può essere implementata da una lista collegata, ma anche con un array o vettore)
  • coda (mezzi FIFO & può essere implementato da un elenco doppio collegato, o forse in altri modi sensibili)
  • dequeue (...)
  • coda di priorità (significa "alto/basso chiave First out" questo è un concetto astratto, che può essere implementato in many different ways)
  • mappa/array associativo/dizionario (si significa mappare le chiavi ai valori. spesso richiede una funzione extra per convertire le chiavi in ​​chiavi valide per la tabella hash o albero sottostante)
  • set (significa, è una raccolta, che è iterabile e può dire, se un valore è un elemento dell'insieme o meno. valore, ovvero un elemento dell'insieme deve apparire esattamente una volta durante l'iterazione, un set può essere mutabile o no (può consentire di aggiungere o rimuovere elementi). Le routine per l'intersezione, l'unione, la differenza possono essere fornite (ad esempio come metodi in OOP) .) quando si tratta di realizzazione, c'è un certo numero di possibilità)

bene, non ci sarebbe un'ultima cosa che considero molto degni di nota: algebraic data types ... a seconda della lingua, che sia esistono in modo nativo, o devi emularli ... haXe e C# (per quanto ho sentito) sarebbero due lingue imperative che li offrono semplicemente consentendo parametri per enumerazioni ... possono essere usati per implementare liste, alberi e molte altre cose carine ... per esempio, sono perfetto per rappresentare AST s e molte altre strutture complesse ...

+0

Capisco cosa stai dicendo, ma sono ancora strutture di dati distinte; puoi essere esperto in liste concatenate, matrici e altri modi per implementare gli stack senza capire gli stessi stack, e puoi essere esperto in stack senza capire le loro implementazioni. Sto tentando di elencare le strutture di dati fondamentali, siano esse implementazioni o interfacce. – jakeboxer

0

Un "oggetto funzione", "puntatore di funzione" o "chiusura" non può essere implementato in alcune lingue restrittive che dispongono di matrici, elenchi concatenati, ecc. Ma forse sono più vicini ai tipi di dati piuttosto che alle strutture dati.

"rope" implementation (come implementato nella libreria "cord") è la mia implementazione preferita della struttura di dati astratta "a stringa", ma forse non è davvero "fondamentale".

Problemi correlati