Depth First Search (DFS) – Implementazione iterativa e ricorsivo

Google Translate Icon

La ricerca in profondità (DFS) è un algoritmo per l'attraversamento o la ricerca di strutture di dati ad albero o graph. Si inizia dalla radice (selezionando qualche nodo arbitrario come radice per un grafo) ed esplorando il più lontano possibile lungo ogni ramo prima di backtracking.

Il graph seguente mostra l'ordine in cui i nodi vengono rilevati in DFS:

DFS Tree

Ricerca in profondità negli alberi

Un albero è un grafo non orientato in cui due vertici qualsiasi sono collegati esattamente da un percorso. In altre parole, qualsiasi grafo connesso aciclico è un albero. Per un albero, abbiamo i seguenti metodi di attraversamento:

Questi sono già trattati in dettaglio in post separati.

Ricerca in profondità nel graph

UN Ricerca in profondità (DFS) è un modo per attraversare i graficici strettamente correlati all'attraversamento del preordine di un albero. Di seguito è riportata l'implementazione ricorsivo dell'attraversamento del preordine:

procedure preorder(treeNode v)
{
    visit(v);
    for each child u of v
        preorder(u);
}

Per trasformarlo in un algoritmo di attraversamento del graph, sostituisci "figlio" con "vicino". Ma per evitare loop infiniti, tieni traccia dei vertici che sono già stati scoperti e non rivisitarli.

procedure dfs(vertex v)
{
    visit(v);
    for each neighbor u of v
        if u is undiscovered
            call dfs(u);
}

L'algoritmo ricorsivo può essere implementato come segue in C++, Java e Python:

C++


Scaricare  Esegui codice

Risultato:

0 1 2 3 4 5 6 7 8 9 10 11 12

Java


Scaricare  Esegui codice

Risultato:

0 1 2 3 4 5 6 7 8 9 10 11 12

Python


Scaricare  Esegui codice

Risultato:

0 1 2 3 4 5 6 7 8 9 10 11 12

La complessità temporale dell'attraversamento DFS è O(V + E), dove V e E sono rispettivamente il numero totale di vertici e archi nel graph. Si prega di notare che O(E) può variare tra O(1) e O(V2), a seconda della densità del graph.

Implementazione iterativa di DFS

L'implementazione non ricorsivo di DFS è simile a implementazione non ricorsivo di BFS ma differisce da esso in due modi:

  • Usa un stack invece di un queue.
  • Il DFS dovrebbe contrassegnare come scoperto solo dopo aver aperto il vertice, non prima di spingerlo.
  • Utilizza un iteratore inverso invece di un iteratore per produrre gli stessi risultati di DFS ricorsivo.

Di seguito è riportato il programma C++, Java e Python che lo dimostra:

C++


Scaricare  Esegui codice

Risultato:

0 1 2 3 4 5 6 7 8 9 10 11 12

Java


Scaricare  Esegui codice

Risultato:

0 1 2 3 4 5 6 7 8 9 10 11 12

Python


Scaricare  Esegui codice

Risultato:

0 1 2 3 4 5 6 7 8 9 10 11 12

Applicazioni di DFS

 
Vedi anche:

Deep First Search (DFS) – Domande del colloquio e problemi pratici

 
Riferimenti: https://www.ics.uci.edu/~eppstein/161/960215.html

Vota questo post

Voto medio 4.79/5. Conteggio voti: 405

Nessun voto finora! Sii il primo a votare questo post.

Ci dispiace che questo post non ti sia stato utile!

Ci racconti come possiamo migliorare questo post?




Grazie per aver letto.

Si prega di utilizzare il nostro compilatore in linea per pubblicare codice nei commenti utilizzando C, C++, Java, Python, JavaScript, C#, PHP e molti altri linguaggi di programmazione popolari.

Come noi? Segnalaci i tuoi amici e aiutaci a crescere. Buona codifica :)



sottoscrivi
Notifica di
guest
18 Commenti
Il più votato
Il più recente Il più antico
Feedback in linea
Visualizza tutti i commenti
NON seguire questo link o verrai bannato dal sito!