logo

Rozdiel medzi BFS a DFS

Breadth-First Search (BFS) a Hĺbkové vyhľadávanie (DFS) sú dva základné algoritmy používané na prechádzanie alebo vyhľadávanie grafov a stromov. Tento článok popisuje základný rozdiel medzi vyhľadávaním do šírky a vyhľadávaním do hĺbky.

bfs-vs-dfs-(1)

Rozdiel medzi BFS a DFS



Breadth-First Search (BFS) :

BFS, Breadth-First Search, je technika založená na vrcholoch na nájdenie najkratšej cesty v grafe. Používa a Výkon:

reťazec a podreťazec
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; verejné: Graf(int V); // Konštruktor // funkcia na pridanie hrany do grafu void addEdge(int v, int w);  // vypíše prechod BFS z daného zdroja s void BFS(int s); }; Graph::Graph(int V) { this->V = V;  adj = nový zoznam [V]; } void Graph::addEdge(int v, int w) { adj[v].push_back(w); // Pridajte w do zoznamu v. } void Graph::BFS(int s) { // Označenie všetkých vrcholov ako nenavštívené bool* navštívené = new bool[V];  pre (int i = 0; i< V; i++)  visited[i] = false;  // Create a queue for BFS  list fronta;  // Označiť aktuálny uzol ako navštívený a zaradiť ho do frontu [s] = true;  queue.push_back(s);  // 'i' sa použije na získanie všetkých susedných vrcholov // zoznamu vrcholov ::iterátor i;  // Vytvorte mapovanie z celých čísel na znaky znakovej mapy[6] = { 'A', 'B', 'C', 'D', 'E', 'F ' };  while (!queue.empty()) { // Vyradí vrchol z frontu a vytlačí ho 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(() =>[]); // Pole zoznamov susediacich } // Funkcia na pridanie hrany do grafu addEdge(v, w) { this.adj[v].push(w); // Pridajte w do zoznamu v.  } // Funkcia na vykonanie prechodu BFS z daného zdroja s BFS(s) { // Označenie všetkých vrcholov ako nenavštívených let visit = new Array(this.V).fill(false);  // Vytvorenie frontu pre BFS let queue = [];  // Označiť aktuálny uzol ako navštívený a zaradiť ho do frontu [s] = true;  queue.push(s);  // Mapovanie z celých čísel na znaky nech map = ['A', 'B', 'C', 'D', 'E', 'F'];  while (queue.length> 0) { // Vyradí vrchol z frontu a vytlačí ho s = queue.shift();  console.log(mapa[s] + ' '); // Na vytlačenie pôvodného štítka použite mapovanie // Získanie všetkých susedných vrcholov vyradeného vrcholu s // Ak susedný nebol navštívený, potom ho označte za navštívený // a zaraďte ho do frontu (nech i of this.adj[s ]) { if (!navštívené[i]) { queue.push(i);  navštívené[i] = pravda;  } } } } } // Funkcia hlavnej funkcie main() { // Vytvorenie grafu uvedeného v diagrame /* 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('Prvá šírka prechodu je: ');  g.BFS(0); // Spustenie BFS od A (0) } // Spustenie hlavnej funkcie main();>

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

Hĺbkové prvé vyhľadávanie (DFS) :

DFS, Hĺbkové prvé vyhľadávanie , je technika založená na okrajoch. Používa sa Výkon:



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

Rozdiel medzi BFS a DFS:

ParametreBFSDFS
ZnamenaťBFS znamená Breadth First Search.DFS znamená Depth First Search.
Dátová štruktúraBFS (Breadth First Search) používa dátovú štruktúru Queue na nájdenie najkratšej cesty.DFS (Depth First Search) používa dátovú štruktúru zásobníka.
DefiníciaBFS je traverzálny prístup, v ktorom najprv prechádzame všetkými uzlami na rovnakej úrovni a potom prejdeme na ďalšiu úroveň.DFS je tiež traverzálny prístup, v ktorom traverz začína v koreňovom uzle a pokračuje cez uzly tak ďaleko, ako je to možné, až kým nedosiahneme uzol bez nenavštívených blízkych uzlov.
Koncepčný rozdielBFS vytvára strom úroveň po úrovni.DFS vytvára podstrom po podstrome.
Použitý prístupFunguje na koncepte FIFO (First In First Out).Funguje na koncepte LIFO (Last In First Out).
Vhodné preBFS je vhodnejšie na vyhľadávanie vrcholov bližšie k danému zdroju.DFS je vhodnejšie, ak existujú riešenia mimo zdroja.
AplikácieBFS sa používa v rôznych aplikáciách, ako sú bipartitné grafy, najkratšie cesty atď.DFS sa používa v rôznych aplikáciách, ako sú acyklické grafy a hľadanie silne prepojených komponentov atď.

Pozri tiež BFS vs DFS pre binárny strom pre rozdiely pre prechod binárneho stromu.