Esistono tutti i tipi di miscele. Hai strutture di dati, che non sono associate ad algoritmi, algoritmi, che non richiedono strutture di dati (reali), ma molto spesso i due vengono in un unico pacchetto.
Modifica: come ha sottolineato correttamente @Doval, le strutture dati di per sé non hanno alcuna operazione associata. L'atto di combinare la struttura dei dati e l'algoritmo costituisce un tipo di dati astratto.
Strutture di dati senza algoritmi
Consideriamo ad esempio una struttura di dati per la memorizzazione di coordinate bidimensionali, opportunamente chiamate Point
. Non c'è molto in termini di algoritmi da fare per un punto ed è davvero solo un contenitore per un valore x
e y
. Naturalmente, dando questa struttura di dati, ora puoi aggiungere tutti i tipi di algoritmi (calcolo della distanza, scafi convessi, what-have-you).
Puoi pensare a molte strutture di dati, che sono semplicemente un accumulo di dati individuali. Mentre questi si verificano frequentemente nella pratica, non costituiscono un buon materiale didattico, perché non c'è nulla da imparare da esso, una volta compreso, che singoli elementi di dati possono essere accumulati in una nuova struttura di dati (come ciò che impari dopo l' Point
esempio sopra , se ti fornisco quella fantastica struttura di dati chiamata Point3D
, che può fare la stessa cosa per lo spazio tridimensionale?)
Algoritmi senza strutture di dati (reali)
"Reale", perché ovviamente ogni algoritmo interessante necessita di tipi di dati primitivi come numeri interi o booleani, e non vogliamo considerarli come strutture di dati in questo contesto. Analogamente a quanto sopra, questi algoritmi sono in genere piuttosto semplici. In particolare, non presentano uno stato complicato di alcun tipo, perché di solito entra in una struttura di dati (vedere la sezione successiva).
Un esempio di tale algoritmo sarebbe il calcolo del massimo comune divisore di due numeri. Gli algoritmi di Euklid per il gcd devono solo contenere due numeri interi e manipolarli.
Una volta che le cose iniziano a diventare più interessanti, si entra molto presto nel mondo dei tipi di dati astratti. Ad esempio, il setaccio di Eratostene si basa su una matrice. Potremmo discutere adesso, se un array è ancora primitivo, o in effetti, potresti discutere se un numero intero non è già una struttura di dati. Ad ogni modo, gli algoritmi che esistono completamente senza strutture di dati sono piuttosto noiosi, anche se si accetta la loro esistenza isolata.
Algoritmi combinati con strutture di dati, ovvero tipi di dati astratti
Questi sono quelli interessanti, ma per due ragioni molto diverse. In genere, puoi avvicinarti a queste due direzioni: prima la struttura dei dati o prima l'algoritmo.
Mentre un tipo di dati astratto è definito dalla combinazione di struttura dei dati + algoritmi / operazioni, spesso li vediamo focalizzati su uno di questi e consideriamo l'altro come fattori abilitanti.
Struttura dei dati, quindi algoritmo
Incontrerai tipi di dati astratti, che sono piuttosto semplici da usare, ma coinvolgono algoritmi più o meno complicati per farli funzionare internamente. Ad esempio, a HashMap
è banale da usare, ma implica una funzione di hash elegante e gestione delle collisioni di hash all'interno. Tuttavia, dal tuo punto di vista come utente, ti preoccupi come qualcosa che contiene dati per te, non qualcosa che fa qualcosa per te.
Contrariamente all'ultimo gruppo di seguito, queste strutture di dati non espongono i loro utenti a questi algoritmi. Non è necessario conoscere, né preoccuparsi, della HashMap
funzione hash interna di una s per poterla utilizzare. (Per usarlo efficacemente, potresti voler conoscere queste cose;)
Algoritmo, quindi struttura dei dati
L'altra direzione significa che hai un algoritmo, che vuoi essere in grado di usare semplicemente, ma che ha bisogno delle strutture di dati internamente per farlo funzionare come previsto. Un esempio potrebbe essere un algoritmo di partizionamento dello spazio binario (BSP), che puoi semplicemente richiedere il bidimensionale Point
da un ampio insieme di punti più vicini a un determinato punto di query. Tuttavia, è necessaria una struttura ad albero (e persino algoritmi aggiuntivi come i calcoli della distanza) all'interno per scrivere effettivamente l'algoritmo.
In generale, si può dire che gli algoritmi di questo gruppo utilizzano strutture di dati coinvolti per la loro rappresentazione interna dello stato. Direi che questo gruppo di algoritmi è il più diversificato e ne troverai molti diversi che si adattano a questo schema generale. Per quanto riguarda il punto di vista, li consideriamo interessanti, perché fanno qualcosa (ad esempio l'ordinamento) per noi e non si preoccupano così tanto della parte contenente i dati.
Strutture e algoritmi di dati strettamente correlati
Infine, hai strutture di dati, che sono molto vicine agli algoritmi che corrispondono direttamente a loro. Un tipico esempio è un albero binario, che, quando vuoi fare qualcosa di significativo con esso, impone l'argomento degli algoritmi di camminata sugli alberi (profondità prima, larghezza prima, qualunque cosa).
In questi casi, ogni tanto cambiamo il focus della nostra visione dei tipi di dati astratti risultanti. A volte ti interessa la struttura del tuo albero, pochi minuti dopo ti interessa poter eseguire un'operazione di ricerca su di esso, quindi ti chiedi di eliminare un nodo e subito come appare la struttura in seguito. Sebbene tutto ciò sia vero anche per le altre sezioni precedenti, non è qualcosa che è l'obiettivo principale nella tua mente, ad esempio, quando si memorizzano / recuperano dati da / a un Map
, o quando si ordina un elenco collegato.