logo

Forskellen mellem BFS og DFS

Breadth-First Search (BFS) og Dybde-første søgning (DFS) er to grundlæggende algoritmer, der bruges til at krydse eller søge i grafer og træer. Denne artikel dækker den grundlæggende forskel mellem Breadth-First Search og Depth-First Search.

bfs-vs-dfs-(1)

Forskellen mellem BFS og DFS



Breadth-First Search (BFS) :

BFS, Breadth-First Search, er en toppunktsbaseret teknik til at finde den korteste vej i grafen. Den bruger en Produktion:

A, B, C, D, E, F>

Kode:

C++
#include  #include  using namespace std; // This class represents a directed graph using adjacency // list representation class Graph {  int V; // No. of vertices  // Pointer to an array containing adjacency lists  list * adj; public: Graph(int V); // Konstruktør // funktion til at tilføje en kant til grafen void addEdge(int v, int w);  // udskriver BFS-traversal fra en given kilde s void BFS(int s); }; Graph::Graph(int V) { this->V = V;  adj = ny liste [V]; } void Graph::addEdge(int v, int w) { adj[v].push_back(w); // Tilføj w til vs liste. } void Graph::BFS(int s) { // Marker alle hjørnerne som ikke besøgt bool* visited = new bool[V];  for (int i = 0; i< V; i++)  visited[i] = false;  // Create a queue for BFS  list kø;  // Marker den aktuelle node som besøgt og sæt den besøgte i kø[s] = sand;  kø.push_back(er);  // 'i' vil blive brugt til at få alle tilstødende hjørner af en // vertex liste ::iterator i;  // Opret en mapping fra heltal til tegn char map[6] = { 'A', 'B', 'C', 'D', 'E', 'F ' };  while (!queue.empty()) { // Sæt et vertex i kø fra køen og udskriv det s = queue.front();  cout<< map[s] << ' '; // Use the mapping to print  // the original label  queue.pop_front();  // Get all adjacent vertices of the dequeued vertex  // s If a adjacent has not been visited, then mark  // it visited and enqueue it  for (i = adj[s].begin(); i != adj[s].end(); ++i) {  if (!visited[*i]) {  queue.push_back(*i);  visited[*i] = true;  }  }  } } int main() {  // Create a graph given in the diagram  /* A  /   B C  / /   D E F  */  Graph g(6);  g.addEdge(0, 1);  g.addEdge(0, 2);  g.addEdge(1, 3);  g.addEdge(2, 4);  g.addEdge(2, 5);  cout << 'Breadth First Traversal is: ';  g.BFS(0); // Start BFS from A (0)  return 0; }>
Python
from collections import deque # This class represents a directed graph using adjacency list representation class Graph: def __init__(self, V): self.V = V # No. of vertices self.adj = [[] for _ in range(V)] # Adjacency lists # Function to add an edge to graph def addEdge(self, v, w): self.adj[v].append(w) # Add w to v’s list # Prints BFS traversal from a given source s def BFS(self, s): # Mark all the vertices as not visited visited = [False] * self.V # Create a queue for BFS queue = deque() # Mark the current node as visited and enqueue it visited[s] = True queue.append(s) # Create a mapping from integers to characters mapping = ['A', 'B', 'C', 'D', 'E', 'F'] while queue: # Dequeue a vertex from queue and print it s = queue.popleft() # Use the mapping to print the original label print(mapping[s], end=' ') # Get all adjacent vertices of the dequeued vertex s # If an adjacent has not been visited, then mark it visited # and enqueue it for i in self.adj[s]: if not visited[i]: queue.append(i) visited[i] = True if __name__ == '__main__': # Create a graph given in the diagram # A # /  # B C # / /  # D E F g = Graph(6) g.addEdge(0, 1) g.addEdge(0, 2) g.addEdge(1, 3) g.addEdge(2, 4) g.addEdge(2, 5) print('Breadth First Traversal is: ', end='') g.BFS(0) # Start BFS from A (0)>
JavaScript
// This class represents a directed graph using adjacency list representation class Graph {  constructor(V) {  this.V = V; // No. of vertices  this.adj = new Array(V).fill(null).map(() =>[]); // Array of adjacency lists } // Funktion til at tilføje en kant til grafen addEdge(v, w) { this.adj[v].push(w); // Tilføj w til vs liste.  } // Funktion til at udføre BFS-traversal fra en given kilde s BFS(s) { // Marker alle hjørnerne som ikke besøgt lad besøgt = new Array(this.V).fill(false);  // Opret en kø for BFS lad køen = [];  // Marker den aktuelle node som besøgt og sæt den besøgte i kø[s] = sand;  queue.push(s);  // Mapping fra heltal til tegn lad map = ['A', 'B', 'C', 'D', 'E', 'F'];  while (queue.length> 0) { // Sæt et vertex i kø fra køen og udskriv det s = queue.shift();  console.log(map[s] + ' '); // Brug kortlægningen til at udskrive den originale etiket // Hent alle tilstødende hjørner af det udkøede vertex s // Hvis et tilstødende ikke er blevet besøgt, så marker det besøgt // og sæt det i kø for (lad i af this.adj[s ]) { if (!besøgt[i]) { queue.push(i);  besøgt[i] = sand;  } } } } } // Hovedfunktion funktion main() { // Lav en graf givet i diagrammet /* A /  B C / /  D E F */ lad g = new Graph(6);  g.addEdge(0, 1);  g.addEdge(0, 2);  g.addEdge(1, 3);  g.addEdge(2, 4);  g.addEdge(2, 5);  console.log('Bredth First Traversal er: ');  g.BFS(0); // Start BFS fra A (0) } // Kør hovedfunktionen main();>

Produktion
Breadth First Traversal is: A B C D E F>

Depth First Search (DFS) :

DFS, Dybde første søgning , er en kantbaseret teknik. Den bruger Produktion:



A, B, C, D, E, F>

Forskellen mellem BFS og DFS:

ParametreBFSDFS
Står forBFS står for Breadth First Search.DFS står for Depth First Search.
DatastrukturBFS (Bredth First Search) bruger Queue-datastruktur til at finde den korteste vej.DFS (Depth First Search) bruger stak datastruktur.
DefinitionBFS er en traversal tilgang, hvor vi først går gennem alle noder på samme niveau, før vi går videre til næste niveau.DFS er også en traversal tilgang, hvor traversen begynder ved rodknudepunktet og fortsætter gennem knudepunkterne så langt som muligt, indtil vi når knudepunktet uden ubesøgte nærliggende knudepunkter.
Begrebsmæssig forskelBFS bygger træet niveau for niveau.DFS bygger træet undertræ for undertræ.
AnvendelseDet fungerer efter konceptet FIFO (First In First Out).Det fungerer efter konceptet LIFO (Last In First Out).
Egnet tilBFS er mere velegnet til at søge hjørner tættere på den givne kilde.DFS er mere velegnet, når der er løsninger væk fra kilden.
AnsøgningerBFS bruges i forskellige applikationer såsom todelte grafer, korteste veje osv.DFS bruges i forskellige applikationer såsom acykliske grafer og at finde stærkt forbundne komponenter osv.

Se venligst også BFS vs DFS for binært træ for forskellene for en binær trægennemgang.