Căutați în profunzime

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
Căutați în profunzime
Depth-first-tree.svg
Ordinea de navigare a nodului
Clasă Algoritm de căutare
Structură de date Grafic
Cel mai rău caz din punct de vedere temporal
  • (pentru grafice explicite) [1]
  • (pentru grafice implicite) [2]
Cel mai rău caz spațial
  • (pentru grafice explicite) [3]
  • (pentru grafice implicite) [2]
Optim Nu
Costum de afaceri Nu

În teoria graficelor , cercetarea aprofundată (în engleză depth-first search, în acronimul DFS) este un algoritm de căutare pe arbori și grafice . Spre deosebire de căutarea în lățime , are caracteristica de a fi recursiv intrinsec.

Definiție

Numele derivă din faptul că într-un copac, chiar înainte de a fi vizitat nodurile primelor generații, algoritmul se poate găsi vizitând vârfuri departe de rădăcină, mergând astfel „în profunzime”. Nu întâmplător, dacă este rulat pe un grafic, algoritmul identifică un arbore care este un subgraf (adică conține toate vârfurile și toate și numai arcele care au fost urmate). Putem vedea algoritmul ca pe o vizită largă în care în loc de o coadă folosim o stivă (adică în loc să adăugăm noile elemente în partea de jos le adăugăm în partea de sus). Strategia de căutare explorează graficul în fiecare instanță de execuție a algoritmului, cât mai profund posibil: arcurile graficului sunt explorate începând cu ultimul vârf descoperit că are încă arcuri neexplorate care ies din ea. Odată ce explorarea tuturor marginilor neexplorate ale vârfului este terminată întoarce-te pentru a explora toate arcele de ieșire începând de la vârful din care 'fusese descoperit anterior. Procesul de explorare continuă până când toate vârfurile grafului au fost explorate. Subgraful predecesorilor, care este generat de vizita în adâncime, poate fi alcătuit din mai mulți arbori : acest subgraf este definit ca o pădure DFS , deci compusă din mai mulți arbori DFS . Căutarea DFS, pe lângă generarea pădurii DFS, marchează fiecare vârf cu informații temporale precise, în special actualizează două etichete pentru fiecare vârf: care înregistrează când vârful generic a fost descoperit și care înregistrează când întreaga listă de adiacență a (adică toate vârfurile la care se poate ajunge din acesta). Vârfurile sunt colorate diferit în funcție de caz: alb , culoarea pe care o ia fiecare vârf înainte de timpul său , gri între timp și și negru în cele ce urmează. Pentru fiecare vârf se aplică, de asemenea .

Realizare

Implementarea algoritmului constă din două proceduri: o procedură care începe căutarea și se ocupă de colorarea tuturor vârfurilor graficului cu alb , resetarea contorului global de timp și selectarea fiecărui nod unic al graficului. Pentru fiecare nod selectat se începe o a doua procedură care are sarcina de a efectua vizita efectivă.

 DFS (G)
   pentru fiecare vârf u în V [G] do
     culoare [u] ← alb
     π [u] ← zero
   timp ← 0
   pentru fiecare vârf u în V [G] do
     dacă culoarea [u] = alb
       apoi DFS-Visit (u)

Procedura de vizitare a nodului are grijă de colorarea corespunzătoare a tuturor vârfurilor vizitate începând de la (vârfurile din lista de adiacență ), pentru a actualiza valorile de timp și a construi pădurea DFS.

 Vizita DFS (u)
   culoare [u] ← gri
   d [u] ← timp ← timp + 1
   pentru fiecare vârf v în Adj [u] do
     dacă culoarea [v] = alb atunci
       π [v] ← u
       Vizita DFS (v)
   culoare [u] ← negru
   f [u] ← timp ← timp + 1

Complexitate

Procedura DFS necesită un timp de execuție de cu excepția timpului pentru executarea DFS-Visit . Ultima procedură se numește o dată pentru fiecare vârf iar ciclul său rulează exact ori, deci în total:

Deci timpul total de execuție este egal cu .

Ordin

Având de efectuat operațiuni pe fiecare vârf vizitat, algoritmul se poate comporta în 3 moduri diferite:

  • efectuează operația, apoi se reamintește asupra copiilor ( precomandă )
  • reamintiți-vă copiii, apoi efectuați operația ( după comandă )
  • reamintește-te pe unii copii, efectuează operația, reamintește-te pe copiii rămași ( vizită în ordine , interesant în copaci binari sau în grafice cu liste de adiacență ordonate într-un mod special)

Implementare Python

Pentru grafice

 vizită definitivă ( vârf ):
    summit . vizitat = Adevărat
    pentru adiacent în vârf . adiacent :
        dacă nu adiacent . vizitat :
            vizita ( adiacent )

Pentru copaci

 vizită definitivă ( vârf ):
    pentru adiacent în vârf . adiacent :
        vizita ( adiacent )

Notă

  1. ^ Cunoscut numărul de vârfuri și de arcade
  2. ^ a b Cunoscut factorul de ramificare iar adâncimea maximă
  3. ^ Cunoscut numărul de vârfuri

Bibliografie

  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Introducere în algoritmi , Jackson Books, 2003, ISBN 88-256-1421-7 .

Elemente conexe

Alte proiecte