szélességi keresés
Kiejtés
- IPA: [ ˈseːlɛʃːeːɡikɛrɛʃeːʃ]
Főnév
- (matematika, algoritmusok) A BFS (Breadth-First Search) egy gráfkeresési algoritmus, amely a gráf csúcsait szélességi sorrendben járja be. Az algoritmus az adott kiindulópontból indul, majd rétegenként halad, először a közvetlen szomszédokat látogatva meg, mielőtt továbblépne a következő rétegre. Ez az algoritmus különösen hasznos minimális úthosszúságú problémák, például a legkevesebb élből álló út megtalálására egy nem súlyozott gráfban.
Elmélet
A BFS a következőképpen működik: 1. Kezdet: A kiinduló csúcsot bejelöljük látogatottként, és hozzáadjuk egy sorhoz (queue). 2. Ismétlés: Amíg a sor nem üres: - Vegyük ki a sor elején lévő csúcsot. - Az aktuális csúcs összes szomszédját bejárjuk: - Ha egy szomszédot még nem látogattunk meg, jelöljük látogatottként, és adjuk hozzá a sorhoz. 3. Vég: A sor kiürülésekor az algoritmus befejeződik, a gráf összes elérhető csúcsát bejártuk.
Fontos tulajdonságok: - Időkomplexitás: ( O(V + E) ), ahol ( V ) a csúcsok száma, ( E ) pedig az élek száma. - Térkomplexitás: ( O(V) ), a látogatott csúcsok és a sor tárolása miatt.
Pszeudokód
BFS(G, start): Látogatott = üres halmaz Sor = üres sor Sorba helyez(start) Jelöld látogatottként(start) amíg Sor nem üres: csúcs = Sorból eltávolít() Feldolgozd(csúcs) minden szomszéd S a csúcs szomszédai közül: ha S nincs látogatottként jelölve: Jelöld látogatottként(S) Sorba helyez(S)
Python implementáció
from collections import deque
def bfs(graph, start):
visited = set()
queue = deque([start])
visited.add(start)
while queue:
node = queue.popleft()
print(node, end=" ") # Csúcs feldolgozása
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)
# Példa gráf
graph = {
0: [1, 2],
1: [0, 3, 4],
2: [0, 5],
3: [1],
4: [1, 5],
5: [2, 4]
}
bfs(graph, 0) # Kimenet: 0 1 2 3 4 5
C++ implementáció
#include <iostream>
#include <vector>
#include <queue>
#include <unordered_set>
using namespace std;
void bfs(const vector<vector<int>>& graph, int start) {
unordered_set<int> visited;
queue<int> q;
visited.insert(start);
q.push(start);
while (!q.empty()) {
int node = q.front();
q.pop();
cout << node << " "; // Csúcs feldolgozása
for (int neighbor : graph[node]) {
if (visited.find(neighbor) == visited.end()) {
visited.insert(neighbor);
q.push(neighbor);
}
}
}
}
int main() {
// Példa gráf
vector<vector<int>> graph = {
{1, 2}, // 0. csúcs szomszédai
{0, 3, 4}, // 1. csúcs szomszédai
{0, 5}, // 2. csúcs szomszédai
{1}, // 3. csúcs szomszédai
{1, 5}, // 4. csúcs szomszédai
{2, 4} // 5. csúcs szomszédai
};
bfs(graph, 0); // Kimenet: 0 1 2 3 4 5
return 0;
}
Összegzés
A BFS egy egyszerű, mégis erőteljes algoritmus, amely a gráfok szélességi bejárására szolgál. Mind Pythonban, mind C++-ban könnyen implementálható, és sokféle feladatra alkalmazható, például legkisebb úthossz keresésére vagy összefüggő komponensek feltárására.
Fordítások
- angol: breadth-first search (en)
- német: Breitensuche (de)
- orosz: поиск в ширину (ru) (poisk v širinu)
- szélességi keresés - Értelmező szótár (MEK)
- szélességi keresés - Etimológiai szótár (UMIL)
- szélességi keresés - Szótár.net (hu-hu)
- szélességi keresés - DeepL (hu-de)
- szélességi keresés - Яндекс (hu-ru)
- szélességi keresés - Google (hu-en)
- szélességi keresés - Helyesírási szótár (MTA)
- szélességi keresés - Wikidata
- szélességi keresés - Wikipédia (magyar)