Hoppa till innehåll

BFS kontra DFS: välj rätt traversal

↑

BFS och DFS undersöker båda samband i grafer men prioriterar olika noder. BFS går nivåvis med en kö, medan DFS följer en gren först med stack eller rekursiva anrop. Skillnaden syns tydligt när grafen innehåller flera alternativa vägar.

ABCDEF

Besökta: –

Queue: –

Grannar behandlas i alfabetisk ordning. DFS använder omvänd push-ordning för att besöka den alfabetiskt första grannen först.

Välj BFS och stega från A. Återställ sedan och välj DFS. Färgade noder är besökta, och strukturen visar väntande arbete. Besöksordningen är förutsägbar här eftersom grannordningen är alfabetisk. Andra grannordningar kan ge andra giltiga resultat.

Fråga BFS DFS
Datastruktur FIFO-kö LIFO-stack / rekursion
Prioritet Minsta antal kanter först Djupare gren först
Kortaste väg i antal kanter Ja, i oviktad graf med föräldraspårning Ingen generell garanti
Tid med grannlistor O(V + E) O(V + E)
Extra minne O(V) visited + kö O(V) visited + stack
Vanliga användningar Kortaste oviktad väg, nivåer Nåbarhet, backtracking, cykler, topologisk sortering

Båda kan använda O(V) extra minne i värsta fall, men väntestrukturerna ser olika ut. På ett brett träd kan BFS lagra nästan en hel nivå. Rekursiv DFS på ett träd behåller en aktiv väg och använder O(h) anropsstack, plus eventuella resultat. I allmänna grafer tar visited-set ofta O(V). DFS använder alltså inte alltid mindre minne.

Preorder, inorder och postorder är DFS-ordningar på binära träd. Nivåordning är BFS på ett träd. Inorder är inte en allmän graftraversering eftersom grafer saknar en given vänster-/högerstruktur.

BFS minimerar antalet kanter, inte en godtycklig total kostnad. Om A-B kostar 100 och vägen A-C-B kostar 2 kan BFS välja direktvägen trots högre kostnad. För viktade vägar med icke-negativa kostnader kan Dijkstra passa; A* använder även en heuristik.

Övning: Rita en graf med två vägar från A till D, en med två kanter och en med fyra. Testa båda algoritmerna för hand. Kan DFS hitta D först via den längre vägen?

Referenser: GeeksforGeeks BFS och DFS, W3Schools graftraversering.