Technopedia Center
PMB University Brochure
Faculty of Engineering and Computer Science
S1 Informatics S1 Information Systems S1 Information Technology S1 Computer Engineering S1 Electrical Engineering S1 Civil Engineering

faculty of Economics and Business
S1 Management S1 Accountancy

Faculty of Letters and Educational Sciences
S1 English literature S1 English language education S1 Mathematics education S1 Sports Education
teknopedia

teknopedia

teknopedia

teknopedia

teknopedia

teknopedia
teknopedia
teknopedia
teknopedia
teknopedia
teknopedia
  • Registerasi
  • Brosur UTI
  • Kip Scholarship Information
  • Performance
  1. Weltenzyklopädie
  2. Ricerca in profondità - Teknopedia
Ricerca in profondità - Teknopedia
Ricerca in profondità
Ordine di esplorazione dei nodi
ClasseAlgoritmo di ricerca
Struttura datiGrafo
Caso peggiore temporalmente
  • O ( | V | + | E | ) {\displaystyle O(|V|+|E|)} {\displaystyle O(|V|+|E|)} (per grafi espliciti)[1]
  • O ( b d ) {\displaystyle O(b^{d})} {\displaystyle O(b^{d})} (per grafi impliciti)[2]
Caso peggiore spazialmente
  • O ( | V | ) {\displaystyle O(|V|)} {\displaystyle O(|V|)} (per grafi espliciti)[3]
  • O ( b d ) {\displaystyle O(b^{d})} {\displaystyle O(b^{d})} (per grafi impliciti)[2]
OttimaleNo
CompletoNo
Manuale

Nella teoria dei grafi, la ricerca in profondità (in inglese depth-first search, in acronimo DFS), è un algoritmo di ricerca su alberi e grafi. A differenza della ricerca in ampiezza, ha la caratteristica di essere intrinsecamente ricorsivo.

Definizione

[modifica | modifica wikitesto]

Il nome deriva dal fatto che in un albero, ancora prima di avere visitato i nodi delle prime generazioni, l'algoritmo può ritrovarsi a visitare vertici lontani dalla radice, andando così "in profondità". Non a caso, se fatto girare su un grafo, l'algoritmo individua un albero che ne è un sottografo (ovvero che ne contiene tutti i vertici e tutti e soli gli archi che sono stati seguiti). Possiamo vedere l'algoritmo come una visita in ampiezza in cui invece che una coda utilizziamo una pila (ovvero invece di aggiungere gli elementi nuovi in fondo li aggiungiamo in cima). La strategia di ricerca esplora il grafo andando, in ogni istante dell'esecuzione dell'algoritmo, il più possibile in profondità: gli archi del grafo vengono esplorati a partire dall'ultimo vertice scoperto v {\displaystyle v} {\displaystyle v} che abbia ancora degli archi non esplorati uscenti da esso. Una volta terminata l'esplorazione di tutti gli archi non esplorati del vertice v {\displaystyle v} {\displaystyle v} si ritorna indietro per esplorare tutti gli archi uscenti a partire dal vertice da cui v {\displaystyle v} {\displaystyle v}' era stato precedentemente scoperto. Il processo di esplorazione continua fin quando tutti i vertici del grafo non siano stati esplorati. Il sottografo dei predecessori, che viene generato dalla visita in profondità può essere costituito da più alberi: tale sottografo è definito foresta DFS, composta, quindi, da diversi alberi DFS. La ricerca DFS, oltre a generare la foresta DFS marca ogni vertice con ben precise informazioni temporali, in particolar modo aggiorna due etichette per ogni vertice: d [ v ] {\displaystyle d[v]} {\displaystyle d[v]} che registra quando il generico vertice v {\displaystyle v} {\displaystyle v} è stato scoperto ed f [ v ] {\displaystyle f[v]} {\displaystyle f[v]} che registra quando è stata esplorata l'intera lista di adiacenza di v {\displaystyle v} {\displaystyle v} (ovvero tutti i vertici che sono raggiungibili a partire da esso). I vertici vengono colorati in modo differente a seconda dei casi: white, colore che ogni vertice assume prima del tempo d [ u ] {\displaystyle d[u]} {\displaystyle d[u]}, grey tra il tempo d [ u ] {\displaystyle d[u]} {\displaystyle d[u]} ed f [ u ] {\displaystyle f[u]} {\displaystyle f[u]} e black nel seguito. Per ogni vertice u {\displaystyle u} {\displaystyle u} vale inoltre d [ u ] < f [ u ] {\displaystyle d[u]<f[u]} {\displaystyle d[u]<f[u]}.

Realizzazione

[modifica | modifica wikitesto]

La realizzazione dell'algoritmo consiste di due procedure: una procedura che avvia la ricerca e che si occupa di colorare di white tutti i vertici del grafo, di azzerare il contatore globale del tempo e di selezionare ogni singolo nodo del grafo. Per ogni singolo nodo selezionato si avvia una seconda procedura che ha il compito di effettuare la visita vera e propria.

 DFS(G)
   for each vertex u in V[G] do
     color[u] ← white
     π[u] ← nil
   time ← 0
   for each vertex u in V[G] do
     if color[u] = white
       then DFS-Visit(u)

La procedura per la visita del nodo si occupa di colorare opportunamente tutti i vertici visitati a partire da u {\displaystyle u} {\displaystyle u} (i vertici nella lista di adiacenza A d j [ u ] {\displaystyle Adj[u]} {\displaystyle Adj[u]}), di aggiornare i valori temporali e costruire la foresta DFS.

 DFS-Visit(u)
   color[u] ← grey
   d[u] ← time ← time + 1
   for each vertex v in Adj[u] do
     if color[v] = white then
       π[v] ← u
       DFS-Visit(v)
   color[u] ← black
   f[u] ← time ← time + 1

Complessità

[modifica | modifica wikitesto]

La procedura DFS richiede tempo di esecuzione pari a Θ ( V ) {\displaystyle \Theta (V)} {\displaystyle \Theta (V)} escluso il tempo per l'esecuzione di DFS-Visit. Quest'ultima procedura è chiamata una volta per ogni vertice v {\displaystyle v} {\displaystyle v} e il suo ciclo viene eseguito esattamente | A d j [ v ] | {\displaystyle \left|Adj[v]\right|} {\displaystyle \left|Adj[v]\right|} volte, dunque in totale:

∑ | A d j [ v ] | = Θ ( E ) {\displaystyle \sum \left|Adj[v]\right|=\Theta (E)} {\displaystyle \sum \left|Adj[v]\right|=\Theta (E)}

Quindi il tempo complessivo di esecuzione è pari a Θ ( V + E ) {\displaystyle \Theta (V+E)} {\displaystyle \Theta (V+E)}.

Ordine

[modifica | modifica wikitesto]

Dovendo effettuare delle operazioni su ogni vertice visitato, l'algoritmo può comportarsi in 3 modi diversi:

  • effettua l'operazione, poi richiamare se stesso sui figli (pre-ordine)
  • richiamare se stesso sui figli, poi effettuare l'operazione (post-ordine)
  • richiamare se stesso su alcuni figli, effettuare l'operazione, richiamare se stesso sui figli rimanenti (visita in ordine, interessante negli alberi binari o in grafi con liste di adiacenza ordinate in modo particolare)

Realizzazione in Python

[modifica | modifica wikitesto]

Per grafi

[modifica | modifica wikitesto]
def visita(vertice):
    vertice.visitato = True
    for adiacente in vertice.adiacenti:
        if not adiacente.visitato:
            visita(adiacente)

Per alberi

[modifica | modifica wikitesto]
def visita(vertice):
    for adiacente in vertice.adiacenti:
        visita(adiacente)

Note

[modifica | modifica wikitesto]
  1. ^ Noto il numero di vertici | V | {\displaystyle |V|} {\displaystyle |V|} e di archi | E | {\displaystyle |E|} {\displaystyle |E|}
  2. ^ a b Noto il branching factor b {\displaystyle b} {\displaystyle b} e la profondità massima d {\displaystyle d} {\displaystyle d}
  3. ^ Noto il numero di vertici | V | {\displaystyle |V|} {\displaystyle |V|}

Bibliografia

[modifica | modifica wikitesto]
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Introduzione agli algoritmi, Jackson Libri, 2003, ISBN 88-256-1421-7.

Voci correlate

[modifica | modifica wikitesto]
  • Ricerca in ampiezza
  • Backtracking

Altri progetti

[modifica | modifica wikitesto]

Altri progetti

  • Wikimedia Commons
  • Collabora a Wikimedia Commons Wikimedia Commons contiene immagini o altri file sulla ricerca in profondità

Collegamenti esterni

[modifica | modifica wikitesto]
  • depth-first search, su sapere.it, De Agostini. Modifica su Wikidata
  • (EN) Eric W. Weisstein, Depth-First Traversal, su MathWorld, Wolfram Research. Modifica su Wikidata
  • (EN) Depth-first search, su Encyclopaedia of Mathematics, Springer e European Mathematical Society. Modifica su Wikidata
  • (EN) Denis Howe, depth-first search, in Free On-line Dictionary of Computing. Disponibile con licenza GFDL
V · D · M
Algoritmi di ricerca su grafi ed alberi
RicercaPotatura alfa-beta · Algoritmo di Bellman-Ford · Algoritmo di Tarjan · Bidirectional search · D* · Depth-limited search · Algoritmo di Dijkstra · Algoritmo di Floyd-Warshall · Hill climbing · Iterative deepening depth-first search · Algoritmo di Johnson · Lexicographic breadth-first search · Ricerca in ampiezza · Ricerca in profondità · Uniform-cost search · Ricerca ad albero Monte Carlo (MCTS)
Ricerca informataAlgoritmo A* · Algoritmo B* · Beam search · Best-first search · Iterative deepening A* · Ricerca best-first ricorsiva · Memory-bounded A* (SMA*)
Voci correlateProgrammazione dinamica
  Portale Informatica
  Portale Matematica
Estratto da "https://it.wikipedia.org/w/index.php?title=Ricerca_in_profondità&oldid=137501326"

  • Indonesia
  • English
  • Français
  • 日本語
  • Deutsch
  • Italiano
  • Español
  • Русский
  • فارسی
  • Polski
  • 中文
  • Nederlands
  • Português
  • العربية
Pusat Layanan

UNIVERSITAS TEKNOKRAT INDONESIA | ASEAN's Best Private University
Jl. ZA. Pagar Alam No.9 -11, Labuhan Ratu, Kec. Kedaton, Kota Bandar Lampung, Lampung 35132
Phone: (0721) 702022