Download as pdf or txt
Download as pdf or txt
You are on page 1of 14

Machine Translated by Google

Sistematski dizajn algoritma za dvopovezane komponente

K.Madhukar, D.Pavan Kumar, C. Pandu Rangan Odsjek za kompjuterske


nauke i inženjerstvo Indijski institut za tehnologiju Madras - 600
036, Indija Email: rangan@iitm.ernet.in i R.Sundar
Odsjek za kompjuterske nauke i automatizaciju
Indijski institut of Science Bangalore - 560 012, Indija

Sažetak

U ovom radu predstavljamo novi linearni algoritam za pronalaženje dvopovezanih komponenti


neusmjerenog jednostavnog grafa. Prezentacija ovog algoritma je urađena kao vježba u korištenju
savremenih principa i tehnika za sistematski razvoj algoritama.

1. Uvod

Predstavljamo razvoj novog linearnog algoritma za pronalaženje blokova (i vrhova i ivica) grafa. Tradicionalni
algoritam koristi stek da "iskoči" ivice bloka. Ovo traje O(#V + #E) vremena da se dobije skup ivica, a zatim dobijanje
skupa vrhova iz skupa ivica traje O(#V #I ) vremena, gde je #I broj blokova. Također se obično prikazuje u formi
programa i nakon toga se uspostavljaju svi operativni detalji i odgovarajuća svojstva. Ovo je prilično zbunjujuće i
neintuitivno. Ovdje koristimo moderne ideje za razvoj programa i dokaz. Osnovni princip je strukturirati algoritam
tako da odražava teoriju na kojoj se zasniva [GRI 88]. Algoritam smo izgradili na način odozgo prema dolje i uvijek
smo predstavljali svojstva na kojima je izvršeno sljedeće obnavljanje, prije nego što izvršimo obnavljanje.

Ovaj rad je organiziran na sljedeći način. Odjeljak 2 predstavlja naše oznake zajedno sa nekim osnovnim
teoretskim terminima i konvencijama. Odjeljak 3 daje opći pregled algoritma bez posebne reprezentacije. Poglavlje
4 predstavlja neka željena svojstva reprezentacije i obnavlja algoritam uzimajući ih u obzir. Odjeljak 5 pokazuje kako
promijeniti graf u onaj koji zadovoljava ova svojstva. Poglavlje 6 govori o izračunavanju nekih od povezanih funkcija.
Odjeljak 7 pronalazi skup vrhova za svaki blok, a dio 8 skup ivica. Odjeljak 9 daje detalje implementacije i analizira
vremensku složenost. Odjeljak 10 završava se raspravom.

2 Notacija

Boolean i, ili i ne predstavljaju ^, _ i : respektivno. Za Speciers/Quantiers slijedimo [DRO 89] (str. 64-69). Često
korišteni kvantieri su egzistencijalni kvantit 9, univerzalni kvantier 8, a speciers su brojeći specier #, union specier S ,
sumiranje

1
Machine Translated by Google
Machine Translated by Google

G Gfcg
(9 u; v : (u; v) 2 V : (u ^ v) ^ :(u ^ v))).
Za neusmjereni graf se kaže da je bikonektan i da nema sječenih vrhova. Dvopovezane
komponente (ili blokovi) su maksimalni bipovezani podgrafovi grafa G. Može se pokazati da je
graf dvopovezan i svaki par ivica leži na zajedničkom ciklusu [HAR 69].
Definirajte relaciju R na skupu rubova E od G na sljedeći
način e1Re2 , (e1 = e2) ^ cyc(e1 ; e2).
Svaki skup u particiji E induciran sa R daje blok od G [AHU 84].
Imajte na umu da je dovoljno da razvijemo algoritam za povezani graf pošto je svaki graf a
unija povezanih podgrafova.

Specifikacija 3.1 ULAZ: Povezani graf G = (V, E)


IZLAZ: Dvopovezane komponente G

Tem može pripadati više od jednog bloka dok ivica pripada tačno jednom. Ovo sugerira
rudimentarni algoritam bikonektivnosti koji koristi gornju činjenicu za izračunavanje skupova
vrhova i rubova svakog bloka u različitim stilovima.

Algoritam 3.1 (Pronađi blokove)


f precondn : Povezani graf G=(V, E)g
početak (1) Pronađite jedinstveni
reprezentativni rub za svaki blok
i koristite ga za imenovanje bloka.

(2) Izračunajte skup vrhova za svaki blok.


(3) Izračunajte skup ivica za sve blokove.
kraj

f postcondn : Blokovi G su navedeni g

4 Označavanje prikladnog prikaza grafa

Algoritam 3.1 sadrži operaciju u kojoj imamo izbor. Može postojati nekoliko mogućih rubova koji
predstavljaju blok. Sada deniramo prikaz grafa na kojem je već napravljen izbor.
Originalni graf G je bio neusmjeren. Sada usmjeravamo ivice, particioniramo skup rubova E = T
[ F i ponovo numeriramo vrhove. Usmjerene ivice, particija i prenumerirani vrhovi moraju zadovoljiti
sljedeća svojstva.

svojstvo 4.1 V = fij 0 i < #V g je usmjereno razapinjuće stablo.


! T
4.2 (u; v) 2 F =) v svojstvo ! u:

4.3 (u; v) 2 T =) u < v. svojstvo

Kako se spoj gornja tri svojstva često koristi, bilježimo ga kao svojstvo 4.4.

svojstvo 4.4 (svojstvo 4.1) ^ (osobina 4.2) ^ (osobina 4.3).

Grafikon D = (V ; T ; F ) koji zadovoljava svojstva 4.1 i 4.2 naziva se grafik dlana. Rubovi u T
nazivaju se lukovi drveća, a oni u F nazivaju se listovi. Putanja razdvojenog lista je niz od nula ili više
ivica razdvojenog stabla (lukova stabla) praćenih tačno jednim listom.
Neke korisne funkcije grafa dlana su opisane u nastavku.

3
Machine Translated by Google

4.1 Roditeljska funkcija p(:)


Roditelj vrha u je definiran na sljedeći način:
!

(p(v) = u) , (u; v) 2 T (1)

Imajte na umu da roditelj korijena nije dedeniran.

4.2 Funkcija dijete ch(:)

ch:v = S (u : u 2 V : (v; u) 2 T )

4.3 Funkcija najniže dostupnosti low(:)


low(v) je definiran kao minimum od v i w gdje je w najniži numerirani vrh do kojeg se može doći
iz v putem span-frond putanje. Ako nema putanje raspona koja počinje od v, onda je low(v) = v.
U kvantitativnom zapisu
!

nisko:v = min(v;MIN (u : u 2 V : (9 w : w 2 V : v T!w^ (w; u) 2 F ))) (2)

T
Od 4.3, odvajanjem slučajeva za nulu i za veće dužine u v ! w dobijamo
!

nisko:v = min(v; MIN (u : u 2 V : (v; u) 2 F);


!

MIN (nisko:u : u 2 V : (v; u) 2 T )) (3)

4.4 Nezavisni vrh


Vrh koji zadovoljava low(v) p(v) naziva se nezavisni vrh. Imajte na umu da je roditelj nezavisnog
vrha ili korijen ili odrezani vrh.

Teorema 4.1 Svaki blok B ima tačno jedan nezavisni vrh i takav da je (p(i); i) ivica tog bloka.

Dokaz:
Tvrdnja : Neka je c najmanji vrh bloka B. Dijete od c koji pripada bloku B je traženi nezavisni vrh i.

Dokaz tvrdnje: Trivijalno je pokazati da je i nezavisan vrh. Mi ćemo koristiti sljedeće


lema koja pokazuje da je to jedini vrh koji zadovoljava zahtjeve teoreme.

Lema 4.1 c = p(i) ima samo jedno dijete i u bloku B.

Dokaz: Ako je j 2 ch(p(i)) i j 6= i onda bilo koji put od i do j u neusmjerenom grafu mora proći
kroz p(i) (iz svojstava 4.1 i 4.2). Ne postoji ciklus koji sadrži i i j i stoga oni ne leže u jednom
bloku [HAR 69]. Stoga p(i) ima samo jedno dijete koje pripada bloku B.
QED (lema)
Ako je j(6= i) nezavisno i (p(j); j) je u bloku B, tada je prema gornjoj lemi p(j) potomak od i.
Dakle, p(j) i. Imamo i low(j) p(j). Dakle, (p(i); i) i (p(j); j) nemaju

4
Machine Translated by Google

1 10
9 6

2 3 7

4
5
(a) Grafikon G

1 10 9 (8) 3 4
(6)

(2) 3 3 7 (4)
7 (5)
(b) Blokovi G
1 10
9 6

2 3 7

4
5

(c) Prikaz G. grafika dlana.


Isprekidane linije su listovi, a pune linije su rubovi stabala.

(d) Vrijednosti nekih funkcija grafa dlana:

I = { 2, 4, 5, 6, 8}; p = (-, 1, 2, 3, 4, 3, 6, 7, 7, 3)

nisko = (1, 1, 1, 4, 5, 3, 3, 8, 3, 1); nd = (10, 9, 8, 2, 1, 4, 3, 1, 1, 1)

(e) Na slici (b), za svaki blok, vrh od I koji se koristi za njegovo imenovanje je numerisan u zagradi.

5
Machine Translated by Google

leže na zajedničkom ciklusu, što je u suprotnosti sa pretpostavkom da je B blok.


QED (tvrdnja i teorema)
Posljedica: Broj blokova jednak je broju nezavisnih vrhova.
Možemo izabrati (p(i); i) kao reprezentativnu ivicu bloka kojem pripada. Ali kako je p(i) poznato
kada je i xediran, možemo adresirati blok imenom i. Sada se korak 1 algoritma 3.1 može ponoviti
kao \Pronađi sve nezavisne vrhove". Za graf na slici 1(a) svi blokovi, zajedno sa vrhovima koji se
koriste za adresiranje (predstavljanje) svakog bloka, prikazani su na slici 1. (b).

5 Izgradnja prikaza dlana grafa

Može se pokazati da se prvo pretraživanje po dubini može koristiti za efikasnu konstrukciju grafa
dlana. U ovom odeljku pokušavamo da sistematski razvijemo algoritam prve pretrage dubine na
osnovu karakterizacije palme. Budući da4.1,(Vprelazak
; T ) treba
mora
da bude
pokriti
usmjereno
skup vrhova,
stablo
imati
prema
dosljedan
svojstvu
način usmjeravanja ivica u odnosu na smjer prelaska i mora izbjegavati konstruiranje ciklusa sa
T ivicama. Jedna prirodna shema je označavanje posjećenih rubova i vrhova i usmjeravanje
rubova u smjeru kretanja, tako da se ciklusi mogu spriječiti izbjegavanjem ponovnih posjeta.
Svojstvo 4.2 implicira da ne bismo trebali dodavati list osim ako između krajnjih tačaka postoji
staza drveta. Ovo se može zadovoljiti nastavljanjem putovanja od posljednjeg posjećenog vrha
sve dok se ne naiđe na već posjećeni vrh, tako da putanja
T
prelaska novih vrhova obezbediće v ! u put potreban za gornji uslov. Sve dok zadnji posjećeni
vrh ima još nekolicinu nepohodenih susjeda, može se izabrati jedan od njih. Ali ako su svi
susjedi već posjećeni, možda ćemo morati tražiti prethodno posjećene vrhove. Vrhove
numeriramo redoslijedom kojim se posjećuju, primjećujući da vrh prvo posjeti luk stabla. Mi
pohranjujemo ovu numeraciju u nizupre. Predstavljamo algoritam dajući samo relevantne
korake i odlažemo neke detalje implementacije (izjave A, B, C, D i E) na kasnije odeljke.

Algoritam 5.1 (Konstrukcija palme) f


precondn : G = (V, E) je neusmjeren graf var: niz
0 : : : (#V 1) ] od 1 : : : #V 1; za i 2 0 : : : #V 1 do
pre.v := -1; A (odgođeno za sekciju 6.1) var v :
vertex := select(V); var S : skup vrhova := fvg;
pre.v := 0; oznaka v posjećeno; var T, F : skup
ivica := C (odloženo za sekciju 9) f Invarijantno :
S = fv jv 2 V ^ posjećeno(v)g^ (8 u; v : u; v 2 S :
pre:u < pre :v ) posjećen je prije v) ^
;;

! T
(8 u; v : (u; v) 2 F ^ u; v 2 S : v ! u)^ (S,T)
je usmjereno stablo ^ H (odloženo na odjeljak 9)
g do (iako nisu sve l ivice uzeti u obzir)! (v; u) :
!
var usmjerena ivica; (v;
! !

(1). u) :=\Odaberite ivicu (v; u)datako


je v najskorije posjećeni
vrh koji ima nepređenu ivicu (u,v)"; ako je posjećeno(u) !
!

F := F [ f (v u) g;

6
Machine Translated by Google
Machine Translated by Google
Machine Translated by Google

6.3 Skup nezavisnih vrhova I

Po deniciji, vrh v je nezavisan i nizak:v jednostavan. p:v. Stoga je algoritam za izračunavanje I

Algoritam 6.2 (Izračunaj nezavisan skup vrhova) f precondn :


P = (V,T,F) zadovoljava svojstvo 4.4 ^ niz p zadovoljava
jednačinu 4.1 ^ nizak niz zadovoljava jednačinu 3 g var I : skup
vrhova := ; var v : vrh := 1; f invarijantno : I = fuj(u < v) ^ (nisko: gore:u)gg
do (v < #V ) ! ako je p:v nisko:v ! I := I [ fvg; 2 p:v > low:v ! preskočiti;

v := v + 1;
od
f postcondn : I = fuj low:up:ugg

7 Pronalaženje skupa vrhova za svaki blok

Sada obnavljamo korak 2 algoritma 3.1. Neka je BV :i skup svih vrhova bloka definiranih nezavisnim
vrhom i.
Iz demencije slijedi da je svaki član BV :i, osim p:i, potomak od i (lema 4.1). Ali ne pripadaju svi
potomci i u BV :i. Skup BV :i je dat sa
T T T
= fp:ig [ fuj (i ! u) ^ (8 j : (j 2 I ) ^ (i ! u))g !+ j) : :(j BV :i (5)
T
Za vrh v, skup njegovih potomaka des(v) = fu=v ! ug and

#des(v) = nd(v) (6)


T
Klauzula i ! u se može prevesti u u 2 des(i). Proizlazi iz svojstva 4.1, svojstva 4.3
i jednadžba 6 da je u 2 des(i) isto kao iu < i + nd(i).
T T
skup eksplicitno isključen klauzulom (8 j : (j 2 I ) ^ (i ! u)) je skup S (des:j :!+
j 2j)I: ::(ji <Dalje,
j < i + nd:i). Ovo
daje sljedeći algoritam za BV :i.

Algoritam 7.1 (Izračunaj BV.i) f


precondn : P = (V,T,F) zadovoljava svojstvo 4.4 ^ niz p
zadovoljava jednadžbu 4.1 ^ nizak niz zadovoljava jednačinu
4.3 ^ (i 2 I ) ^ I = fuj low:up:ug ^ niz nd zadovoljava jednačinu 6 g
BV :i := fp:ig [ fig; var
v : vrh := i + 1;

T
invarijantno : BV :i = fp:ig [ fuj (u < v) ^ (i ! u) ^
T T
(j 2 I ) ^ (i ! u))g !+ j) : :(j (8 j :

9
Machine Translated by Google

uradi (v < i + nd:i) ! ako


v 2 I ! v := v + nd:v; 2 v 2= I !
BV :i := BV :i [ fvg; v := v + 1;

od
f postcondn : jednačina 5 g

Ostaje pokazati kako pronaći BV :i za sve i 2 I .

Algoritam 7.2 (Izračunaj BV) f


precondn : P = (V,T,F) zadovoljava svojstvo 4.4 ^ I = fuj low:up:ug ^ nizovi nizovi i p
zadovoljavaju jednačine 4.3 i 4.1 respektivno g var BV : array[ 0 :: : #V 1 ]
skupa vrhova; za i 2 0 : : : #V - 1 do ! BV :i := ; var v : vrh := 0;

f invarijantno : 8(i : (i < v) ^ (i 2 I ) : jednadžba 5) ^ 8(i : (iv) _ (i


2= I ) : BV :i = ) g do (v < #V ) ! ako v 2 I ! Compute
BV .v; 2 v 2= I ! Skip;

v := v + 1;
od
f postcondn : (8 i : i 2 I : jednadžba 5) ^ (8 i : i 2= I : BV :i = ) g

Ostaje da se izračuna niz nd. Imamo rekurzivnu deniciju

des:v = fvg [ S (des:u : u 2 ch:v : istina)

Dakle
nd:v = 1 + X (nd:u : u 2 ch:v : istina) (7)

Moramo izračunati nd vrijednosti djece prije roditelja. Sumiranje nad skupom djece izbjegava se tako
što svako dijete doprinosi svom roditelju. U početku je nd vrijednost za svaki vrh postavljena na 1, pošto je
svaki vrh sam po sebi potomak.

Algoritam 7.3 (Izračunaj broj potomaka) f precondn : P


= (V,T,F) zadovoljava svojstvo 4.4 ^ niz p zadovoljava
jednačinu 4.1 g var nd : array[ 0 : : : #V 1] od
1 : : : # V ; za (i 2 0 : : : #V 1) do ! nd:i := 1; var v : vrh := #V
1;

invarijantno : (8 u : u 2 V :

nd:u = 1 + P (nd:w : (w 2 ch:u) : (w > v)))

uradi (v > 0) ! nd:


(p:v) := nd:(p:v) + nd:v ;

10
Machine Translated by Google
Machine Translated by Google
Machine Translated by Google

do (pre:u > pre:v) ^ (pre:v


6= 0 cand p:pre:v = pre:u) !
STK := STK.(1 : : : #STK-1); (v; u) :=
!

STK.0;
od

Sa svim ovim dodacima možemo proširiti invarijantu algoritma 5.1 postavljanjem H na 8 i; j : 0 i < j #ST
K-1 : (pre:((ST K:i):1) pre:((ST K:j):1))
U svim našim algoritmima skupovi se mogu implementirati kao sekvence. Kako izvodimo samo
disjunktne unije, operacija unije na skupovima se može prevesti u konkatenaciju nizova.
Inicijalizacije u algoritmu 5.1 uzimaju O(#V) vremena i petlja obrađuje svaki rub dvaput dajući
vremensku složenost O(#V + #E).

9.2 Nisko izračunajte

U obnavljanju algoritma 6.1, provjera se može izvršiti gledanjem u A:u i provjerom da li je w >
u gdje je w u A:u. Inicijalizacija traje O(#V) vremena, a ukupan broj provjera listova traje O(#E)
vremena. Stoga je vremenska složenost O(#V + #E).

9.3 Skup nezavisnih vrhova

Petlja u algoritmu 6.2 obrađuje sve vrhove jednom. Dakle, uz pretpostavku dostupnosti low i
p, ovo traje O(#V ) vremena.

9.4 Compute BV

U algoritmu 7.2, inicijalizacija traje O(#V) vremena. Provjera v 2 I može se prevesti u low:vp:v. Algoritam 7.1 se zove #I
puta. Uz pretpostavku dostupnosti nd i obračuna za sve ove pozive zajedno, može se provjeriti da se naredba v := v +
nd:v u algoritmu 7.1 izvršava #I puta i da se naredbe koje ažuriraju BV :i izvršavaju (#V + #I ) puta.

U algoritmu 7.3, inicijalizacija traje O(#V) vremena i petlja se kreće preko skupa vrhova.
Stoga se nd(:) može izračunati u O(#V) vremenu. Tako se skupovi vrhova svih blokova mogu
izračunati u O(#V + #I) vremenu.

9.5 Izračunaj BE

U algoritmu 8.1, koristeći jednačinu 11 i uz pretpostavku dostupnosti io niza, inicijalizacija


traje O(#V) vremena, a petlja O(#E) vremena. Za računanje io-a, algoritam 8.2 uzima O(#V)
vremena jer i inicijalizacija i petlja uzimaju O(#V) vremena. Stoga algoritam 8.1 ima vremensku
složenost od O(#V + #E).
Uz sve ove izmjene, naš glavni algoritam 3.1 traje O(#V + #E) vremena.

10 Zaključci

Predstavili smo razvoj linearnog algoritma za pronalaženje dvopovezanih komponenti (i vrhova i skupova ivica)
neusmjerenog jednostavnog grafa. Naš razvoj pratio je dobro poznati princip programiranja da dokaz ispravnosti i
program treba da idu ruku pod ruku.
Vjerujemo da će napori poput našeg i ovog u [GRI 88] biti daleko u pružanju boljeg razumijevanja zamršenosti teorije
algoritamskih grafova.

13
Machine Translated by Google

Reference

[AHU 84] Aho, Hopcroft i Ullman. Strukture podataka i algoritmi, Addison Wesley, MA, SAD
1984.

[DRO 89] Dromey.G. Izvođenje programa, Addison Wesley, Australija 1989.

[GRI 88] Gries D i Xue J. Algoritam planarnosti Hopcroft Tarjan - Prezentacije i poboljšanja, Univerzitet
Cornell, Tech Report, 88-906, 1988.

[HAR 69] Harary Frank. Teorija grafova, Addison Wesley, MA, SAD 1969.

14

You might also like