Qual è la relazione tra strutture dati e algoritmi? [chiuso]


13

Ho cercato un buon corso online nelle strutture di dati, ma ho scoperto che Google restituisce anche risultati per i corsi di algoritmi, che dicono cose come:

In questo corso imparerai diversi principi fondamentali della progettazione degli algoritmi: metodi di divisione e conquista, algoritmi grafici, strutture pratiche di dati (heap, tabelle hash, alberi di ricerca) , algoritmi randomizzati e altro. [fonte]

e

Entro la fine di questa classe capirai i concetti chiave necessari per ideare nuovi algoritmi per grafici e altre importanti strutture di dati e per valutare l'efficienza di questi algoritmi. [fonte]

e

Questo corso fornisce un'introduzione alla modellazione matematica dei problemi computazionali. Copre gli algoritmi, i paradigmi algoritmici e le strutture di dati comuni utilizzati per risolvere questi problemi . [fonte]

La mia domanda è: gli algoritmi e le strutture di dati sono intimamente collegati, nel senso che devono essere compresi insieme o un argomento è più fondamentale rispetto all'altro?

EDIT: Per coloro che votano per chiudere questa domanda, puoi per favore dirmi perché e forse come migliorare questo? Imparare a porre le domande giuste fa parte del processo educativo.


17
Una struttura di dati è statica e non può fare nulla. Un algoritmo è solo un insieme di istruzioni da eseguire su alcuni dati. Senza l'uno, l'altro è inutile. Insieme, creano programmi per computer. Sono entrambi fondamentali.
Foshi,

2
@Phoshi Wrong. La struttura dei dati è strettamente legata agli algoritmi che manipolano i dati. Gli algoritmi così strettamente legati sono considerati parte della struttura dei dati. Ad esempio, la struttura dati Elenco allineati indica come vengono salvati i dati e anche come vengono letti e manipolati.
Euforico

7
@Euforico Direi che è sbagliato dire che gli algoritmi fanno parte della struttura dei dati. Esiste più di un modo per implementare una ricerca binaria: ad esempio, puoi fare la if less than recurse to the left; if greater than, recurse to the right; if equal, returnricerca ingenua o leggermente più sofisticata if less than recurse to the left; otherwise keep track of this value as a potential candidate and recurse to the right; check for equality once we reach the leaves. Hanno un numero leggermente diverso di confronti. Entrambe sono una delle tante cose che potresti scegliere di fare con un albero.
Doval,

4
@Euforico Stai confondendo la struttura dei dati con il tipo di dati astratto implementato dalla combinazione di struttura dei dati e algoritmi.
Doval,

7
@Euforico, non sono d'accordo. merge sort è un algoritmo. Un array è una struttura di dati. Un elenco collegato è una struttura di dati diversa. Posso scrivere un'implementazione di MergeSort per operare su entrambi. Alcune strutture di dati possono essere più naturali o più efficienti per un particolare algoritmo, ma raramente è un requisito assoluto (è necessario disporre di un heap per implementare l'heap sort). Nicholas Wirth scrisse un popolare libro di testo negli anni '80 dal titolo: "Algorithms + Data Structures = Programs"
Charles E. Grant

Risposte:


20

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 xe 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' Pointesempio 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 HashMapfunzione 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 Pointda 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.


1
Stai unendo strutture di dati e tipi di dati astratti. Una struttura di dati non fa nulla . Non ha senso dire "incontrerai strutture di dati, che sono piuttosto semplici da usare" perché una struttura di dati è solo una struttura. A Mapè un tipo di dati astratto che può essere implementato utilizzando una particolare struttura di dati e un insieme di algoritmi che producono i risultati desiderati attraversando e manipolando la struttura. La struttura dei dati non nasconde gli algoritmi, perché non ne ha nessuno; il tipo di dati astratto nasconde la struttura dei dati (questo è ciò che lo rende astratto.)
Doval,

Si noti che in un certo senso gli algoritmi sono sempre nascosti perché non c'è modo di ispezionare le funzioni. Questo è probabilmente il motivo per cui vengono chiamate astrazioni nel calcolo lambda (il cui unico tipo di dati è funzioni).
Doval,

2
Hai ragione. Tuttavia, vedo una distinzione tra il modo in cui vediamo i diversi ADT. Ho modificato la mia risposta e spero che ora sia più chiaro e non confonda più la struttura con gli ADT, pur sottolineando ancora, che puoi concentrarti sulla struttura e / o sulle operazioni per qualsiasi ADT.
Frank,

È davvero troppo semplice dire che le strutture di dati sono sostantivi e gli algoritmi sono verbi? Suppongo che si potrebbe dire che l'algoritmo è l'implementazione del verbo, ma è ancora la ricerca di un albero , anche se che la ricerca è una ricerca binaria. Avresti perso tutti i dettagli tecnici dicendo questo, ma ha una certa eleganza.
Magus

@Doval: Anche se una struttura di dati che consiste semplicemente in un gruppo di numeri in un array che sono tenuti ad avere e mantenere una relazione reciproca, una cosa del genere può essere "facile da usare" se è facile mantenere gli invarianti richiesti mentre fai quello che vuoi, o "difficile da usare" se è difficile.
supercat

5

Le strutture di dati spesso influenzano i dettagli di un algoritmo. Per questo motivo i due vanno spesso di pari passo.

Prendi ad esempio un algoritmo per tagliare il tuo prato. Il modo in cui tagli il prato è probabilmente influenzato dalla struttura effettiva del prato. Se vivi in ​​una piccola casa in un sobborgo denso e il tuo prato è solo un piccolo rettangolo di pochi metri quadrati nell'area, probabilmente preferiresti tagliare il tuo prato con un tosaerba invece di un trattore / tosaerba. Se il tuo prato comprende molti ettari di terreno pianeggiante, la tua preferenza potrebbe essere per il tosaerba a cavallo rispetto al tosaerba (anche se entrambi i tosaerba potrebbero alla fine portare a termine il lavoro). Se il tuo prato comprende acri di terra con ampie aree pianeggianti, ma alcune piccole colline e un numero di alberi, potresti sviluppare un algoritmo più interessante per tagliare il prato che coinvolge sia un tosaerba a cavallo che un tosaerba, o qualche altra erba tecniche di taglio.

Alla fine, tuttavia, la struttura dei tuoi dati potrebbe avere un impatto significativo sulle tue decisioni su come sviluppare il tuo algoritmo (o quali algoritmi usare). Per questo motivo, i due argomenti vanno spesso di pari passo.

E viceversa: a volte l'algoritmo che vogliamo utilizzare influenza (almeno all'inizio del calcolo) le strutture di dati sviluppate per supportare l'algoritmo. Ad esempio, passare da un elenco di array all'idea di un elenco collegato e infine a un BST per la memorizzazione di un elenco ordinato che consentirà una ricerca rapida.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.