Traversals grafu
Traverz grafu znamená navštívit každý vrchol a hranu přesně jednou ve studni -definovaná objednávka. Při používání určitých algoritmů grafu musíte zajistit, aby každý vrchol grafu byl navštíven přesně jednou. Pořadí, ve kterém jsou vrcholy navštíveny, je důležité a může záviset na algoritmu nebo otázce, kterou řešíte.
Během procházení je důležité sledovat, které vrcholy byly navštíveny. Nejběžnějším způsobem sledování vrcholů je jejich označení.
Breadth First Search (BFS)
Existuje mnoho způsobů, jak procházet grafy. BFS je nejčastěji používaný přístup.
BFS je algoritmus procházení, při kterém byste měli začít procházet od vybraného uzlu (zdrojový nebo počáteční uzel) a procházet graf po vrstvách, čímž prozkoumáte sousední uzly (uzly, které jsou přímo připojeny ke zdrojovému uzlu). Poté se musíte přesunout směrem k sousedním uzlům další úrovně.
Jak název BFS napovídá, musíte graf procházet po šířce následujícím způsobem:
- Nejprve se posuňte vodorovně a navštívit všechny uzly aktuální vrstvy
- Přejít na další vrstvu
Zvažte následující diagram.
Vzdálenost mezi uzly ve vrstvě 1 je srovnatelně menší než vzdálenost mezi uzly ve vrstvě 2. Proto v BFS musíte projít všechny uzly ve vrstvě 1, než se přesunete k uzlům ve vrstvě 2.
Procházení podřízených uzlů
Graf může obsahovat cykly, které vás při procházení grafem mohou znovu přivést do stejného uzlu. Chcete-li se vyhnout opětovnému zpracování stejného uzlu, použijte booleovské pole, které uzel po zpracování označí. Při návštěvě uzlů ve vrstvě grafu je uložte takovým způsobem, abyste mohli procházet odpovídající podřízené uzly v podobném pořadí.
Aby byl tento proces snadný, použijte uzel k uložení uzlu a označte jej jako „navštívený“, dokud nebudou označeni všichni jeho sousedé (vrcholy, které jsou s ním přímo spojeny). Fronta se řídí metodou řazení do fronty First In First Out (FIFO), a proto budou neigborové uzly navštíveny v pořadí, v jakém byly vloženy do uzlu, tj. Nejprve bude navštíven uzel, který byl vložen jako první, a tak na.
Pseudokód
Proces procházení
Procházení začne od zdrojového uzlu a posune s do fronty. s budou označeny jako „navštívené“.
První iterace
- s budou vyřazena z fronty
- Sousedé s, tj. 1 a 2 budou procházeni
- 1 a 2, které nebyly dříve překročeny, jsou překročeny. Budou:
- Posunuty do fronty
- 1 a 2 budou označeny jako navštívené
Druhá iterace
- 1 je vyřazeno z fronty
- sousedé 1, tj. sa 3 jsou procházeni,
- s je ignorováno, protože je označeno jako „navštíveno“
- 3, který nebyl dříve překročen, je překročen. Je to:
- Posunuto do fronty
- Označeno jako navštíveno
Třetí iterace
- 2 je vyřazeno z fronty
- Sousedé 2, tj. s, 3 a 4 jsou procházeny
- 3 a s jsou ignorovány, protože jsou označeny jako „navštívené“
- 4, který nebyl dříve prošel, je prochází. Je to:
- Posunuto do fronty
- Označeno jako navštíveno
Čtvrtá iterace
- 3 je vyřazeno z fronty
- Sousedé 3, tj. 1, 2 a 5 jsou procházeny
- 1 a 2 jsou ignorovány, protože jsou označeny jako „navštívené“
- 5, který nebyl dříve prošel, je prochází. Je to:
- Posunuto do fronty
- Označeno jako navštíveno
Pátá iterace
- 4 bude vyřazeno z fronty
- Sousedé 4, tj. 2 jsou procházeny
- 2 je ignorováno, protože je již označeno jako „navštíveno“
Šestá iterace
- 5 je vyřazeno z fronty
- Sousedé 5, tj. 3 jsou procházeny
- 3 je ignorováno, protože je již označeno jako „navštíveno“
Fronta je prázdná a vychází ze smyčky. Všechny uzly byly překonány pomocí BFS.
Pokud mají všechny hrany v grafu stejnou váhu, lze pomocí BFS také zjistit minimální vzdálenost mezi uzly v grafu.
Příklad
Stejně jako v tomto diagramu, začněte od zdrojového uzlu a vyhledejte vzdálenost mezi zdrojem uzel a uzel 1. Pokud nedodržíte algoritmus BFS, můžete přejít ze zdrojového uzlu do uzlu 2 a poté do uzlu 1. Tento přístup vypočítá vzdálenost mezi zdrojovým uzlem a uzlem 1 jako 2, zatímco minimální vzdálenost je ve skutečnosti 1. Minimální vzdálenost může být správně vypočítána pomocí algoritmu BFS.
Složitost
Časová složitost BFS je O (V + E), kde V je počet uzlů a E je počet hran.
Aplikace
1. Jak určit úroveň každého uzlu v daném stromu?
Jak víte v BFS, pohybujete se po úrovni. Můžete také použít BFS k určení úrovně každého uzlu.
Implementace
Tento kód je podobný kódu BFS pouze s následujícím rozdílem:
level] = level + 1;
V tomto kódu je při návštěvě každého uzlu nastavena úroveň daného uzlu s přírůstkem na úrovni jeho nadřazeného uzlu. Takto se určuje úroveň každého uzlu.
2 . 0-1 BFS
Tento typ BFS se používá k nalezení nejkratší vzdálenosti mezi dvěma uzly v grafu za předpokladu, že hrany v grafu mají váhy 0 nebo 1. Pokud použijete BFS vysvětlený dříve v v tomto článku získáte nesprávný výsledek pro optimální vzdálenost mezi 2 uzly.
V tomto přístupu se logické pole nepoužívá k označení uzlu, protože bude ověřena podmínka optimální vzdálenosti navštívit každý uzel. K uložení uzlu se používá dvojitá fronta. V 0-1 BFS, pokud je váha hrany = 0, pak je uzel tlačen na přední stranu dequeue. Pokud je váha hrany = 1, pak je uzel tlačen na zadní stranu dequeue.
Implementace
Q je fronta s dvojím zakončením. Vzdálenost je pole, kde bude vzdálenost obsahovat vzdálenost od počátečního uzlu k uzlu v. Zpočátku je vzdálenost definovaná od zdrojového uzlu ke každému uzlu nekonečná.
Pochopme tento kód pomocí následujícího grafu:
Seznam sousedů grafu bude následující:
Zde je „s“ považováno za 0 nebo zdrojový uzel.
0 – > 1 – > 3 – > 2
hrany.first = 1, hrany.sekunda = 1
hrany.first = 3, hrany.sekunda = 0
hrany.first = 2, hrany.sekunda = 1
1 – > 0 – > 4
edge.first = 0, edge.second = 1
edge.first = 4 , edge.second = 0
2 – > 0 – > 3
edge.first = 0 , edge.second = 0
edge.first = 3, edge.second = 0
3 – > 0 – > 2 – > 4
edge.first = 0, edge.second = 0
edge.first = 2, edge.second = 0
edge.first = 4, edge.second = 0
4 – > 1 – > 3
hrany.first = 1, hrany.sekunda = 0
hrany.first = 3, hrany.sekunda = 0
Pokud použijete algoritmus BFS, bude výsledek nesprávný, protože vám ukáže optimální vzdálenost mezi s a uzel 1 a sa 2 uzel jako 1. Důvodem je to, že navštěvuje děti s a vypočítává vzdálenost mezi s a jeho dětmi, což je 1. Aktuální optimální vzdálenost je v obou případech 0.
Zpracování
Počínaje zdrojovým uzlem, tj. 0, se bude pohybovat směrem k 1, 2 a 3. Protože váha hrany mezi 0 a 1 a 0 a 2 je 1 , 1 a 2 budou přesunuty do zadní části fronty. Vzhledem k tomu, že váha hrany mezi 0 a 3 je 0, bude 3 zatlačeno na přední stranu fronty. Vzdálenost bude odpovídajícím způsobem udržována v poli vzdálenosti.
Poté bude z fronty vysunuta 3 a stejný proces bude aplikován na její sousedy atd.