Tarjanin algoritmi
Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 14.6.2022 tarkistetusta
versiosta . tarkastukset vaativat
5 muokkausta .
Tarjanin algoritmi on algoritmi vahvasti toisiinsa liittyvien komponenttien löytämiseksi lineaarisessa ajassa
juoksevasta digraafista .
Tämä algoritmi perustuu:
- Pörssejä tarkastellaan käänteisessä topologisessa järjestyksessä, joten alkuperäisen kärjen rekursiivisen funktion lopussa ei kohtaa yhtään kärkeä samasta vahvasti kytketystä komponentista, koska kaikki alkuperäisestä kärjestä saavutettavat pisteet on jo käsitelty.
- Palautteet puussa antavat toisen polun kärjestä toiseen ja yhdistävät vahvasti toisiinsa liittyvät komponentit yhdeksi.
Algoritmin epävirallinen kuvaus
Tarjanin algoritmi voidaan ymmärtää muunnelmana syvyys-first- hakualgoritmista , jossa suoritetaan lisävaiheita, kun solmussa käydään ja solmun käsittely on valmis. Kärkipisteessä käynti tapahtuu siirryttäessä juuresta lehtiin, ja kärjen käsittely päättyy paluumatkalla. Kun pisteessä käydään, se työnnetään apupinoon, kun vahvasti kytketty komponentti käsitellään, kaikki sen kärjet työnnetään ulos tästä pinosta [1] .
Algoritmi pseudokoodissa
// tulotiedot: suunnattu graafi G = (V, A)
// lähtötiedot: joukko vahvasti kytkettyjä komponentteja
index := 0
pino := []
jokaiselle v :lle V do
jos v .index = null , sitten
strongconnect( v )
funktio strongconnect( v )
// Indeksiin tallennetaan aiemmin käsiteltyjen kärkien lukumäärä, v.index on "sisääntuloaika" kärkeen v
v .index := indeksi
v .lowlink := indeksiindeksi
:= indeksi + 1
pino .push( v )
// OnStack-kenttää tarvitaan tarkistamaan, kuuluuko yläosa pinoon O(1) v .onStack := true
// Iteroi v:stä lähtevien kaarien yli
jokaiselle ( v , w ) :lle A do ,
jos w .index = null then
// Vertexissä w ei ole vieraillut aiemmin; ajaa siitä rekursiivisesti
strongconnect( w )
v .lowlink := min( v .lowlink, w .lowlink)
muuten jos w .onStack sitten
// Vertex w on pinossa, joten se kuuluu samaan vahvasti yhdistettyyn komponenttiin kuin v
/ / Jos w ei ole pinossa, kaari ( v , w ) johtaa aiemmin käsiteltyyn vahvasti yhdistettyyn komponenttiin ja se tulee jättää huomiotta
// Huomautus: seuraavalla rivillä käytetään tarkoituksella w.indexiä w.lowlinkin sijaan - tämä viittaa Tarjanin alkuperäinen artikkeli
/ / Jos w.index korvataan w.lowlinkillä, algoritmi pysyy oikeana
v .lowlink := min( v .lowlink, w .index)
// Vertex v on nykyisen vahvasti kytketyn komponentin juuri, kaikki pinon kärjet v:stä ja ylemmistä muodostavat tämän komponentin,
jos v .lowlink = v .index
luoda uusi vahvasti yhdistetty komponentti
toista
w := pino .pop()
w .onStack := false
lisää w nykyiseen vahvasti kytkettyyn komponenttiin,
kun w ≠ v
lähettää nykyisen vahvasti kytketyn komponentin
Aukioloajat
Algoritmilla on aikamonimutkaisuus , jossa on kaarien lukumäärä ja ovat graafin kärjet [1] .
Katso myös
Strongly Connected Two-Stack Component Search Algorithm on samanlainen algoritmi, joka käyttää syvällistä hakua.
Muistiinpanot
- ↑ 1 2 Jeremy Sik et ai., 2006 .
Linkit
Kirjallisuus
- Tarjan RE Depth-first-haku ja lineaarinen graafialgoritmit // SIAM Journal on Computing. - 1972. - Voi. 1 , ei. 2 . - s. 146-160. - doi : 10.1137/0201010 .
- Robert Sedgwick. Graafialgoritmit = Graafialgoritmit. - 3. painos - Venäjä, Pietari: "DiaSoftUP" , 2002. - S. 496. - ISBN 5-93772-054-7 .
- Jeremy Sik, Lai Kwang Lee, Andrew Lumsdane. C++ Boost Graph Library. - Peter, 2006. - S. 202-205. — 304 s. — ISBN 5-469-00352-3 .