BFS versus DFS (breedte-eerst versus diepte-eerst zoeken): bezoekvolgorde, datastructuur, kortste paden, geheugen en toepassingen
Beide zijn manieren om elke knoop van een graaf of boom te bezoeken door de verbindingen te volgen. Breedte-eerst zoeken (BFS) breidt zich uit in volgorde van afstand: het bezoekt eerst alle knopen op één verbinding van het startpunt, dan die op twee verbindingen, enzovoort. Diepte-eerst zoeken (DFS) volgt één pad zo ver mogelijk, en wanneer het op een doodlopend punt komt, keert het terug en probeert een ander pad. BFS wordt geïmplementeerd met een wachtrij en DFS met een stack of recursie; op een graaf die als nabuurlijsten is opgeslagen, bezoeken beide alles in een tijd die evenredig is met het aantal knopen plus het aantal verbindingen. BFS is de gebruikelijke keuze voor kortste paden in ongewogen grafen, en DFS om alle paden uitputtend te doorzoeken of cycli op te sporen.
| Kenmerk | Breedte-eerst zoeken (BFS) | Diepte-eerst zoeken (DFS) |
|---|---|---|
| Bezoekvolgorde | Dichtstbijzijnde eerst (minste verbindingen vanaf het startpunt), laag voor laag naar buiten | Gaat diep langs één pad, keert terug bij een doodlopend punt en gaat verder met het volgende pad |
| Gebruikte datastructuur | Wachtrij (first in, first out) | Stack (last in, first out) of recursieve aanroepen |
| Kortste paden | In een ongewogen graaf is het aantal verbindingen bij het eerste bereiken van een knoop de kortste afstand vanaf het startpunt | Niet gegarandeerd: een knoop kan eerst via een omweg worden bereikt |
| Tijdcomplexiteit (V knopen, E verbindingen) | O(V + E) met nabuurlijsten, O(V²) met een nabuurmatrix | Gelijk aan BFS: O(V + E) met nabuurlijsten, O(V²) met een nabuurmatrix |
| Geheugengebruik | De knopen die nog moeten worden bezocht, staan in de wachtrij; bij veel vertakkingen staat een hele laag knopen tegelijk in de wachtrij, dus die wordt groot | Recursief geschreven zijn alleen de knopen op het huidige pad nodig, dus het geheugen groeit met de diepte van het pad; zeer diepe zoektochten kunnen de call stack laten overlopen |
| Of een oplossing wordt gevonden | Altijd gevonden als er eindig veel knopen zijn; ook als de zoekruimte onbegrensd groeit, worden ondiepe oplossingen eerst gevonden | In een eindige graaf altijd gevonden als bezochte knopen worden bijgehouden; als paden onbegrensd dieper kunnen worden, kan het langs één pad blijven afdalen en nooit terugkomen |
| Doorloopvolgorde in bomen | Level-order (niveau voor niveau vanaf de wortel, van links naar rechts) | Pre-order, in-order en post-order |
| Typische toepassingen | Kortste paden in ongewogen grafen, het minimale aantal stappen in een doolhof, hoeveel hops een netwerk overbrugt | Uitputtend doorzoeken van doolhoven en puzzels (backtracking), samenhangende componenten en cycli vinden, topologisch sorteren |
De getalswaarden zijn typische ordegroottes en variëren per procesgeneratie en product.