Пошук у ширину (BFS) і Пошук у глибину (DFS) це два основних алгоритми, які використовуються для обходу або пошуку графів і дерев. У цій статті розглядається основна різниця між пошуком у ширину та пошуком у глибину.

Різниця між BFS і DFS
Пошук у ширину (BFS) :
BFS, пошук у ширину, це техніка на основі вершин для пошуку найкоротшого шляху в графі. Він використовує a Вихід:
A, B, C, D, E, F>
код:
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 * присл. public: Graph(int V); // Конструктор // функція для додавання ребра до графіка void addEdge(int v, int w); // друкує обхід BFS із заданого джерела void BFS(int s); }; Graph::Graph(int V) { this->V = V; adj = новий список [V]; } void Graph::addEdge(int v, int w) { adj[v].push_back(w); // Додати w до списку v. } void Graph::BFS(int s) { // Позначити всі вершини як невідвідані bool* visited = new bool[V]; для (int i = 0; i< V; i++) visited[i] = false; // Create a queue for BFS list черга; // Позначити поточний вузол як відвіданий і поставити його в чергу visited[s] = true; queue.push_back(s); // 'i' буде використано для отримання всіх суміжних вершин // списку вершин ::ітератор i; // Створення відображення з цілих чисел на символи char map[6] = { 'A', 'B', 'C', 'D', 'E', 'F '}; while (!queue.empty()) { // Вилучити вершину з черги та надрукувати її 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(() =>[]); // Масив списків суміжності } // Функція для додавання ребра до графіка addEdge(v, w) { this.adj[v].push(w); // Додати w до списку v. } // Функція для виконання обходу BFS із заданого джерела s BFS(s) { // Позначити всі вершини як невідвідані let visited = new Array(this.V).fill(false); // Створення черги для BFS let queue = []; // Позначити поточний вузол як відвіданий і поставити його в чергу visited[s] = true; queue.push(s); // Перетворення цілих чисел на символи let map = ['A', 'B', 'C', 'D', 'E', 'F']; while (queue.length> 0) { // Вилучити вершину з черги та надрукувати її s = queue.shift(); console.log(map[s] + ' '); // Використовуйте відображення, щоб надрукувати оригінальну мітку // Отримати всі суміжні вершини вилученої з черги вершини s // Якщо суміжну вершину не було відвідано, позначте її як відвідану // та поставте в чергу для (let i of this.adj[s) ]) { if (!visited[i]) { queue.push(i); відвідано[i] = правда; } } } } } // Основна функція function main() { // Створення графіка, заданого на діаграмі /* A / B C / / D E F */ let 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('Перший обхід ширини: '); g.BFS(0); // Запуск BFS з A (0) } // Запуск головної функції main();>
Вихід
Breadth First Traversal is: A B C D E F>
Пошук спочатку в глибину (DFS) :
DFS, Пошук спочатку на глибину , це техніка, заснована на краях. Він використовує Вихід:
A, B, C, D, E, F>
Різниця між BFS і DFS:
Параметри | BFS | ДФС |
---|---|---|
Виступає за | BFS розшифровується як Breadth First Search. | DFS означає Depth First Search. |
Структура даних | BFS (Breadth First Search) використовує структуру даних черги для пошуку найкоротшого шляху. | DFS (пошук спочатку глибиною) використовує структуру даних стека. |
Визначення | BFS — це обхідний підхід, у якому ми спочатку проходимо всі вузли на одному рівні, перш ніж переходити до наступного рівня. | DFS також є обхідним підходом, у якому обхід починається з кореневого вузла і продовжується через вузли настільки далеко, наскільки це можливо, доки ми не досягнемо вузла без невідвіданих сусідніх вузлів. |
Концептуальна різниця | BFS будує дерево рівень за рівнем. | DFS створює піддерево дерева за піддеревом. |
Використаний підхід | Він працює за концепцією FIFO (First In First Out). | Працює за концепцією LIFO (Last In First Out). |
Підходить для | BFS більше підходить для пошуку вершин ближче до заданого джерела. | DFS більше підходить, коли є рішення далеко від джерела. |
Додатки | BFS використовується в різних програмах, таких як дводольні графи, найкоротші шляхи тощо. | DFS використовується в різних програмах, таких як ациклічні графи та пошук сильно зв’язаних компонентів тощо. |
Також див BFS проти DFS для бінарного дерева для відмінностей для обходу бінарного дерева.