Căutați în profunzime
Căutați în profunzime | |
---|---|
Ordinea de navigare a nodului | |
Clasă | Algoritm de căutare |
Structură de date | Grafic |
Cel mai rău caz din punct de vedere temporal | |
Cel mai rău caz spațial | |
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ă
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
- Wikimedia Commons conține imagini sau alte fișiere despre cercetări aprofundate