Kargerin algoritmi | |
---|---|
| |
Nimetty | David Karger [d] |
tarkoitus | löytää kaavion pienin leikkaus |
Tietorakenne | kaavio |
Keskimääräinen aika | |
Muistin hinta | - |
Kargerin algoritmi tietojenkäsittelytieteessä ja graafiteoriassa on todennäköisyyspohjainen algoritmi , jonka avulla voit löytää yhdistetyn graafin minimileikkauksen . David Kargerin keksimä algoritmi ja julkaistiin vuonna 1993 [1] .
Algoritmin idea perustuu reunan supistumiseen suuntaamattomassa graafissa. Reunan supistuksen aikana kaksi kärkeä yhdistetään yhdeksi, mikä vähentää graafin kärkien määrää yhdellä. Kaikki supistuneiden kärkien reunat yhdistetään äskettäin muodostettuun kärkipisteeseen, jolloin syntyy multigrafi . Kargerin algoritmi valitsee iteratiivisesti satunnaiset reunat ja suorittaa toiminnon, kunnes jäljellä on kaksi kärkeä, jotka ovat alkuperäisen graafin leikkaus. Jos algoritmia toistetaan tarpeeksi monta kertaa, niin minimileikkaus löytyy suurella todennäköisyydellä.
Päätehtävänä on löytää pullonkauloja eri verkostoista. Esimerkkejä:
Kargerin algoritmin perustoiminto on eräänlainen reunan supistaminen . Tämän toiminnon suorittamiseksi mielivaltaiselle reunalle graafin ja pisteet yhdistetään yhdeksi . Jos kärkipiste poistetaan , jokainen näkymän reuna korvataan näkymän reunalla . Silmukat poistetaan, ja tämän toimenpiteen jälkeen graafi ei sisällä silmukoita. Kustannusfunktio määritellään uudelleen seuraavasti: .
Algoritmi on satunnaisen käytettävissä olevan reunan ja kärkien liiton ekvitodennäköinen valinta kuvatun operaation mukaisesti. Algoritmin tuloksena saadaan pistepari, jonka välissä oleva reunajoukko on graafin osa. Tämä leikkaus ei välttämättä ole minimaalinen, mutta todennäköisyys, että tämä leikkaus on minimaalinen, on huomattavasti suurempi kuin satunnaisesti valitulla leikkauksella.
Lemma 1. .
Todiste. Huomaa, että jokainen leikkaus vastaa leikkausta . Anna , ja . Tällöin seuraavat erot ovat voimassa: , (edellyttäen, että ) ja . Siten .
Lemma 2. Todennäköisyys, että algoritmin tulos on pienin leikkaus, on suurempi tai yhtä suuri kuin .
Todiste. Antaa olla -th supistuneen reunan edellyttäen, että . Olkoon ja lisäksi -:nnen supistuksen jälkeiset kaaviot ja mikä tahansa kuvaajan pienin leikkaus . Sitten seuraava on totta:
Huomaa, että todennäköisyys, että pienintä leikkausta ei löydy toistoista, on . Siten on mahdollista mielivaltaisesti pienentää virheen todennäköisyyttä, mutta tämä pidentää algoritmin suoritusaikaa. Virheen todennäköisyysvakiolle riittää, että algoritmi suoritetaan kerran ja suoritusaika kasvaa arvoon . Kun vakiovirhetodennäköisyys on saavutettu, se pienenee eksponentiaalisesti funktiona . Toistaiseksi mahdolliset pienimmät leikkaukset on generoinut algoritmilla itsenäisesti kussakin kutsussa, mutta ensimmäisten reunaliitosten tuloksia voidaan käyttää useisiin ajoihin. Karger-Stein-algoritmin ideana on tunnistaa kussakin iteraatiossa kaksi supistusehdokasta ja jatkaa Karger-algoritmia rekursiivisesti jokaiselle niistä:
Lause. Karger-Stein-algoritmilla on aika monimutkaisuus .
Todiste. Seuraava yksinkertaistettu rekursiivinen yhtälö kuvaa algoritmin ajoaikaa: for ja for . Rekursion syvyys on , koska syöttödatan kokoa pienennetään vakiomäärä kertoja. Olkoon rekursion tasolla . Huomaa, että rekursiotasolla algoritmi on suoritettava kerran ja kunkin rekursiivisen kutsun syötekaavion koko on . Siten jokaisen rekursiivisen kutsun suoritusaika on , ja rekursisyvyyden sisällä vaadittava suoritusaika on . Kokonaissuoritusaika on .
Lemma. .
Todiste.
Lause. Algoritmi laskee pienimmän leikkauksen todennäköisyydellä .
Todiste. Antaa olla pienin leikkaus kaaviossa ja . Silloin todennäköisyys, että se säilyy supistuksen jälkeen, on yhtä suuri kuin minimi:
Todennäköisyys, että tai joilla on sama pienin leikkaus kuin ja on vähintään . Karger-Stein-algoritmi onnistuu vain kahdessa tapauksessa: jos tai sisältää minimikokoleikkauksen ja algoritmin rekusiivinen kutsu onnistuu. Olkoon todennäköisyys, että algoritmi on onnistunut kuvaajalle . Silloin todennäköisyys, että algoritmi valmistuu onnistuneesti, on . Olkoon todennäköisyys, että algoritmi on onnistunut rekursiotasolla . Sitten todellakin jos ja . Tästä seuraa, että missä on rekursion syvyys.
Kun algoritmi on käynnistetty uudelleen kerran, saadaan suoritusaika ja virhetodennäköisyys .