Vážení čtenáři, v tomto článku vás provedu konceptem hloubkového prvního vyhledávání (DFS). Jedná se o koncept grafu, který je běžným problémem v mnoha konkurenčních kódovacích zkouškách. Podívejme se tedy na vytvoření DFS traversal pomocí Pythonu.
obsah
co je hloubka první vyhledávání?
hloubkové vyhledávání je algoritmus, který využívá datovou strukturu zásobníku k procházení grafů a stromů. Koncept hloubkového vyhledávání pochází ze slova „hloubka“. Strom prochází až do hloubky větve a pak zpět přechází do zbytku uzlů.
zvažte prázdný „zásobník“, který obsahuje navštívené uzly pro každou iteraci. Náš úkol je následující:
- Začněte v kořenovém uzlu a zatlačte jej na zásobník.
- zkontrolujte všechny sousední uzly stromu a vyberte jeden uzel.
- projděte celou větev vybraného uzlu a zatlačte všechny uzly do zásobníku.
- po dosažení konce větve (žádné další sousední uzly), tj. n-tého uzlu listu, přesuňte se o jediný krok zpět a vyhledejte sousední uzly N-1.uzlu.
- pokud existují sousední uzly pro N-1. uzel, projděte tyto větve a zatlačte uzly na zásobník.
Pojem Hloubka První Hledat Ilustrované
Pojďme se podívat na náš příklad grafu níže:
je kořenový uzel. Takže když je A navštíveno, zatlačíme to na stoh.
Stack : A
pojďme na větev A-B. B není navštívena, takže jdeme do B a zatlačíme B na stoh.
Stack : A B
Teď, přišli jsme na konci našeho A-B branch a přesuneme n-1 uzlů, což je A. podíváme se teď na sousední uzel, který se. S. Navštivte S a zatlačte jej do zásobníku. Nyní musíte projít větev S-C-D až do hloubky, tj. až do D a označit S, C, D, jak jste navštívili.
Stack: A B S C D
Protože D nemá žádné jiné sousední uzly, přesunout zpět na C a procházet jeho přilehlé pobočce E-H-G do hloubky a tlačit je do zásobníku.
Stack : A B S C D E H G
po dosažení D, existuje pouze jeden sousední uzel ie F, který není navštíven. Zatlačte F také na stoh.
Stack : A B S C D E H G F
tento zásobník sám o sobě je průchodem DFS.
Kódování Hloubka První Hledat Algoritmus v Pythonu
Jak si musí být vědomi toho, existuje mnoho metod představuje graf, který je sousednosti seznam sousednosti a matice.
takže v následujícím příkladu jsem definoval seznam sousedství pro každý z uzlů v našem grafu.
graph1 = { 'A' : , 'B' : , 'C' : , 'D' : , 'E' : , 'F' : , 'G' : , 'H' : , 'S' : }
Poznámka: Tento seznam sousedství může být zadán od uživatele a nemusí být pevně zakódován.
nyní definujeme naši funkci DFS, která bere jako vstup 3 parametry-graf (seznam sousedství), uzel a seznam navštívených uzlů.
pokud aktuální uzel není navštíven, tj. není přítomen v navštíveném seznamu, označte jej jako navštívený a připojte jej do navštíveného seznamu.
přesuňte se na další uzel a poté rekurzivně předejte tento uzel do funkce DFS. Tímto způsobem se každý uzel přesune do hloubky a vytiskne jej jako výstup DFS.
def dfs(graph, node, visited): if node not in visited: visited.append(node) for k in graph: dfs(graph,k, visited) return visitedvisited = dfs(graph1,'A', )print(visited)
Kompletní Kód a Výstup
graph1 = { 'A' : , 'B' : , 'C' : , 'D' : , 'E' : , 'F' : , 'G' : , 'H' : , 'S' : }def dfs(graph, node, visited): if node not in visited: visited.append(node) for k in graph: dfs(graph,k, visited) return visitedvisited = dfs(graph1,'A', )print(visited)
výstupem výše uvedeného kódu je následující:
Závěr
doufám, že jste sledovali tento návod na DFS algoritmus a byly schopni pochopit kód a příklad také. Vyzkoušejte to pomocí pera a papíru vedle sebe, abyste lépe porozuměli traverzám.