logo

Різниця між BFS і DFS

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

bfs-vs-dfs-(1)

Різниця між 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 для бінарного дерева для відмінностей для обходу бінарного дерева.