logo

Rozdíl mezi BFS a DFS

Breadth-First Search (BFS) a Hloubkové vyhledávání (DFS) jsou dva základní algoritmy používané pro procházení nebo vyhledávání grafů a stromů. Tento článek popisuje základní rozdíl mezi vyhledáváním do šířky a vyhledáváním do hloubky.

bfs-vs-dfs-(1)

Rozdíl mezi BFS a DFS



Breadth-First Search (BFS) :

BFS, Breadth-First Search, je technika založená na vrcholech pro nalezení nejkratší cesty v grafu. Používá a Výstup:

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

Kód:

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; veřejnost: Graf(int V); // Konstruktor // funkce pro přidání hrany do grafu void addEdge(int v, int w);  // vypíše procházení BFS z daného zdroje s void BFS(int s); }; Graph::Graph(int V) { this->V = V;  adj = nový seznam [PROTI]; } void Graph::addEdge(int v, int w) { adj[v].push_back(w); // Přidejte w do seznamu v. } void Graph::BFS(int s) { // Označení všech vrcholů jako nenavštívené bool* navštíveno = new bool[V];  for (int i = 0; i< V; i++)  visited[i] = false;  // Create a queue for BFS  list fronta;  // Označí aktuální uzel jako navštívený a zařadí jej do fronty[s] = true;  queue.push_back(s);  // 'i' se použije k získání všech sousedních vrcholů // seznamu vrcholů ::iterátor i;  // Vytvořte mapování z celých čísel na znaky char map[6] = { 'A', 'B', 'C', 'D', 'E', 'F ' };  while (!queue.empty()) { // Vyřadí vrchol z fronty a vytiskne jej 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; }>
Krajta
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(() =>[]); // Pole seznamů sousedství } // Funkce pro přidání hrany do grafu addEdge(v, w) { this.adj[v].push(w); // Přidejte w do seznamu v.  } // Funkce pro provedení BFS traversal z daného zdroje s BFS(s) { // Označení všech vrcholů jako nenavštívených let visit = new Array(this.V).fill(false);  // Vytvořte frontu pro BFS let queue = [];  // Označí aktuální uzel jako navštívený a zařadí jej do fronty[s] = true;  fronta.push(y);  // Mapování z celých čísel na znaky let map = ['A', 'B', 'C', 'D', 'E', 'F'];  while (queue.length> 0) { // Vyřadí vrchol z fronty a vytiskne jej s = queue.shift();  console.log(map[s] + ' '); // Použijte mapování k vytištění původního štítku // Získejte všechny sousední vrcholy vyřazeného vrcholu s // Pokud sousední nebyl navštíven, označte jej jako navštívený // a zařaďte jej do fronty pro (let i of this.adj[s ]) { if (!navštíveno[i]) { queue.push(i);  navštíveno[i] = true;  } } } } } // Funkce hlavní funkce main() { // Vytvořte graf uvedený v diagramu /* A /  B C / /  D E F */ nechť 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('Breadth First Traversal is: ');  g.BFS(0); // Spuštění BFS od A (0) } // Spuštění hlavní funkce main();>

Výstup
Breadth First Traversal is: A B C D E F>

Hloubkové první vyhledávání (DFS) :

DFS, Hloubka první hledání , je technika založená na okrajích. Používá se Výstup:



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

Rozdíl mezi BFS a DFS:

ParametryBFSDFS
znamenáBFS znamená Breadth First Search.DFS znamená Depth First Search.
Datová strukturaBFS (Breadth First Search) používá datovou strukturu Queue k nalezení nejkratší cesty.DFS (Depth First Search) používá datovou strukturu zásobníku.
DefiniceBFS je traversální přístup, ve kterém nejprve procházíme všemi uzly na stejné úrovni, než přejdeme na další úroveň.DFS je také traverzální přístup, ve kterém traverz začíná u kořenového uzlu a pokračuje skrz uzly tak daleko, jak je to možné, dokud nedosáhneme uzlu bez nenavštívených blízkých uzlů.
Koncepční rozdílBFS staví strom úroveň po úrovni.DFS vytváří podstrom po podstromu.
Použitý přístupFunguje na konceptu FIFO (First In First Out).Funguje na konceptu LIFO (Last In First Out).
Vhodné proBFS je vhodnější pro hledání vrcholů blíže k danému zdroji.DFS je vhodnější, když existují řešení mimo zdroj.
AplikaceBFS se používá v různých aplikacích, jako jsou bipartitní grafy, nejkratší cesty atd.DFS se používá v různých aplikacích, jako jsou acyklické grafy a hledání silně propojených komponent atd.

Podívejte se prosím také BFS vs DFS pro binární strom pro rozdíly pro Binary Tree Traversal.