Karger-algoritmus
Kiejtés
- IPA: [ ˈkɒrɡɛrɒlɡoritmuʃ]
Főnév
- (matematika, algoritmusok) A Karger-algoritmus egy valószínűségi algoritmus a minimális vágás (minimum cut) meghatározására egy gráfban. Az algoritmus ismételt élszűkítéssel dolgozik, míg a gráf két csúcshalmazra csökken. A két halmaz közötti élek száma adja meg a minimális vágás értékét.
Algoritmus menete
- Gráf beolvasása: A gráfot csúcsok és élek formájában reprezentáljuk.
- Véletlen élszűkítés:
- Egy élt véletlenszerűen kiválasztunk, majd “összehúzzuk” az él által összekapcsolt két csúcsot.
- Az összehúzott csúcs összes élét egyesítjük, miközben az önhurkokat eltávolítjuk.
- Ismétlés:
- Addig ismételjük az élszűkítést, amíg a gráf két csúcsra csökken.
- Minimális vágás kiértékelése:
- Az utolsó két csúcs között lévő élek száma adja a minimális vágást.
- Több futtatás:
- Az algoritmus véletlenszerű természete miatt többször kell futtatni, hogy növeljük a sikeres eredmény esélyét.
Pszeudokód
function KargerMinCut(Graph G): while G has more than 2 vertices: randomly select an edge (u, v) merge vertices u and v into a single vertex remove self-loops return the number of edges between the remaining two vertices
Python Implementáció
import random
from copy import deepcopy
def karger_min_cut(graph):
"""
Karger-algoritmus a minimális vágás meghatározására.
Args:
graph: A gráf szomszédsági listaként.
Returns:
A minimális vágás értéke.
"""
# Mély másolat a gráf módosítása elkerülése érdekében
graph = deepcopy(graph)
while len(graph) > 2:
# Véletlenszerű él kiválasztása
u = random.choice(list(graph.keys()))
v = random.choice(graph[u])
# Csúcsok összevonása
graph[u].extend(graph[v])
for vertex in graph[v]:
graph[vertex] = [u if x == v else x for x in graph[vertex]]
# Önhurok eltávolítása
graph[u] = [x for x in graph[u] if x != u]
del graph[v]
# A minimális vágás a megmaradt két csúcs közötti élek száma
return len(next(iter(graph.values())))
# Példa gráf szomszédsági listában
graph = {
1: [2, 3, 4],
2: [1, 3, 4],
3: [1, 2, 4],
4: [1, 2, 3]
}
# Több futtatás a legjobb eredményért
min_cut = float('inf')
for _ in range(100):
result = karger_min_cut(graph)
if result < min_cut:
min_cut = result
print("Minimális vágás:", min_cut)
C++ Implementáció
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <cstdlib>
#include <ctime>
using namespace std;
// Gráf szomszédsági lista reprezentáció
using Graph = unordered_map<int, vector<int>>;
int kargerMinCut(Graph graph) {
while (graph.size() > 2) {
// Véletlenszerű él kiválasztása
int u = rand() % graph.size();
auto it = graph.begin();
advance(it, u);
int vertex_u = it->first;
int v_index = rand() % graph[vertex_u].size();
int vertex_v = graph[vertex_u][v_index];
// Csúcsok összevonása
graph[vertex_u].insert(graph[vertex_u].end(), graph[vertex_v].begin(), graph[vertex_v].end());
for (int neighbor : graph[vertex_v]) {
auto& edges = graph[neighbor];
replace(edges.begin(), edges.end(), vertex_v, vertex_u);
}
// Önhurok eltávolítása
auto& edges = graph[vertex_u];
edges.erase(remove(edges.begin(), edges.end(), vertex_u), edges.end());
// Eltávolítjuk a vertex_v-t
graph.erase(vertex_v);
}
// A megmaradt két csúcs közötti élek száma
return graph.begin()->second.size();
}
int main() {
srand(time(0));
// Példa gráf szomszédsági listában
Graph graph = {
{1, {2, 3, 4}},
{2, {1, 3, 4}},
{3, {1, 2, 4}},
{4, {1, 2, 3}}
};
int min_cut = INT_MAX;
for (int i = 0; i < 100; i++) {
Graph temp_graph = graph;
min_cut = min(min_cut, kargerMinCut(temp_graph));
}
cout << "Minimális vágás: " << min_cut << endl;
return 0;
}
Alkalmazások
- Hálózati optimalizáció:
- Minimális kapcsolatvesztés meghatározása.
- Szociális hálózatok:
- Közösségek szétválasztása.
- Vágások és particionálás:
- Gráfpartíció optimalizálása.
Előnyök és Hátrányok
Előnyök
- Egyszerűség: Könnyen implementálható.
- Hatékonyság: Nagy méretű gráfok esetén is gyors.
Hátrányok
- Valószínűségi természet: Többször kell futtatni a pontos eredmény érdekében.
- Nem determinisztikus: A végeredmény eltérhet a futtatások között.
Összegzés
A Karger-algoritmus hatékony módszer a minimális vágás problémájának megoldására. Bár véletlenszerűségen alapul, többszörös futtatással növelhető az eredmény megbízhatósága. Pythonban és C++-ban egyaránt egyszerűen implementálható, és számos hálózati és gráfprobléma esetén hasznos.
Fordítások
Tartalom
- Karger-algoritmus - Értelmező szótár (MEK)
- Karger-algoritmus - Etimológiai szótár (UMIL)
- Karger-algoritmus - Szótár.net (hu-hu)
- Karger-algoritmus - DeepL (hu-de)
- Karger-algoritmus - Яндекс (hu-ru)
- Karger-algoritmus - Google (hu-en)
- Karger-algoritmus - Helyesírási szótár (MTA)
- Karger-algoritmus - Wikidata
- Karger-algoritmus - Wikipédia (magyar)