Karger-algoritmus

Üdvözlöm, Ön a Karger-algoritmus szó jelentését keresi. A DICTIOUS-ban nem csak a Karger-algoritmus szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a Karger-algoritmus szót egyes és többes számban mondani. Minden, amit a Karger-algoritmus szóról tudni kell, itt található. A Karger-algoritmus szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. AKarger-algoritmus és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

Kiejtés

  • IPA:

Főnév

Karger-algoritmus

  1. (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

  1. Gráf beolvasása: A gráfot csúcsok és élek formájában reprezentáljuk.
  2. 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.
  3. Ismétlés:
    • Addig ismételjük az élszűkítést, amíg a gráf két csúcsra csökken.
  4. 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.
  5. 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)
        
        # Csúcsok összevonása
        graph.extend(graph)
        for vertex in graph:
            graph = ]
        
        # Önhurok eltávolítása
        graph =  if x != u]
        del graph
    
    # 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: 
}

# 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.size();
        int vertex_v = graph;

        // Csúcsok összevonása
        graph.insert(graph.end(), graph.begin(), graph.end());

        for (int neighbor : graph) {
            auto& edges = graph;
            replace(edges.begin(), edges.end(), vertex_v, vertex_u);
        }

        // Önhurok eltávolítása
        auto& edges = graph;
        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

  1. Hálózati optimalizáció:
    • Minimális kapcsolatvesztés meghatározása.
  2. Szociális hálózatok:
    • Közösségek szétválasztása.
  3. 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