Căutare în lățime

De la testwiki
Versiunea din 28 august 2023 20:35, autor: imported>InternetArchiveBot (Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5)
(dif) ← Versiunea anterioară | Versiunea curentă (dif) | Versiunea următoare → (dif)
Sari la navigare Sari la căutare
Exemplu animat de căutare în lățime

Căutarea (parcurgerea) în lățime (BFS) este un algoritm pentru parcurgerea sau căutarea într-o structură de date de tip arbore sau graf. Aceasta începe cu rădăcina arborelui (sau cu un nod arbitrar dintr-un graf, uneori denumit „cheie de căutare”[1]) și explorează nodurile mai întâi nodurile vecine acestuia, înainte de a trece la vecinii de pe nivelul următor (vecinii vecinilor).

BFS și aplicarea acestuia în găsirea de componente conexe ale grafurilor au fost inventate în 1945 de către Konrad Zuse, în teza sa de doctorat (respinsă) despre limbaj de programare Format:Ill-wd, dar aceasta a fost publicată abia în 1972.[2] A fost reinventat în 1959 de către Format:Ill-wd, care l-a folosit pentru a găsi cea mai scurtă cale de ieșire dintr-un labirint,[3][4] și Format:Ill-wd de C. Y. Lee ca algoritm de Format:Ill-wd (publicat în 1961).[5][6]

Pseudocod

Intrare: Un graf Graph și un nod inițial root al lui Graph

Ieșire: Starea finală. Legăturile părinte urmează calea cea mai scurtă înapoi la root

O implementare nerecursivă a căutării în lățime:

Breadth-First-Search(Graph, root):
    
    create empty set S
    create empty queue Q      

    add root to S
    Q.enqueue(root)                      

    while Q is not empty:
        current = Q.dequeue()
        if current is the goal:
            return current
        for each node n that is adjacent to current:
            if n is not in S:
                add n to S
                n.parent = current
                Q.enqueue(n)

Mai multe detalii

Această implementare nerecursivă este similară cu cea nerecursivă a căutării în adâncime, dar are două diferențe față de acesta:

  1. Utilizează o coadă (First In First Out), în loc de stivă; și
  2. Verifică dacă un nod a fost descoperit înainte de a-l pune în coadă, în loc să amâne această verificare până la scoaterea nodului din coadă.

Coada Q conține frontiera de-a lungul căreia algoritmul efectuează căutarea.

Mulțimea S este utilizată pentru a urmări care noduri au fost vizitate (necesar pentru o căutare generală prin graf, dar nu și pentru cea prin arbore). La începutul algoritmului, mulțimea este vidă. La sfârșitul algoritmului, acesta conține toate nodurile aflate la o distanță față de rădăcină mai mică decât a nodului căutat.


Părintele atribut fiecărui nod este util pentru accesarea nodurilor pe calea cea mai scurtă, de exemplu, făcând backtracking de la nodul destinație la nodul de pornire, după ce s-a aplicat BFS, și s-au stabilit nodurile predecesoare.

Căutarea în lățime produce așa-numitul arbore de căutare în lățime. Funcționarea unui arbore de căutare în lățime este ilustrată de următorul exemplu.

Exemplu

Acesta este un exemplu de arbore de căutare în lățime obținut prin rularea BFS pornind de la Frankfurt:

Graf pe baza unei hărți a Germaniei cu unele conexiuni între orașe
Arborele de căutare în lățime obținut atunci când se rulează BFS pe graful de mai sus, pornind de la Frankfurt

Analiza

Complexitatea în timp și spațiu

Complexitatea în timp poate fi exprimată ca deoarece în cel mai rău caz vor fi analizate fiecare nod și fiecare muchie. este numărul de noduri și este numărul de muchii din graf.   poate varia între și , în funcție de cât de rar este graful dat la intrare.[7]

Atunci când numărul de noduri din graf este cunoscut dinainte, și se utilizează structuri de date suplimentare pentru a determina care noduri au fost deja adăugate la coadă, complexitatea în spațiu poate fi exprimată ca , unde  este Format:Ill-wd mulțimii nodurilor. Aceasta în plus față de spațiul necesar pentru graful în sine, care poate varia în funcție de Format:Ill-wd utilizată de implementarea algoritmului.

Atunci când se lucrează cu grafuri care sunt prea mari pentru a fi stocate în mod explicit (sau infinite), este mai practic să se descrie complexitatea căutării în lățime în alți termeni: găsirea nodurilor aflate la distanța Format:Math față de nodul de start (măsurată în număr de muchii) solicită BFS un timp și un spațiu de Format:Math, unde Format:Math este „factorul de ramificare” al grafului (gradul exterior mediu).[8]Format:Rp

Completitudine și optimalitate

În analiza algoritmilor, datele de intrare ale căutării în lățime sunt presupuse a fi un graf finit, reprezentat în mod explicit ca listă de adiacență sau ceva similar. Cu toate acestea, la aplicarea metodelor de parcurgere a grafurilor folosite în inteligența artificială, datele de intrare pot fi o Format:Ill-wd a unui graf infinit. În acest context, o metodă de căutare este descrisă ca fiind completă atunci când este garantat că va găsi o stare căutată, dacă există una. Căutarea în lățime este completă, dar cea în adâncime nu este. Atunci când este aplicată grafurilor infinite reprezentate implicit, căutarea în lățime va găsi în cele din urmă starea căutată, dar cea în lățime poate să se piardă în unele părți din graf în care nu există starea căutată și să nu se mai întoarcă niciodată.[9]

Ordonarea BFS

O enumerare a nodurilor unui graf este declarată a fi o ordonare BFS dacă este o ieșire posibilă a aplicării BFS pe graful respectiv.

Fie G=(V,E) un graf cu n noduri și fie N(v) mulțimea vecinilor lui v. Pentru σ=(v1,,vm) o listă de elemente distincte din V, și pentru vV{v1,,vm}, fie νσ(v) cel mai mic i astfel încât vi este vecin cu v, dacă există i, și  altfel.

Fie σ=(v1,,vn) o enumerare a nodurilor lui V. Enumerarea σ este o ordonare BFS (cu originea v1) dacă, pentru orice 1<in, vi este nodul wV{v1,,vi1} astfel încât ν(v1,,vi1)(w) este minimal. Echivalent, σ este o ordonare BFS dacă, oricare ar fi 1i<j<kn cu viN(vj)N(vk), există un vecin vm al lui vj astfel încât m<i.

Aplicații

Căutarea în lățime poate fi folosită pentru a rezolva multe probleme din teoria grafurilor, de exemplu:

Bibliografie

Format:Refbegin

Format:Refend

Legături externe

Format:Commonscat