Breadth-first search ( BFS ) je jednou z metod procházení grafů . Nechť je dán graf a počáteční vrchol . Algoritmus prohledávání do šířky systematicky prochází všechny hrany , aby „objevil“ všechny vrcholy dosažitelné z , přičemž vypočítává vzdálenost (minimální počet hran) od každého dosažitelného vrcholu. Algoritmus funguje pro řízené i neorientované grafy. [jeden]
Hledání do šířky má tento název, protože v procesu procházení jdeme do šířky, to znamená, že než začneme hledat vrcholy na dálku , projdou se vrcholy na dálku .
Prohledávání šířky je jedním z neinformovaných vyhledávacích algoritmů [2] .
Breadth-First Search funguje tak, že procházíte jednotlivými úrovněmi grafu , počínaje zdrojovým uzlem .
Zvažte všechny hrany vycházející z uzlu . Pokud je další uzel cílovým uzlem, pak hledání skončí; jinak je uzel přidán do fronty . Po kontrole všech hran opouštějících uzel je z fronty odebrán další uzel a proces se opakuje.
Poznámka: rozdělení vrcholů na nezavinuté a nerozložené je nutné pro libovolný graf (protože může mít cykly). U stromu tato operace není nutná, protože každý vrchol bude vybrán pouze jednou.
Níže je pseudokód algoritmu pro případ, kdy je potřeba pouze najít cílový uzel. V závislosti na konkrétní aplikaci algoritmu může být vyžadován další kód pro uložení nezbytných informací (vzdálenost od počátečního uzlu, nadřazeného uzlu atd.)
Rekurzivní formulace:
BFS( počáteční_uzel , cíl_uzel ) { return BFS'({ počáteční_uzel }, ∅, uzel_cíle ); } BFS'( okraj , navštíveno , uzel_cíle ) { if ( okraj == ∅) { // Cílový uzel nenalezen vrátit false; } if ( cílový_uzel ∈ okraj ) { return true; } return BFS'({ dítě | x ∈ okraj , dítě ∈ expand( x )} \ navštíveno , navštíveno ∪ okraj , uzel_cíle ); }Iterativní formulace:
BFS( počáteční_uzel , cílový_uzel ) { pro (všechny uzly i) navštívené [ i ] = false; // zpočátku je seznam navštívených uzlů prázdný fronta .push( start_uzel ); // počínaje od navštíveného zdrojového uzlu [ start_node ] = true; while (! fronta .empty() ) { // dokud není fronta prázdná uzel = fronta .pop(); // vyzvednutí prvního prvku ve frontě if ( node == cíl_uzel ) { return true; // kontrola, zda je aktuální uzel cíl } foreach ( child in expand( node )) { // všichni následníci aktuálního uzlu, ... if (visited[ child ] == false) { // ... které ještě nebyly navštíveny ... fronta .push ( dítě ) ; // ... přidat na konec fronty... navštíveno [ dítě ] = true; // ... a označit jako navštívené } } } vrátit false; // Cílový uzel je nedostupný }Implementace Pascalu :
funkce BFS ( v : Node ) : Boolean ; begin enqueue ( v ) ; zatímco fronta není prázdná do begin curr : = dequeue () ; if is_goal ( curr ) then begin BFS := true ; výstup ; konec ; značka ( curr ) ; for next in následníky ( curr ) do if not označené ( next ) then begin enqueue ( next ) ; konec ; konec ; BFS := false ; konec ;Označte počet vrcholů a hran v grafu jako resp .
Protože všechny expandované uzly jsou uloženy v paměti, prostorová složitost algoritmu je [2] .
Algoritmus iterativního prohlubování je podobný prohledávání do šířky v tom, že každá iterace prozkoumá celou úroveň nových uzlů před přechodem na další úroveň, ale vyžaduje podstatně méně paměti.
Protože v nejhorším případě algoritmus navštíví všechny uzly grafu, při ukládání grafu ve formě seznamů sousedství je časová složitost algoritmu [2] [3] .
Pokud má každý uzel konečný počet následníků, je algoritmus kompletní: pokud řešení existuje, algoritmus prohledávání do šířky ho najde, ať už je graf konečný nebo ne. Pokud však řešení neexistuje, hledání nekončí na nekonečném grafu.
Pokud jsou délky hran grafu stejné, je optimální prohledávání do šířky, to znamená, že vždy najde nejkratší cestu. V případě váženého grafu najde prohledávání do šířky cestu obsahující minimální počet hran, ale nemusí nutně tu nejkratší.
Cost -first search je zobecněním prohledávání do šířky a je optimální na váženém grafu s nezápornými váhami hran. Algoritmus navštěvuje uzly grafu v pořadí zvyšujících se nákladů na cestu z počátečního uzlu a obvykle používá prioritní frontu .
Hledání do šířky formálně navrhl E. F. Moore v kontextu hledání cesty v bludišti [4] . Lee nezávisle objevil stejný algoritmus v kontextu zapojení PCB [5] [6] [7] .
Breadth-First Search lze použít na problémy související s teorií grafů :
Algoritmy pro vyhledávání grafů | ||
---|---|---|
Neinformované metody | ||
Informované metody | ||
Zkratky | ||
Minimální kostra | ||
jiný |