breadth-first search
Főnév
breadth-first search (tsz. breadth-first searches)
A szélességi keresés (Breadth-First Search – BFS) egy alapvető gráf- és faalgoritmus, amelyet gyakran alkalmazunk olyan problémák megoldására, ahol a legkevesebb számú lépés (élszám) megtalálása a cél. A BFS először a gyökércsúcsból (vagy kezdőpontból) indul, majd egyszerre „körbejárja” az összes közvetlen szomszédot, mielőtt a következő, nagyobb „távolságú” szintekre lépne. A módszer garantálja, hogy ha létezik út két csúcs között, akkor a megtalált út a legrövidebb (élhosszúságú) lesz, feltéve, hogy az élek egységnyi súlyúak.
1. Algoritmus leírása
Kezdeti állapot
- Adott egy gráf , ahol a csúcsok halmaza és az élek halmaza.
- Van egy kezdőcsúcs , amelyből a keresést indítjuk.
Adatszerkezet
- Egy FIFO (First-In-First-Out) sor (queue), amely a következő feldolgozandó csúcsokat tartalmazza.
- Egy tömb vagy hashtábla, amely jelzi, hogy mely csúcsokat látogattuk már meg (színjelölés vagy boolean érték).
- (Opcionálisan) egy szülőmutató (parent) tömb, amely a megtalált legrövidebb út visszakövetéséhez szükséges.
Pseudokód
BFS(G, s): létrehozunk egy üres sort: Q = [] létrehozunk egy visited tömböt, minden csúcsra false visited[s] = true parent[s] = null enqueue(Q, s) amíg Q nem üres: u = dequeue(Q) feldolgozzuk u-t (pl. kiírjuk vagy vizsgáljuk) minden v ∈ szomszédok(u) esetén: ha visited[v] == false: visited[v] = true parent[v] = u enqueue(Q, v)Működés
- Először beleteszünk a kezdőcsúcsot a sorba, megjelöljük látogatottként.
- A sorból mindig a legrégebben berakott (legkorábbi) csúcsot vesszük ki, és megnézzük összes szomszédját.
- A még nem látogatott szomszédokat hozzáadjuk a sor végéhez, és megjelöljük látogatottként.
- Ezzel biztosított, hogy a szintekben haladunk: először a gyökérszintet (0. szint), majd az 1. szint csúcsait, majd a 2. szintet, és így tovább.
2. Idő- és helykomplexitás
- Időkomplexitás: .
- Minden csúcsot pontosan egyszer teszünk be és veszünk ki a sorból ().
- Minden élt legfeljebb egyszer vizsgálunk meg, amikor a végpontját látogatjuk ().
- Helykomplexitás: .
- A visited és parent tömbök mérete .
- A sorban legfeljebb csúcs lehet.
3. Gyakorlati megvalósítás (példa Pythonban)
from collections import deque
def bfs(graph, start):
visited = set()
parent = {start: None}
queue = deque([start])
visited.add(start)
while queue:
u = queue.popleft()
print(f"Feldolgozva: {u}")
for v in graph[u]:
if v not in visited:
visited.add(v)
parent[v] = u
queue.append(v)
return parent
graphlehet például egy szótár, amelyben a kulcsok a csúcsok, az értékek pedig listák a szomszédos csúcsokról.- A
parentdict segítségével bármelyik célcsúcshoz visszakövethetjük a gyökérből vezető legrövidebb utat.
4. Példa a működésre
Tegyük fel, hogy a következő irányítatlan gráfot reprezentálja a szótár:
graph = {
'A': ['B', 'C'],
'B': ['A', 'D', 'E'],
'C': ['A', 'F'],
'D': ['B'],
'E': ['B', 'F'],
'F': ['C', 'E']
}
- Kezdőpont:
'A'. - A BFS bejárás sorrendje:
'A''B','C''D','E','F'
Így látható, hogy előbb járjuk be az A-ból közvetlenül elérhető csúcsokat, majd azok szomszédait.
5. Legyen szó fáról vagy általános gráfról
- Fa esetén a BFS gyakorlatilag szintenkénti faátjárást jelent.
- Iránányított gráf esetén ugyanaz az elv, csak a bejárás során a bevitt irányt követjük.
- Súlyozott gráf esetén a BFS csak egységsúlyú élek esetén adja a legrövidebb utat; általános súlyozott gráfhoz Dijkstra-algoritmus szükséges.
6. Alkalmazások
- Legrövidebb út egységsúlyú gráfokban.
- Szintszám meghatározása: minden csúcshoz rendeljük hozzá a gyökértől való távolságot.
- Legnagyobb komponens keresése irányítatlan gráfban.
- Szélességi fa építése, amely a gráf összes csúcsát szintek szerint szervezi.
- Árkiegyenlítések, játékelméleti keresések, labirintusbejárás.
- Weboldalak feltérképezése (webcrawler), ahol az oldalak a csúcsok és a linkek az élek.
7. Változatok és optimalizációk
- Bidirekcionális BFS: ha a keresett célcsúcs ismert, egyszerre indítunk keresést a kezdőcsúcstól és a céltól, és akkor találkozunk, amikor a két bejárás találkozik a gráf valamelyik köztes pontján. Ez drasztikusan csökkentheti a bejárt állapotok számát nagy gráfok esetén.
- B méllyebb keresések kombinálása: például A*-algoritmusban a BFS szerű szerkezetet heuristikával kiegészítve használjuk.
8. Összegzés
A szélességi keresés az egyik legegyszerűbb és leggyakrabban használt gráfbejáró algoritmus, amely garantáltan megtalálja a legrövidebb utat egységnyi súlyú élek esetén. Lineáris idő- és helykomplexitással működik, könnyen implementálható és számos problémában – a faátjárástól kezdve egészen webcrawlerekig – alkalmazható. A soralapú feldolgozás szint-szerű szemléletet ad, amely megkülönbözteti a mélységi kereséstől, ahol a cél egy adott ágon való minél mélyebb bejárás.
Forgalmasan tanulmányozva, a BFS megértése elengedhetetlen a fejlesztők és kutatók számára, hiszen alapot nyújt bonyolultabb keresési és optimalizációs algoritmusokhoz, valamint valós alkalmazási területeken is kulcsszerepet játszik.
- breadth-first search - Szótár.net (en-hu)
- breadth-first search - Sztaki (en-hu)
- breadth-first search - Merriam–Webster
- breadth-first search - Cambridge
- breadth-first search - WordNet
- breadth-first search - Яндекс (en-ru)
- breadth-first search - Google (en-hu)
- breadth-first search - Wikidata
- breadth-first search - Wikipédia (angol)