Prohledávání do hloubky (DFS) - rekurzivně l function df s(G, v) mark v as visited preVisit(v) for (v, w) g E(G) do edgeVisit (\/, w) if w not visited then |^ df s(G, w) postVisit(v) Prohledávání do sirky (BFS) l function bf s(G, v) Q <— empty queue mark v as visited enqueue(Q, v) while Q not empty do v <— dequeue(Q) vertexVisit(v) for (v, w) g E(G) do edgeVisit (\/, w) if w not visited then mark w as visited enqueue (Q, w) Prohledávání do sirky (BFS) l function bf s(G, v) Q <— empty queue mark v as visited enqueue(Q, v) while Q not empty do v <— dequeue(Q) vertexVisit(v) for (v, w) g E(G) do edgeVisit (\/, w) if w not visited then mark w as visited enqueue (Q, w) ► Co se stane když vyměníme frontu za zásobník? Tzv. „obecné schéma" prohledávání grafu l function search(G,\/) B 4- empty bag put (6, v) while B not empty do v <— get (6) if v not visited then mark v as visited vertexVisit(v) for (v, w) g do edgeVisit (\/, w) put (6, w) ► Je toto tvrzení pravdivé? „Pokud je bag fronta, je toto schéma BFS, pokud je bag-zásobník, je toto schéma DFS." rohledávánř do hloubky (DFS) - iterativně Chceme skutečné iterativní DFS ► musí mít všechny vlastnosti DFS, tj. zejména postorder ► potřebujeme simulovat rekurzi pomocí zásobníku ► co všechno je na zásobníku rekurze? Prohledávání do hloubky (DFS) - iterativně Chceme skutečné iterativní DFS ► musí mít všechny vlastnosti DFS, tj. zejména postorder ► potřebujeme simulovat rekurzi pomocí zásobníku ► co všechno je na zásobníku rekurze? Varianta 1: indexy následníků (iterátory) ► s každým prvkem v zásobníku si pamatujeme index ► ten určuje, které následníky ještě musíme zpracovat ► použitelnost závisí na reprezentaci grafu ► index může být obecnější iterátor ► použitelné pro explicitní grafy (matice sousednosti, seznam následníků) ► i pro některé implicitní grafy Prohledávání do hloubky (DFS) - iterativně Chceme skutečné iterativní DFS ► musí mít všechny vlastnosti DFS, tj. zejména postorder ► potřebujeme simulovat rekurzi pomocí zásobníku ► co všechno je na zásobníku rekurze? Varianta 1: indexy následníků (iterátory) ► s každým prvkem v zásobníku si pamatujeme index ► ten určuje, které následníky ještě musíme zpracovat ► použitelnost závisí na reprezentaci grafu ► index může být obecnější iterátor ► použitelné pro explicitní grafy (matice sousednosti, seznam následníků) ► i pro některé implicitní grafy Varianta 2: bez iterátorů ► u některých implicitních grafů nejsme schopni rozumně iterovat přes následníky ► vygenerujeme všechny následníky a uložíme je na zásobník ► dva typy prvků na zásobníku (vrcholy a hrany) Prohledávání do hloubky (DFS) - iterativně 1 function df s(G, v) 2 S <— empty stack 3 mark v as visited 4 preVisit (\/) 5 push(S, (\/, 1)) 6 while S not empty do 7 (v, k)