Grunnleggende Grafalgoritmer III Lars Vidar Magnusson 26.3.2014 Kapittel 21 og 22 Usammenhengende-sett Strongly-connected components
Usammenhengende Sett Usammenhengende sett er ikke en grafalgoritme i seg selv, men de benyttes i flere. Usammenhengende sett (disjoint-set) er en datastruktur for å ivareta et sett med komponenter uten felles medlemmer. Er også kjent som union find algoritmen. Ivaretar en samling T = {S 1,..., S k } med k usammenhengende dynamiske sett. Hver sett er identifiseres av et represantativt element som kan være hvilket som helst av elementene i settet.
Usammenhengende Sett Operasjoner Vi har tre hovedoperasjoner på usammenhengende sett. Make-Set(x): Lager et nytt usammenhengende sett S i = {x} og legger S i til T. Union(x, y): Hvis x S x og y S y så er T = T S x S y {S x S y }. Find-Set(x): Returnerer det representative elementet i settet som inneholder x.
Analyse av Usammenhengende Sett Når vi analyserer usammenhengende sett så må vi ta hensyn til to ulike størrelser. n er det totale antallet elementer i.e. antall Make-Set operasjoner. m er det totale antallet operasjoner på strukturen i.e. n pluss alle andre operasjoner. Siden m inneholder n vil m n. Vi kan ikke ha flere enn n 1 Union operasjoner, siden etter n 1 kall til Union så er alle elementer medlem av samme sett.
Applikasjonseksempel - Connected-Components Algoritmen For å vise hvordan usammenhengende sett kan bli brukt skal vi ta en titt på en enkel grafalgoritme Connected-Components. For en graf G = (V, E) så er node u og v i samme komponent hvis det eksiterer en sti mellom dem. Connected-Components algoritmen finne alle sammenhende komponenter i en graf G.
Connected-Components Pseudokode Connected-Components algoritmen er listet under. Vi kan sjekke om to noder er sammenhengende ved å bruke Same-Component.
Representere Usammenhengende Sett Det finnes flere måter å representere usammenhengende sett i minnet. Den mest effektive er å bruke en skog med usammenhengende sett (disjoint-set forest). Vi har et tre per sett. Roten i treet er det representative elementet Hver node peker bare til sin forelder i.e. ingen referanser til eventuelle barn. Operasjonene på usammenhengende sett kan da sammenfattes med følgende. Make-Set: lager et tre med bare rotnode Union: setter den ene roten til å være barn av den andre Find-Set: følg forelderreferansene til vi når rotnoden
Eksempel på Skog av Usammenhengende Sett Figuren under viser et eksempel på en skog av usammenhengende sett.
Optimalisering ved Hjelp av Heuristikk Kjøretiden for Find-Set kan i verstefall bli lineær, som villet ført til lang kjøretid. Man har kommet frem til to fantastiske heuristikk for å fjerne problemet. Den første er den såkalte union by rank heuristikken Vi lar roten til det minste treet bli barn til det største I stedet for størrelse bruker vi rank som er en øvre grense på høyden til en node. Den andre er såkalt path compression Vi lar alle nodene på veien til roten under kjøring av Find-Path få rotnoden som forelder. Hver node x vil ha to atributter x.p og x.rank.
Eksempel på Path Compression Figuren under viser et eksempel på hvordan path compression fungerer.
Make-Set Algoritmen Pseudokoden for Make-Set algoritmen er listet under.
Union Algoritmen Pseudokoden for Union algoritmen og hjelpealgoritmen Link er listet under.
Find-Set Algoritmen Pseudokoden for Find-Set algoritmen er listet under.
Kjøretiden til Usammenhengende Sett Som vi har nevnt tidligere så beskriver vi kjøretiden til en usammenhengende sett implementasjon ved hjelp av to størrelser. n er antall elementer m er antall operasjoner, inkludert Make-Set Hvis man bruker både union by rank og path compression så får vi en kjøretid på O(mα(n)). α er den inverse Ackermann funksjonen (se tabellen under for å se hvordan α(n) vokser i forhold til n. n α(n) 0 2 0 3 1 4 7 2 8 2047 3 2048 A 4(1) 4 A 4(1) refererer til et tall større enn 10 80.
Strongly Connected Components (SCC) Algoritmen Vi har sett på hvordan vi finner sammenhengende komponenter i en graf med Connected-Components. Vi skal nå se på hvorda vi finner strongly connected components med SCC algoritmen. Vi er gitt en rettet graf G = (V, E). Et sammenhengende komponent C er strengt sammenhengende hvis u, v C det eksisterer en sti fra u til v og en sti fra v til u.
Ideen bak SCC Algoritmen bruker den transponerte grafen G T. G T = (V, E T ), E T = {(u, v) : (v, u) E} G T er G med alle kantene snudd Vi observerer at G og G T har de samme strengt sammenhengende komponentene (SCC). Vi generer en graf G SCC = (V SCC, E SCC ). V SCC inneholder en node for hvert strengt sammenhengende komponent i G. E SCC inneholder en kant mellom komponentene hvis det eksisterer en kant mellom komponentene i G. G SCC er en DAG, siden hvert komponent er separert fra hverandre med kanter som går én vei.
Pseudokode for SCC Pseudokoden for SCC algoritmen er listet under.
Hvordan SCC Fungerer Figuren under viser hvordan SCC algoritmen tar en rettet graf G og finner en DAG G SCC med de strengt sammenhengende komponentene.