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.

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:
| Parametry | BFS | DFS |
|---|---|---|
| znamená | BFS znamená Breadth First Search. | DFS znamená Depth First Search. |
| Datová struktura | BFS (Breadth First Search) používá datovou strukturu Queue k nalezení nejkratší cesty. | DFS (Depth First Search) používá datovou strukturu zásobníku. |
| Definice | BFS 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íl | BFS staví strom úroveň po úrovni. | DFS vytváří podstrom po podstromu. |
| Použitý přístup | Funguje na konceptu FIFO (First In First Out). | Funguje na konceptu LIFO (Last In First Out). |
| Vhodné pro | BFS je vhodnější pro hledání vrcholů blíže k danému zdroji. | DFS je vhodnější, když existují řešení mimo zdroj. |
| Aplikace | BFS 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.