Tarjans algoritm
Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från
versionen som granskades den 14 juni 2022; kontroller kräver
5 redigeringar .
Tarjans algoritm är en algoritm för att hitta starkt sammankopplade komponenter i en digraf som går i linjär tid.
Denna algoritm är baserad på:
- Hörnena betraktas i omvänd topologisk ordning, så i slutet av den rekursiva funktionen för den ursprungliga vertexen kommer ingen vertex från samma starkt sammankopplade komponent att påträffas, eftersom alla hörn som kan nås från den ursprungliga vertexen redan har bearbetats.
- Återkopplingar i ett träd ger en andra väg från en vertex till en annan och kopplar samman de starkt anslutna komponenterna till en.
Informell beskrivning av algoritmen
Tarjans algoritm kan förstås som en variant av sökalgoritmen djup-först , där ytterligare steg utförs när en nod besöks och bearbetningen av noden är klar. Ett besök på ett vertex inträffar när man flyttar från roten till bladen, och slutet av bearbetningen av vertexet inträffar på vägen tillbaka. När en vertex besöks skjuts den in i hjälpstacken, när en starkt ansluten komponent bearbetas skjuts alla dess hörn ut ur denna stapel [1] .
Algoritm i pseudokod
// indata: riktad graf G = (V, A)
// utdata: uppsättning av starkt anslutna komponenter
index := 0
stack := []
för varje v i V gör
om v .index = null då
strongconnect( v )
function strongconnect( v )
// I index lagrar vi antalet tidigare bearbetade hörn, v.index är "inträdestiden" till vertex v
v .index := index
v .lowlink := index
index := index + 1
stack .push( v )
// OnStack-fältet behövs för att kontrollera om toppen tillhör stacken i O(1)
v .onStack := true
// Iterera över bågarna som utgår från v
för varje ( v , w ) i A gör
om w .index = null då
// Vertex w har inte besökts tidigare; kör rekursivt från den
strongconnect( w )
v .lowlink := min( v .lowlink, w .lowlink)
annars om w .onStack då
// Vertex w är på stacken, så den tillhör samma starkt anslutna komponent som v
/ / Om w inte finns på stacken, så leder bågen ( v , w ) till den tidigare bearbetade starkt anslutna komponenten och bör ignoreras
// Notera: nästa rad använder medvetet w.index istället för w.lowlink - detta hänvisar till Tarjans originalartikel
/ / Om vi ersätter w.index med w.lowlink, förblir algoritmen korrekt
v .lowlink := min( v .lowlink, w .index)
// Vertex v är roten till den nuvarande starkt anslutna komponenten, alla hörn i stacken från v och uppåt bildar denna komponent
om v .lowlink = v .index då
skapa en ny starkt ansluten komponent
upprepa
w := stack .pop()
w .onStack := false
lägg till w till den nuvarande starkt anslutna komponenten
medan w ≠ v
mata ut den ström starkt anslutna komponenten
Öppettider
Algoritmen har tidskomplexitet , där är antalet bågar och är grafens hörn [1] .
![{\displaystyle \mathrm {O} (|V|+|A|)}](https://wikimedia.org/api/rest_v1/media/math/render/svg/eee2183e00089a67c02cc0d8fc98b9f4eae5ffc2)
![|A|](https://wikimedia.org/api/rest_v1/media/math/render/svg/648fce92f29d925f04d39244ccfe435320dfc6de)
![|V|](https://wikimedia.org/api/rest_v1/media/math/render/svg/9ddcffc28643ac01a14dd0fb32c3157859e365a7)
Se även
Strongly Connected Two-Stack Component Search Algoritm är en liknande algoritm som använder djup-först-sökning.
Anteckningar
- ↑ 1 2 Jeremy Sik et al., 2006 .
Länkar
Litteratur
- Tarjan RE Djup-första sökning och linjära grafalgoritmer // SIAM Journal on Computing. - 1972. - Vol. 1 , nej. 2 . - S. 146-160. - doi : 10.1137/0201010 .
- Robert Sedgwick. Grafalgoritmer = Grafalgoritmer. - 3:e uppl. - Ryssland, St. Petersburg: "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 sid. — ISBN 5-469-00352-3 .