Przeszukiwanie grafów
Wiedza o istnieniu interesuj ¾acego nas obiektu (np. drzewa spinaj ¾acego) jest w praktycznych zastosowaniach ma÷o przydatna. Na ogó÷potrzebujemy informacji o sposobie znalezienia tego obiektu, czyli potrzebujemy odpowiedniego algorytmu. Jednak algorytm, którego czas dzi- a÷ania wynosi 1000 lat, jest umiarkowanie przydatny. Potrzebne s ¾a wi ¾ec metody pozwalaj ¾ace stwierdzi´c, który ze znanych algorytmów jest szybszy, a przynajmniej takie które pozwalaj ¾a oceni´c, czy algorytm jest wystarczaj ¾aco szybki dla naszych potrzeb. Interesuje nas zatem czas dzia÷ania algorytmu. Jest on oczywi´scie zale·zny od rozmiaru danych wej´sciowych.
Jednak nawet przy tym samym rozmiarze danych, czas pracy algorytmu mo·ze by´c znacz ¾aco ró·zny. Nas b ¾edzie interesowa´c pesymistyczny czas dzia÷ania, czyli najd÷u·zszy mo·zliwy czas dzia÷ania dla danych wej´sciowych okre´slonego rozmiaru. B ¾edziemy przy tym zak÷ada´c, ze wprowadzamy dane jednego typu, czyli rozmiar danych wej´sciowych mo·· zna okre´sli´c jedn ¾a liczb ¾a n (w ogólnym przypadku rozwa·zania s ¾a podobne). W praktyce nie b ¾edziemy wyznacza´c dok÷adnego czasu T (n), a jedynie b ¾edziemy szuka´c dobrego oszacowania górnego.
Obliczenie czasu dzia÷ania algorytmu polega na zsumowaniu czasu dzia÷ania wszystkich prostych (elementarnych) instrukcji, takich jak przypisanie warto´sci (i := i + 1), porównanie (if a > 0 then. . . ), czy wywo÷anie procedury. Algorytm zawiera pewn ¾a liczb ¾e instrukcji prostych, przy czym niektóre z nich s ¾a wykonywane wielokrotnie w p ¾etli. Czasy poszczegól- nych instrukcji prostych, zwane te·z ich kosztami, oznaczmy przez c1; : : : ; ck. Zast ¾epuj ¾ac koszty poszczególnych instrukcji najwi ¾ekszym z nich c = max fc1; : : : ; ckg dostajemy osza- cowanie czasu T (n) pewn ¾a funkcj ¾a f (n), której wspó÷czynniki zale·z ¾a od c.
Rozwa·zmy przyk÷adowo algorytm znajdowania maksimum n liczb. Dane wej´sciowe stanowi tablica a = [a[1]; ; : : : ; a[n]].
Maksimum(a) % koszt krotno´s´c
x := a[1] % c1 1
fori := 2 to n do % c2 n 1 if a[i] > x then % c3 n 1
x := a[i] % c1 n 1
max := x % c4 1
Z powy·zszej (uproszczonej) analizy algorytmu wynika, ·ze pesymistyczny czas jego dzia÷ania mo·zna oszacowa´c nast ¾epuj ¾aco:
T (n) = c1+ (n 1) c2+ (n 1) c3+ (n 1) c1+ c3
c + (n 1) c + (n 1) c + (n 1) c + c = 3cn c, czyli czas dzia÷ania jest ograniczony z góry przez funkcj ¾e f (n) = 3cn c.
1
Zauwa·zmy, ·ze problemy z czasem dzia÷ania algorytmu mog ¾a si ¾e pojawi´c przy du·zym rozmi- arze danych wej´sciowych. Oznacza to, ·ze interesuj ¾ace s ¾a dla nas nie tyle konkretne warto´sci ograniczaj ¾acej funkcji f (n), co zachowanie przy n ! 1, czyli jej w÷asno´sci asymptoty- czne. Badanie w÷asno´sci asyptotycznych funkcji f b ¾edzie polega÷o na porównaniu jej z pewn ¾a funkcj ¾a g > 0, której w÷asno´sci s ¾a nam znane. Pojawia si ¾e pytanie, jak porówna´c asympto- tyczne w÷asno´sci funkcji f oraz g. Polega to, mówi ¾ac w uproszczeniu, na zbadaniu granicy
A = lim
n!1
f (n) g (n).
Je·zeli A jest liczb ¾a dodatni ¾a, to uwa·zamy, ·ze funkcje te s ¾a "asymptotycznie podobne", je·zeli A = 0, to f jest "asymptotycznie mniejsza", za´s je´sli A = 1, to f jest "asymptotycznie wi ¾eksza" ni·z g. Przyjmuj ¾ac np. g (n) = n, w rozwa·zanym przyk÷adzie dostajemy
n!1lim f (n)
g (n) = 3c2 (0; 1) ,
czyli f i g s ¾a "asymptotycznie podobne". Takie podej´scie pozwala na uproszczenie rozwa·za´n przez pomini ¾ecie w rozwa·zaniach kosztu c, który nie wp÷ywa na asymptotyczne w÷asno´sci funkcji. Dok÷adniej, przyjmujemy c = 1, co sprawia, ·ze funkcja f (n) szacuje ilo´s´c instrukcji prostych w algorytmie, czyli z÷o·zono´s´c obliczeniow ¾a algorytmu. W ostatnim przyk÷adzie mamy f (n) = 3cn c = 3n 1.
Sprowadzili´smy rozwa·zania dotycz ¾ace czasu dzia÷ania algorytmu do badania jego (pesymisty- cznej, asymptotycznej) z÷o·zono´sci obliczeniowej. Zde…niujemy teraz formalnie poj ¾ecia pozwala- j ¾ace opisa´c z÷o·zono´s´c obliczeniow ¾a algorytmu.
Dla k 2 N oznaczmy Nk = fn 2 N; n kg i za÷ó·zmy, ·ze f; g : Nk ! R+. Mówimy, ·ze funkcja g (n) jest asymptotycznym ograniczeniem górnym funkcji f (n) lub ·ze f (n) jest rz ¾edu co najwy·zej g (n) je·zeli
lim sup
n!1
f (n) g (n) <1.
Zbiór takich funkcji f (n), dla których g (n) jest asymptotycznym ograniczeniem górnym oz- naczamy O (g (n)). Zamiast pisa´c f (n) 2 O (g (n)) b ¾edziemy, zgodnie z przyj ¾etymi zwycza- jami, pisa´c
f (n) = O (g (n)). Przyj ¾ete oznaczenia nazywamy notacj ¾a O(wielkie O).
Cwiczenie 1.´ Pokaza´c, ·ze
f (n) = O (g (n)), 9c>0 9n02N 8n n0 f (n) cg (n) .
Funkcja g (n) pe÷ni w podanej de…nicji rol ¾e wzorca, do którego porównujemy funkcj ¾e f (n). Dlatego jako g (n) b ¾edziemy przyjmowa´c na ogó÷funkcje: 1 (sta÷a), ln n, n, 2n oraz iloczyny tych funkcji. Przyk÷adowo, funkcj ¾e f (n) nazywamy ograniczon ¾a wielomianowo je´sli f (n) = O nk dla pewnej liczby naturalnej k.
Cwiczenie 2.´ Pokaza´c, ·ze dla dowolnych funkcji f; g; h : Nk! R+
(1) f (n) = O (f (n)).
(2) Je·zeli f (n) = O (g (n)) i g (n) = O (h (n)), to f (n) = O (h (n)).
Cwiczenie 3.´ Znale´z´c funkcje takie, ·ze
(1) f (n) = O (g (n)) oraz g (n) 6= O (f (n)) (czyli g (n) =2 O (f (n))).
(2) f (n) 6= O (g (n)) oraz g (n) 6= O (f (n)).
(3) f (n) = O (g (n)), g (n) = O (f (n)) oraz f 6= g.
Cwiczenie 4.´ W zbiorze funkcji z Nk w R+ mo·zemy wprowadzi´c relacj ¾e przyjmuj ¾ac f g , f (n) = O (g (n)) :
Jakie w÷asno´sci ma relacja ?
Cwiczenie 5.´ Udowodni´c, ·ze dla dowolnej liczby a > 0
n!1lim lnan
n = lim
n!1
na 2n = 0.
Cwiczenie 6.´ Sprawdzi´c prawdziwo´s´c warunków 1) n = O (n3) ; 10) ln5n = O (p
n) ; 19) 2n+ 3n= O (3n) ; 2) n2 = O (n3) ; 11) ln n5 = O (ln n) ; 20) n2n = O (3n) ; 3) n3 = O (n2) ; 12) ln5n = O (ln n) ; 21) 5n= O (n!) ; 4) n3 = O (5n3 + 4n2 + 3n + 2) ; 13) ln n = O (log2n) ; 22) n! = O (5n) ; 5) 5n3+ 4n2+ 3n + 2 = O (n3) ; 14) ln n = O (log10n) ; 23) ln 2n = O (n) ; 6) n +p
n = O (n) ; 15) ln n = O (ln ln n) ; 24) ln n! = O (n) ; 7) np
n = O (n) ; 16) n5 = O (2n) ; 25) ln n! = O (n ln n) ; 8) p
n = O (ln n) ; 17) 2n= O (n5) ; 26) ln n! = O (n2) ; 9) ln n = O (p
n) ; 18) 4n= O (2n+ 3n) ; 27) nn = O (n!) :
Oprócz notacji O stosowane s ¾a równie·z inne sposoby porównywania funkcji. Wspomnimy o jeszcze jednym zwanym notacj ¾a (wielkie theta). Mówimy, ·ze funkcja g (n) jest asymp- totycznie dok÷adnym oszacowaniem funkcji f (n) lub ·ze f (n) jest rz ¾edu g (n) je·zeli
0 < lim inf
n!1
f (n)
g (n) lim sup
n!1
f (n) g (n) <1.
Piszemy wtedy f (n) = (g (n)).
Cwiczenie 7.´ Udowodni´c, ·ze dla dowolnych funkcji f; g; h : Nk! R+ (1) f (n) = (g (n)), f (n) = O (g (n)) ^ g (n) = O (f (n)).
(2) f (n) = (f (n)).
(3) f (n) = (g (n))) g (n) = (f (n)).
(4) Je·zeli f (n) = (g (n)) i g (n) = (h (n)), to f (n) = (h (n)).
Cwiczenie 8.´ Sprawdzi´c prawdziwo´s´c warunków z ´cwiczenia 6, po zast ¾apieniu notacji O notacj ¾a .
Uwaga 1. De…nicje dotycz ¾ace porównywania funkcji mo·zna bez ·zadnych zmian sformu÷owa´c dla funkcji okre´slonych na pó÷prostej (a; 1), a > 0 zamiast na zbiorze Nk (jedynie dla wi ¾ekszej czytelno´sci warto zmienn ¾a n zast ¾api´c przez x).
Uwaga 2. Zapisuj ¾ac z÷o·zono´s´c obliczeniow ¾a algorytmu upraszcza si ¾e zapis przez opuszcze- nie symbolu mocy zbioru j j, tzn. pisze si ¾e np. O (V2) i O (V ln V ) zamiast O jV j2 i O (jV j ln jV j).
Zanim przejdziemy do omawiania konkretnych algorytmów, zwró´cmy jeszcze uwag ¾e na is- totny problem wyst ¾epuj ¾acy gdy próbujemy oceni´c z÷o·zono´s´c obliczeniow ¾a algorytmu napisanego w pseudokodzie. Problem polega na tym, ·ze czasem nie da si ¾e ustali´c, czy dan ¾a instrukcj ¾e mo·zemy potraktowa´c jako elementarn ¾a, czy te·z do jej wykonania potrzeba wi ¾ekszej ilo´sci instrukcji elementarnych. Przyk÷adowo instrukcja przypisania odwo÷uj ¾aca si ¾e do elementu tablicy mo·ze by´c potraktowana jako elementarna, gdy·z mo·zemy si ¾e odwo÷a´c bezpo´srednio do dowolnego elementu tablicy. Je·zeli jednak dane s ¾a zorganizowane nie w postaci tablicy, ale listy, to odwo÷anie do elementu listy wymaga odwo÷ania si ¾e do wszystkich go poprzedzaj ¾acych.
Tak wi ¾ec analogiczna instrukcja przypisania wymaga wi ¾ekszej ilo´sci instrukcji elementarnych.
Przyk÷ad ten pokazuje, ·ze na ogó÷z÷o·zono´s´c obliczeniow ¾a mo·zemy policzy´c dla konkret- nej implementacji algorytmu, a nie dla samego algorytmu. Z tego te·z wzgl ¾edu w naszym wyk÷adzie b ¾edziemy ogranicza´c si ¾e do podawania informacji o z÷o·zono´sci obliczeniowej jak ¾a mo·zna uzyska´c implementuj ¾ac dany algorytm. Nie b ¾edziemy raczej bada´c tego samodzielnie.
W twierdzeniu ?? udowodnili´smy, ·ze ka·zdy graf spójny ma drzewo spinaj ¾ace. Dowód nie podawa÷jednak sposobu znalezienia takiego drzewa. Omówimy teraz algorytm znajduj ¾acy drzewo spin ¾ajace grafu spójnego. Warunki z twierdzenia ?? sugeruj ¾a dwa sposoby rozwi ¾azania tego problemu:
Usuwamy kolejne kraw¾edzie dbaj ¾ac o zachowanie spójno´sci, tak d÷ugo jak to mo·zliwe.
Startujemy od zbioru pustego i dodajemy kolejne kraw¾edzie dbaj ¾ac o zachowanie acykliczno´sci, tak d÷ugo jak to mo·zliwe.
Okazuje si ¾e, ·ze bardziej efektywny jest, na ogó÷, algorytm oparty na drugim pomy´sle. Algo- rytm oparty na pierwszym mo·ze by´c szybszy dla grafu rzadkiego, tzn. takiego, w którym ilo´s´c kraw¾edzi jEGj jest du·zo mniejsza ni·z kwadrat liczby wierzcho÷ków jVGj2. Jednak dla grafów rzadkich algorytm oparty na drugim pomy´sle jest wystarczaj ¾aco szybki i w konsekwencji mo·zna go stosowa´c do dowolnych grafów spójnych.
Za÷ó·zmy, ·ze G = (E; V ) jest grafem spójnym oraz a dowolnie wybranym wierzcho÷kiem.
Drzewo(G; a) V0 :=fag E0 :=;
while V n V0 6= ; do
Wybierz kraw¾ed´z bc tak ¾a, ·ze b 2 V0 i c 2 V n V0 V0 := V0[ fcg
E0 := E0[ fbcg T := (V0; E0)
Graf G Drzewo spinaj ¾ace T
Drzewo spinaj ¾ace T
Twierdzenie 1. Wynikiem dzia÷ania procedury Drzewo jest drzewo spinaj ¾ace T grafu spójnego G.
Dowód. Udowodnimy kolejno kilka prostych faktów. Je·zeli nie zaznaczymy inaczej, sfor- mu÷owania b ¾ed ¾a dotyczy´c dowolnej iteracji.
(1) Ko´nce kraw¾edzi z E0 nale·z ¾a do V0 (czyli (V0; E0)jest grafem).
Dla E0 =; jest to oczywiste. W÷asno´s´c (1) jest niezmiennikiem p ¾etli, bo koniec kraw¾edzi dodawanej do E0 jest dodawany do V0.
(2) Je·zeli V n V0 6= ;, to wybór kraw¾edzi bc jest mo·zliwy.
Wystarczy wzi ¾a´c dowolny wierzcho÷ek z V n V0 i po÷¾aczy´c go ´scie·zk ¾a z a (spójno´s´c). Na podstawie w÷asno´sci ?? ´scie·zka ta zawiera szukan ¾a kraw¾ed´z.
(3) Procedura zatrzyma si ¾e.
Wynika to ze sko´nczono´sci V .
(4) W÷asno´s´c "(V0; E0)jest drzewem" jest niezmiennikiem p ¾etli.
Spójno´s´c (V0; E0)jest niezmiennikiem p ¾etli, bo dodawany wierzcho÷ek jest po÷¾aczony kraw¾edzi ¾a z wierzcho÷kiem nale·z ¾acym do V0. Poniewa·z w ka·zdej iteracji dodajemy tyle samo wierz- cho÷ków co kraw¾edzi, wi ¾ec niezmiennikiem p ¾etli jest tak·ze warunek
jE0j = jV0j 1.
Teza wynika zatem z twierdzenia ??.
(5) Po wyj´sciu z p ¾etli, (V0; E0)jest drzewem spinaj ¾acym G.
Przed wej´sciem do p ¾etli graf (V0; E0) = (fag ; ;) jest drzewem. Z (4) wnioskujemy wi ¾ec, ze po wyj´sciu (V· 0; E0) jest równie·z drzewem. Poniewa·z mamy wtedy V0 = V, wi ¾ec jest to drzewo spinaj ¾ace.
Dla grafu niespójnego pocedura Drzewo nie dzia÷a, bo po wyczerpaniu wszystkich wierz- cho÷ków ze sk÷adowej Ga nie jest mo·zliwy wybór kolejnej kraw¾edzi bc. Je´sli jednak w p ¾etli while warunek
V n V0 6= ; zast ¾apimy warunkiem
istnieje kraw¾ed´z bc taka, ·ze b 2 V0 i c 2 V n V0, to dostaniemy algorytm znajduj ¾acy drzewo spinaj ¾ace sk÷adowej Ga.
Cwiczenie 9.´ Napisa´c algorytm znajduj ¾acy drzewo spinaj ¾ace grafu spójnego metod ¾a usuwania z grafu kolejnych kraw ¾edzi i udowodni´c poprawno´s´c dzia÷ania.
Problem znajdowania drzewa spinaj ¾acego grafu jest jednym z wielu, gdzie mamy do czynienia z przeszukiwaniem grafu, czyli przechodzeniem przez wszystkie wierzcho÷ki. Przyjrzyjmy si ¾e algorytmowi Drzewo. Wykonywany w p ¾etli wybór kraw¾edzi nie jest jednoznaczny. Mo·zna wi ¾ec wyobrazi´c sobie ró·zne sposoby wybierania kolejnej kraw¾edzi. Szukanie kraw¾edzi polega na sprawdzeniu, czy ju·z wybrane wierzcho÷ki mo·zna po÷¾aczy´c kraw¾edzi ¾a z jeszcze niewybranymi.
Istotna jest zatem kolejno´s´c w jakiej przegl ¾adamy wierzcho÷ki ju·z wybrane. Zmieniaj ¾ac kole- jno´s´c dostaniemy ró·zne algorytmy przeszukiwania grafu. Dwa najwa·zniejsze to przeszuki- wanie wszerz i przeszukiwanie w g÷¾ab. Procedura przeszukiwania rozpoczyna si ¾e od wyró·znionego wierzcho÷ka, który nazywamy korzeniem drzewa.
Przeszukiwanie wszerz (BFS - breadth …rst search).
Przeszukuj ¾ac wszerz szukamy najpierw s ¾asiadów korzenia. Wierzcho÷ki te tworz ¾a pier- wszy poziom. Nast ¾epnie szukamy s ¾asiadów wierzcho÷ków pierwszego poziomu (w´sród jeszcze niewybranych). Wierzcho÷ki pierwszego poziomu przeg÷¾adamy w kolejno´sci w jakiej by÷y wybierane. Znalezione wierzcho÷ki tworz ¾a drugi poziom. Operacje wyszukiwania powtarzamy na kolejnych poziomach, dopóki nie znajdziemy wszystkich wierzcho÷ków.
Poni·zszy przyk÷ad pokazuje drzewo przeszukiwania wszerz, czyli drzewo spinaj ¾ace TB
uzyskane z wykorzystaniem przeszukiwania wszerz. Korzeniem jest wierzcho÷ek a, za´s s ¾asi- adów wybieramy w kolejno´sci alfabetycznej. Kolejno´s´c wybierania kraw¾edzi jest oznaczona liczbami.
Graf G Drzewo przeszukiwania wszerz TB
Przeszukiwanie w g÷¾ab (DFS - depth …rst search).
Zaczynamy przeszukiwanie od korzenia i szukamy s ¾asiada ostatnio odwiedzonego wierz- cho÷ka. Je·zeli nie znajdziemy, to cofamy si ¾e do poprzednio odwiedzonego i szukamy s ¾asiada dla niego.
U·zywaj ¾ac przeszukiwania w g÷¾ab, znajdziemy drzewo spinaj ¾ace TD grafu z poprzedniego przyk÷adu. Jest ono nazywane drzewem przeszukiwania w g÷¾ab. Tak jak poprzednio, s ¾asiadów wybieramy w kolejno´sci alfabetycznej i numerujemy kraw¾edzie w kolejno´sci znaj- dowania.
Graf G Drzewo przeszukiwania w g÷¾ab TD
Cwiczenie 10.´ Za÷ó·zmy, ·ze graf G jest reprezentowany w postaci macierzy s ¾asiedztwa.
(1) Zmody…kowa´c (uszczegó÷owi´c) algorytm Drzewo tak by wynikiem by÷o drzewo przeszuki- wania wszerz.
(2) Zmody…kowa´c algorytm tak by wynikiem by÷o drzewo przeszukiwania w g÷¾ab.
(3) Oszacowa´c z÷o·zono´s´c obliczeniow ¾a utworzonych algorytmów.
Przeszukuj ¾ac graf wyró·znili´smy jeden wierzcho÷ek (pocz ¾atek przeszukiwania). W wyniku tego dostali´smy drzewo maj ¾ace pewn ¾a struktur ¾e. Drzewem z wyró·znionym korzeniem (drzewem ukorzenionym) nazywamy par ¾e (T; r), gdzie T jest drzewem, za´s r wyró·znionym wierzcho÷kiem, nazywanym korzeniem drzewa. Dowolny wierzcho÷ek drzewa mo·zna po÷¾aczy´c z korzeniem dok÷adnie jedn ¾a´scie·zk ¾a prost ¾a. D÷ugo´s´c tej ´scie·zki nazywamy numerem poziomu wierzcho÷ka. Zbiór wszystkich wierzcho÷ków o numerze poziomu równym n nazywamy n- tym poziomem drzewa. Najwi ¾ekszy numer poziomu wierzcho÷ka nazywamy wysoko´sci ¾a drzewa. Je·zeli wierzcho÷ek b le·zy na ´scie·zce prostej z korzenia do wierzcho÷ka c 6= b to mówimy, ·ze c jest potomkiem b. Je·zeli b jest przedostatnim wierzcho÷kiem na tej ´scie·zce, to wierzcho÷ek c nazywamy synem (dzieckiem, nast ¾epnikiem) b, za´s wierzcho÷ek b ojcem (rodzicem, poprzednikiem) c. Podgraf Tb z÷o·zony z b, wszystkich jego potomków oraz kraw¾edzi ÷¾acz ¾acych te wierzcho÷ki jest drzewem. Par ¾e (Tb; b) nazywamy poddrzewem o korzeniu b. Li´s´cmi w drzewie ukorzenionym nazywamy wszystkie wierzcho÷ki stopnia 1,
oprócz korzenia. Drzewo z wyró·znionym korzeniem przedstawiamy gra…cznie rysuj ¾ac korze´n na górze, a dzieci ni·zej ni·z rodziców.
Drzewo przeszukiwania w g÷¾ab z ostatniego przyk÷adu mo·ze by´c traktowane jako drzewo z wyró·znionym korzeniem a. Dla drzewa ukorzenionego (TD; a)mamy:
ojciec g: c;
synowie g: f; h;
potomkowie g: f; e; i; j; h; l; k;
0. poziom drzewa: a;
3. poziom drzewa: d; g;
wysoko´s´c drzewa: 6;
li´scie: d; e; j; k;
poddrzewo (Tg; g): .
W÷asno´s´c 1. Je·zeli (T; r) jest drzewem ukorzenionym, to (1) Korze´n r nie ma ojca.
(2) Dowolny wierzcho÷ek ró·zny od korzenia ma dok÷adnie jednego ojca.
Dowód. Jedyn ¾a ´scie·zk ¾a prost ¾a z r do r jest ´scie·zka trywialna. Nie istnieje wi ¾ec przedostatni wierzcho÷ek na tej ´scie·zce, czyli r nie ma ojca.
Niech b b ¾edzie wierzcho÷kiem ró·znym od korzenia. Istnieje dok÷adnie jedna ´scie·zka prosta z r do b. Poniewa·z b 6= r, wi¾ec jest ona nietrywialna. Ojciec b jest zatem wyznaczony jednoznacznie jako przedostatni wierzcho÷ek na tej ´scie·zce.
W÷asno´s´c 2. Je·zeli wierzcho÷ki a, b drzewa ukorzenionego (T; r) s ¾a po÷¾aczone kraw ¾edzi ¾a, to a jest ojcem b albo b jest ojcem a.
Dowód. Poniewa·z T jest grafem acyklicznym, wi ¾ec a 6= b. Zatem przynajmniej jeden z rozwa·zanych wierzcho÷ków jest ró·zny od r. Mo·zemy przyj ¾a´c, ·ze b 6= r. Ze spójno´sci T wynika, ·ze istnieje ´scie·zka prosta d = r : : : b. Rozwa·zmy przypadki.
(1) a nie nale·zy do d.
Wtedy a nie jest ojcem b. Ponadto r : : : ba jest ´scie·zk ¾a prost ¾a, czyli b jest ojcem a.
(2) a jest przedostatnim wierzcho÷kiem w d, czyli d = r : : : ab.
Wówczas a jest ojcem b. Poniewa·z pod´scie·zka r : : : a nie zawiera b, wi ¾ec b nie jest ojcem a.
(3) a nale·zy do d, ale nie jest przedostatnim wierzcho÷kiem w d, czyli d = r : : : a : : : b.
Dodaj ¾ac do ´scie·zki prostej a : : : b (d÷ugo´sci > 1) kraw¾ed´z ba dostajemy cykl a : : : ba,
wbrew acykliczno´sci T . Wynika st ¾ad, ·ze ten przypadek nie mo·ze zachodzi´c.
Z (1)-(3) wnioskujemy tez ¾e.
Cwiczenie 11.´ Pokaza´c, ·ze w nietrywialnym drzewie ukorzenionym li´scie s ¾a jedynymi wierz- cho÷kami, które nie maj ¾a synów.
Cwiczenie 12.´ (1) W drzewie (TB; a) z przedostatniego przyk÷adu powtórzy´c obliczenia, które zrobili´smy dla drzewa (TD; a).
(2) Traktuj ¾ac TB i TD jako drzewa wolne, utworzy´c (narysowa´c) drzewa ukorzenione (TB; f ) i (TD; f ). Powtórzy´c obliczenia wykonane dla (TD; a) i (TB; a).
(3) Dla grafu G utworzy´c drzewo przeszukiwania wszerz (T1; f ) i drzewo przeszukiwania w g÷¾ab (T2; f ). Powtórzy´c obliczenia wykonane dla (TD; a) i (TB; a).
Cwiczenie 13.´ W poni·zszym gra…e
(1) Znale´z´c drzewo spinaj ¾ace TB przeszukuj ¾ac graf wszerz oraz drzewo spinaj ¾ace TD przeszuku- j ¾ac graf w g÷¾ab. Przeszukiwanie rozpocz ¾a´c od wierzcho÷ka a, wierzcho÷ki wybiera´c w kolejno´sci alfabetycznej.
(2) Narysowa´c drzewa ukorzenione (TB; a) i (TD; a). Wyznaczy´c: li´scie, trzeci poziom, wysoko´s´c drzewa, synów wierzcho÷ka e, potomków wierzcho÷ka d (narysowa´c poddrzewo o korzeniu d).
(3) Powtórzy´c (1) i (2) zast ¾epuj ¾ac wierzcho÷ek a wierzcho÷kiem h.
Zauwa·zmy, ·ze przeszukuj ¾ac graf omówionymi metodami (wszerz, w g÷¾ab), mamy dowol- no´s´c w wybieraniu s ¾asiada danego wierzcho÷ka (w przyk÷adach i ´cwiczeniach robili´smy to alfabetycznie). Dokonuj ¾ac wyboru wprowadzamy, de facto, pewien porz ¾adek w zbiorze dzieci
poszczególnych wierzcho÷ków, który gra…cznie oddajemy rysuj ¾ac dziecko wybrane wcze´sniej na lewo od wybranego pó´zniej. Oznacza to, ·ze otrzymane w ten sposób drzewo ukorzenione ma dodatkow ¾a struktur ¾e. Zanim j ¾a formalnie opiszemy zauwa·zmy, ·ze dla zbioru sko´nczonego, ustawienie jego elementów w ci ¾ag sko´nczony (ponumerowanie) jest równoznaczne ze zde…n- iowanie w nim relacji liniowego porz ¾adku.
Drzewo z wyró·znionym korzeniem nazywamy uporz ¾adkowanym, je·zeli dla dowol- nego wierzcho÷ka, zbiór jego dzieci jest liniowo uporz ¾adkowany (o ile jest niepusty). Jak wcze´sniej wspomnieli´smy, drzewa spinaj ¾ace otrzymane w wyniku dzia÷ania algorytmu Drzewo mo·zna traktowa´c jako uporz ¾adkowane drzewa z wyró·znionym korzeniem. Porz ¾adek w zbiorze dzieci danego wierzcho÷ka jest okre´slony przez kolejno´s´c wyboru. Przyk÷adowo w rozpa- trywanych wy·zej drzewach przeszukiwania wszerz i przeszukiwania w g÷¾ab by÷to porz ¾adek alfabetyczny.
Zagadnienie przeszukiwania grafu jest zwi ¾azne z problemem porz ¾adkowania wierzcho÷ków grafu, tj. ustawiania ich w ci ¾ag. Graf spójny i jego drzewo spinaj ¾ace maj ¾a te same wierz- cho÷ki. Porz ¾adkowanie wierzcho÷ków grafu spójnego sprowadza si ¾e wi ¾ec do porz ¾adkowania wierzcho÷ków jego drzewa spinaj ¾acego. Dwa podstawowe sposoby porz ¾adkowania wierz- cho÷ków: pre…ksowy (preorder) i post…ksowy (postorder) wykorzystuj ¾a drzewo przeszuki- wania w g÷¾ab. Opis procedury porz ¾adkujacej wierzcho÷ki drzewa mo·zna jednak sformu÷owa´c dla dowolnego uporz ¾adkowanego drzewa z wyró·znionym korzeniem.
Za÷ó·zmy, ·ze mamy uporz ¾adkowane drzewo z wyró·znionym korzeniem (T; r). Ustawimy wierzcho÷ki tego drzewa w ci ¾ag. W tym celu tworzymy zamkni ¾et ¾a ´scie·zk¾e o pocz ¾atku r wed÷ug nast ¾epuj ¾acych regu÷:
Je·zeli bie·z ¾acy wierzcho÷ek ma nieodwiedzone jeszcze dzieci, to idziemy (dodajemy kraw¾ed´z) do pierwszego nieodwiedzonego dziecka (zgodnie z porz ¾adkiem w zbiorze dzieci).
Je·zeli bie·z ¾acy wierzcho÷ek nie ma nieodwiedzonych dzieci, to cofamy si ¾e (dodajemy kraw¾ed´z) do ostatnio odwiedzonego wierzcho÷ka.
Procedur ¾e ko´nczymy, je´sli po osi ¾agni ¾eciu korzenia oka·ze si ¾e, ·ze wszystkie jego dzieci by÷y ju·z odwiedzone.
Mo·zna sprawdzi´c, ·ze w wyniku opisanej wy·zej procedury powstaje ´scie·zka zamkni ¾eta za- wieraj ¾aca wszystkie wierzcho÷ki drzewa T . Niektóre wierzcho÷ki wyst ¾epuj ¾a tam wielokrotnie.
Naturalne s ¾a dwa sposoby uporz ¾adkowania wierzcho÷ków (ustawienia w ci ¾ag).
Porz ¾adek pre…ksowy (preorder)
Wierzcho÷ek wstawiamy do ci ¾agu przy pierwszym pojawieniu si ¾e na ´scie·zce.
Porz ¾adek post…ksowy (postorder)
Wierzcho÷ek wstawiamy do ci ¾agu przy ostatnim pojawieniu si ¾e na ´scie·zce.
Dla rozpatrywanego wcze´sniej drzewa przeszukiwania w g÷¾ab mamy
Porz ¾adek preorder: a; b; c; d; g; f; e; i; j; h; l; k:
Porz ¾adek postorder: d; e; j; i; f; k; l; h; g; c; b; a:
W uporz ¾adkowaniu pre…ksowym rodzice s ¾a umieszczeni w ci ¾agu przed dzie´cmi, a w post-
…ksowym - po dzieciach.
Cwiczenie 14.´ Traktuj ¾ac drzewa ukorzenione z ´cwicze´n 12 i 13 jako drzewa uporz ¾adkowane (kolejno´s´c dzieci alfabetyczna), uporz ¾adkowa´c ich wierzcho÷ki w porz ¾adku pre…ksowym i post-
…ksowym.
Aby uzyska´c algorytm porz ¾adkowania wierzcho÷ków grafu spójnego musimy po÷¾aczy´c algo- rytm tworzenia drzewa przeszukiwania w g÷¾ab (algorytm Drzewo w wersji z ´cwiczenia 10) z metod ¾a opisan ¾a powy·zej.
Cwiczenie 15.´ Napisa´c algorytmy porz ¾adkowania wierzcho÷ków grafu spójnego w porz ¾adku preorder i w porz ¾adku postorder (u·zy´c pseudokodu lub jakiegokolwiek j ¾ezyka programowania).
Drzewo ukorzenione, w którym ka·zdy wierzcho÷ek ma co najwy·zej dwóch synów nazywamy drzewem binarnym. Je·zeli dla pewnej liczby naturalnej m, ka·zdy wierzcho÷ek ma co na- jwy·zej m synów, to drzewo nazywamy m-arnym. Drzewa binarne odgrywaj ¾a szczególnie du·z ¾a rol ¾e w zastosowaniach. Uporz ¾adkowane drzewa binarne s ¾a de…niowane w specy-
…czny sposób. Dla ustalonego wierzcho÷ka a, zbiór jego dzieci ma 1 lub 2 elementy (o ile jest niepusty). Zamiast wprowadza´c liniowy porz ¾adek w tym zbiorze, jego elementom przypisu- jemy warto´sci 0 lub 1 (w sposób ró·znowarto´sciowy). Dziecko, któremu przypisano warto´s´c 0 nazywamy dzieckiem lewym, za´s warto´s´c 1 - dzieckiem prawym. Oznacza to, ·ze poni·zsze rysunki reprezentuj ¾a ró·zne uporz ¾adkowania drzewa binarnego o korzeniu r.
Dla drzew binarnych mo·zna wprowadzi´c jeszcze jedn ¾a metod ¾e porz ¾adkowania wierzcho÷ków.
Porz ¾adek in…ksowy (inorder).
Wierzcho÷ek wstawiamy do ci ¾agu mi ¾edzy lewym a prawym dzieckiem.
Dla grafów z ostatniego rysunku mamy:
lewy graf: c; a; d; r; e; b;
prawy graf: c; a; d; r; b; e.
Wró´cmy do de…nicji drzewa z wyró·znionym korzeniem. Zauwa·zmy, ·ze traktuj ¾ac ojca jako pocz ¾atek, a syna jako koniec kraw¾edzi, przekszta÷camy drzewo ukorzenione (T; r) w graf skierowany eT. Dok÷adniej de…niujemy eT przyjmuj ¾ac VTe = VT oraz
ETe =f(a; b) ; a; b 2 VT ^ a jest ojcem bg .
Otrzymany w ten sposób graf skierowany nazywamy drzewem skierowanym z wyró·znionym korzeniem.
(T; r) Te
Wierzcho÷ek a grafu skierowanego nazywamy ´zród÷emtego grafu je´sli indeg (a) = 0, nato- miast uj´sciem je´sli outdeg (a) = 0. Z w÷asno´sci 1 wynika natychmiast, ·ze w drzewie uko- rzenionionym skierowanym eT, korze´n jest jedynym ´zród÷em.
W dalszej cz ¾e´sci wyk÷adu przyda si ¾e kryterium pozwalaj ¾ace rozstrzygn ¾a´c czy graf skierowany jest drzewem ukorzenionym.
Twierdzenie 2. Graf skierowany G jest drzewem skierowanym z korzeniem r wtedy i tylko wtedy, gdy jego szkielet GN jest spójny oraz
(1) indeg (r) = 0 i indeg (a) = 1 dla a6= r.
Dowód. " ) " Za÷ó·zmy, ·ze graf skierowany G jest drzewem skierowanym generowanym przez drzewo ukorzenione (T; r). Z de…nicji drzewa skierowanego oraz szkieletu wynika, ·ze VT = VG = VGN. Z w÷asno´sci 2 wnioskujemy, ·ze je´sli (a; b) 2 EG, to (b; a) =2 EG i w konsekwencji szkielet GN nie ma kraw¾edzi wielokrotnych. Korzystaj ¾ac ponownie z w÷asno´sci 2, dla dowolnych wierzcho÷ków a, b mamy
fa; bg 2 EGN , (a; b) 2 EG_ (b; a) 2 EG
, b jest ojcem a w T _ a jest ojcem b w T , fa; bg 2 ET.
Oznacza to, ·ze GN = T, czyli graf GN jest spójny. Warunek (1) wynika z w÷asno´sci 1, bo
indeg (a) =jfx; (x; a) 2 EGgj = jfx; x jest ojcem a w T gj =
( 0 ; a = r 1 ; a6= r :
"( " Za÷ó·zmy, ·ze G jest grafem skierowanym o spójnym szkielecie spe÷niaj ¾acym (1). Z Lematu o u´sciskach d÷oni dla grafów skierowanych mamy
jEGNj = jEGj = X
a2VG
indeg a =X
a6=r
1 = jVGj 1 = jVGNj 1.
Wobec spójno´sci GN, z twierdzenia ?? wynika, ·ze GN jest drzewem. Aby zako´nczy´c dowód wystarczy pokaza´c, ·ze drzewo ukorzenione (GN; r)generuje graf skierowany G, tzn.
(2) (a; b)2 EG , a jest ojcem b w (GN; r). Udowodnimy najpierw, ·ze
(3) je·zeli a jest ojcem b w (GN; r), to (a; b) 2 EG.
Przypu´s´cmy nie wprost, ·ze tak nie jest, tzn. istniej ¾a wierzcho÷ki a, b takie, ·ze a jest ojcem b oraz (a; b) =2 EG.
W´sród wszystkich par wierzcho÷ków o tej w÷asno´sci wybierzmy a0, b0, dla których a0 le·zy na poziomie o najmniejszym mo·zliwym numerze k. Z za÷o·zenia dostajemy (a0; b0) =2 EG, fa0; b0g 2 EGN i w konsekwencji (b0; a0)2 EG.
Rozpatrzmy przypadki k = 0, tzn. a0 = r.
Wtedy (b0; r)2 EG, co jest sprzeczne z za÷o·zeniem indeg (r) = 0.
k > 0.
Wtedy a0 ma na poziomie k 1ojca c. Z minimalno´sci k wynika, ·ze (c; a0)2 EG.
Poniewa·z a0 jest ojcem b0, wi ¾ec b0 le·zy na poziomie k +1, czyli c 6= b0. St ¾ad indeg a0
2 > 1, co jest sprzeczne z za÷o·zeniem. Otrzymane sprzeczno´sci dowodz ¾a implikacji (3).
Udowodnimy teraz implikacj ¾e przeciwn ¾a:
(4) je·zeli (a; b) 2 EG, to a jest ojcem b w (GN; r).
Za÷ó·zmy, ·ze (a; b) 2 EG i przypu´s´cmy nie wprost, ·ze a nie jest ojcem b. Poniewa·z fa; bg 2 EGN, wi ¾ec na podstawie w÷asno´sci 2, b jest ojcem a. Zatem z (3) wynika, ze (b; a) 2 E· G i w konsekwencji wierzcho÷ki a i b s ¾a w gra…e nieskierowanym GN
po÷¾aczone dwiema kraw¾edziami. Jest to sprzeczne z acykliczno´sci ¾a GN. Otrzymana sprzeczno´s´c dowodzi (4). Z (3) i (4) wynika (2), co ko´nczy dowód twierdzenia.
Niech (T; r) b ¾edzie drzewem z wyró·znionym korzeniem. Z w÷asno´sci 1 wynika, ·ze r nie ma poprzednika (ojca), natomiast wszystkie wierzcho÷ki a 6= r maj ¾a dok÷adnie jednego poprzed- nika (ojca). Mo·zemy wi ¾ec na VT zde…niowa´c funkcj ¾e przyjmuj ¾ac:
p (a) =
( poprzednik a gdy a 6= r;
; gdy a = r:
Funkcj ¾e p nazywamy wektorem poprzedników drzewa ukorzenionego (T; r) i cz ¾esto za- pisujemy w postaci [p (a)]a2V
T. Je´sli wierzcho÷ki drzewa T ustawimy w ci ¾ag VT =fx1; x2; : : : ; xng, to funkcja p jest wyznaczona przez wektor
[p (x1) ; p (x2) ; : : : ; p (xn)]
i mo·zemy j ¾a z tym wektorem uto·zsamia´c.
Je·zeli (T; r) jest drzewem ukorzenionym, to w T mo·zemy wprowadzi´c strukur ¾e grafu skierowanego. De…nicj ¾e wektora poprzedników stosuje si ¾e równie·z w tym przypadku, tzn.
dla skierowanych drzew z wyró·znionym korzeniem. Sytuacja taka jest nawet ÷atwiejsza do opisania bo mamy wtedy
p (b) = a, (a; b) 2 ET:
Zauwa·zmy jeszcze, ·ze przy ustalonym zbiorze wierzcho÷ków V , wektor poprzedników p drzewa (skierowanego) T z korzeniem r jednoznacznie okre´sla to drzewo. Korze´n r jest bowiem jedynym elementem zbioru fa 2 V ; p (a) = ;g oraz
ET =f(a; b) ; (a; b) 2 ETg = f(a; b) ; p (b) = a 2 V g = f(p (b) ; b) ; p (b) 6= ;g ;
czyli zbiór kraw¾edzi ET mo·zna wyznaczy´c znaj ¾ac funkcj ¾e p. Oczywi´scie, podobna zale·zno´s´c zachodzi te·z dla drzew ukorzenionych nieskierowanych. Wektor poprzedników stanowi za- tem reprezentacj ¾e analityczn ¾a drzewa ukorzenionego. Reprezentacja ta jest wygodniejsza ni·z rozwa·zane wcze´sniej macierze s ¾asiedztwa i incydencji, listy s ¾asiedztw, czy kody Prüfera. Co wi ¾ecej, równie·z drzewo wolne mo·zna zapisa´c za pomoc ¾a wektora poprzedników. W tym celu wystarczy wyró·zni´c jakikolwiek wierzcho÷ek jako korze´n.
Cwiczenie 16.´ Znale´z´c wektor poprzedników dla nast ¾epuj ¾acych drzew ukorzenionych (kole- jno´s´c wierzcho÷ków alfabetyczna)
1) 2) 3)
4) 5)
Cwiczenie 17.´ Wyznaczczy´c drzewo ukorzenione (T; r) o zbiorze wierzcho÷ków V = f1; : : : ; ng oraz wektorze poprzedników p.
(1) p = [4; 4; 6; 6; ;; 5].
(2) p = [;; 1; 1; 1; 2; 2; 4; 4; 7; 9].
(3) p = [;; 1; 2; 3; 3; 3; 1; 7; 7; 9; 9; 1].
(4) p = [7; 9; 7; 11; 10; 10; ;; 1; 1; 7; 10; 9].
(5) p = [2; 3; 13; 6; 6; 12; 10; 10; 10; 11; 12; 13; 14; ;].
Cwiczenie 18.´ Znale´z´c wektory poprzedników drzew z ´cwiczenia ?? przyjmuj ¾ac r = 2 oraz r = 5 (kolejno´s´c wierzcho÷ków rosn ¾aca).
Niech a b ¾edzie ustalonym wierzcho÷kiem drzewa ukorzenionego (T; r) (nieskierowanego). W T istnieje dok÷adnie jedna ´scie·zka prosta z a do r. Znaj ¾ac wektor poprzedników p, mo·zemy
÷atwo t ¾e ´scie·zk¾e wyznaczy´c. Ma on posta´c:
a p (a) p (p (a)) : : : Mo·zna to zapisa´c przy pomocy nast ¾epuj ¾acego algorytmu.
Path(p; a)
x := a % bie·z ¾acy wierzcho÷ek
d := a % zbudowana ´scie·zka
while p (x) 6= ; do d := dfx; p (x)g p (x) x := p (x)
Wynikiem dzia÷ania procedury Path jest ´scie·zka prosta d z wierzcho÷ka a do korzenia r.
Procedur ¾e mo·zna te·z wykorzysta´c do szukania ´scie·zki prostej z korzenia do wierzcho÷ka a (równie·z dla drzew skierowanych). Nale·zy jedynie zapisa´c wierzcho÷ki ´scie·zki d w odwrotnej kolejno´sci.
Cwiczenie 19.´ Znale´z´c ´scie·zk ¾e prost ¾a z wierzcho÷ka a do korzenia dla drzew, których wektor poprzedników jest równy p. Zak÷adamy, ·ze V = f1; : : : ; ng.
(1) p = [;; 1; 1; 1; 2; 2; 4; 4; 7; 9], a = 5.
(2) p = [;; 1; 1; 1; 2; 2; 4; 4; 7; 9], a = 10.
(3) p = [;; 1; 2; 3; 3; 3; 1; 7; 7; 9; 9; 1], a = 5.
(4) p = [;; 1; 2; 3; 3; 3; 1; 7; 7; 9; 9; 1], a = 10.
(5) p = [2; 3; 13; 6; 6; 12; 10; 10; 10; 11; 12; 13; 14; ;], a = 5.
(6) p = [2; 3; 13; 6; 6; 12; 10; 10; 10; 11; 12; 13; 14; ;], a = 10.
Poj ¾ecie wektora poprzedników mo·zna rozszerzy´c na dowolne proste grafy skierowane. Za-
÷ó·zmy, ·ze G = (V; E) jest prostym grafem skierowanym oraz r ustalonym wierzcho÷kiem.
Funkcj ¾e p = [p (a)]a2V tak ¾a, ·ze p (r) = ; oraz dla a 2 V n frg zachodzi (p (a) ; a)2 E lub p (a) = ;
nazywamy wektorem poprzedników w G. Oznaczmy
Vp =fa; p (a) 6= ;g [ frg oraz Ep =f(p (a) ; a) ; p (a) 6= ;g :
Para (Vp; Ep)mo·ze, ale nie musi by´c podgrafem grafu G. Je´sli Gp = (Vp; Ep) jest podgrafem, to nazywamy go podgrafem poprzedników.
Rozwa·zmy graf skierowany G
Dla r = 1 funkcje p1 = [;; 1; 2; 1; 4], p2 = [;; 1; 4; 2; ;], p3 = [;; 4; 2; 2; ;] s ¾a wektorami poprzedników. Odpowiadaj ¾a im grafy poprzedników, z których dwa pierwsze s ¾a drzewami skierowanymi o korzeniu 1, za´s trzeci jest grafem skierowanym, ale nie jest drzewem skierowanym.
Podobnie dla r = 2 funkcja p = [;; ;; 2; 2; ;] jest wektorem poprzedników, dla którego graf poprzedników jest drzewem skierowanym o korzeniu 2.
Przyjmuj ¾ac natomiast r = 1 oraz p = [;; ;; 2; 2; ;] dostajemy wektor poprzedników taki, ·ze Vp =f1; 3; 4g, Ep =f(2; 3) ; (2; 4)g. Para (Vp; Ep) nie jest wi ¾ec grafem, bo 2 =2 Vp.