Różnica między BFS i DFS

Różnica między BFS i DFS

Wyszukiwanie wszerz (BFS) I Wyszukiwanie w głąb (DFS) to dwa podstawowe algorytmy używane do przechodzenia lub przeszukiwania grafów i drzew. W tym artykule omówiono podstawową różnicę między wyszukiwaniem wszerz a wyszukiwaniem w głębi.

bfs-vs-dfs-(1)

Różnica między BFS i DFS

Wyszukiwanie wszerz (BFS) :

BFS, wyszukiwanie wszerz, to technika oparta na wierzchołkach, służąca do znajdowania najkrótszej ścieżki na grafie. Używa A Wyjście:

A, B, C, D, E, F 

Kod:

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 * przym.; public: Graph(int V); // Konstruktor // funkcja dodająca krawędź do wykresu void addEdge(int v, int w);  // drukuje przejście BFS z danego źródła void BFS(int s); }; Graph::Graph(int V) { this->V = V;  adj = nowa lista [V]; } void Graph::addEdge(int v, int w) { adj[v].push_back(w); // Dodaj w do listy v. } void Graph::BFS(int s) { // Zaznacz wszystkie wierzchołki jako nieodwiedzone bool* odwiedził = nowy bool[V];  for (int i = 0; tj < V; i++)  visited[i] = false;  // Create a queue for BFS  list kolejka;  // Oznacz bieżący węzeł jako odwiedzony i umieść go w kolejce odwiedził[s] = true;  kolejka.push_back(s);  // 'i' zostanie użyte do pobrania wszystkich sąsiadujących wierzchołków // listy wierzchołków ::iterator i;  // Utwórz mapowanie liczb całkowitych na znaki char map[6] = { 'A', 'B', 'C', 'D', 'E', 'F ' };  while (!queue.empty()) { // Usuń wierzchołek z kolejki i wypisz go 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; } 
Pyton
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(() =>[]); // Tablica list sąsiedztwa } // Funkcja dodająca krawędź do wykresu addEdge(v, w) { this.adj[v].push(w); // Dodaj w do listy v.  } // Funkcja wykonująca przejście BFS z BFS danego źródła { // Oznacz wszystkie wierzchołki jako nieodwiedzone let Visited = new Array(this.V).fill(false);  // Utwórz kolejkę dla BFS niech kolejka = [];  // Oznacz bieżący węzeł jako odwiedzony i umieść go w kolejce odwiedził[s] = true;  kolejka.push(s);  // Mapowanie liczb całkowitych na znaki let map = ['A', 'B', 'C', 'D', 'E', 'F'];  while (queue.length> 0) { // Usuń wierzchołek z kolejki i wypisz go s = kolejka.shift();  konsola.log(mapa[s] + ' '); // Użyj mapowania, aby wydrukować oryginalną etykietę // Pobierz wszystkie sąsiednie wierzchołki usuniętego z kolejki wierzchołka s // Jeśli sąsiedni wierzchołek nie został odwiedzony, zaznacz go jako odwiedzony // i umieść go w kolejce (let i of this.adj[s ]) { if (!odwiedziliśmy[i]) { kolejka.push(i);  odwiedziliśmy[i] = prawda;  } } } } } // Funkcja główna funkcja main() { // Utwórz wykres podany na diagramie /* A /  B C / /  D E F */ niech g = nowy wykres(6);  g.addEdge(0, 1);  g.addEdge(0, 2);  g.addEdge(1, 3);  g.addEdge(2, 4);  g.addEdge(2, 5);  console.log('Pierwsze przejście wszerz to: ');  g.BFS(0); // Uruchom BFS od A (0) } // Uruchom główną funkcję main(); 

Wyjście
Breadth First Traversal is: A B C D E F 

Pierwsze wyszukiwanie w głąb (DFS) :

DFS, Pierwsze wyszukiwanie w głębi , jest techniką opartą na krawędziach. Używa Wyjście:

A, B, C, D, E, F 

Różnica między BFS i DFS:

Parametry BFS DFS
Oznacza BFS oznacza wyszukiwanie wszerz. DFS oznacza wyszukiwanie w głębi.
Struktura danych BFS (Breadth First Search) wykorzystuje strukturę danych kolejki do znalezienia najkrótszej ścieżki. DFS (Depth First Search) wykorzystuje strukturę danych stosu.
Definicja BFS to podejście przemierzające, w którym najpierw przechodzimy przez wszystkie węzły na tym samym poziomie, zanim przejdziemy na następny poziom. DFS to także podejście polegające na przechodzeniu, w którym trawers rozpoczyna się w węźle głównym i przebiega przez węzły tak daleko, jak to możliwe, aż dotrzemy do węzła bez nieodwiedzonych pobliskich węzłów.
Różnica koncepcyjna BFS buduje drzewo poziom po poziomie. DFS buduje poddrzewo po poddrzewie.
Zastosowane podejście Działa w oparciu o koncepcję FIFO (First In First Out). Działa w oparciu o koncepcję LIFO (Last In First Out).
Nadaje się do BFS jest bardziej odpowiedni do wyszukiwania wierzchołków bliższych podanemu źródłu. DFS jest bardziej odpowiedni, gdy istnieją rozwiązania odległe od źródła.
Aplikacje BFS jest używany w różnych zastosowaniach, takich jak wykresy dwudzielne, najkrótsze ścieżki itp. DFS jest używany w różnych zastosowaniach, takich jak wykresy acykliczne i znajdowanie silnie połączonych komponentów itp.

Proszę również zobaczyć BFS vs DFS dla drzewa binarnego dla różnic w przechodzeniu przez drzewo binarne.