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.
vlc, aby pobrać YouTube

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:
wyszukiwanie kontradyktoryjne
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.