Professional Documents
Culture Documents
T. Cormen, C. Leiserson, R. Rivest - Wprowadzenie Do Algorytmów
T. Cormen, C. Leiserson, R. Rivest - Wprowadzenie Do Algorytmów
Wydanie czwarte
Wydawnictwa Naukowo-Techniczne
Warszawa
Dane o oryginale:
ISBN 83-204-266~
Spistreści
Przedmowa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . • . . . . . . 13
3. Sumy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3.1. Wzory i dotyC"Z\(Zsum ...............................
własności . 64
3.2. Szacowanie wartości sum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . 68
4. Rekurencje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.1. Metoda podstawiania ........................................ . 78
4.2. Metoda iteracyjna .......................................... . 82
4.3. Metoda rekurencji uniwersalnej ................................ . 86
* 4.4. Dowód twierdzenia o rekurencji uniwersalnej . . . . . . . . . . . . . . . . . . . .... . 89
4.4.1. Dowód dla dokładnych potęg .................................. . 90
4.4.2. Części całkowite liczb ........................................ . 96
5
SPIS TRESCI
6
SP1STRE$CI
7
SPIS TRE$CI
8
SPIS TRE$CI
9
$PIS TREŚCI
Al- ...
34. Wyszukiwanie wzorca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 956
34.1. go „naiwny wyszu !ci'wania wzorca ......................... . 958
34.2. Algorytm Rabina-Karpa ..................................... . 960
34.3. Wyszukiwanie wzorca z wykorzystaniem automatów skończonych ........ . 965
34.4. Algorytm Knutha-Morri.sa-Pratta ............................... . 972
* 34.5. Algorytm Boyera-Moore'a .................................... . 980
10
SPIS TRE$CI
Do wykładowcy
Książka jest uniwersalna. Może być wykorzystana do wykładów z algorytmów
i struktur danych na różnym poziomie zaawansowania. Ponieważ zawarliśmy
w niej macznie więcej materiału niż to konieczne do semestralnego wykładu,
można ją traktować jak „worek", z którego wybiera się to, co akurat najbar-
dziej pasuje do danego wykładu.
Najlepiej przygotować zajęcia ze studentami według wcześniej wybranych
rozdziałów. Treść rozdziałów jest w dużym stopniu niezależna, a więc nie
powinno być z tym problemów. Złożoność materiału przedstawionego w każ
dym rozdziale jest stopniowana - od problemów mało skomplikowanych do
bardziej skomplikowanych. Na wykładach dla początkujących można korzy-
stać jedynie z pierwszych podrozdziałów każdego rozdziału, a na zajęciach
13
PRZEDMOWA
Do studenta
Mamy nadzieję, że książka ta łagodnie wprowadzi Cię w problemy dotyczące
algorytmiki. Staraliśmy się, aby każdy algorytm był zrozumiały i interesujący.
Każdy krok algorytmu jest opisany tak, abyś nie miał kłopotów ze zgłębieniem
skomplikowanej strok.tury całego algorytmu. Przedstawiamy też aparat mate-
matyczny potrzebny do analizy algorytmów. Jeśli masz już pewne doświadcze
nie w tej dziedzinie, możesz pominąć początkowe rozdziały.
Książka jest dosyć obszerna, a wykład będzie prawdopodobnie obejmował
tylko część zawartego w niej materiału. Chcieliśmy jednak., aby spełniała funk-
cję swego rodzaju encyklopedii przydatnej potem w pracy zawodowej.
Czego wymagamy od czytelnika?
• Powinien mieć pewne doświadczenie programistyczne. W szczególności po-
winien wiedzieć, na czym polega rekursja, i znać elementarne struktury da-
nych, takie jak. tablice i listy.
• Powinien umieć przeprowadzać dowody przez indukcję matematyczną. Nie-
które części książki wymagają elementarnej znajomości analizy matema-
tycznej. W części I zawarliśmy jednak. cały potrzebny tu materiał mate-
matyczny.
14
PRZEDMOWA
Błędy
algorithms@theory .lcs.mit.edu,
pisząc w nagłówku listu Subject: help. Od razu zastrugamy się, że nie jesteśmy
w stanie odpowiedzieć na wszystkie listy osobiście.
Podziękowania
15
PRZEDMOWA
16
PRZEDMOWA
Wstęp
1.1. Algorytmy
Nieformalnie, algorytm jest pewną. ściśle określoną procedurą. obliczeniową,
która dla właściwych danych wejściowych „produkuje" żądane dane wyjściowe
zwane wynikiem działania algorytmu. Algorytm jest więc ciągiem kroków obli-
czeniowych prowadzących do przekształcania danych wejściowych w wyjściowe.
Algorytm możemy również traktować jako sposób rozwiązania konkret-
nego problemu obliczeniowego. Postawienie problemu polega na sprecyzowaniu
21
ROZDZIAŁ 1. WSTĘP
Dla ciągu wejściowego (31, 41, 59, 26, 41, 58) wynikiem działania algorytmu
sortowania będzie ciąg wyjściowy (26, 31, 41, 41, 58, 59). Taki ciąg wejściowy
jest nazywany „egzemplarzem" problemu sortowania. Ogólnie, egzemplarz
problemu składa się z określonych danych wejściowych spełniających wszyst-
kie warunki podane w opisie problemu.
Sortowanie ma liczne zastosowania w informatyce (w wielu programach
jest wykorzystywane jako krok pośredni), czego rezultatem jest opracowanie
dużej liczby dobrych algorytmów sortujących. Optymalność algorytmu w da-
nym zastosowaniu zależy od liczby sortowanych elementów, stopnia posor-
towania elementów na wejściu oraz rodzaju użytej pamięci: RAM, dysk lub
taśma.
Algorytm jest poprawny, gdy dla każdego egumplam problemu algorytm
zatrzymuje się i daje dobry wynik. Mówimy wtedy, że poprawny algorytm
„rozwiązuje" zadany problem obliczeniowy. Algorytm niepoprawny może się
nigdy nie zatrzymać albo po zatrzymaniu dać zły wynik. Niepoprawne algoryt-
my mogą być jednakże użyteczne, jeśli ich błędne działanie może być kont-
rolowane. Zobaczymy to na przykładzie algorytmów znajdowania dużych liczb
pierwszych, w rozdz. 33. Z reguły jednak: nie będziemy się zajmować algoryt-
mami niepoprawnymi.
Algorytm można przedstawić w postaci programu komputerowego albo
zrealizować sprzętowo. Jedynym wymaganiem jest precyzja opisu wynikającej
z niego procedury obliczeniowej,
W tej książce będziemy przeważnie zapisywać algorytmy w pseudojęzyku
programowania, który jest bardzo podobny do C, Pascala lub Algolu. Jeśli
czytelnik zna któryś z tych języków, to nie powinien mieć trudności w rozumie-
niu nas2:egopseudojęzyka programowania. W takim pseudojęzylru (w odróż
nieniu od „prawdziwych" języków programowania) będziemy używać większej
gamy sposobów do wyrażenia konkretnych kroków algorytmu. Czasami naj-
lepszym sposobem jest wyrażenie czegoś w języku naturalnym; czytelnik: nie
22
1.1. ALGORYTMY
powinien być zatem 7.dziwiony, gdy wewnątrz programu napotka zdania w ję
zyku polskim. Pseudojęzyk różni się też tym od „prawdziwego" języka, że
nie uwzględnia się tu technik programowania. Problemy abstrakcji danych,
modularności i obsługi błędów są często ignorowane w celu uproszczenia opisu
algorytmu.
. .
4
"' " ,o..
••
~
• •.....
•.o, ~
INSERTION-SORT(A)
1 for j +- 2 to length{A]
23
ROZDZIAŁ 1. WSTĘP
2 do key - A[j]
3 t> Wstaw A[j] w posortowany ciąg A[l ..j - I].
4 i+-j-1
5 while i> O i A[i] > key
6 do A[i + I] - A[i]
7 i+-i-1
8 A[i+IJ-key
5 2 4 6 I 3
2 5 4 6 1 3
~
2 4 5 I 3
~
2 4 5 6
9) 3
1 2
~
4 5 6
9)
I 2 3 4 5 6 Posortowane
Rys. 1.2. Działanie procedury INSl\RTION-SoRTdla. tablicy A= (S, 2, 4, 6, I, 3). Pozycja o indeksie
j jest oznaczona kółkiem
24
stosowanie wcięć zamiast normalnych oznaczeń struktury blokowej, takich
jak begin i end, znacznie redukuje liczbę detali, zachowując (a nawet pod-
nosząc) klarowność prezentacji tJ.
2. Konstruktory iteracji while, for i repeat oraz warunkowe if, tb.en i else mają
tutaj tę samą interpretację co w Pascalu.
3. Symbol „t> '' oznacza, że reszta wiersza jest komentarzem.
4. Wielokrotne przypisywanie w formie i+- j +- e oznacza przypisanie zmien-
nym i oraz j wartości wyrażenia e; jest ono równoważne przypisaniu j +- e
łącznie z przypisaniem i+- j.
5. Zmienne (takie jak i,j oraz key) są lokalne w danej procedurze. Nie używa
my zmiennych globalnych bez 2'.B7naczania tego explicite.
6, Dostęp do elementu tablicy odbywa się przez podanie jej nazwy i indeksu
żądanego elementu. Na przykład A[i] jest i-tym elementem tablicy A. Nota-
cja ,, .." służy do wyznaczania podtablicy. Tak więc A[l ..J] jest podtablicą
składającą się z elementów A[l], A[2], ... , A[j].
7. Dane złożone z kilku części są organizowane jako obiekty, składające się
z atrybutów lub pól. Konkretne pole jest podane przez nazwę pola, a następ
nie identyfikator obiektu w nawiasach kwadratowych. Tablica może być na
przykład obiektem z atrybutem /ength mówiącym o liczbie jej elementów.
Aby określić liczbę elementów w tablicy A, piszemy /ength[A]. Sposób
użycia nawiasów kwadratowych będzie zawsze jednoznacznie wynikać
z kontekstu.
Zmienna odpowiadająca tablicy lub obiektowi jest traktowana jako
wskaźnik do danych reprezentujących tę tablicę lub ten obiekt. Dla wszyst-
kich pól/ obiektu x, przypisanie y +- x powoduje/[y) = / [x]. Ponadto jeśli
teraz wykonamy /[x] +- 3, to w następstwie nie tylko f[x] = 3, lecz także
/[y] = 3. Inaczej mówiąc, x i y wskazują na te same obiekty (są tymi samy-
mi obiektami) po przypisaniu y +- x.
Czasami wskaźnik na nic nie wskazuje; ma wtedy specjalną wartość
NIL.
8. Parametry są przekazywane do procedury przez wartość: wywoływana pro-
cedura otrzymuje swoją kopię parametrów, a zmiany wewnętrze tych kopii
nie są widoczne przez program wywołujący. Obiekty są przekazywane przez
wskaźniki do nich. Jeśli na przykład x jest parametrem procedury, to przy-
pisanie x +- y wewnątrz procedury jest niewidoczne na zewnątrz. Jednakże
przypisanie f[x] +- 3 jest widoczne.
1
> W prawdziwych językach programowania zazwyczaj nie używa się samych wcięć do za.
znaczenia struktury blokowej, ponieważ poziomy wcięc są trudne do określenia, kiedy tekst pro-
gramu jest dzielony na strony.
25
ROZDZIAŁ 1. WSTĘP
ZADANIA
1.2. Analizaalgorytmów
Analiza algorytmu polega na określeniu zasobów, jalcie są potrzebne do jego
wykonania. Zasobem zasadniczym jest dla nas czas obliczeń, jednakże innymi
zasobami mogą być: pamięć, szerokość kanału komunikacyjnego lub układy
logiczne. Zwykle analizowanie kilku algorytmów dla tego samego problemu
prowadzi do wyboru najoptymalniejszego z nich.
Przed przeprowadzeniem analizy algorytmu musimy wybrać odpowiedni
model realizowania obliczeń, uwzględniając zasoby dostępne w przyjętej tech-
nologii i ich koszty. W większej części tej książki będziemy przyjmować, że
naszym podstawowym modelem obliczeń jest jednoprocesorowa maszyna o do-
stępie swobodnym do pamięci (w skrócie RAM od ang. Random Access Machi-
ne), a nasze algorytmy są realizowane jako programy komputerowe. W modelu
RAM instrukcje są wykonywane jedna po drugiej (sekwencyjnie). W dalszych
rozdziałach będziemy mieli sposobność badania modeli obliczeń równoległych
(dla komputerów równoległych) oraz modeli dla sprzętowych implementacji
algorytmów.
Czasami zanalizowanie nawet prostego algorytmu może być wyzwaniem.
Trzeba przy tym korzystać z kombinatoryki, rachunku prawdopodobieństwa,
wykazać się sprawnością w obliczeniach algebraicznych czy też umieć ziden-
tyfikować naistotniejsze człony pewnych wzorów. Ponieważ zachowanie się
algorytmu może być różne dla różnych możliwych danych wejściowych, po-
trzebujemy środków do wyrażania tego zachowania w postaci prostych, łat
wych do zrozumienia formul.
26
1.2. ANALIZA ALGORYTMÓW
ii Pojawiają. siętu pewne subtelności. Kroki obliczenia, które wyrażamy w języku natural-
nym, to często odwołania do procedur, których wykonanie może wymagać czasu dłuższego niż
stały. Możemy na przykład powiedzieć „posortuj punk.ty względem x", co, jak. się przekonamy,
zabiera czas dłuższy niż stały. 2'.a.uważmy też, że instrukcja polegające. na wywołaniu procedury
zajmuje czas stały, wykonanie zaś tej procedury może trwać dłużej, tzn. odróżniamy proces wywo-
łania procedury - przekazywania jej parametrów itd. - od procesu wykonywania tej procedury.
27
ROZDZIAŁ 1. WSTĘP
• •
T(n) - c1 n + c2 (n - I)+ c4 (n - I)+ c, L ,,+ c, L (t, - I)
J=2 J=2
•
+ c, L (t, - I) + c,(n - I)
J=2
1
>Nie stosuje się to na przykład do pamięci; instrukcja potrzebująca. m słów pamięci wykony-
wana n razy niekoniecznie potrzebuje w sumie mn słów.
28
1.2. ANALIZA ALGORYTMÓW
Czas działania algorytmu może się jednak różnić nawet dla danych o tym
samym rozmiarze. W procedurze INSERTION-SORTna przykład najlepszy przy-
padek (optymistyczny) występuje wówczas, gdy wejściowa tablica jest już po-
sortowana. Dla każdego j = 2, 3, ... , n stwierdzamy, że A(i] ~ key w wierszu 5,
gdy i ma początkową wartość j - 1. Zatem tj = 1 dla j = 2, 3, ... , n, a minimal-
ny czas działania wynosi
Ij=n(n+ 1) _ 1
J=2 2
a
I (j _ l) = n(n ::- 1)
J.c2 2
(sumami takimi zajmiemy się w rozdz. 3), wnioskujemy zatem, że czas działa
nia procedury INSERTION-SORTwynosi
+ c 6 ( n(n-
2
1))
+ - c7
(n(n -
2
1))
+ c 8 (n - 1)
29
ROZDZIAŁ 1. WSTĘP
30
1 .2. ANALIZA ALGORYTMÓW
ZADANIA
1.2-1. Rozważmy sortowanie n liczb z tablicy A następującą metodą. Znaj-
dujemy najmniejszy element tablicy A i wstawiamy na pierwsze miejsce
w pewnej tablicy B. Następnie znajdujemy drugi najmniejszy element
z A i wstawiamy na drugie miejsce w B. W ten sposób postępujemy dla
wszystkich n elementów tablicy A. Napisz dla tego algorytmu - który jest
znany jako sortowanie przez selekcję - program. Podaj pesymistyczny i op-
tymistyczny czas działania tego algorytmu, używając notacji 0.
1.2-2. Rozważmy znowu wyszukiwanie liniowe (patrz zad. 1.1-3). Ile elemen-
tów ciągu wejściowego trzeba średnio sprawdzić przy szukaniu losowego
elementu w tablicy? Jak to wygląda w przypadku pesymistycznym? Jaki
jest średni i pesymistyczny czas działania tego algorytmu wyrażony za
pomocą notacji 0? Odpowiedź uzasadnij.
1.2-3. Rozważmy problem wykrywania powtarzających się elementów w ciągu
n liczb (x 1, x 2 , ... , xn>·Pokaż, że można rozwiązać ten problem w czasie
0(nlgn), gdzie lgn oznacza log 2 n.
1.2-4. Rozważmy problem obliczania wartości wielomianów. Mamy danych
n współczynników a0 , a 1 , ... , 0 11_ 1 i liczbę rzeczywistą x, chcemy obliczyć
·-'
L a1x 1• Opisz bezpośredni algorytm rozwiązujący ten problem w czasie
j=O
0(n 2). Opisz algorytm działający w czasie @(n), w którym do obliczania
wielomianów jest zastosowana następująca metoda (zwana metodą Ho-
mera):
·-'
L a1x 1 = (...(a11_ 1x + a 11_ 2 )x + ...+ a 1)x + a0
i=O
1.2-6. Jak zmodyfikować (prawie każdy) algorytm, aby polepszyć jego czas
działania w przypadku optymistycznym?
1.3. Projektowanie
algorytmów
Jest wiele podejść do projektowania algorytmu. W sortowaniu przez wstawia-
nie stosuje się metodę przyrostową: mając posortowaną podtablicę A[l „j - 1],
wstawiamy pojedynczy element A[j] we właściwe miejsce, otrzymując większą
posortowaną podtablicę A[l „j].
W tym podrozdziale rozważamy inną metodę, zwaną „dziel i zwyciężaj"
(ang. divide-and-conquer).Użyjemy tej metody do zaprojektowania algorytmu
sortowania znacznie szybszego niż sortowanie przez wstawianie. Jedną z zalet
algorytmu zaprojektowanego w stylu „dziel i zwyciężaj" jest możliwość szaco-
wania czasu działania przy wykorzystaniu metod, które będą wprowadzone
w rozdz. 4.
32
1.3. PROJEKTOWANIE ALGORYTMÓW
MERGE-SORT(A,p, r)
1 ifp<r
2 + r)/2J
tben q ~ L<P
3 MERGE-SoRT(A, p, q)
4 MERGE-SoRT(A, q + l, r)
5 MERGE(A, p, q, r)
Aby posortować cały ciąg A - (A[l], A[2], ... , A[n]), wywołujemy procedurę
MERGE-SORT(A, 1, length[A]), gdzie length[A] =n.Patrząc na drzewo wywo-
łań rekurencyjnych od dołu (gdy n jest potęgą dwójki), widzimy, że algorytm
najpierw sortuje pojedyncze ciągi w ciągi 2-elementowe, następnie 2-elemen-
n Zapis rxl oznacza najmniejszą liczbę całkowitą nie mniejszą niż x, natomiast LxJ oznacza
największą liczbę całkowitą nie większą niż x. Notacja ta jest zdefiniowana również w ro?.dz. 2.
33
ROZDZIAŁ 1. WSTĘP
Qąg posortowany
lt·.,:.'._,:.,,.,..:•:;,•,12:"···--k,'",.
., . . .. .
' i>,,
~
.. ',·.•. ' $ '
""' ,-. ,'
t'I
Scal
/ '
Sca)
' '
/&,,,
12'..1 I I• 6j 11 .,al I2 •I
/s.v\ /Scal\ /Scal\ /Scal\
[il [1J 0 [!l [il [Il @ [il
Qąg początkowy
Rys. 1.3. Operacja sortowania przez roilanie tablicy A= (5, 2, 4, 6, I, 3, 2, 6). Długości posortowa~
nych ciągów wzrastają w miarę posuwania się algorytmu „w górę"
Dziel: Podczas tego etapu znajdujemy środek przedziału, co zajmuje czas sta-
ły. Zatem D(n) = 0(1).
Zwyciężaj: Rozwiązujemy rekurencyjnie dwa pod.problemy, każdy rozmiaru
n/2, co daje w sumie czas działania 2T{n/2).
Połącz: Jak to już poprzednio stwierdziliśmy, procedura MERGB działa
w czasie 0(n), a więc C(n) = 0(n).
jeśli n= I
T(n) = {®(!),
2T(n/2) + 0(n), jeśli n> 1
2, jeśli n = 2,
T(n) ={
2T(n/2) + n, jeśli n=2k, k>l
35
ROZDZIAŁ 1. WSTĘP
1.4. Podsumowanie
Dobry algorytm jest jak „ostry nóż" - robi dokładnie to, co ma robić, z naj-
mniejszym wysiłkiem. Używanie złego algorytm.u to jak „krajanie stek.u kor-
kociągiem". Rezultat może nie być ani efektywny, ani „apetyczny".
Algorytmy służące do rozwiązania tego samego problemu mogą się zna-
cząco różnić efektywnością. Różnice te mogą być większe niż różnica między
komputerem osobistym i „superkomputerem". Dla przykładu rozważmy sytu-
ację, gdy na superkomputerze zastosowano algorytm sortowania przez wsta-
wianie, a na małym komputerze osobistym - algorytm sortowania przez scala-
nie. W obu wypadkach należy posortować tablicę zawierającą milion elemen-
tów. Załóżmy, że superkomputer wykonuje 100milionów operacji na sekundę,
podczas gdy komputer osobisty wykonuje w tym czasie tylko milion operacji.
Aby różnica była jeszcze bardziej widoczna, załóżmy, że sortowanie przez
wstawianie jest zaprogramowane przez niezwykle dobrego programistę i wyni-
kowy program wykonuje 2n2 operacji superkomputera, aby posortować
n liczb. Natomiast sortowanie przez scalanie jest zaprogramowane w ten spo-
sób, że wynikowy program wykonuje 50n lg n operacji. Aby posortować miHon
liczb, superkomputer potrzebuje czasu
2 · (106 ) 2 instrukcji .
, . uk .. -ek-d··· - 20000 sekund s; 5,56 godzin
10 mstr CJl1s un ę
36
PROBLEMY
Używając algorytmu, którego czas działania jest opisany funkcją niższego rzę
du, napisanego nawet przez słabszego programistę, komputer osobisty działa
20 razy szybciej niż superkomputer!
Przykład ten świadczy o tym, że szybkość działania algorytmu jest co naj-
mniej równie istotna jak szybkość działania komputera. Całkowity czas za.leży
zarówno od wyboru dobrego algorytmu, jak i dobrego komputera. Dlatego
właśnie, podobnie do rozwoju nowych technologii, można za.obserwować
gwałtowny rozwój algorytmiki.
ZADANIA
1.4-1. Załóimy, że porównujemy implementację sortowania przez scalanie
i sortowania przez wstawianie na tym samym komputerze. Dla danych
wejściowych ro2'llliaru n sortowanie przez wstawianie działa w czasie 8n2 ,
podczas gdy sortowanie przez scalanie działa w czasie 64nlg n. Dla jak.ich
wartości n sortowanie przez scalanie jest lepsze niż sortowanie przez wsta-
wianie? Jak można 2'lllodyfikować program sortowania przez scalanie, aby
działał szybciej dla małych danych?
1.4-2. Jak.a jest najmniejsza wartość n, dla której algorytm wykonujący 100n2
operacji działa szybciej niż algorytm wykonujący 2n operacji na tym sa-
mym komputerze?
Problemy
1~1. Porównanie czasów działania
Dla funkcji/(n) i czasu t z poniższej tabeli wyznacz największy ro2'llliar n prob-
lemu, który może być rozwiązany w czasie t, zakładając, że algorytm działa
w ciąguf(n) mikrosekund.
t I I I I I 1 1
• . .
J sekunda rrnn. godz. dzień mtestąc rok wiek
lgn
.fi,
n
nlgn
+
_j.
n'
n'
2"
n! I I •
I I I
ROZDZIAŁ 1. WSTĘP
1-2. Sortowanie przez wstawianie dla małych tablic podczas sortowania przez
scalanie
Pomimo że sortowanie przez scalanie działa w czasie 0{nlgn), natomiast sor-
towanie przez wstawianie działa w czasie 0(n 2 ), stałe czynniki w sortowaniu
przez wstawianie czynią ten algorytm szybszym dla małych n. Zatem ma sens
korzystanie z sortowania przez wstawianie podczas sortowania przez scalanie,
kiedy rozmiar danych jest mały. Rozważmy modyfikację sortowania przez sca-
lanie, w której n/k podlist rozmiaru k sortujemy, używając sortowania przez
wstawianie, a następnie używamy mechanizmu scalania, gdzie k jest wartością,
którą należy wyznaczyć.
(a) Pokaż, że n/k pod.list, każda długości k, może być posortowanych za po-
mocą sortowania przez wstawianie w czasie E>(nk).
(b) Pokaż, że podlisty mogą być scalone w czasie E>(nlg(n/k)).
(c) Zakładając, rezmodyfikowany algorytm działa w czasie 6(nk + n lg(n/k)),
podaj, jaki jest maksymalny rząd wartości k jako funkcji zależnej od n, dla
którego zmodyfikowany algorytm ma ten sam rząd złożoności co normal-
ne sortowanie przez scalanie?
(d) Jakie k wybrać w praktyce?
1-3. Inwersje
Niech A[l .. n] będzie tablicą zawierającą n różnych liczb. Jeśli i <j oraz
A[i] > A[J], to para (i, 1) jest nazywana inwersją A.
(a) Wypisz pięć inwersji tablicy (2, 3, 8, 6, 1).
(b) Jaka tablica n-elementowa ma najwięcej inwersji? Ile ich jest?
(c) Jaka jest relacja między czasem działania sortowania przez wstawianie
i liczbą inwersji sortowanej tablicy? Opowiedź uzasadnij.
(d) Podaj algorytm wyznaczający liczbę inwersji permutacji n-elementowej
w czasie E>(nlgn) (Wskazówka: Zmodyfikuj sortowanie przez scalanie).
Uwagi do rozdziału
Jest wiele doskonałych książek o algorytmach, których autorami są między
innymi Aho, Hopcroft i Ullman [4, 5], Baase [14], Brassard i Bratley [33],
Horowitz i Sahni [105], Knuth [121, 122, 123], Manber [142], Mehlhorn [144,
145, 146], Purdom i Brown [164], Reingold, Nievergelt i Deo [167], Sedge-
wick [175] i Wilf [201].
Niektóre aspekty praktyczne są dyskutowane w książkach Bentleya [24,
25] i Gonneta [90].
W 1968 r. K.nuth opublikował pierwszy z trzech tomów książki The Art of
Computer Programming [121, 122, 123]. Pierwszy z nich był wstępem do al-
38
UWAGI DO ROZDZIAŁU
Podstawow
aparatmatematycz
Wprowadzenie
Analiza algorytmów wymaga często użycia aparatu matematycznego. Może
wystarczyć tylko znajomość algebry na poziomie szkoły średniej, ale może
zdarzyć się i tak, że trzeba będzie się wykazać umiejętnością rozwiązywania
równań rekurencyjnych. Ta część książki stanowi kompendium metod i narzę
dzi, które będziemy stosować w analizie algorytmów. Jest pomyślana tak, aby
można się było do niej odwoływać w dalszych partiach książki. Niektóre tema-
ty są omówione dość szczegółowo.
Radzimy czytelnikowi, aby nie starał się zgłębić całego materiału matema-
tycznego od razu. Uważamy, że lepiej będzie, jeśli najpierw pobieżnie zapozna
się z zawartością rozdziałów tej części książki, po czym przejdzie do rozdziałów
poświęconych algorytmom. Po przeczytaniu ich może wrócić do tej części,
kiedy tylko dojdzie do wniosku, że powinien lepiej zrozumieć stosowane narzę
dzia matematyczne.
Rozdział 2 zawiera dokładne definicje kilku notacji asymptotycznych
(przykładem jest notacja 0, o której była już mowa w rozdz. I). Naszym celem
jest tutaj nauczyć czytelnika posługiwania się notacją używaną w książce, a nie
rozumienia nowych koncepcji matematycznych.
Rozdział 3 dotyczy metod obliczania i szacowania sum, z czego często się
korzysta w analizie algorytmów. Wiele przedstawionych tu wzorów można
znaleźć w książkach z analizy matematycznej, ale wygodnie jest mieć je zgro-
madzone w jednym miejscu.
Metody rozwiązywania równań rekurencyjnych, które stosowaliśmy do
analizy sortowania przez scalanie w rozdz. 1, są tematem rozdz. 4. Jedną ze
skuteczniejszych metod jest tzw. ,,metoda rekurencji uniwersalnej", która mo-
że być użyta w rekurencjach powstających w algorytmach typu „dziel i zwycię
żaj". Znaczna część rozdz. 4 jest poświęcona dowodowi poprawności tej meto-
dy, chociaż dowód można pominąć.
42
WPROWADZENIE
Rzędy wielkości
funkcji
Na podstawie rzędu wielkości funkcji, za pomocą której opisuje się czas działa
nia algorytmu (o czym wspominaliśmy w rozdz. 1), można scharakteryzować
efektywność algorytmu i porównać złożoność dwóch różnych algorytmów.
Gdy na przykład rozmiar danych wejściowych n staje się bardzo duży sortowa-
nie przez scalanie, które działa w czasie pesymistycznym 9(nlgn), ,,wygrywa"
z sortowaniem przez wstawianie, którego pesymistyczny czas działania wynosi
9(n 2). Chociaż niekiedy możemy wyznllC"LyĆ dokładnie czas działania algoryt-
mu, jak na przykład w sortowaniu przez wstawianie w rozdz. I, jednak taka
dokładność często jest niepotrzebna, a jej osiągnięcie zbyt pracochłonne. Dla
dostatecznie dużych danych wejściowych stałe współczynniki i mniej znaczące
składniki we wzorze na czas działania są zdominowane przez rozmiar samych
tych danych.
Kiedy dla dostatecznie dużych danych wejściowych liczymy jedynie rząd
wielkości czasu działania algorytmu, wtedy zajmujemy się asymptotyczną zło
żonością algorytmów. Oznacza to, że interesuje nas, jak szybko wzrasta czas
działania algorytmu, gdy rozmiar danych dąży do nieskończoności. Zazwyczaj
dla dostatecznie dużych danych najlepszy jest algorytm asymptotycznie bar-
dziej efektywny.
W tym ro:zdziale pokażemy kilka standardowych metod upraszczania ana-
lizy asymptotycznej algorytmów. Rozpoczniemy od podania definicji kilku ty-
pów „notacji asymptotycznej", której przykład zaprezentowaliśmy, wspomina-
jąc o notacji 0. Następnie pr7.edstawimy podstawowe notacje oraz zbadamy
zachowanie się funkcji często występujących w analizie algorytmów.
44
2.1. NOTACJA ASYMPTOTYCZNA
2.1. Notacjaasymptotyczna
W notacji używanej do opisu asymptotycznego czasu działania algorytmów
korzysta się z funkcji, których zbiorem argumentów jest zbiór liczb natural-
nych N= {O, 1, 2, ... }. Notacja taka jest użyteczna przy opisie pesymistycznego
czasu działania T(n), który zazwyczaj jest funkcją ro11Diaru danych wejścio
wych, będąc.ego liczbą naturalną. Czasami jednak wygodna jest pewna modyfi-
kacja, na przykład rozszerzenie podobnej notacji na zbiór liczb rzeczywistych.
Niemniej jednak istotne jest, aby modyfikacja notacji nie prowadziła do straty
precyzji. W podrozdziale tym defmiujemy podstawowe notacje asymptotyczne,
a także wprowadzamy kilka ich modyfikacji.
Notacja 0
W rozdziale 1 stwierdziliśmy, że pesymistyczny czas działania algorytmu sor-
towania przez wstawianie wynosi T(n) = 0(n 2). Zdefmiujmy formalnie, co to
oznacza.
Dla danej funkcji g(n) oznaczamy przez 0(g(n)) zbiór funkcji
45
ROZDZIAŁ 2. RZĘDY WIELK0$CI FUNKCJI
cg(n)
/(n)
f(n)
/(n)
I cg(n)
c:__;______ ,
'o '------'-------
'o
'
,,,
/(n)= 8{g(n)) /(n)= O(g(n))
(b)
no /(n)""
(c)
O(g(n))
Rys. 2.1. Graficzne przykłady notacji 0, O i n. Poks:zana w lrażdej części wartość n0 jest minimalną.
możliwą. wartością; każda większa wartość jest również dobra. (a) Za pomocą notacji 0 szacuje się
funkcję z dokładnością do stałego współczynnika. Pisz.emy /(n) = 0(g(n)), jeśli istnieją dodatnie
stałe n0 , c1 i c1 talcie, że na prawo od n0 wartość/(n) leży zawsze między c 1g(n) i c1g(n). (b) Notacja
O daje górne ograniczenie funkcji z dokładnością do stałego współczynnika. Pisz.emy
f(n) .., O(g(n)), jeśli istnieją dodatnie stale n0 i c takie, że na prawo od n0 wartość /(n) jest nie
większa niż cg(n). (c) Notacja n
daje dolne ograniczenie funkcji z dokładnością do stałego współ
czynnika. Piszemy /(n) = O(g(n)), jeili istnieją dodatnie stałe n0 i c takie, 2'il na prawo od n0
wartość /(n) jest nie mniejsza niż cg(n)
że -~ n2 - 3n = 0(n 2
). W tym celu musimy znaleźć dodatnie stale c 1 , c2 oraz
n0 takie, że
Prawa strona jest prawdziwa dla każdej wartości n ;;i, 1, gdy wybierzemy
c2 ;;i: 1/2. Podobnie, lewa strona jest prawdziwa dla każdej wartości n ;;i, 7, gdy
wybierzemy c 1 ~ 1/14. Wybierając c1 = 1/14, c2 = 1/2 oraz n 0 = 7, możemy
sprawdzić, że ~ n2 - 3n = 0(n 2
). Z pewnością istnieją inne możliwości wyboru
stałych, ale istotne jest głównie to, że istnieje jakakolwiek możliwość. Zauważ
46
2.1. NOTACJA ASYMPTOTYCZNA
dla każdego wielomianu p(n) = L' a;n\ gdzie a1 są stałymi i a,1> O, mamy
i"' o
p(n) ~ 0(n') (patrz problem 2-1).
Ponieważ każda stała jest wielomianem stopnia O, możemy wyrazić funk-
cję stałą jako 0(n°) lub 0(1). Ta ostatnia notacja formalnie nie jest całkiem
poprawna, gdyż nie bardzo wiemy, co tutaj dąży do nieskończoności 1 l. Będzie
my często używać notacji E>(l) do oznaczenia albo wartości stałej lub funkcji
stałej względem pewnej zmiennej.
Notacja O
Notacja 0 asymptotycznie ogranicza funkcję od góry oraz od dołu. Kiedy
mamy tylko asymptotyczną granicę górną, używamy notacji O. Dla danej funk-
cji g(n) oznaczamy przez O(g(n)) zbiór funkcji
ii Pewnym problemem jest to, że nasza notacja dla funkcji nie odróżnia funkcji od ich warto-
ści. W rachunku A.parametry funkcji są opisane bardziej fonna1nie: funkcja n 2 może być zapisana
jako Ml.n2 albo M'.r1 . Przyjmując bardziej rygorystycmą notację, skomplikowalibyśmy przekształ
cenia algebraiczne, tak więc tolerujemy pewną niezgodność formalizmu.
47
ROZDZIAŁ 2. RZĘDY WIELKOŚCI FUNKCJI
48
2.1. NOTACJA ASYMPTOTYCZNA
Notacja Q
Podobnie jak notacja O określa asymptotyczną granicę górną, notacja n okreś
la asymptotyczną granicę dolną. Dla danej funkcji g(n) oznaczamy przez
O:(g(n))zbiór funkcji
Intuicja związana z notacją O jest pokazana na rys. 2.lc. Dla wszystkich war-
tości n większych od n0 wartość /(n) jest nie mniejsza niż cg(n).
Z definicji dotychczas wprowadzonych notacji asymptotycznych łatwo wy-
kazać słuszność następującego ważnego twierdzenia (patrz zad. 2.1-5).
l'WIERDZENIE2.1.
Dla każdych dwóch funkcji/(•) i g(n) zachodzi zależność/(•) - 0(g(n)) wtedy
i tylko wtedy, gdy f(n) - O(g(n)) if(n) - !l(g(n)).
•
Przykładem zastosowania tego twierdzenia jest fakt, że z dowodu na to, iż
an2 + bn + c = 0(n 2) (gdzie a, b, c są stałymi i a > O), wynika bezpośrednio,
że an 2 + bn + c = O:(n2) oraz an 2 + hn + c = O(n2 ). W praktyce, zamiast ko-
rzystać z twierdzenia 2.1 do uzyskania górnego i dolnego oszacowania z asym-
ptotycznie dokładnych oszacowań, jak to zrobiliśmy w tym przykładzie, za-
zwyczaj używamy go do wykaz.ania istnienia asymptotycznie dok.ładnych gra-
nic na podstawie istnienia asymptotycznej granicy górnej i asymptotycznej gra-
nicy dolnej.
Ponieważ notacja O opisuje granicę dolną, więc używając jej do oszacowa-
nia czasu działania algorytmu dla najlepszego przypadku, szacujemy również
czas działania algorytmu dla wszystkich danych wejściowych. Na przykład czas
działania algorytmu sortowania przez wstawianie dla najlepszego przypadku
wynosi O:(n),z czego wynika, że czas działania tego algorytmu wynosi O:(n).
Czas działania algorytmu sortowania przez wstawianie leży zatem między
.Q(n) a O(n2 ). Ponadto oszacowania te są asymptotycznie najlepsze z możli
wych: na przykład czas działania algorytmu sortowania przez wstawianie nie
wynosi .Q(n2 ), gdyż algorytm ten działa w czasie ®(n), gdy dane są już posorto-
wane. Nie jest jednak sprzecznością powiedzenie, że pesymistyczny czas działa
nia algorytmu sortowania przez wstawianie wynosi O:(n2), ponieważ dla pew-
nych danych wejściowych algorytm ten wymaga czasu O:(n2 ). Gdy mówimy, że
czas działania algorytmu wynosi .Q(g(n)),rozumiemy przez to, że niezależnie od
konkretnych danych wejściowych rozmiaru n czas działania algorytmu dla tych
danych wynosi co najmniej g(n) razy pewna stała, dla dostatecznie dużych n.
49
ROZDZIAŁ 2. RZĘDY WIELKOŚCI FUNKCJI
Widzieliśmy już, jak notacja asymptotyczna może być użyta we wzorach mate-
matycznych. Wprowadzając na przykład notację O napisaliśmy „n = O(n 2 )".
Mogliśmy również napisać 2n 2 + 3n + 1 = 2n 2 + 0(n). Jak interpretujemy
wzory tego typu?
Gdy notacja asymptotyczna występuje po prawej stronie równania, tak jak
w n = O(n 2 ), oznacza to, że zdefmiowaliśmy znak równości jako oznaczenie
przynależności: neO(n 2 ). Jednak.że ogólnie, gdy notacja asymptotyczna poja-
wia się we wzorze, interpretujemy ją jako anonimową. funkcję o pomijalnej
nazwie. Na przykład wzór 2n2 + 3n + 1 = 2n2 + @(n) oznacza, że
2n2 + 3n + l = 2n 2 + f(n), gdzie f(n) jest pewną funkcją należącą do zbioru
0(n). W tym wypadku/(n) = 3n + I, co faktycznie należy do 0(n).
Używając notacji asymptotycznej w ten sposób, eliminujemy nieistotne
detale oraz upraszczamy równanie. W rozdziale 1 na przykład wyraziliśmy
pesymistyczny czas działania algorytmu sortowania przez scalanie jak.o reku-
•
renCJę
•
LO(,)
I= 1
jest tylko jedna funkcja anonimowa (funkcja względem r). Wyrażenie to zatem
nie jest tym samym co 0(1) + 0(2) + ...+ O(n). To ostatnie nie ma jasnej
interpretacji.
W pewnych wypadkach notacja asymptotyczna pojawia się po lewej stro-
nie równania, na przykład
50
2.1. NOTACJA ASYMPTOTYCZNA
2n2 + 3n + I = 2n 2 + 0(n)
- ®(n')
Każde z równań możemy zinterpretować, używając podanej wcześniej reguły.
Pierwsze z równań mówi, że istnieje pewna funkcja /(n)e0(n) tak.a, że
2
2n + 3n + 1 = 2n 2 + f(n) dla wszystkich n. Drugie z nich mówi, że dla każdej
funkcji g(n)e 0(n) (takiej jak wspomniana funkcja/(n)) istnieje pewna funkcja
h(n) e 0(n ) tak.a, że 2n 2 + g(n) = h(n) dla wszystkich n. Z interpretacji tej wy-
2
cuchów relacji.
Notacja o
Asymptotyczna granica górna określona przez notację O może być lub nie być
asymptotycznie dokładna. Granica 2n 2 = O(n 2) jest asymptotycznie dokładna,
ale granica 2n = O(n 2 ) nie jest. Notacja o służy do określenia granicy górnej,
która nie jest dokładna. Formalnie defmiujemy o(g(n)) (,,małe o od g w zależ
ności od n") jako zbiór
o(g(n)) - {/(n): dla każdej dodatniej stałej c > Oistnieje stała n, > O taka,
że O .::;;J(n) < cg(n) dla wszystkich n~ n 0 }
lim /(n)_ - O
(2.1)
•-• g(n)
Niektórzy autorzy używają tej granicy jak.o definicji notacji o. Definicja w tej
książce dotyczy jedynie anonimowych funkcji, które są asymptotycznie nie-
•
uJemne.
51
ROZDZIAŁ 2. RZĘDY WIELKOŚCI FUNKCJI
Notacja w
w(g(n)) = {/(n): dla każdej dodatniej stałej c > O istnieje stała n 0 > O
taka, że O~ cg(n) </(n) dla wszystkich n~ n 0 }
. f(n)
hm--·--·-· = oo
"...."°g(n)
jeśli powyższa granica istnieje. To znaczy /(n) staje się dowolnie duże w stosun-
ku do g(n), gdy n dąży do nieskończoności.
Porównywanie funkcji
Wiele relacji dotyczących liczb rzeczywistych dotyczy też porównywania rzę
dów wielkości funkcji. W dalszym tekście zakładamy, że/(n) i g(n) są asymp-
totycznie dodatnie.
Przechodniość:
Zwrotność:
f(n) = ®(f(n))
f(n) = O(f(n))
f(n) = Q(f(n))
Symetria:
52
2.1. NOTACJA ASYMPTOTYCZNA
Symetria transpozycyjna:
Własność trichotomii:
Chociaż można porównać każde dwie liczby, nie można tego zrobić dla funk-
cji w sensie asymptotycznym. Oznacza to, że dla dwóch funkcji /(n) i g(n)
może nie wystąpić żaden z dwóch faktów: f(n) = O(g(n)), f(n) = O(g(n)). Na
przykład funkcje n oraz n 1 +Ilion nie mogą być w tym sensie porównane, gdyż
wartość wykładnika w nt+lliDn waha się między O i 2, przyjmując wszystkie
pośrednie wartości.
ZADANIA
53
ROZDZIAŁ 2. RZĘDY WłELKO$CI FUNKCJI
2.1-6. Pokaż, że czas działania algorytmu wynosi 0(g(n)) wtedy i tylko wtedy,
gdy jego pesymistyczny czas działania wynosi O(g(n)), a jego optymistycz-
ny czas działania wynosi O(g(n)).
2.1-7. Udowodnij, ;.., o(g(n)) "ru(g(n)) jest zbiorem pustym.
2.1-8. Możemy rozszerzyć naszą notację na przypadek dwóch parameterów
n i m, które dążą do nieskończoności z różnymi szybkościami. Dla danej
funkcji g(n, m) oznaczamy przez O(g(n, m)) zbiór funkcji
Monotoniczność
Dla każdej liczby rzeczywistej x zapis LxJt oznacza największą liczbę całkowi
tą, nie większą. niż X, a zapis Ixl ~ najmniejszą liczbę Całkowitą, nie mniejszą
niż x. Dla wszystkich liczb rzeczywistych x
1n/2l+ Ln/2J= n
t W terminologii polskiej nie ma specjalnych nazw dla tych funkcji; dlatego też będziemy je
czasem nazywać zgodnie z terminologią angielską: L xJ- podłogą (ang.floor), a rxl- sufitem (ang.
ceiling) (przyp. tłum.).
54
2.2. STANDARDOWE NOTACJE I TYPOWE FUNKCJE
LLn/aJ/bJ
= Ln/abj (2.4)
Wielomiany
Dla danej dodatniej liczby całkowitej d wielomianem stopnia d zmiennej n jest
funkcja p(_n)postaci
Funkcje wykładnicze
a0 = 1
a =a
1
a- 1 = l/a
(rl")" = a""
(rl")" = (a")"
d"d' = d" + li
. -n
Illil
•=O (2.5)
...... oo a•
55
ROZDZIAŁ 2. RZĘDY WIELKOSCI FUNKCJI
z czego wynika, że
n' - o(a")
A zatem każda dodatnia funkcja wykładnicza rośnie szybciej niż wielomian.
Oznaczając przez e liczbę 2,71828..., podstawę logarytmów naturalnych,
mamy dla wszystkich liczb rzeczywistych x
(2.6)
gdzie ,,!" oznacza „silnię" (którą zdefiniujemy później). Dla wszystkich liczb
rzeczywistych x mamy
e" ;> l + X (2.7)
przy czym równość zachodzi tylko wtedy, gdy x = D. Gdy Jxl~ I, mamy
przybliżenie
1+x~ć~1+x+x 2 (2.8)
(:,N równaniu tym notacja asymptotyczna jest użyta do opisu zachowania się
funkcji w przypadku granicznym, ale raczej gdy x - D niż gdy x - co). Dla
kaid.ego x mamy
lim
n-> "'
(1+ 2)"-
n
e"
Logarytmy
Będ7iemy używali następujących notacji:
Istotną konwencją notacyjną jest to, że logarytm funkcji odnosi się tylko do
składnika bezpośrednio występującego po symbolu logarytmu, a więc lg n + k
oznacza (lgn) + k, a nie lg(n + k). Dla n> O i b > l funkcja logbn jest ściśle
rosnąca.
56
2.2. STANDARDOWE NOTACJE I TYPOWE FUNKCJE
Dla wszystkich liczb rzeczywistych a > O, h > O, c > O (dla których od-
powiednie logarytmy są określone) i n zachodzą następujące zależności:
a= blog,a
x2 xl x4 xs
In(! + x) - x - 2 + 3 - 4 + 5 - ...
Mamy również dwie nierówności dla x > -1:
X
-- ~ ln(l + X) ,s_;X (2.10)
I+ X
. Ig'n . Ig'n
Inn~- algn - = hm .....
___
a
=O
n--+o, 2 n-+o, n
lg 6 n = o(n")
dla każdej stałej a> O. Tak więc każdy dodatni wielomian rośnie szybciej niż
każda funkcja polilogarytmiczna.
57
ROZDZIAŁ 2. RZĘDY WIELKOSCI FUNKCJI
Silnia
Symbol n! (czytaj „n silnia") jest określony dla n ~ Ow następujący sposób:
l, jeśli n=O
ni -
.- { n·(n-1)!, jeśli n> O
Zatem n!= l ·2·3 ...n.
Słabym ograniczeniem górnym na silnię jest n!::::;;n", gdyż każdy z n czyn-
ników w iloczynie jest nie większy ni.z n. Wzór Stirlinga
(2.11)
n! - o(n")
n! = w(211)
lg(n!)- 0(nlgn)
(2.12)
Logarytm iterowany
Używamy notacji lg·n (czytaj „log gwiazdka n") do oznaczenia logarytmu ite-
rowanego, który jest zdefniowany następująco. Niech funkcja lg<lln będzie
zdefiniowana rekurencyjnie dla nieujemnych liczb całkowitych i w poniższy
sposób:
n jeśli i= O
lg(lg<'-1ln), jeśli i> O i Igli-lln > O
nieokreślone, jeśli i> O i JgU- 1 >n::::;;
O lub JgU- 1 >n
jest nieokreślony
58
2.2. STANDARDOWE NOTACJE I TYPOWE FUNKCJE
0
lg n = min{ i~ O: Ig(l)n.,s;;1}
Ig'2 - I
lg'4 - 2
lg'l6 - 3
lg'65536 - 4
lg.(265536)= 5
Liczby Fibonacciego
F 0 =0
F1 = 1 (2.13)
F 1 =F 1_ 1 +F 1_ 2 dla i~ 2
(2.14)
- 1,61803...
~-1-Js
2
- - 0,61803...
W szczególności mamy
59
ROZDZIAŁ 2. RZĘDY WIELKOSCI FUNKCJI
(2.15)
ZADANIA
2.2-1. Wykaż, że jeśli f(n) i g(n) są funkcjami monotonicznie rosnącymi, to
takimi są również funkcje f(n) + g(n) i f(g(_n)), oraz jeśli f(n) i g(n) są
dodatkowo nieujemne, to funkcjaf(n) · g(n) jest monotonicznie rosnąca.
2.2-2. Korzystając z definicji notacji O, pokaż, że Jtn) = n°ll) wtedy i tylko
wtedy, gdy istnieje stała k > O taka, że Jtn) = O(n~.
2.2-3. Udowodnij równanie (2.9).
2.2-4. Udowodnij, że lg(n!) = 0(nlgn) oraz że n!= o(n").
* 2.2-5. Czy funkcja rtg nl ! jest ograniczona wielomianowo? Czy funkcja
flglgnl ! jest ograniczona wielomianowo?
* 2.2-6. Co jest asymptotycznie większe: lg(lg"n) czy lg"Qgn)?
2.2-7. Udowodnij, stosując indukcję, że i-ta liczba Fibonacciego spełnia rów-
ność F1 = (<J, - (i,)/../-5,
gdzie liczba <J,wynika ze złotej proporcji, a (i,jest
1 1
Problemy
2-1. Asymptotyczne zachowanie się wielomianów
Niech
60
PROBLEMY
2-4. Własności
notacji asymptotycznej
Niech /(n) i g(n) będą asymptotycznie dodatnimi funkcjami. Sprawdź praw-
dziwość następujących faktów (odpowiedź uzasadnij):
61
ROZDZIAŁ 2. RZĘDY WIELKO$Cl FUNKCJI
(c) /(n)= O(g(n)) implikuje lg(/(n)) = O(lg(g(n))), gdzie lg(g(n)) > O if(n);;, I
dla wszystkich dostatecznie dużych n
(d) /(n) = O(g(n)) implikuje 2t•> = 0(2'"')
(e) f(n) = 0((/(n))')
(f) f(n) = O(g(n)) implikuje g(n) = 0.(/(n))
(g) /(n) = 0(/(n/2))
(h) /(n)+ o(/(n)) = 0(/(n))
62
UWAGIDO ROZDZIAŁU
f(n) C J;(n)
(a) lgn I
(b) n-I o
(c) n/2 I
(d) n/2 2
(e) Jn 2
(!) J-;; I
nlfl '
(g) 2
(h) n/lgn 2
Uwagido rozdziału
Knuth [121] podaje jako źródło notacji O teorioliczbową pracę P. Bachmanna
z 1892 r. Notacja o została wprowadzona przez E. Landaua w 1909 r. w jego
badaniach dotyczących liczb pierwszych. Notacje .O:i 0 były lansowane przez
K.nutha [124] w celu usprawnienia popularnych, ale technicznie niejasnych za-
stosowań notacji O zarówno do dolnych, jak i do górnych granic. Wiele osób
używa nadal notacji O tam, gdzie bardziej precyzyjna jest notacja 0. Dalszy
opis historii i rozwoju notacji asymptotycznych można znaleźć w książkach
Knutha [121, 124] oraz Brassarda i Bratleya [33].
Nie wszyscy autorzy definiują notacje asymptotyczne w ten sam sposób,
chociaż różne notacje są często zgodne w typowych sytuacjach. Niektóre alter-
natywne definicje uwzględniają też funkcje, które nie są asymptotycznie nie-
ujemne, tak długo jak ich bezwzględne wartości są odpowiednio ograniczone.
Wiele innych matematycznych własności funkcji można znaleźć na przy-
kład w książkach Abramowitza i Steguna [I] lub Beyera [27], a także w książ
kach z analizy matematycznej autorstwa Apostoła [12] lub Thomasa i Finneya
[192]. Książka K.nutha [121] zawiera dużo materiału na temat matematyk.i
dyskretnej wykorzystywanej w informatyce.
Rozdział 3
Sumy
Kiedy algorytm zawiera iteracyjne konstrukcje sterujące, takie jak pętle wbile
lub for, jego czas działania możemy wyrazić jako sumę czasów potrzebnych na
każde wykonanie treści pętli. W podrozdziale 1.2 na przykład zauważyliśmy,
żej-ta iteracja w algorytmie sortowania przez wstawianie dla najgorszego przy-
padku wymaga czasu proporcjonalnego do j. Dodając czasy wykonania kolej-
nych iteracji, otrzymujemy sumę (lub szereg)
"
I"•
t= 1
64
3.1. WZORY I WŁASNO$CI DOTYCZĄCE SUM
Jeżeli n= O, to wartość sumy defmiuje się jak.o O. Jeśli n n.ie jest liczbą cał
kowitą, to przyjmujemy, że górna granica sumowania wynosi LnJ. Podobnie,
jeżeli pierwsza wartość k = x nie jest liczbą całkowitą, to przyjmujemy, że
sumowanie zaczynamy od LxJ. Wartość sumy skończonej jest zawsze dobrze
określona i nie zależy od kolejności dodawania jej wyrazów.
Mając dany ciąg liczb a 1 , a 2 , ... , nieskończoną sumę wyrazów tego ciągu
. . '
a 1 + a 2 + ...mozemy zap1sac w postaci
.
co oznacza
•
lim I a,
n-coi=l
Jeśli ta granica n.ie istnieje, to szereg jest rozbieżny; jeśli granica istnieje, to
szereg jest zbieżny. Wyrazów szeregu zbieżnego nie można zawsze dodawać
w dowolnej kolejności. Można jednak tak dodawać wyrazy szeregu bezwzględ-
• 00
Liniowość
• • •
L (ca, + b,) - c L a,+ L b,
J:;l l:"'1 i=l
65
ROZDZIAŁ 3. SUMY
Szeregi arytmetyczne
Suma
"
I: k-1 +2+ ... +n
.t =, 1
" I
.r, k- In(n + I) (3.1)
- 0 (n') (3.2)
Szeregi geometryczne
Dla liczby rzeczywistej x =F1 suma
"
[x'-l+x+x'+ ... +x"
.t=O
Szeregi harmoniczne
Dla dodatniej liczby całkowitej n, n-tą liczbą harmoniczną nazywamy
I I I I
H-1+-+
" 2
--+-+
3 4
... + --
n
" I
-I:-
.t"'l k
- Inn+ 0(1) (3.5)
66
3.1. WZORY t WŁASNOŚCI DOTYCZĄCE SUM
•
Ikx'-
,. (1-x)
X 2 (3.6)
0
Szeregteleskopowy
Dla dowolnego ciągu a0 , a1 , ••• , a„
"
L (al - al-1) = a,, - ao (3.7)
l= 1
W tym szeregu każdy ze składników a 1 , a2 , ••• , an-t jest dodany i odjęty do-
kładnie raz. Mówimy, że szereg składa się teleskopowo. Podobnie
·-'
L (al- al+ 1) = a0 - a„
l=O
n-1 1
I--
,.,k(k+1J
I I I
···-~~
k(k + I) k k +I
to otrzymamy
,-, I •-'(I I )
,I,k(k+ 1)- ,;, k - k+1
I
- I --
n
67
ROZDZIAŁ 3. SUMY
Iloczyny
Jeżeli n = O, to wartość
iloczynu definiujemy jako 1. Możemy przekształcić
wzór z iloczynem na wzór z sumą przy użyciu równości
ZADANIA
68
3.2. SZACOWANIE WART0$CI SUM
Indukcja matematyczna
±
k"'l
k wynosi
1
2
n(n + 1). Możemy łatwo sprawdzić, że zachodzi to dla n= l,
indukcyjnie zakładamy więc, że zachodzi dla n i dowodzimy, że zachodzi rów-
nież dla n + 1. Otrzymujemy
n+ l n
L k - L k +(n+ I)
k"'l keol
I
- n(n+ l)+(n+ I)
2
I
- (n + l)(n + 2)
2
69
ROZDZIAŁ 3. SUMY
L' 1 k = 0(1).
t=
Zakładając, że to oszacowanie sumy zachodzi dla n, dowodzimy
teraz, że zachodzi dla n + 1:
11+ 1 n
L1 k= t=L1 k+(n+
ł=
I)
=O(n+I)
" "
I k,; I n
t=l t=l
=n2
"
Zazwyczaj dla szeregów postaci Lat, jeżeli amax= max.1 ..,;t,snat, to
t= l
"
70
3.2. SZACOWANIE WARTOŚCI SUM
I
= ao
I- r
•
Możemy skorzystać z tej metody przy ograniczaniu sumy L (k/3ł). Pierw-
t=1
szy wyraz jest równy 1/3, a stosunek dwóch następujących po sobie wyrazów
•
wynosi
(k+l)/3'+' 1 k+l
··-= - .
k/3' 3 k
2
<:-
~ 3
dla każdego k ';?;-1. Każdy wyraz jest ograniczony z góry przez (1/3)(2/3).t,
z czego wynika, że
• k • I(2)'
I -'I--
t"'13t"""t„13 3
- 1
-·-·-·-·-
3 1-2/3
I
- 1
Podstawowym błędem przy stosowaniu tej metody jest pokaz.anie~ że
stosunek dwóch następujących po sobie wyrazów jest mniejszy od 1, a na-
stępnie założenie, że suma może zostać ograniczona przez szereg geometry-
czny. Przykładem może tu być nieskończony szereg harmoniczny, który jest
rozbieżny, gdyż
- lim (lg n)
71
ROZDZIAŁ 3. SUMY
Rozdzielaniesum
Jednym ze sposobów oszacowania skomplikowanej sumy jest przedstawienie
jej w postaci sumy dwóch lub więcej szeregów powstałych przez rozdzielenie
indeksów owej sumy, a następnie ograniczenie tak powstałych szeregów. Przy-
puśćmy na przykład, że próbujemy znaleźć dolne ograniczenie szeregu aryt-
,12
>IO+ '
.I:= 1
I
k=n/2+1
(n/2)
;, (n/2) 2
- O(n2 )
I•,-I•,+I•,
k=O .1:=0 k=k 0
- E>(ll + I' a,
~=ko
72
3.2. SZACOWANIE WARTQ$CI SUM
Teraz możemy już użyć innych metod ograniczania sumy L" ak. Chcąc na
k=k,
przykład znaleźć asymptotyczne górne ograniczenie sumy
• k'
1:-2t
k=O
8
"'
~9 -
Więc
2 k2 oo k2
1: ·
k=o2"
· + 1: ··
teeJ 2t
LignJ 2'-l 1
,;;I;I;-,
J=O J=O 2
73
ROZDZIAŁ 3. SUMY
:s;;lgn+l (3.8)
Szacowaniecałkami
Jeżeli suma da się wyrazić w postaci L" f(k), gdzie f(k) jest funkcją mono-
k=m
tonicznie rosnącą, możemy oszacować ją przez całki
n n n+ 1
J f(x) dx <,, "i,f(k) <,, J /(x) dx (3.9)
•-1 •
Dowód tego oszacowania został zilustrowany na rys. 3.1. Suma jest tam przed-
stawiona jako pola prostokątów figury, a całka to szary obszar pod krzywą.
Jeżeli f(k) jest funkcją monotonicznie malejącą, to możemy użyć podobnej
metody do określenia ograniczeń
n+ l n n
J f(x) dx <,, "i,f(k) <,, J /(x) dx (3.10)
• •-1
n 1 n+ 1 dx.
"[,--;;,j-
k= 1 k 1 X
-ln(n+l) (3.11)
= Inn
z c-zego
(3.12)
74
3.2. SZACOWANIE WARTO$CI SUM
f (x)
. •.·,
••
/: ..-,.
" '<
',; \;,;.·<':·
' •
• "-",p ·,. ··>
•
' ' '
•••
'
.·,.·<( " ,,,, ,:,.
;Is;• ' ' ..,,
'--- ~--~'--X
m-1 m m+l m+2 .- .- n-2 n-1 n n+I
<•)
f (x)
.... .... ~
n· " ..,
•
~ l
- - ~· '" ' I' ' ·; ......
..
..
..
••
__,
m-1 m m+l m+2 -· -· n-2 n-I n n+I
(b)
•
Rys. 3.1. Oszacowanie sumy L f(k) przez całki. Pole wszystkich prostokątów razem reprezentuje
wartość
•
·-·
sumy. Całka to szary obszar pod
•
krzywą. Jeżeli porównamy ze sobą obszary z części (a),
75
ROZDZIAŁ 3. SUMY
ZADANIA
3.2-1. Pokaż, że suma L" 1/k 2 jest ograniczona z góry przez stałą.
k=l
3.2-2. Znajdź asymptotyczne ograniczenie sumy
l!a nj
t
r
=o
1n12•1
3.2-3. Wykaż metodą rozdzielania sumy, że wartość n-tej liczby harmonicznej
wynosi OQg n).
3.2-4. Przybliż sumę L" k 3
całką.
t =1
3.2-S. Dlaczego, aby otrzymać górne oszacowanie n-tej liczby harmonicznej
L" 1/k, nie użyliśmy bezpośrednio nierówności (3.10)?
t= 1
Problemy
3-1. Szacowanie wartości smn
Podać asymptotycznie dokładne ograniczenia na wartości następujących sum
przy założeniu, że r ~ O i s ~ O są stałymi.
"
<•lL "'
t=l
Uwagido rozdziału
Książka Knutha [121] jest doskonałym odniesieniem do materiału prezentowa-
nego w tym rozdziale. Podstawowe wiadomości o sumach można znaleźć w ka-
żdej książce z analizy matematycznej, na przykład w pracach Apostoła [12] lub
Thomasa i Finneya [192],
Rozdział 4
Rekurencje
jeśli n= 1
T(n) - {0(1), (4.1)
2T(n/2) + 0(n), jeśli n> I
77
ROZDZIAŁ 4. REKURENCJE
Warunki brzegowe, jak.ie muszą być spełnione, aby można było rozwiązać
rekurencję, to następna klasa szczegółów, które z reguły pomijamy. Ponieważ
czas działania algorytmu dla danych wejściowych o stałym romiiarze jest sta-
ły, rekurencje opisujące czas działania algorytmu generalnie zawierają
T(n) - 0(1) dla wystarczająco małych n. Dla wygody będziemy zatem pomijać
dokładne ustalania warunków brzegowych rekurencji i założymy, że T(n) jest
stałe dla małych n. Rekurencję (4.1) na przykład zazwyczaj zapisujemy jak.o
bez dok.ładnego
podawania wartości dla małych n. Powodem jest to, że zmiana
wartości T(l) zmienia rozwiązanie równania rekurencyjnego tylko o stalą,
więc rząd wielkości się nie zmienia.
Gdy rozwiązujemy równania rekurencyjne często pomijamy założenia
o całkowitości argumentów i warunki brzegowe; dopiero później okazuje się,
czy mają one jakiś znaczą.cy wpływ na rozwiązanie, czy też nie. Zazwyczaj
okazuje się, że nie mają one żadnego znaczenia, ale czasami trzeba wiedzieć,
kiedy należy je uwzględnić, a kiedy można pominąć. W określeniu ważności
wyżej wymienionych szczegółów pomaga zarówno doświadczenie w rozwiązy
waniu równań rekurencyjnych, jak i pewne twierdzenia, które o tym trak.tują
(patrz tw. 4.1 i problem 4-5). W tym rozdziale rozważymy kilka z tych szczegó-
łów, aby pokazać subtelności metod rozwiązywania równań rekurencyjnych.
4.1. Metodapodstawiania
Metoda rozwiązywania równań rekurencyjnych przez podstawianie polega na
zgadnięciu postaci rozwiązania, a następnie wykazaniu przez indukcję, że jest
ono poprawne. Trzeba też znaleźć odpowiednie stale. Nazwa metody pochodzi
78
4.1. METODA PODSTAWIANIA
od tego, że
podstawiamy odgadnięty wzór funkcji dla mniejszych wartości,
korzystając z założenia indukcyjnego. Metoda ta jest bardzo skuteC'llla, ale
oczywiście może być zastosowana tylko w przypadkach, kiedy łatwo jest prze-
widzieć postać rozwiązania.
Metoda podstawiania może być użyta do określenia albo górnego, albo
dolnego oszacowania na wartości rozwiązania rekurencji. Jako przykład ob-
liczymy ograniczenie górne funkcji zadanej zależnością rekurencyjną
79
ROZDZIAŁ 4. REKURENCJE
Zgadywanie rozwiązania
Niestety, nie ma ogólnej zasady na zgadywanie poprawnych rozwiązań równań
rekurencyjnych. Odgadnięcie rozwiązania to kwestia doświadczenia i pomys-
łowości. Na szczęście jednak istnieją pewne „heurystyki", które mogą być po-
mocnicze przy zgadywaniu.
Jeżeli rekurencja jest podobna do innej, z którą spotkaliśmy się już wcześ
niej, dobrze jest spróbować podstawić postać rozwiązania podobną do tej po-
przednio znanej. Jak.o przykład rozważmy rekurencję
Pewne subtelności
W pewnych wypadkach, gdy poprawnie się zgadnie asymptotyczne oszacowa-
nie na rozwiązanie rekurencji, mogą się pojawić kłopoty z przeprowadzeniem
dowodu indukcyjnego. Zazwyczaj problem polega na tym, że założenie nie jest
wystarczająco silne, aby udowodnić precyzyjne oszacowanie. Gdy natrafisz na
tak.i trudny przypadek, spróbuj pominąć składniki niższego rzędu.
Rozważmy rekurencję
gdy b ~ 1. Tak jak poprzednio, stała c musi być dostatecznie duża, aby za-
chodziły warunki brzegowe.
Większość ludzi uważa, że odejmowanie składnik.ów niższego rzędu jest
niezgodne z intuicją. Jeśli rachunki zawiodły, to czy nie powinniśmy zwiększać
odgadniętego wzoru. Aby zrozumieć ten krok, należy jednak pamiętać, że łat
wiej jest udowodnić coś mocniejszego dla dużych wartości, zakładając coś mo-
cniejszego dla małych.
81
ROZDZIAŁ 4. REKURENCJE
Zamiana zmiennych
Czasami drobny zabieg algebraiczny może zamienić daną rekurencję tak, aby
była podobna do takiej, którą już znamy. Jak.o przykład rozważmy rekurencję
T(2m) - 2T(2mfl) +m
Możemy teraz podstawić S(m) = T(2m), otrzymując rekurencję
S(m) - 2S(m/2) +m
podobną do rekurencji (4.4) i mającą takie samo rozwiązanie: S(m) =
= O(m lgm). Zamieniając odwrotnie S(m) na T(n), otrzymujemy T(n) =
- T(2·) - S(m) - O(mlgm) - O(lgnlglgn).
ZADANIA
4.2. Metodaiteracyjna
Metoda iterowania rekurencji nie wymaga odgadywania odpowiedzi, ale może
wymagać zastosowania większego aparatu algebraicznego niż metoda podsta-
wiania. Główną ideą jest rozwijanie (iterowanie) rekurencji i wyrażanie jej jako
82
4.2. METODA ITERACYJNA
T(n) = 3T(Ln/4J) + n
Iterujemy ją następująco:
= 4n + o(n)
= O(n)
Skorzystaliśmy tu z tożsamości (2.9), aby wywnioskować, że 310B•" = n10g,, 3 ,
i skorzystaliśmy też z faktu, że log 4 3 < I, otrzymując, że 0(n1°i•3 ) = o(n).
Metoda iteracyjna jest zazwyczaj związana z mnóstwem przekształceń al-
gebraicznych, więc zachowanie prostoty nie jest wcale tak łatwe. Punkt kluczo-
wy to skoncentrowanie się na dwóch parametrach: liczbie iteracji rekurencji
potrzebnych do osiągnięcia wan1nku brzegowego oraz sumie składników poja-
wiających się w kolejnych iteracjach. Czasami, w procesie iterowania rekuren-
cji, można przewidzieć rozwiązanie bez skomplikowanych przekształceń algeb-
raicznych. Wówczas iterowanie można poniechać na korzyść metody podsta-
wiania, która jest znacznie mniej algebraiczna.
83
ROZDZIAŁ 4. REKURENCJE
T(n) 2
" "'
/~ /~
r(;) r(;) (;)' (;)'
I \ I \
r(:) r('.I)r(:) r(:)
(•) (b) (<)
2 ..................................... _, _______
..•..•,1~- 2
n
"
/ ~ 2
(;)' ( ; ) •••••••••••-••••••u••u•u11~• I 2
-,
2
lg"
I \ I \
(:)' (:)' (i)' (:)' .,,. -n I 2
4
I\I\I\I\
I \ I \ I \ I \
. •
•
•
2
W sumie: 0(11 )
(d)
Rys. 4.1. Konstrukcja drzewa rekursji dla równania rekurencyjnego T(n) = 2T(n/2) + n 1 . Część (a)
zawiera T(n), które jest stopniowo rozwijane w (b)-(d) do drzewa rekursji. W pełni rozwinięte
drzewo w części (d) ma wysokość Jgn (ma ono lgn + I poziomów)
84
4.2. METODA ITERACYJNA
Drzewa rekursji
Drzewo rekursji pozwala w dogodny sposób ilustrować rozwijanie rekurencji,
jak również ułatwia stosowanie aparatu algebraicznego służącego do rozwiąza
nia tej rekurencji. Jest ono szczególnie użyteczne, gdy rekurencja opisuje al-
gorytm typu „dziel i zwyciężaj". Na rysunku 4.1 jest pokazane wyprowadzenie
drzewa rekursji dla równania rekurencyjnego
ZADANIA
4.2-1. Wyznacz, używając metody iteracyjnej, asymptotyczne oszacowanie
górne dla rekurencji T(n) = 3T(Ln/2J) + n.
85
ROZDZIAŁ 4. REKURENCJE
n ·······························-·····-········-""··=••·
W sumie: O(n lg n)
Rys. 4.2. Drzewo rekursji dla równania rekurencyjnego T(n) = T(n/3) + T(2n/3) + n
4.3. Metodarekurencji
uniwersalnej
Metoda rekurencji uniwersalnej podaje „uniwersalny przepis" rozwiązywania
równania rekurencyjnego postaci
86
4.3. METODA REKURENCJI UNIWERSALNEJ
87
ROZDZIAŁ 4. REKURENCJE
jest pewna luka między przypadkami 2 i 3, gdy funkcja /(n) jest większa niż
n10H,II, ale nie wielomianowo większa. Jeśli funkcja/(n) ,,wpada" w jedną z tych
luk lub gdy warunek regularności w przypadku 3 nie zachodzi, to metoda
rekurencji uniwersalnej nie może być zastosowana do rozwiązania równania
rekurencyjnego.
T(n) = 9T(n/3) +n
T(n) = T(2n/3) + I
gdzie a= l, b = 3/2,f(n) = l, a n1og,a = ,roa,,,1 =n°= 1. Stosujemy tutaj przy-
padek 2, gdyż /(n)= 0(n1°8 "') = 0(1), a zatem rozwiązaniem rekurencji jest
T(n) = ®Qgn).
Dla rekurencji
T(n) = 3T(n/4) + n lg n
88
* 4.4. DOWÓD TWIERDZENIA O REKURENCJI UNIWERSALNEJ
T(n) = 2T(n/2) + n lg n
chociaż ma ona poprawną formę: a= 2, b = 2,/(n) = nlgn i n101"'
=n.Wydaje
się, że powinien tu zachodzić przypadek 3, gdyż/(n) = n lg n jest asymptotycz-
nie większe niż n101"' = n, ale nie wielomianowo większe. Stosunek/(n)/n' 0 B"' =
= (nlg n)/n = lgn jest asymptotycznie mniejszy niż n• dla każ.dej dodatniej sta-
łej e. W konsekwencji rekurencja ta „ wpada" w lukę między przypadkiem
2 i przypadkiem 3. (Patrz zad. 4.4-2, gdzie znajdziesz jej rozwiązanie).
ZADANIA
4.3-1. Skorzystaj z metody rekurencji uniwersalnej i podaj dokładne asymp-
totyczne oszacowania dla następujących rekurencji:
(a) T(n) = 4T(n/2) + n
(b) T(n) = 4T(n/2) + n'
(c) T(n) = 4T(n/2) + n'
4.3-2. Czas działania algorytmu A jest opisany przez rekurencję T(n) =
= 1T(n/2) + n 2 • Algorytm konkurencyjny A' ma czas działania T'(n) =
= aT'(n/4) + n 2 • Jaka jest najwięksu liczba całkowita a, przy której A'
jest asymptotycznie szybszy niż A?
* 4.3-3. Skorzystaj z metody rekurencji uniwersalnej i pokaż, że rozwiązaniem
rekurencji T(n) = T(n/2) + 0(1) dla wyszukiwania binarnego (patrz zad.
1.3-5) jest T(n) = 0(Ign).
4.3-4. Rozważmy warunek regularności af(n/b) ~ cf(n) dla pewnej stałej
c < 1, który jest częścią przypadku 3 twierdzenia o rekurencji uniwersal-
nej. Podaj przykład prostej funkcji/(n), która spełnia wszystkie warunki
z przypadku 3 twierdzenia o rekurencji uniwersalnej z wyjątkiem warunku
regularności.
89
ROZDZIAŁ 4. REKURENCJE
n, jeśli n= 1, 2, 4, 8, ...
T(n) - { , • •
n , w przee1wnym razie
LEMAT 4.2.
Niech a~ 1 i b > 1 będą stałymi
oraz niech /(n) będzie nieujemną funkcją
zdefiniowaną dla dokładnych potęg b przez rekurencję
jeśli n=1
T(n) - {0(1),
aT (n/b) + f(n), jeśli n = bi
90
* 4.4. DOWÓD TWIERDZENIA O REKURENCJI UNIWERSALNEJ
loa.n-1
T(n) - 0(n 1''") + I alf(n/b') (4.6)
JoaO
DOWÓD
Iterując rekurencję, otrzymujemy
zatem
Joa.n- 1
T(n) - 0(n 1"'") + L a1f(njb')
j"" o
co kończy dowód.
•
Drzewo rekursji
Spróbujmy najpierw dać pewną intuicję, używając drzewa rekursji. Na rysunku
4.3 widać drzewo odpowiadające iterowaniu rekurencji w lemacie 4.2. Korzeń
drzewa ma koszt/(n), a koszt każdego z jego a synów wynosif(n/b). (Wygod-
nie jest wyobrażać sobie, że a jest liczbą całkowitą, zwłaszcza gdy oglądamy
drzewo rekursji, ale takie założenie nie jest matematycznie niezbędne), Każdy
z synów korzenia ma a synów, przy czym koszt każdego z nich wynosi/(n/b 2);
mamy zatem a 2 węzłów, które są w odległości 2 od korzenia. Ogólnie, mamy a1
węzłów, które znajdują się w odległościj od korzenia, a każdy z nich ma koszt
f(n/bi). Koszt liścia wynosi T(l) = 8(1), a każdy liść znajduje się w odległości
log,,n od korzenia, gdyż n/b 101-" =I.Mamy a1°
1 >" = n 1oa.aliści w drzewie.
91
ROZDZIAŁ 4. REKURENCJE
/(n) -·-············································.............................
...........
;.,. /(n)
•••
f(n/b) f(n/b) f(n/b) "···iii• af(n/b)
..........................
••• '
' 8(1) 6(1) 8(1)
0(1) 0(1) 0(1) 6(1) 8(1) 8(1)
' ' '
8(1) 0(1) 0(1)----i..,.e n ( los•a)
log 1 a
' log•n-1
W sumie: e(nlog,
0
} + LJ
1~0
f(n!b 1)
Rys. 4.3. Drzewo rekursji generowane przez T(n) = aT(n/b) + f(n). Drzewo jest pełnym drzewem
rzędu a z n'°s.aliśćmi mającym wysokość logba. Koszt każdego poziomu jest pokazany po prawej
stronie rysunku, a ich suma jest dana w równaniu (4.6)
loca,11-1
I <if(nli,;>
i"' o
92
* 4.4. DOWÓD TWIERDZENIA O REKURENCJI UNIWERSALNEJ
LEMAT4.3.
Niech a ~ 1 i b > 1 będą stałymi oraz niech /(n) będzie nieujemną funkcją
zdefiniowaną dla dokładnych potęg b. Funkcja g(n) zdefiniowana dla dokład
nych potęg b przez
10, ... - 1
g(n) - L a;f(n/lJI) (4.7)
j=O
DOWÓD
Dla przypadku l mamy f(n) - O(n'0 ••-•), z czego wynika, ż, f(n/11)-
= O((n/b1)1°
8"'-"). Podstawiając to do równania (4.7), otrzymujemy
g(n) - 'a1(-"-)'""'-,)
o('"'f- j=O fy
(4.8)
10, ... -1
- n' 0
••-· I
)"'O
(b'Y
-1)
-n'"·--·(b''""
b" - l
-n'"••-·(i
:)
Ponieważ O(n") =
b i 1, są stałymi, ostatnie wyrażenie redukuje się do n10,i.11-•
= O(lt 0
'"'). Podstawiając to wyrażenie do sumy w równaniu (4.8), otrzymujemy
g(n) - O(n'"'')
co kończy dowód dla przypadku 1.
93
ROZDZIAŁ 4. REKURENCJE
g(n) =0 >o,a-•
( ,r, a' b' ·(")'""°) (4.9)
Szacujemy sumę, używając notacji 0, ale tym razem zamiast szeregów geomet-
rycznych, otrzymujemy ciąg takich samych wartości:
,....,-, (")'"''
'<C' a1 -.
L, <, = n'"'' >o,,-,(
'<C'
a
biot.a L,
)I
j=O U' j=O
lo1J1 -1
= n'o1.,, L 1
jaa O
g(n) = 0(n' 0
'' log, n)
•
,s;f(nl I: c1
94
* 4.4. DOWÓD TWIERDZENIA O REKURENCJI UNIWERSALNEJ
- O(f(n))
gdyż c jest stalą. Zatem g(n) - 0(f(n)) dla dokładnych potęg b. Przypadek
3 został przez nas w ten sposób uzasadniony; kończy to dowód całego lematu .
LEMAT4.4.
Niech a ~ I i b > 1 będą stałymi oraz niech f(n) będzie nieujemną funkcją
zdefiniowaną dla dokładnych potęg b. Definiujemy T(n) dla dokładnych potęg
b za pomocą rekurencji
gdzie i jest dodatnią liczbą całkowitą. Wtedy funkcja T(n) może być ograniczo-
na asymptotycznie dla dokładnych potęg b w następujący sposób.
1. Jeśli/(n) = O(n1"'"'-")dla
pewnej stałej e > O, to T(n) = 0(n 1011>").
2. Jeśli/(n) - 0(n'"'"), to T(n) - 0(n'"""lgn).
3. Jeśli f(n) = O(n 1og"'+")dla pewnej stałej e > O oraz jeśli af(n/b) ~ cf(n) dla
pewnej stałej c < 1 i wszystkich dostatecznie dużych n, to T(n) = 0(/(n)).
DOWÓD
Korzystamy z oszacowania w lemacie 4.3, aby obliczyć sumę (4.6) z lematu 4.2.
Dla przypadku 1 mamy
a dla przypadku 2
95
ROZDZIAŁ 4. REKURENCJE
jest trywialne, gdyż oszacowanie In/bł ~ n/b może być użyte w pierwszym
przypadku, aby otrzymać pożądany rezultat, a oszacowanie Ln/bj).:::;;
n/b mo-
że być użyte w drugim przypadku. Dolne oszacowanie rekurencji (4.11) wyma-
ga podobnej techniki co górne oszacowanie rekurencji (4.10), pokażemy więc
jedynie ostatnie z nich.
Chcemy iterować rekurencję (4.10), tak jak w lemacie 4.2. W czasie ite-
rowania rekurencji otrzymujemy sekwencję rekurencyjnych wywołań dla ar-
gumentów
n
1n/bł
11n/bł/bł
111n/bł /bł /bł
jeśli i= O
(4.12)
jeśli i> O
Naszym pierwszym celem jest wyznaczenie liczby iteracji k, dla której nk jest
x + 1, otrzymujemy
stałą. Korzystając z nierówności fxl .:::;;
96
* 4.4. DOWÓD TWIERDZENIA O REKURENCJI UNIWERSALNEJ
n I
ni"""'-+··
bi b..·+1
n I 1
bib+ · ·
"' - + ----
n3"""63 +1
•
•
•
Ogólnie
n i-1 1
n,~ b; + LI L
J=OV'
Llog..,J
-1
= El(n'"") + L a1f(n;) (4.13)
J=O
Li"L"J- t
g(n) = L a1f(n;) (4.14)
J=O
97
ROZDZIAŁ 4. REKURENCJE
b1/n ,:::;;
1. Oszacowanie f (n) = O(n1"1>"}implikuje, że istnieje stała c > O taka,
że dla dostatecznie dużych ni
n b )1,...,
f(n;) ~ C ( i,;+ b _ )
-,(j;)(1+(~b~1))1,,,
~,(";Xi+ 1)1,..., bb
ZADANIA
* 4.4-1. Podaj proste, ale dokładne wyrażenie dla n1 w równaniu (4.12) dla przy-
padku, w którym b jest dodatnią liczbą całkowitą, a nie dowolną liczbą
rzeczywistą.
* 4.4-2. Pokaż, że jeślif(n) = E>(n108"'Ig1 n), gdzie k ~ D,to rekurencja uniwersal-
na ma rozwiązanie T(n) = 8(n 1°"""lf+ 1 n). Dla uproszczenia ogranicz
swoją analizę do dokładnych potęg b.
* 4.4-3. Pokaż, że przypadek 3 w twierdzeniu o rekurencji uniwersalnej jest
„przesadzony", w tym sensie, że warunek regularności af(n/b),:::;;cf(n) dla
pewnej stałej c < 1 implikuje, że istnieje stała e > O taka, że
f(n) - !l(n1,..,+•).
Problemy
4.1. Przykłady rekurencji
Podaj asymptotyczne górne oraz dolne oszacowanie dla T(n) w każdej z da-
nych poniżej rekurencji. Załóż, że T(n) jest stałą dla n,:::;;2. Twoje oszacowania
powinny być tak dokładne, jak to możliwe. Odpowiedzi uzasadnij.
98
PROBLEMY
99
ROZDZIAŁ 4. REKURENCJE
•
9'(z) = I F,z'
J=O
8
= O +z+ z2 + 2z3 + 3z4 + 5z 5 + 8z6 + 13z7 +21z + ...
100
PROBLEMY
(b) Pokaż, że
z
91-(z)= 1-z-z 2
z
(1 - ,f,z)(l - ,/,z)
l ( l l )
- ,Is I:_-,t,z- l - ,t,z
gdzie
l +.js
,t, - .... - 1,61803 ...
2
oraz
(c) Pokaż, że
•
I
$F(z)- L ,,(,t, 1 - ,f,~z'
1=ov5
101
ROZDZIAŁ 4. REKURENCJE
(a) Wykaż, że jeśli mamy więcej niż n/2 układów złych, to profesor nie zawsze
może stwierdzić, które układy są dobre, opierając się na testach powyż
szego typu. Załóżmy, że złe układy mogą w pewnym sensie współdziałać,
żeby nie można było wykryć, które z nich są dobre.
(b) Rozważmy problem znajdowania jakiegokolwiek dobrego układu spośród
n układów zakładając, że dobrych układów jest więcej niż n/2. Wykaż, że
Ln/2Jtestów wystarczy do zredukowania problemu do analogicznego prob-
lemu, którego rozmiar będzie mniej więcej połową rozmiaru wejściowego.
(c) Pokaż, że dobre układy mogą zostać zidentyfikowane przy użyciu E>(n)
testów zakładając, że mamy więcej niż n/2 dobrych układów. Sformułuj
i rozwiąż rekurencję, która opisuje liczbę testów.
Uwagido rozdziału
Rekurencje były badane już w 1202 r. pr:rez L. Fibonacciego, od którego na-
zwiska bierze się nazwa liczb Fibonacciego. A. De Moivre wprowadził metodę
funkcji tworzących (patrz problem 4-6) do rozwiązywania rekurencji. Metoda
rekurencji uniwersalnej jest wzięta (w zmodyfikowanej formie) od Bentleya,
Hakena oraz Saxe'a [26], którzy podają rozszerzoną metodę opisaną w zad.
4.4-2. K.nuth (121] oraz Liu [140] pokazują. jak rozwiązywać liniowe rekuren-
cje, korzystając z funkcji tworzących. Praca Purdoma i Browna [164] zawiera
rozszerzoną dyskusję na temat rozwiązywania rekurencji.
Rozdział 5
5.1. Zbiory
Zbiór jest kolekcją oddzielnych obiektów, zwanych elementami zbioru. Jeżeli
obiekt x jest elementem zbioru S, to piszemy xeS (czytaj: ,,x jest elementem
zbioru S'' lub krócej ,.X należy do S"). Jeśli x nie jest elementem S, to piszemy
x,j; S. Możemy zdefiniować zbiór przez wypisanie jego elementów w nawia-
sach. Możemy na przykład zapisać zbiór S zawierający elementy 1, 2 i 3 w po-
staci S = {1, 2, 3}. Ponieważ 2 jest elementem zbioru S, a 4 nie jest, możemy
zapisać 2 e S i 4 ffS. Elementy zbioru nie są numerowane i zbiór nie może
zawierać dwóch takich samych elementów. Zbiory A i B są równe, co zapisuje~
my A = B, jeżeli zawierają te same elementy. Na przykład {1, 2, 3, I} = { 1, 2,
3) - {3, 2, l}.
Dla często spotykanych zbiorów używamy szczególnych oznaczeń.
t) Niektórzy autorzy podają, że liczby naturalne mczynają się od I. Jednak obecnie przyjęło
się, że Ojest również liczbą naturalną.
103
ROZDZIAŁ 5. ZBIORYI NIE TYLKO
AnB={x:xeAixeB}
AuB={x:xeAłubxeB}
A- B= {x:xeA i x,tB}
Prawa idempotentności:
AnA=A
AuA=A
Prawa przemienności:
AnB=BnA
AuB=BuA
104
5.1. ZBIORY
Prawa łączności:
A n(Br,C) = (AnB)r, C
A u(BuC) = (A uB)u C
Prawa rozdzielności:
Ar,(Bu C) = (AnB)u(Ar, C)
Au(Br,C) = (AuB)n(A u C) (5.1)
Prawa pochłaniania:
An(AuB)=A
Au(Ar,B)=A
Prawa De Morgana:
A-(Br,C) = (A-B)u(A- C)
A- (BuC) =(A -B)n(A - C) (5.2)
Pierwsze z praw De Morgana jest zilustrowane na rys. 5.1 przy użyciu diagra-
mu Venna, gdzie zbiory są przedstawione w postaci obszarów na płaszczyźnie.
• , . '
B .A B
. u
'
C C .
' C
A (B ri C) = A-(BriC) "' (A-8) u (A-C)
Rys. 5.1. Diagram Venna ilustrujący pierwsze prawo De Morgana (5.2). Każdy ze zbiorów A,
B i C jest reprezentowany prz.ez koło na płaszczyźnie
105
ROZDZIAŁ 5. ZBIORY I NIE TYLKO
Anll - A u o·
AuB=AnB
Zbiory A i B są rozłączne, jeżeli nie mają wspólnych elementów, tzn. jeżeli
A n B = 0. Zbiór fi' = {S;} niepustych zbiorów tworzy podział zbioru S, jeżeli
s- us,
s,eY
z czego wynika, że
106
5.1. ZBIORY
Na przykład {a, b} x {a, b, c} = {(a, a), (a, b), (a, c), (b, a), (b, b), (b, c)}.Jeśli
A i B są zbiorami skończonymi, to moc ich iloczynu kartezjańskiego wynosi
* 5.1-3. Udowodnij tak zwaną zasadę włączania i wyłączania, która jest uogól-
nieniem równości (5.3):
107
ROZDZIAŁ 5. ZBIORY I NIE TYLKO
5.2. Relacje
Relacja binarna (dwuargumentowa) R dwóch zbiorów A i B jest podzbiorem
iloczynu kartezjańskiego A x B. Jeżeli (a, b)eR, to czasami piszemy: a Rb.
Kiedy mówimy, że R jest relacją binarną w zbiorze A, oznacza to, że R jest
podzbiorem A x A. Na przykład relacją „mniejsze niż" w zbiorze liczb natu-
ralnych jest zbiór {(a, b): a, be N i a< b}. Relacja n-arna (n-argumentowa)
w zbiorach A 1 , A 2 , •••, A11jest podzbiorem A 1 x A 2 x ... x A 11•
Relacja binarna R c A x A jest zwrotna, jeśli
aRa
dla każdego aeA. Na przykład.,=" i .. ~" są relacjami zwrotnymi w zbiorze
N, podczas gdy ,, <" nie jest. Relacja R jest symetryczna, jeżeli
a R b implikuje b R a
dla dowolnych a, b EA. Na przykład relacja ,, =" jest symetryczna, lecz ,, < "
i ,, ~ " już nie są. Relacja R jest pn:ecboclnia, jeżeli
aRb i bRc implikuje aRc
dla dowolnych a, b, c EA. Na przykład relacje ,. < ", ,, ~" i ,, =" są przechod-
nie, ale relacja R={(a, b):a, beN i a=b-1} nie jest, ponieważ
z 3 R 4 i 4 R 5 nie wynika, że 3 R 5.
Relacja, która jest zwrotna, symetryczna i przechodnia, nazywa się relacją
równoważności. Na przykład ,, =" jest relacją równoważności w zbiorze liczb
naturalnych, ale ,, <" nią nie jest. Jeśli R jest relacją równoważności w zbiorze
A, to dla dowolnego a e A klasa abstrakcji a jest zbiorem [a] = {b EA: a R b}
wszystkich elementów równoważnych a. Jeśli na przykład zdefiniujemy
108
5.2. RELACJE
DOWÓD
W pierwszej części dowodu musimy pokazać, że klasy równoważności R są
niepustymi, parami rozłącznymi zbiorami, których suma wynosi A. Ponieważ
R jest zwrotna, aE [a], więc klasy równowa:7ności są niepuste; co więcej, ponie-
waż każdy element aEA należy do klasy abstrakcji [a], suma klas równoważ
ności wynosi A. Pozostaje wykazać, że klasy abstrakcji są parami rozłączne,
tzn. jeśli dwie klasy abstrakcji [a] i [b] mają ten sam element c, to są tym samym
zbiorem. Tak więc jeśli a R c i b R c, to przez symetrię i przechodniość za-
chodzi a R b. Dla dowolnego elementu xE [a]:x R a, a więc x R b, z czego
wynika, że [a] c [b]. Podobnie, [b] c [a], a więc [a] - [b].
Co do drugiej części dowodu, niech d = {A1} będzie podziałem A, i zdefi-
niujmy R = {(a, b): istnieje i takie, że aEA 1 i beA 1}. Pokażemy, że R jest
relacją równoważ.ności w A. Zwrotność zachodzi, ponieważ aeA 1, z czego
wynika, że a Ra. Symetria zachodzi, ponieważ jeśli a Rb, to a i b znajdują się
w tym samym zbiorze A;, więc b R a. Jeżeli a R b i b R c, to wszystkie trzy
elementy należą do tego samego zbioru, więc zachodzi a R c, z czego wynika,
że zachodzi przechodniość. Widać, że zbiory podziału są klasami równoważno
ści R, ponieważ aEA 1, skąd xE[a], z czego wynika, że XEA 1, oraz z xEA;
wynika, że xe[a]. +
Relacja binarna R w zbiorze A jest antysymetryczna, jeżeli
aRb i bRaimplikujea=b
109
ROZDZIAŁ 5. ZBIORY I NIE TYLKO
•
W częściowo uporządkowanym zbiorze A może nie być pojedynczego
„maksymalnego" elementu x takiego, że y R x dla wszystkich yeA. Zamiast
tego może istnieć wiele elementów maksymalnych, które nie są ze sobą w relacji
R. Na przykład wśród pewnej liczby pudelek różnych rozmiarów może być
kilka „największych" pudełek, których nie da się umieścić w żadnym innym
pudełku, lecz nie istnieje jedno pudełko „największe", do którego można 1lllie-
ścić każde inne pudełko. Częściowy porządek R w zbiorze A jest pełny lub
liniowy, jeśli dla dowolnych a, be A zachodzi a Rb lub b Ra. Na przykład
relacja ,, ~ " jest pełnym porządkiem liczb naturalnych, ale relacja ,jest po-
tomkiem" nie jest pełnym porządkiem zbioru wszystkich ludzi, ponieważ są
jednostki, które nie są ze sobą w ogóle spokrewnione.
ZADANIA
5.1-1. Udowodnij, że relacja bycia podzbiorem „c" określona we wszystkich
podzbiorach Z jest porządkiem częściowym, ale nie pełnym.
5.2-2. Wykaż, że dla dowolnej dodatniej liczby całkowitej n relacja „rów-
noważny modulo n" jest relacją równoważności w zbiorze liczb całko
witych. (Mówimy, że a: b (mod n), jeśli istnieje liczba całkowita q taka,
że a - b = qn). Na jakie klasy abstrakcji ta relacja dzieli zbiór liczb cał
kowitych?
5.2-3. Podaj przykłady relacji, które są
(a) zwrotne i symetryczne, ale nie przechodnie;
(b) zwrotne i przechodnie, ale nie symetryczne;
(c) symetryczne i przechodnie, ale nie zwrotne.
5.2-4. Niech S będzie skończonym zbiorem, a R relacją równoważności
w S x S. Pokaż, że jeśli dodatkowo R jest antysymetryczna, to klasy abs-
trakcji S relacji R są singletonami.
5.2-5. Profesor Narcissus twierdzi, że jeżeli relacja R jest symetryczna i prze-
chodnia, to jest również zwrotna. Podaje następujący dowód. Z symetrii
wynika: jeśli a Rb, to b Ra. Przechodniość implikuje a Ra. Czy profesor
ma rację?
5.3. Funkcje
Mając dane dwa zbiory A i B, funkcją / nazywamy relację binarną w A x B
taką, że dla każdego aeA istnieje dokładnie jedno beB takie, że (a, b)ef
.Zbiór A nazywa się dzieclriną funkcji f, a zbiór B - przeciwdziedziną funkcji f
Czasami zapisujemy/: A - B; jeśli (a, b) ef. to b = f(a), ponieważ b jest jedno-
znacznie określone przez wybór a.
110
5.3. FUNKCJE
nie jest funkcją, ponieważ (1, 3) i (1, 5) spebtiają g, więc jeśli wybierzemy a = 1,
to nie ma dokładnie jednego b takiego, że (a, b)eg.
Mając daną funkcję/: A -i-B,jeśli b = /(a), to mówimy, że a jest argwnen-
tem f, a b jest wartością / w a. Możemy określić funkcję przez podanie jej
wartości dla każdego elementu z jej dziedziny. Na przykład/(n) = 2n dla neN,
co oznacza/= {(n, 2n): neN}. Dwie funkcje fig są sobie równe, jeśli mają tę
samą dziedzinę i przeciwdziedzinę i jeśli dla każdego a z dziedziny /(a) = g(a).
Oąg skończony o długości n jest funkcją f, której dziedzina jest zbiorem
{O, 1, ... , n - l}. Często określamy tak.i ciąg przez wypisanie jego wartości:
(f(O),f(l), ... ,f(n -1)).
Oąg nieskończony jest funkcją, której dziedziną jest zbiór liczb natural-
nych N. Na przykład ciąg Fibonacciego, zdefiniowany wzorem (2.13),jest cią
giem nieskończonym (O, I, 1, 2, 3, 5, 8, 13, 21, .... ).
Kiedy dziedziną funkcji/ jest iloczyn kartezjański, często pomija się dodat-
kowe nawiasy otaczające argument funkcji f Jeżeli na przykład
f: A 1 x A 2 x ... x A11-> B, to napiszemy b = f(a 1 , a2 , ••• , 0 11) zamiast b = f((a 1 ,
a 2 , •••, a11)). Każde a1 nazywamy argwnentem funkcji/, pomimo że technicznie
(pojedynczy) argument/jest n-tką (a 1 , a2 , ••• , a11).
Jeśli/: A -> B jest funkcją i b = f(a), to mówimy, że b jest obrazem a wf
Obraz zbioru A' c A wf jest zdefiniowany jako
111
ROZDZIAŁ 5. ZBIORY I NIE TYLKO
element ze zbioru N pojawia się jako wartość/ dla pewnego argumentu. Nato-
miast funkcja /(n) = 2n nie jest surjekcją ze zbioru N w N, ponieważ żaden
argument podstawiony do f nie daje 3. Funkcja/(n) = 2n jest jednakże surjek-
cją ze zbioru liczb naturalnych w zbiór liczb parzystych. Surjekcję /: A -+ B
nazywamy cza.sami odwzorowaniem zbioru A na zbiór B. Jeśli mówimy, że
funkcja/jest „na", oznacza to, że jest surjek.cją.
Funkcja/: A-+ B jest injekcją, jeśli różne argumenty/ dają różne wartości,
tzn. jeśli a -::/, /(a'). Na przykład funkcja/(n) = 2n jest injekcją ze
a', to /(a) -::/,
zbioru N w zbiór N, ponieważ każda liczba parzysta b jest obrazem wf co
najwyżej jednego elementu dziedziny, b/2. Funkcja/(n) = Ln/2J nie jest injek-
cją, ponieważ wartość 1 może powstać z dwóch argumentów: 2 i 3. Injekcjajest
czasami nazywana funkcją różnowartościową.
Funkcja/: A-+ B jest bijekcją, jeśli jest jednocześnie surjekcją i injekcją.
Na przykład funkcjaf(n) = (-1)' fn/21 jest bijekcją z N w Z:
o~ o
1~ -1
2~ 1
3~ -2
4~ 2
Powyższa funkcja jest injekcją, ponieważ żaden element ze zbioru Z nie jest
obrazem więcej niż jednego elementu ze zbioru N; jest surjekcją, ponieważ
każdy element zbioru Z pojawia się jak.o obraz jakiegoś elementu zbioru N,
a więc ta funkcja jest bijekcją. Bijekcja jest czasem nazywana odpowiedniością
wzajemnie jednoznaczną, ponieważ łączy parami elementy dziedziny i przeciw-
dziedziny. Bijekcja ze zbioru A w siebie jest nazywana pennutacją.
Kiedy funkcja/ jest bijekcją, jej odwrotność 1- 1 jest zdefiniowana jak.o
jeśli m ~ O
jeśli m <O
ZADANIA
5.3-1. Niech A i B będą zbiorami skończonymi i niech/: A-+ B będzie funkcją.
Wykaż, że
112
5.J...2. Czy funkcjaf(x) = x + 1 jest bijekcją, kiedy dziedziną i przeciwdziedzi-
ną jest N? Czy jest bijekcją w przypadku zbioru Z?
5.3-3. Podaj naturalną defmicję relacji odwrotnej do danej relacji binarnej ta-
ką, że jeśli ta relacja jest bijekcją, to relacja odwrotna jest jej funkcją
odwrotną.
* 5.3-4. Podaj bijekcję ze zbioru Z na zbiór Z x Z.
5.4. Grafy
W tej części książki przedstawimy dwa rodzaje grafów: skierowane (wrien-
towane) i nieskierowane (niewrientowane). Czytelnik powinien pamiętać
o tym, że pewne defmicje, z którymi spotykamy się w literaturze matematycz-
nej, mogą się różnić od podanych tutaj, lecz w większości różnice te są niewiel-
kie. W podrozdziale 23.l pokażemy, jak są reprezentowane grafy w pamięci
komputera.
Graf skierowany (lub digraf) G jest opisany parą (V, E), gdzie V jest
zbiorem skończonym, a E jest relacją. binarną w V. Zbiór V jest nazywany
zbiorem wierzchołków G, a jego elementy są nazywane wiencholkami. Zbiór
E jest nazywany zbiorem krawędzi G, a jego elementy nazywamy krawędziami.
Na rysunku 5.2a jest pokazany graf skierowany o zbiorze wierzchołków {l,
2, 3, 4, 5, 6}. Wierzchołki są przedstawione jak.o kółka, a krawędzie jak.o
strzałki. Zauważmy, że możliwe jest istnienie pętli od danego wierzchołka do
•
mego samego.
W grafie nieskierowanym G = (V, E), zbiór krawędzi Eto zbiór nieuporzą
dkowanych par wierzchołków. Oznacza to, że krawędź jest zbiorem {u, v},
gdzie u, ve V i u "f' v. Do oznaczenia krawędzi będziemy używać zapisu (u, v)
zamiast oznaczenia w postaci zbioru {u, v}; zapisy (u, v) i (v, u) oznaczają tę
samą krawędź. W grafie nieskierowanym nie mogą występować pętle, więc
© 6
(,) (b) (c)
Rys. 5.2. Grafy skierowane i nieskierowane. (a) Graf skierowany G = (V, E), gdzie V= {I, 2, 3, 4, 5, 6}
i E = {(l, 2), (2, 2), (2, 4), (2, 5), (4, I), (4, 5), (5, 4), (6, 3)}. Krawędź (2, 2) jest pętlą. (b) Graf
nieskierowany G = (V, EJ,gdzie V"" {l, 2, 3, 4, 5, 6} i E = {(1, 2), (1, 5), (2, 5), (3, 6)}. Wierzchołek
4 jest izolowany. (c) Podgraf grafu z części (a) utworzony ze zbioru wierzchoHców{I, 2, 3, 6}
113
ROZDZIAŁ 5. ZBIORY I NIE TYLKO
każda krawędź zawiera dokładnie dwa różne wierzchołki. Na rysunku 5.2 (b)
jest pokazany graf nieskierowany o zbiorze wierzchołków {l, 2, 3, 4, 5, 6}.
Wiele definicji dotyczących grafów skierowanych i nieskierowanych jest
takich samych, chociaż niektóre terminy mają nieco inne znaczenie, Jeśli (u, v)
jest krawędzią grafu skierowanego G = (V, E), to mówimy, że krawędź (u, v)
jest wychodząca z wierzchołka u i jest wchodząca do wierzchołka v. Na przykład
krawędzie wychodzące z wierzchołka 2 na rys. 5.2a to (2, 2), (2, 4) i (2, 5).
Krawędzie wchodzące do wierzchołka 2 to (1, 2) i (2, 2). Jeśli (u, v) jest krawę
dzią grafu nieskierowanego G = (V, E), to mówimy, że (u, v) jest incydentna
z wierzchołkami u i v. Na rysunku 5.2b krawędzie incydentne z wierzchołkiem
2 to (I, 2) i (2, 5).
Jeśli (u, v) jest krawędzią grafu G = (V, E), to mówimy, że wierzchołek
v jest sąsiedni do wierzchołka u. Kiedy graf jest nieskierowany, relacja sąsiedz
twa jest symetryczna. Kiedy graf jest skierowany, relacja sąsiedztwa nie musi
być symetryczna. Jeśli w grafie skierowanym v jest wierzchołkiem sąsiadują
cym z u, to czasem zapisujemy to jako u-+ v. Na rysunku 5.2a i b wierzchołek
2 sąsiaduje z wierzchołkiem I, ponieważ krawędź (1, 2) należy do obu grafów.
Wierzchołek 1 nie sąsiaduje z wierzchołkiem 2 na rys. 5.2a, ponieważ krawędż
(2, 1) nie należy do grafu.
Stopniem wierzchołka w grafie nieskierowanym jest liczba incydentnych
z nim krawędzi. Na przykład wierzchołek 2 na rys. 5.2b ma stopień 2. W grafie
skierowanym stopień wyjściowy wierzchołka jest liczbą krawędzi wychodzących
z niego, a stopień wejściowy wierzchołka jest liC'lbą krawędzi do niego wcho-
dzących. Stopniem wierzchołka w grafie skierowanym jest liczba będąca sumą
jego stopni: wejściowego i wyjściowego. Wierzchołek 2 na rys. 5.2a ma stopień
wejściowy 2, stopień wyjściowy 3 i stopień 5,
Ścieżka (droga) długości k z wierzchołka u do wierzchołka u' w grafie
G = (V, E) jest ciągiem wierzchołków (v 0, v1, v2 , ••• , vt) takich, że u= v0,
u' = V.1: i (v1_ 1, vJe E dla i= 1, 2, ..., k. Długość ścieżki jest liczbą krawędzi
ścieżki. Ścieżka zawiera wierzchołki v0 , v1 , ... , vt i krawędzie (v0 , v1 ), (v1 , v2 ), ... ,
(v.1:-i, vJ. Jeśli istnieje ścieżka p z u do u', to mówimy, że u' jest osiągalny
z u po ścieżce p, co zapisujemy: u 4 u', jeśli G jest grafem skierowanym. ścież
ka jest nazywana ścieżką prostą, jeśli wszystkie jej wierzchołki są różne. Na
rysunku 5.2a ścieżka (I, 2, 5, 4) jest ścieżką prostą o długości 3. Ścieżka (2, 5,
4, 5) nie jest ścieżką prostą.
Podścieżka ścieżki p = (v 0, v1, ... , vl) jest ciągiem kolejnych wierzchoł
ków. To znaczy, że dla dowolnych O ~ i~ j ~ k podciąg wierzchołków (v 1,
v1+ 1 , ••• , v1) jest podścieżką ścieżki p.
W grafie skierowanym ścieżka (v 0, v1, ... , vl) tworzy cykl, jeśli v0 = vt
oraz zawiera co najmniej jedną krawędź. Cykl nazywamy prostym, jeśli, dodat-
kowo, v1 , v2 , ... , v.1:są różne. Pętla jest cyklem o długości 1. Dwie ścieżki (v 0 ,
v1 , v2 , ••• , vt- 1 , v0 ) i (v(), v'1 , v2, ..., vl- 1 , v()) tworzą ten sam cykl, jeśli istnieje
114
5.4. GRAFY
G 3
3
5 4
G'
•
(a) (b)
Rys. 5.3. {a) Para izomorficmych grafów. Wierzchołki górnego grafu odpowiadają wierzchołkom
=
dolnego grafu w funkcji odwzorowującej/(1) u,/(2) = u,/(3) = w,/(4) = x,f(S).., y,/(6) = z.
(b) Dwa nieizomorficzne grafy: górny graf ma wiert.ehołek stopnia 4, natootiast dolny takiego nie ma
115
ROZDZIAŁ 5. ZBIORY I NIE TYLKO
116
5.5. DRZEWA
ZADANIA
L stopień(v) - 2JEJ
5.4-2. Pokaż, że w grafie nieskierowanym długość cyklu musi wynosić co
najmniej 3.
5.4-3. Pokaż, że jeśli graf skierowany lub nieskierowany zawiera ścieżkę mię
dzy dwoma wierzchołkami u i v, to zawiera ścieżkę prostą między tymi
wierzchołkami. Pokaż, że jeśli graf skierowany zawiera cykl, to zawiera
cykl prosty.
5.4-4. Pokaż, że dowolny spójny graf nieskierowany G = (V, E) spełnia zależ
ność JEJ;,,JVJ- I.
5.4-5. Pokaż, że w grafie nieskierowanym relacja ,jest osiągalny z" jest relacją
równoważności w zbiorze wierzchołków grafu. Która z trzech własności
relacji równoważności zachodzi dla tej relacji w grafach skierowanych?
5.4-6. Co jest wersją nieskierowaną grafu skierowanego na rys. 5.2a? Co jest
wersją skierowaną grafu nieskierowanego na rys. 5.2b?
* 5.4-7. Pokaż, że hipergrafmoże być przedstawiony jako graf dwudzielny, jeśli
pozwolimy, aby relacja incydencji dla hipergrafu odpowiadała relacji sąsie
dztwa w grafie dwudzielnym. (Wskazówka: Niech jeden zbiór wierzchoł
ków w grafie dwudzielnym odpowiada wierzchołkom hipergrafu, a drugi
zbiór wierzchołków - hiperkrawędziom).
5.5. Drzewa
Podobnie jak dla grafów, tak.że dla drzew istnieje wiele oznaczeń (notacji).
W tej części książki podajemy definicje i własności kilku typów drzew. W pod-
rozdziałach 11.4 i 23.1 pokażemy,jak drzewa mogą być reprezentowane w pa-
mięci komputera.
117
ROZDZIAŁ 5. ZBIORY I NIE TYLKO
\
(o) (b) (c)
Rys, SA. (a) Drzewa wolne. (b) Las. (c) Graf, który zawiera cykl, a więc nie jest ani drzewem, ani lasem
powiedzieć, że graf ten jest drzewem wolnym. Graf nieskierowany, który jest
acykliczny, ale niekoniecznie spójny, nazywamy lasem. Wiele z algorytmów,
które stosujemy dla drzew, możemy również stosować w sposób podobny
w przypadku lasów.
Na rysunku 5.4a widać drzewo, a na rys. 5.4b - las. Graf na rys. 5.4c nie
jest ani drzewem, ani lasem, ponieważ zawiera cykl.
Następujące twierdzenie zawiera wiele ważnych faktów dotyczących drzew
wolnych.
(3) G jest spójny, ale jeśli usuniemy którąś z krawędzi z E, to powstały graf jest
. '
n1esp0Jny.
.
(4) G jest spójny i !El- !VI- I.
(5) G jest acykliczny i !El- !VI-1.
(6) G jest acykliczny, lecz jeśli dodamy do Ejakąk.olwiek krawędź, to powstały
graf zawiera cykl.
DOWÓD
(1)=> (2): Ponieważ drzewo jest spójne, każde dwa wierzchołki G są połączone
co najmniej jedną ścieżką prostą. Niech u i v będą wierzchołkami połączonymi
dwiema różnymi ścieżkami prostymi p 1 i p 2 , jak to widać na rys. 5.5. Niech
w będzie wierzchołkiem, w którym ścieżki po raz pierwszy się rozchodzą; to
znaczy w jest pierwszym wierzchołkiem, przez który przechodzą ścieżki Pi i p 2
i którego następnikiem na p 1 jest x, a następnikiem na p 2 jest y, gdzie x 'F y.
Niech z będzie pierwszym wierzchołkiem, w którym ścieżki schodzą się ponow-
nie; a więc z jest pierwszym wierzchołkiem po w na Pi takim, że znajduje się on
na p 2 • Niech p' będzie podścieżką p 1 , która prowadzi z w przez x do z, i niech
118
5.5. DRZEWA
p'
,. '
• p"
Rys. 5.5. Jeden z kroków w dowodzie tw. 5.2: jeżeli (I) G jest drzewem wolnym, to (2) dowolne dwa
wierzchołki G są ze sobą połączone jedyną ścieżką prostą. Przypuśćmy (przez zaprzeczenie), że
wierzchołki u i v są połączone dwiema różnymi ścieżkami prostymi p 1 i p 1 • Ścieżki te pierwszy raz
łączą się w wierzchołku w i po raz pierwszy ro7.dzielają się w wierzchołku z. Ścieżka p' złożona
razem z odwrotnością ścieżki p" tworzy cykl, co prowadzi do sprzeczności
p" będzie pod.ścieżką p 2 , która prowadzi z w przez y do z. ścieżki p' i p" nie
mają wspólnych wierzchołków poza swoimi końcami. Tak. więc ścieżka otrzy-
mana przez złożenie p' i odwrotności ścieżki p" jest cyklem, co jest zaprze-
C'leniem acykliC'lności drzewa. Tak więc, jeśli G jest drzewem, może istnieć
najwyżej jedna ścieżka prosta między dwoma wierzchołkami.
(2)=-(3): Jeśli każde dwa wierzchołki G są połączone jedyną ścieżką pros-
tą, to G jest spójny. Niech (u, v) będzie jedną z krawęd.zi E. Ta krawędź jest
ścieżką z u do v, musi więc być jedyną ścieżką łączącą u i v. Jeśli usuniemy (u, v)
z G, przestanie istnieć ścieżka z u do v, więc operacja ta rozspójnia G.
(3) =- (4): Przyjmując, że graf G jest spójny i biorąc pod uwagę zad. 5.4-4,
mamy IE!~ IVI-1. Udowodnimy przez indukcję, że IEI~ JVI- 1. Graf spój-
ny o n= I lub n= 2 wierzchołkach ma n - l krawędzi. Przyjmijmy, że G ma
n~ 3 wierzchołków i wszystkie grafy spełniające (3) o mniej niż n wierzchoł
kach spełniają również zależność IEI~ !VI- I. Usuwając dowolną krawędź
z G, rozdzielamy graf na k ~ 2 spójnych składowych (faktycznie k = 2).
Każda składowa spełnia (3), bo inaczej G nie spełniałby (3). Zatem,
przez indukcję, liC'lba krawędzi we wszystkich składowych razem wynosi co
najwyżej IVI - k ~ IVI - 2. Jeśli dodamy usuniętą krawędź, to otrzymamy
IEl<;IVl-1.
(4)=- (5): Przypuśćmy, że G jest spójny i IE)= IVI- l. Musimy wykazać,
że G jest acykliczny. Przypuśćmy, że G ma cykl zawierający k wierzchołków v1 ,
v2 , ••• , v1 • Niech G1 = (V 1 , E1) będzie właśnie tym cyklem. Zauważmy, że
IVkl= IE1 1 = k. Jeśli k < ]VI,to musi istnieć wierzchołek v1 + 1 eV- Vk, który
jest sąsiadem pewnego węzła v1e Vk, ponieważ G jest spójny. 2.defmiujmy
Gk+i = (V 1 + 1, Ek+i) jako podgraf G z Vk+t = V1 u {v1 + 1 } i Ek+l = E1 u {(v1,
vk+1 )}. Następnie zauważmy, że IVk+tl = jE1 + 1 1= k + 1. Jeżeli k + 1 < n, to
możemy w ten sam sposób zdefiniować Gk+i itd., aż otrzymamy Gn= (Vn,E,.),
gdzie n= IVI, vn
= v i IEnl= IVnl= 1v1.Ponieważ Gnjest podgrafem G,
Ens;. E, więc ]El~ IVI,co jest sprzeczne z założeniem IE)= ]VI - 1. Tak więc
G jest acykliczny.
119
ROZDZIAŁ 5. ZBIORY I NIE TYLKO
=
(5) (6): Przypuśćmy, że G jest acykliczny i IEI - IVI - 1. Niech k będzie
liczbą spójnych składowych G. Każda ze spójnych składowych jest z definicji
drzewem wolnym i skoro (1) implikuje (5), liczba wszystkich krawędzi we
wszystkich spójnych składowych G wynosi IV] - k. Tak więc k = 1 i G musi
być drzewem. Ponieważ (I) implikuje (2), każde dwa wierzchołki G są połączo
ne jedyną ścieżką prostą. Dodanie do G krawędzi tworzy cykl.
(6)= (I): Załóżmy, że G jest acykliczny, ale jeśli dodamy do E krawędź,
utworzymy cykl. Musimy wykazać, że G jest spójny. Niech u i v będą dowol-
nymi wierzchołkami G. Jeśli u i v nie są sąsiadami, to przez dodanie krawędzi
(u, v) utworzymy cykl, którego wszystkie krawędzie poza (u, v) należą do G.
Istnieje zatem ścieżka od u do v, a ponieważ u i v zostały wybrane dowolnie,
więc G jest spójny.
•
5.5.2. Drzewa ukorzenione i uporządkowane
Dr:zewoz korzeniem (drzewo ukorzenione) jest drzewem wolnym, w którym jeden
z wierzchołków jest wyróżniony -wierzchołek ten nazywamy korzeniem drzewa.
Często wierzchołki drzew ukorzenionych nazywamy węzlami 1 l drzewa. Na rysun-
ku 5.6a widać drzewo ukorzenione mające 12 węzłów z korzeniem równym 7.
Głębokość O
..
li
Głębokość 1
:w
o Ił: Głębokość 2
t
~ Głębokość 3
Głębokość 4
(,) (b)
l) Określenie „węzeł" jest często używane jak.o synonim wierz.chołka. My będziemy używać
terminu „węzeł" w znaczeniu wierzchołka drzewa ukorzenionego.
120
5.5. DRZEWA
Zauważmy, że stopień węzła za.leży od tego, czy Tjest drzewem ukorzenionym czy wolnym.
1
>
Stopień wierzchołka w drzewie wolnym jest, podobnie jak w grafie nieskierowanym, liczbą sąsied
nich wierzchołków. Natomiast w drzewie ukorzenionym stopniem węzła jest liczba następników.
121
ROZDZIAŁ 5. ZBIORY I NIE TYLKO
,, 3
' 7
J
'4 l
~
'6
(•) (b) (,)
Rys. 5.7. Drzewa binarne. (a) Drzewo binarne naszkicowane w standardowy sposób. Następniki
węzła są narysowane pod nim: lewy po lewej, prawy po prawej stronie. (b) Inne drzewo binarne.
W (a) lewy następnik węzła 7 to 5, a prawy nie istnieje. W (b) lewy następnik 7 nie istnieje, a prawy
to 5. Drzewa te, jako drzewa uporządkowane, są takie same, lecz jako drzewa binarne różnią się
od siebie. (c) Drzewo binarne w (a) reprez.entowane przez węzły regularnego drzewa binarnego:
drzewa uporządkowanego, w którym stopień każdego węzła wewnętrmego wynosi 2. Liście są
umieszczone w kwadracikach
122
5.5. DRZEWA
Głębokość O
Głębokość 1
Gębokolć2
Gębokolć 3
Ry1. 5.8. Pełne drzewo binarne o wysokości 3 i 8 liściach oraz 7 węzłach wewnętrznych
k' - I
k-1
z równania (3.4). Tak więc pełne drzewo binarne o wysokości h ma 211- l
węzłów wewnętrznych.
ZADANIA
5.S-1. Narysuj wszystkie drzewa wolne utworzone z 3 wierzchołków A, Bi C.
Narysuj wszystkie drzewa ukorzenione o węzłach A, B i C, w których
A jest korzeniem.. Narysuj wszystkie drzewa uporządkowane, a następnie
binarne o węzłach A, B i C, w których A jest korzeniem.
S,5-2. Pokaż, że dla n~ 7 istnieje takie drzewo wolne o n węzłach, że wybiera-
jąc po kolei każdy z nich jako korzeń, za każdym razem otrzymujemy inne
drzewo z korzeniem.
S.S-3. Niech G = (V, E) będzie acyklicznym grafem skierowanym, który ma
wierzchołek v0 E V taki, że istnieje dokładnie jedna ścieżka z v0 do każdego
wierzchołka vE V. Udowodnij, że nieskierowana wersja grafu G tworzy
drzewo.
5.5-4. Wykaż, stosując indukcję, że w dowolnym regularnym drzewie binar-
nym liczba węzłów stopnia 2 jest o I mniejsza niż liczba liści.
5.S-5. Wykaż, stosując indukcję, że wysokość drzewa binarnego o n węzłach
wynosi co najmniej Lig nj.
* 5.5-6. Długość ścleW wewnębznej regularnego drzewa binarnego jest sumą, po
wszystkich węzłach wewnętrznych drzewa, głębokości każdego węzła. Po-
123
ROZDZIAŁ 5. ZBIORY I NIE TYLKO
Problemy
5-1. Kolorowanie grafów
k-kolorowanie grafu nieskierowanego G = (V, E) jest funkcją c: V-+ {O, I,
... , k- l} taką, że c(u) ,' c(v) dla każdej krawędzi (u, v)eE. Innymi słowy,
liczby O, 1, ... , k - 1 reprezentują k kolorów i sąsiednie wierzchołki muszą
być innych kolorów.
(a) W dowolnej grupie ludzi n ~ 2 jest dwoje ludzi mających tę samą liczbę
znajomych w tej grupie.
(b) W każdej grupie złożonej z 6 ludzi znajdzie się troje wzajemnie sobie znajo-
mych lub trzech wzajemnie sobie nieznajomych.
(c) Dowolna grupa ludzi może być tak podzielona na dwie części, że co naj-
mniej połowa znajomych każdej z osób należy do grupy, do której ta osoba
nie należy.
124
UWAGI DO ROZDZIAŁU
(d) Jeśli każda osoba w danej grupie jest przyjacielem co najmniej polowy
osób w tej grupie, to można posadzić całą grupę przy stole tak, żeby każda
osoba siedziała pomiędzy dwoma znajomymi.
Uwagido rozdziału
G. Boole zapoczątkował rozwój logiki symbolicznej i wprowadził wiele pod-
stawowych oznaczeń dla zbiorów w książce wydanej w 1854 r. Współczesna
teoria zbiorów została stworzona przez G. Cantora w latach 1874-1895. Can-
tor przede wszystkim skupił się na zbiorach o nieskończonej liczności. Termin
„funkcja" jest związany z nazwiskiem G. W. Leibnitza, który pierwszy użył go
w związku z pewnymi typami wzorów matematycznych. Teoria grafów po-
wstała w 1736 r., kiedy L. Euler dowiódł, że nie da się przejść każdego z sied-
miu mostów Królewca dokładnie jednokrotnie i wrócić do punktu wyjścia.
Użytecznym kompendium wielu definicji i zastosowań teorii grafów jest książ
ka napisana przez Harary'ego [94].
Rozdział 6
Zliczanie
i prawdopodobieństwo
6.1. Zliczanie
Teoria zliczania stara się odpowiedzieć na pytanie „Ile?" - bez faktycznego
zliczania. Możemy na przykład zapytać „Ile jest różnych liczb n-bitowych?"
lub „Ile jest podziałów na klasy n różnych elementów?". W tym podrozdziale
omawiamy elementy teorii zliczania. Zakładamy, że czytelnik. zna podstawowe
zagadnienia teorii zbiorów - jeśli nie, to powinien uprzednio zapoznać się
z materiałem zawartym w podrozdz. 5.1.
126
6.1. ZLICZANIE
Słowa
Permutacje
Pennutacją zbioru skończonego S nazywamy uporządkowany ciąg wszystkich
elementów zbioru S, przy czym każdy element występuje dokładnie raz. Jeśli
na przykład S = {a, b, c}, to mamy 6 permutacji zbioru S:
127
ROZDZIAŁ 6. ZLICZANIE I PRAWDOPODOBIEŃSTWO
ab, ac, ad, ba, be, bd, ca, cb, cd, da, db, de
n!
n(n - l)(n - 2) ...(n - k + 1) - (n_ k)! (6.1)
Kombinacje
k-kombinacją zbioru n-elementowego S nazywamy po prostu k-elementowy
podzbiór zbioru S. Istnieje sześć 2-kombinacji zbioru 4-elementowego {a, b,
c, d}:
ab, ac, ad, be, bd, cd
(Używamy tutaj skrótu, zapisując
zbiór 2-elementowy {a, b} jako ab). Możemy
skonstruować k-kombinację zbioru n-elementowego, wybierając k różnych ele-
mentów z tego zbioru.
Liczba k-kombinacji zbioru n-elementowego może być wyrażona przez
liczbę k-permutacji tego zbioru. Dla każdej k-kombinacji istnieje dokładnie kl
permutacji jej elementów, gdzie każda z nieb jest inną k-permutacją zbioru
n-elementowego. Stąd liczba k-kombinacji zbioru n-elementowego jest równa
liczbie k-permutacji podzielonej przez k!; z równości (6.1) liczba ta wynosi
n!
(6.2)
k!(n - k)!
128
6.1. ZLICZANIE
Współczynniki dwumienne
") n! (6.3)
( k - k!(n - k)!
(6.4)
(x + y)" = f (")x'y"-•
k"'Ok
(6.5)
2"=±(")
k"'O k
(6.6)
129
ROZDZIAŁ 6. ZLICZANIE I PRAWD0P0D0BIEl'.ISTW0
=(-")("-!)
k k-l ...(n-k+l) l
~(k")' (6.7)
n'
" k!
-.0.:
-- (6.8)
(6.9)
(6.11)
= 2nH(l) (6.12)
gdzie
130
6.1. ZLICZANIE
ZADANIA
(")--"-("-!)
k k k- I (6.14)
dlaO<k~n.
6.1-6. Udowodnij tożsamość
( ")-
k
n
n-k
(•-1) k
dlaO~k<n.
6.1-7. Aby wybrać k prreilmiotów z n, można jeden z nich wyróżnić i spraw-
dzić, czy ten wyróżniony przedmiot został wybrany. Użyj tej wskazówki
do udowodnienia, że
f;-(•+l)
l"-1 2
131
ROZDZIAŁ 6. ZLICZANIEI PRAWDOPODOBIEŃSTWO
(6.15)
6.2. Prawdopodobieństwo
132
6.2. PRAWDOPODOBIEI\ISTWO
133
ROZDZIAŁ 6. ZLICZANIE I PRAWDOPODOBIENSTWO
Pr{.,}- 1/ISJ
134
6.2. PRAWDOPODOBIEŃSTWO
d-c
Pr{[c, d]} - · --
b- a
135
ROZDZIAŁ 6. ZLICZANIE I PRAWDOPODOBIErilSTWO
Pr{AIB}= Pr{A)
Pr{A,n A 1) = Pr{A,}Pr{A;)
i <j:;;;,;n. Mówimy,
dla wszystkich 1 :;;;;: że zdarzenia te są (wzajemnie) niezależ
ne, jeśli każdy k-podzbiór A;,, A 1,, ••• , A;,. rodziny, k:;;;,;n
gdzie 2 :;;;;:
i 1 < i 2 < ... < ik:;;;,;n, spełnia zależność
i l :;;;;:
136
6.2. PRAWDOPODOBIENSTWO
Pr{A1 } = 1/2
Pr{A,} = 1/2
Pr{A3 } = 1/2
Pr{A1 n A,}= 1/4
Pr{A1 n A3 } = 1/4
Pr{A,nA 3 } = l/4
Pr{A1 nA,nA 3 } =0
Ponieważ dla 1 :;;;; i <j ~ 3, mamy Pr{A 1 nA 1} = Pr{A 1}Pr{A1} = 1/4, zdarze-
nia A 1 , A 2 i A 3 są parami niezależne. Zdarzenia te jednakże nie są wzajemnie
niezależne, gdyż Pr{A1 n A, r, A,} = Oi Pr{A1 }Pr{A,}Pr{A 3
} = 1/8 ," O.
Twierdzenie Bayesa
Z definicji prawdopodobieństwa warunkowego (6.19) wynika, iż dla dwóch
zdarzeń A i B, każde o niezerowym prawdopodobieństwie, za.chodzi
Pr{AIB}= Pr{A}l'r{BIA}
(6.21)
Pr{B}
który to wzór jest znany jako wzór Bayesa. Mianownik Pr{B} jest stałą nor-
malizującą, którą inaczej można zapisać w następujący sposób. Ponieważ
B = (B n A) u (B n A) i B n A i B n A" są zdarzeniami wzajemnie się wyklu-
czającymi, więc
Pr{A}Pr{BIA}
T
Pr{AIB}= Pr{A}Pr{BIA}+ Pr{~A',c}P~,{=BIA
137
ROZDZIAŁ 6. ZLICZANIEł PRAWDOPOOOBIElilSTWO
=4/5
ZADANIA
6.2-1. Udowodnij nierówność Boole'a: dla każdej skończonej lub przeliczalnej
rodziny zdarzeń A 1 , A 2 , ••• zachodzi
138
6.3. DYSKRETNEZMIENNE LOSOWE
Podaj prosty, ale nie trywialny przykład dwóch zdarzeń, które nie są nieza-
leżne, ale są warunkowo niezależne od trzeciego zdarzenia.
* 6.:Z..10. Uczestniczysz w teleturnieju, w którym nagroda jest ukryta za jedną
z trzech zasłon. Otrzymasz nagrodę, jeśli wskażesz dobrą zasłonę. Po wy-
braniu przez Ciebie jednej z zasłon, ale przed jej podniesieniem, prowadzą
cy podnosi jedną z pozostałych zasłon, odkrywając puste miejsce, i pyta,
czy chcesz zmienić swój wybór na pozostałą zasłonę. Jak zmienią się Twoje
szanse wygrania, jeśli 7.decydujesz się na zmianę?
* 6.:Z..11. Strażnik więzienny losowo wybrał spośród trzech więźniów jednego,
który wyjdzie na wolność. Dwóch pozostałych zostanie ściętych. Strażnik
wie, który z więźniów wyjdzie na wolność, lecz nie wolno mu udzielać
więźniom. informacji. Nazwijmy więźniów X, Y i Z. Więzień X pyta na
osobności strażnika, który z więźniów Y i Z będzie ścięty, argumentując,
że skoro i tak wie, że co najmniej jeden z nich zginie, strażnik nie poda mu
żadnej informacji o jego sytuacji. Strażnik powiedział X, że Y zostanie
ścięty. Więzień X czuje się teraz spokojniejszy, bo wie, że albo on, albo
więzień Z zostanie uwolniony, co oznacza, że prawdopodobieństwo wyj-
ścia wynosi teraz 1/2. Czy ma rację, czy też jego szanse nadal wynoszą 1/3?
Odpowiedź uzasadnij.
6.3. Dyskretnezmiennelosowe
Zmienna losowa (dyskretna) X jest funkcją ze skończonej lub przeliczalnej prze-
strzeni zdarzeń S w zbiór liczb rzeczywistych. Przyporządkowuje ona liczbę
rzeczywistą każdemu możliwemu wynikowi doświadczenia, co pozwala nam
operować indukowanym rozkładem prawdopodobieństwa na zbiorze liczb.
Dla zmiennej losowej X i liczby rzeczywistej x definiujemy zdarzenie X= x
jako {seS:X(s) = x); zatem
139
ROZDZIAŁ 6. ZLICZANIE I PRAWD0PODOB1Er;JSTWQ
Pr{X = x) = Pr{s}
{io,S:X(i)- x)
Funkcja
/(x) = Pr{X = x)
Pr{Y=y)=Z:Pr{X=xi Y=y)
Pr{X = x) = 1:Pr{X = x i Y = y)
'
Korzystając z definicji (6.19) prawdopodobieństwa warunkowego, mamy
Pr{X=x i Y=y)
Pr{X=xlY=y)=~~~~~ -
Pr{Y = y)
co jest dobrze określone, jeśli suma jest skończona lub zbieżna bezwględnie.
Czasami wartość oczekiwana X jest zapisywana jako µx lub, kiedy zmienna
losowa wynika z kontekstu, po prostu jak.o µ.
Wyobraźmy sobie grę, w której rzucamy dwiema monetami. Zarabiamy
3 zł za każdego orła, ale tracimy 2 zł za każdą reszkę. Wartość oczekiwana
zmiennej losowej X reprezentującej nasz zarobek wynosi
E[g(X)J = Z:g(x)Pr{X = x)
141
ROZDZIAŁ 6. ZLICZANIE I PRAWDOPODOBIEŃS1WO
E[XYJ=IZ:xyPr{X=xi Y=y}
.'
= IIxyPr{X = x} Pr{Y = y}
.'
= E[X] E[Y]
•
E[XJ = L iPr{X = i}
;"' o
•
= L i(Pr{X;, i} - Pr{X;, i+!})
i= o
•
= Z:Pr{X;, i} (6.28)
i= l
jako że każdy element Pr{ X ;;i: i}jest dodany i razy i odjęty i - I razy (oprócz
elementu Pr{X;:i: O}, który jest dodany O razy i nie odjęty w ogóle).
Powodem prawdziwości równości E[E 2 (XIl = E 2 [X] i E[X E[XIl = E'[X] jest
to, że E[X] nie jest zmienną losową, a po prostu liczbą rzeczywistą, co oznacza,
142
6.3. DYSKRETNEZMIENNE LOSOWE
Var[aXJ = a'Var[XJ
Jeśli Xi Y są niezależnymi zmiennymi losowymi, to
Var[,±, x,J
= ,±, Var[XJ (6.31)
ZADANIA
6.3-1. Rzuciliśmy dwiema kostkami do gry. Jaka jest wartość oczekiwana su-
my liczb oczek widocznych na dwóch kostkach? Jaka jest wartość oczeki-
wana większej z liczb oczek widocznych na tych kostkach?
6.3-2. Macierz A[l ..n] zawiera n różnych liczb losowo uporządkowanych
z tym, że każda permutacja n liczb jest jednakowo prawdopodobna. Jaka
jest wartość oczekiwana indeksu największego z elementów macierzy? Jaka
jest wartość oczekiwana indeksu najmniejszego z elementów macierzy?
6.3-3. Gra polega na rzucaniu trzema kostkami. Gracz może postawić 1 zł na
jedną z liczb od t do 6. Zasady wypłacania wygranych po wykonaniu
rzutu są następujące: jeśli liczba obstawiona przez gracza nie pojawiła się
na żadnej z kostek, to traci on swoją złotówkę; jeśli liczba ta pojawiła się
dokładnie na k kostkach, dla k = 1, 2, 3, to zachowuje on swoją złotówkę
i dostaje dodatkowo k złotówek. Jaki jest oczekiwany zysk w jednej grze?
* 6.3-4. Niech X i Y będą niezależnymi zmiennymi losowymi. Udowodnij, że
f(X) i g(Y) są niezależne dla dowolnego wyboru funkcji/i g.
* 6.3-5. Niech X będzie nieujemną zmienną losową i przypuśćmy, że E[X] jest
dobrze określona. Udowodnij nierówność Markowa:
143
ROZDZIAŁ 6. ZLICZANIEI PRAWDOPODOBIEŃSTWO
6.3-7. Co jest większe: wartość oczekiwana kwadratu 2'llliennej losowej czy też
kwadrat jej wartości oczekiwanej?
6.3-8. Pokaż, że dla dowolnej zmiennej losowej X, która przyjmuje wyłącznie
wartości O i I, mamy Var[X) - E[X)E[l - X].
6.3-9. Udowodnij, że Yar[aX] = a 2 Yar[x] z defm.icji (6.29) wariancji.
Rozkład geometryczny
Przypuśćmy, że mamy ciąg prób Bemoulliego, każda
z prawdopodobieństwem
sukcesu p i prawdopodobieństwem porażki q = 1 - p. Ile nastąpi prób, zanim
odniesiemy sukces? Niech zmienna losowa X będzie liczbą prób potrzebnych
do osiągnięcia sukcesu. Wówczas X przyjmuje wartości z zakresu {1, 2, ...}
i dla k ~ 1 zachodzi równość
(6.33)
144
6.4. ROZKŁADY GEOMETRYCZNE I DWUMIANOWE
0,35
0,30
0,25
0,20
0,15
0,10
0,05
,....,.,..,,,...,.,.~~ k
l 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Rys. 6.1. Rozkład geometryczny z prawdopodobieństwem sukcesu p = l/3 i prawdopodobieństwem
porażki q = l - p. Wartość oczekiwana rozkładu wynosi 1/p = 3
m
E[XJ - I kq•-•p
I; ea 1
p m
- ql=O
-I ką'
p q
- q. (1 - q)'
- 1/p (6.34)
Potrzeba więc średnio 1/p prób, aby odnieść sukces, czyli wynik intuicyjny.
Wariancja, która może być obliczona podobnie, wynosi
145
ROZDZIAŁ 6. ZLICZANIE I PRAWDOPODOBIErilSTWO
p = 8/36 = 2/9 i musimy średnio rzucić l/p = 9/2 = 4,5 raza, aby otrzymać
w wyniku siedem lub jedenaście.
Rozkład dwumianowy
Ile sukcesów nastąpi podczas n prób Bemoulliego, jeżeli sukces następuje
z prawdopodobieństwem p, a porażka - z prawdopodobieństwem q = 1 - p?
Zdefiniujmy zmienną losową X jako liczbę sukcesów, jak.ie wystąpiły w n pró-
bach. Wówczas X przyjmuje wartości ze zbioru {O,1, ..., n} i dla k = O, ..., n
zachodzi równość
Pr{X-k)-(:)p'q•-• (6.36)
b(k; n, p) -(:)p'(l
- p)•-• (6.37)
146
6.4. ROZKŁADY GEOMETRYCZNE I DWUMIANOWE
0,25
0,20
0,15
0,10
0,05
Rys. 6.2. Rozkład dwumianowy b(k, 15, 1/3) pochodzący z n= 15 prób Bemou1liego, każda z praw-
dopodobieństwem sukcesu p = 1/3. Wartość oczekiwana rozkładu wynosi np= 5
= np L • ("-I)
ł:.=1 k-1
P1-1q"-1:.
= np ,-
L'( I)
ł.=O
n-
k
pt.qt11-1)-t.
,-,
-np I b(k; n-1,p)
ł:. =o
=np (6.39)
Korzystając z liniowości wartości oczekiwanej, możemy otrzymać ten sam
rezultat przy użyciu znaczniej mniej skomplikowanych obliczeń. Niech X bę 1
dzie zmienną losową oznaczającą liczbę sukcesów w i-tej próbie. Wówczas
E[XJ = p· l + q·O =pi z liniowości wartości oczekiwanej (6.26) oczekiwana
liczba sukcesów dla n prób wynosi
•
- I l E[XJ
i=
=np
147
ROZDZIAŁ 6. ZLICZANIE I PRAWDOPODOBIEŃSTWO
= npq (6.41)
n!(k-l)!(n-k+ l)!p
- k!(n - k)! n!q
(n - k + l)p
(6.42)
ką
(n+ l)p - k
-l+----------
kq
Stosunek ten jest większy niż 1, gdy (n+ l)p - k jest dodatnie. Zatem
b(k; n, p) > b(k - I; n, p) dla k <(n+ l)p (rozkład rośnie) i b(k;
n, p) < b(k - l; n, p) dla k >(n+ l)p (rozkład maleje). Jeżeli k - (n+ l)p jest
148
6.4. ROZKŁADY GEOMETRYCZNE I DWUMIANOWE
LEMAT 6.1.
Niech n ~ O, niech O < p < l, niech q = 1 - p i niech O ::::;;
k:::;;;n. Wówczas
b(k;n,p),c, (np)'(
-k·
nq
;;:..k
)"-•
DOWÓD
Korzystając ze wzoru (6.10), otrzymujemy
•
ZADANIA
6.4-1. Sprawdź aksjomat 2 z aksjomatów prawdopodobieństwa dla rozkładu
geometrycznego.
6.4-2. Ile razy musimy średnio rzucić sześcioma monetami; zanim otrzymamy
3 orły i 3 reszki?
6.4-3. Pokaż, że b(k; n, p) ~ b(n - k; n, q), gdzie q ~ 1 - p.
6.4-4. Pokaż, że wartość maksymalna rozkładu dwumianowego b(k; n, p) wy-
t.J
nosi w przybliżeniu 1 2n np q , gdzie q = l - p.
* 6.4-5. Pokaż, że prawdopodobieństwo nieuzyskania sukcesu w n próbach Ber-
noulliego, każda z prawdopodobieństwem p = 1/n, wynosi w przybliżeniu
1/e.Pokaż, że prawdopodobieństwo uzyskania dokładnie jednego sukcesu
jest również w przybliżeniu równe 1/e.
* 6.4-6. Profesor Rosencrantz rzuca monetą n razy i to samo robi profesor Guil-
denstern. Pokaż, że prawdopodobieństwo, iż wyrzucą taką samą liczbę
orłów wynosi ( : 2
(W.vkazówka:Przyjmij, że dla profesora Rosencran-
)/4".
149
ROZDZIAŁ 6. ZLICZANIE I PRAWOOPODOBIENSTWO
k=O k
- (2")
i: (")' n
* 6.4-7. Pokaż, że dla O~ k ~ n zachodzi zależność
150
* 6.5. KRAŃCE ROZKŁADU DWUMIANOWEGO
TwIERDZENIE6.2.
Rozważmy ciąg n prób Bemoulliego, gdzie sukces występuje z prawdopodo-
bieństwem p. Niech X będzie zmienną losową oznaczającą całkowitą liczbę
sukcesów. Wówczas dla O~ k ~ n prawdopodobieństwo uzyskania co naj-
mniej k sukcesów wynosi
" b(i; n, p)
Pr{X;, k} = L,
l=ł
DOWÓD
Korzystamy z nierówności (6.15)
Mamy
·-·
= L, b(k+
l=O
i; n,p)
,-,
()
= ~ P',I, b(i;n-k,p)
0
ponieważ ·-·
L
l=O
b(i; n - k, p) = 1 z równości (6.38).
•
151
ROZDZIAŁ 6. ZLICZANIE I PRAWDOP000BtErilSTWO
WNIOSEK 6.3.
Rozważmy ciąg n prób Bernoulliego, gdzie sukces występuje
z prawdopodo-
bieństwem p. Jeśli X jest zmienną losową oznaczającą całkowitą liczbę suk-
k:;;;;n prawdopodobieństwo uzyskania co najwyżej k suk-
cesów, to dla O:;;;;:
, .
cesow wynosi
Pr{X,; k} -
•L b(i; n, p)
i=O
,; (
n-k
n )(1-py-•
TwIERDZENIE 6.4.
Rozważmy ciąg n prób Bernoulliego, gdzie sukces występuje z prawdopodo-
bieństwem p, a porażka z prawdopodobieństwem q = 1 - p. Niech X będzie
zmienną losową oznaczającą całkowitą liczbę sukcesów. Wówczas dla
O < k < np prawdopodobieństwo uzyskania mniej niż k sukcesów wynosi
,_ I
kq
< -······ ····b(k; n, p)
np-k
DOWÓD
,_,
Ograniczamy szereg L b(i; n, p) szeregami geometrycznymi, używając metody
i= o
z podrozdz. 3.2 (str. 70). Dla i= 1, 2, ... , k mamy ze wzoru (6.42)
b(i-1; n, p) iq
·-·-·- ~--
b(i; n, p) (n-i+ l)p
152
* 6.5. KRAŃCE ROZKŁADU DWUMIANOWEGO
<(ni;)({)
"(n:k)(!)
Jeśli przyjmiemy
to stąd wynika, że
dlaO~i<k,astąd
i-1 i·-1
I b(i; n, p) < I x"-' b(k; n, p)
i= o i=O
00
X
- - - b(k; n, p)
1 -X
ką
- b(k; n, p)
np- k
153
ROZDZIAŁ 6. ZLICZANIEI PRAWDOPODOBIE"'STWO
WNIOSEK6.5.
Rozważmy ciąg n prób Bemoulliego, gdzie sukces występuje z prawdopodo-
bieństwem p. Niech X będzie zmienną losową oznaczającą całkowitą liczbę
sukcesów. Wówczas dla np< k < n prawdopodobieństwo uzyskania więcej niż
k sukcesów wynosi
(n - k)p
< · ·· b(k; n,p)
k-np
•
W następnym twierdzeniu bierze się pod uwagę n prób Bernoulliego, każ
dą z prawdopodobieństwem p 1 uzyskania sukcesu, dla i= 1, 2, ... ,n.Jak wy-
nika z zamieszczonego dalej wniosku, możemy użyć tego twierdzenia do wy-
znaczenia ograniczenia na prawy kraniec rozkładu dwumianowego przyjmując
p 1 = p dla wszystkich prób.
TwIERDZENIE 6.6.
Rozważmy ciąg n prób Bernoulliego, gdzie w i-tej próbie, dla i= 1, 2, ... , n,
sukces występuje z prawdopodobieństwemp;, a porażka występuje z prawdopo-
dobieństwem ą 1 = 1 - P;· Niech X będzie 7mienną losową oznaczającą całkowitą
liczbę sukcesów i niech µ = E[X]. Wówczas dla r > µ zachodzi zależność
Pr{X-µ~r} ~ f (µe)'
DOWÓD
Ponieważ dla dowolnego a > O funkcja tfZX jest ściśle rosnąca względem x,
zatem mamy
154
* 6.5. KRAŃCE ROZKŁADU DWUMIANOWEGO
"
X= LX;
i= l
•
I
Podstawiając za X - µ, otrzymujemy
E[e"''-'1= E[TI,•x,-,JJ
J= 1
" E[e"'x,-
= TI ''J
j =1
co wynika z (6.27), jako że wzajemna niezależność zmiennych losowych X
1
implikuje wzajemną niezależność zmiennych losowych ~x,-pJ (patrz zad. 6.3-
4). Z definicji wartości oczekiwanej mamy
(6.44)
~ exp(p 1ej
"
E[e"''-•1<:;exp TI(p;e")
I= I
= exp(µe")
"
bo µ = L p 1• Dalej, z nierówności (6.43) wynika, że
i= l
155
ROZDZIAŁ 6. ZLICZANIE I PRAWDOPODOBIEŃSTWO
•
Twierdzenie 6.6 zastosowane do prób Bernoulliego, gdzie każda z prób ma
to samo prawdopodobieństwo zaistnienia sukcesu, daje nam następujący wnio-
sek dotyczący ograniczenia na prawym krańcu rozkładu dwumianowego.
WNIOSEK 6.7.
Rozważmy ciąg n prób Bernoulliego, gdzie w każdej próbie sukces występuje
z prawdopodobieństwem p, a porażka występuje z prawdopodobieństwem
q = 1 - p. Wtedy dla r > np zachodzi zależność
"
Pr{X - np;, r) - L b(k; n, p)
k=l11p+rl
DOWÓD
Dla rozkładu dwumianowego ze wzoru (6.30) wynika, że µ = E[X] = np.
•
ZADANIA
* 6.5-1. Co jest mniej prawdopodobne: nieuzyskanie żadnego orla w n rzutach
monetą, czy uzyskanie mniej niż n orłów w 4n rzutach monetą?
* 6.5-2. Pokaż, że
L
•-' ( n) a'<
i=o I
(a+ I)"
na-k(a+I)
k- --- b(k; n, a/(a + I))
156
6.6. ANALIZA PROBABILISTYCZNA
•-I'I,pą
i=O
1 "-i < kq
np - k
("P)'(
---
k n- k
nq )"-•
Pr{µ - X ~
(n -
r} ~ ( ----
---,---
µ)e)'
Podobnie, pokaż, że przy założeniach jak we wniosku 6. 7 zachodzi zależność
Pr{X - µ ~ e-,•,z„
r} :::;;;
6.6. Analizaprobabilistyczna
W tym podrozdziale za pomocą trzech przykładów ilustrujemy na czym polega
analiza probabilistyczna. W pierwszym badamy prawdopodobieństwo tego, że
w pokoju, w którym znajduje się k osób, są pary osób, które urodziły się tego
samego dnia. W drugim badamy losowe wrzucanie kul do urn. W trzecim
zajmujemy się okresami „dobrej passy" uzyskiwania orłów w rzucaniu monetą.
157
ROZDZIAŁ 6. ZLICZANIE I PRAWDOPODOBIEŃSTWO
"
Pr{b, - b;) - L Pr{b, - r i b, - r)
r ee 1
- L"1 (l/n 2)
t ee
- I/n
Bardziej intuicyjnie, kiedy zostaje wybrane b1, prawdopodobieństwo tego, że b;
jest wybrane tak: samo, jest równe 1/n. Stąd prawdopodobieństwo, że i oraz
j mają razem urodziny, jest takie samo jak: prawdopodobieństwo tego, że uro-
dziny jednego z nich wypadają danego dnia. Zauważmy jednakże, że ten zbieg
okoliczności zależy od założenia, że urodziny są niezależne.
Możemy analizować prawdopodobieństwo, że co najmniej 2 z k osób ma
razem urodziny poprzez spojrzenie na zdarzenie dopełniające. Prawdopodo-
bieństwo, że co najmniej dwie daty urodzin się pokrywają, jest równe 1 minus
prawdopodobieństwo tego, że wszystkie daty urodzin są różne. Zdarzenie po-
legające na tym, że k osób ma różne urodziny to
B, -
•-'
(") A,
i= 1
158
6.6. ANALIZA PROBABILISTYCZNA
-!·(":I)(":2)...(n-:+I)
-1-(1-!)(1-!)···(1-k:l)
Nierówność (2.7), I +x ~ C, daje nam
= e-l{ł:.-1)/an
~ 1/2
159
ROZDZIAŁ 6. ZLICZANIE I PRAWDOPODOBIEŃSTWO
X,;~ {I,
o,
jeśli osoby i oraz j
•
w przeciwnym •
razie
mają razem urodziny
k(k - 1)
2n
Kiedy zatem k(k - 1) ~ 2n, oczekiwana liczba par osób o takich samych
dniach urodzin wynosi co najmniej 1. Wobec tego, jeśli mamy co najmniej
J-2~ osób w pokoju, możemy oczekiwać, że co najmniej dwie z nich mają
wspólny dzień urodzin. Dla n = 365, jeśli k = 28, to oczekiwana liczba par
ludzi z tym samym dniem urodzin wynosi (28 · 27)/(2 · 365) ~ 1,0356. Tak więc
przy co najmniej 28 osobach oczekujemy, że co najmniej dwie z nich obchodzą
razem urodziny. N a Marsie, gdzie rok trwa 669 dni marsjańskich, potrzebuje-
my co najmniej 38 Marsjan.
Pierwsza analiza problemu wyznaczyła liczbę osób potrzebnych do tego,
aby prawdopodobieństwo istnienia pary zgadzających się dat urodzin przekra-
czało 1/2, a druga wyznaczyła liczbę taką, że oczekiwana liczba wspólnych
urodzin wynosi I. Pomimo że liczby osób są różne dla tych dwóch sytuacji, są
one równe asymptotycznie: 0(J-;_ ).
160
6.6. ANALIZA PROBABILISTYCZNA
b
E[n,] - b -,+. 1
•
- L E[n,]
i=l
• b
- i=L1 b-r+1.
• 1
-b[-c
I= 1 z
161
ROZDZIAŁ 6. ZLICZANIE I PRAWDOPODOBIEŃSTWO
.; bQn b + 0(1))
Ostatni wiersz wynika z ograniczenia (3.5) szeregu harmonicznego. Zatem po-
trzeba około bln b rzutów, aby oczekiwać, że w każdej z urn znajduje się kula.
Dla k = 2 [lgnl
Pr{A,.2 rlinl}= 1/22 n11
nl
~ 1/22J11n
= 1/n2
i stąd prawdopodobieństwo, że ciąg orłów długości co najmniej 12lg nl rozpo-
czyna się od pozycji i jest dość niewielkie, zwłaszcza jeśli weźmiemy pod uwa-
gę, że jest co najwyżej n pozycji (a faktycznie n - 2 flgnl + 1), od których
może rozpocząć się ten ciąg. Prawdopodobieństwo, że ciąg orłów długości co
najmniej 12lg nl rozpoczyna się gdziekolwiek, wynosi więc
162
6.6. ANALIZAPROBABILISTYCZNA
Pr{A,.,0,,1) = l/2'flgnl
= 1/2 L!rnJ/2
Pr{A;,LirnJ/2}
;;, 1/..;n
Prawdopodobieństwo, że ciąg orłów długości co najmniej Llgnj/2 nie rozpo-
czyna się na pozycji i, jest w takim razie równe co najwyżej I - 1/Jri.Może
my podzielić n rzutów monetą na co najmniej L2n/llgnJJ grup po Llg nj/2
kolejnych rzutów. Ponieważ grupy te są złożone ze wzajemnie się wykluczają
cych, niezależnych rzutów, prawdopodobieństwo, że każda z tych grup nie
będzie ciągiem orłów o długości LlgnJ/2, wynosi
163
ROZDZIAŁ 6. ZLICZANIE I PRAWDOPODOBIEr-.lSTWO
~ l/n
ZADANIA
6.6-1. Przypuśćmy, że kule są wrzucane do b urn. Rzuty są. niezależne i każda
kula może trafić do każdej z urn z jednak.owym prawdopodobieństwem.
Jak.a jest oczekiwana liczba rzutów, zanim co najmniej jedna z urn będzie
zawierać dwie kule?
* 6.6-2. Czy przy analizie paradoksu dnia urodzin ważne jest, aby urodziny były
wzajemnie niezależne, czy też wystarczające jest, aby były parami niezależ
ne? Odpowiedź uzasadnij.
* 6.6-3. Ile osób powinno zostać zaproszonych na przyjęcie, aby było prawdo-
podobne, iż troje z nich ma urodziny w tym samym dniu?
* 6.6-4. Jakie jest prawdopodobieństwo, że k-słowo nad zbiorem. licmości n jest
faktycznie k-permutacją? Jaki jest zwiąi.ek tego pytania z paradoksem
dnia urodzin?
* 6.6-5. Przypuśćmy, że n kul jest wrzucanych do n urn, przy czym każdy rzut
jest niezależny i każda z kul może wpaść do każdej urny z równym praw-
dopodobieństwem. Jak.a jest oczekiwana liczba pustych urn? Jak.a jest
oczekiwana liczba urn zawierających dokładnie jedną kulę?
* 6.6-6. Wzmocnij dolne ograniczenie długości ciągu kolejnych orłów pokazu-
jąc, że w n rzutach monetą prawdopodobieństwo tego, iż nie wystąpi ciąg
orłów dłuższy niż n-2lglgn, jest mniejsze od 1/n.
Problemy
6-1. Kule i 1B'DY
W tym problemie prześledzimy efekt różnych założeń dotyczących liczby spo-
sobów umieszczenia n kul w b różnych urnach.
164
PROBLEMY
(a) Przypuśćmy, że jest różnych n kul i że ich ułożenie w urnie nie ma znacze-
nia. Pokaż, że liczba sposobów 1m,ieszczenia kul w urnach wynosi b".
(b) Przypuśćmy, że kule są. różne i że kule w każdej z urn są uporządkowa
ne. Udowodnij, że liczba sposobów umieszczenia kul w urnach wyno-
si (b + n - 1)!/(b - 1)!. (Wskazówka: Weź pod uwagę liczbę możliwości
ustawienia n różnych kul i b - 1 nierozróżnialnych kijów w jednym rzę
dzie).
(c) Przypuśćmy, że kule są identyczne, a więc ich kolejność w urnie nie ma
maczenia. Pokaż, że liczba sposobów umieszczenia kul w urnach wynosi
(h+ :- 1
). (Wskazówka: Ile ustawień z punktu (b) powtarza się, jeśli
przyjmiemy, że
kule są identyczne?)
(d) Przypuśćmy, że kule są identyczne i że żadna z urn nie może zawierać więcej
1 max+- -oo
2 fori+-1 ton
3 do t> Porównaj A[i] z max.
4 if A[i] > max
5 then max+- A[i]
(a) Jeśli
liczba x jest losowo wybrana ze zbioru n różnych liczb, to jak.ie jest
prawdopodobieństwo, że x jest największą liczbą z tego zbioru?
(b) Jaki jest związek między A[i] i A[j], dla 1 ~j ~ i, kiedy jest wykonywany
wiersz 5 programu?
(c) Jak.ie jest prawdopodobieństwo, dla każdego i z zakresu 1 ~ i~ n, że jest
wykonywany wiersz 5?
(d) Niech s 1 , s2 , ••• , s„ będą n zmiennymi losowymi, gdzie s1 reprezentuje
liczbę wykonań (O lub 1) wiersza 5 podczas i-tej iteracji pętli for. Ile
wynosi E[sJ?
165
ROZDZIAŁ 6. ZLICZANIE I PRAWDOPODOBIEKISTWO
166
UWAGI DO ROZDZIAŁU
Uwagi do rozdziału
Pierwsze ogólne metody rozwiązywania problemów prawdopodobieństwa zo-
stały przedyskutowane w sławnej korespondencji pomiędzy B. Pascalem i P. de
Fermatem, która rozpoczęła się w 1654 r., oraz w książce C. Huygensa
z 1657 r. Szczegółowa teoria prawdopodobieństwa rozpoczęła się od pracy J.
Bemoulliego z 1713 r. i A. De Moivre'a z 1730 r. Kolejne udoskonalenia teorii
wprowadzili P. S. de Laplace, S.-D. Poisson oraz C. F. Gauss.
Sumy :zmiennychlosowych były pierwotnie przedmiotem badań P. L. Cze-
byszewa i A. A. Markowa. Teoria prawdopodobieństwa została zak.sjomatyzo-
wana przez A. N. Kohnogorowa w 1933 r. Ograniczenia krańców rozkładu
zostały wprowadzone przez Czemoffa [40] i Hoeffdinga [99]. Podstawowe za-
gadnienia dotyczące losowych struktur kombinatorycznych opisał P. ErdOs.
Książki Knutha [121] oraz Liu [140]są dobrymi podręcznikami elementar-
nej kombinatoryki i zagadnień zliczania. Standardowe podręczniki, których
autorami są Billingsley [28], Chung [41], Drake [57], Feller [66] i Roz.anov
[171],dają wszechstronne wprowadzenie do probabilistyk.i. Bollobś.s [30], Hof-
ri [100] i Spencer [179] opisują w swoich pracach zaawansowane technik.ipro-
babilistyczne.
Część li
Sortowani
i statystykipozycyjn
Wprowadzenie
W tej części opiszemy algorytmy służące do rozwiązywania następującego pro,-
blemu sortowania:
Dane wejściowe: Ciąg n liczb (a 1, a2 , ••• , a,.).
Wynik: Permutacja (zmiana kolejności) (al, a2, ... , a~) ciągu wejściowego
. , , ,
t aka,zea 1 .::;;a2 ::::;; ... ~a ...
Ciąg wejściowy jest na ogół n-elementową tablicą, chociaż może też być re-
prezentowany inaczej, na przykład jako lista.
Struktura danych
W rzeczywistości liczby, które należy posortować, rzadko są wyodrębnionymi
wartościami. Każda z nich jest na og61 częścią zbioru danych, zwanych re-
kordem. Każdy rekord zawiera klucz, będący wartością, którą należy posor-
tować, a reszta rekordu składa się z dodatkowych danych, które na ogól są
przenoszone razem z kluczem. W praktyce, kiedy algorytm sortowania per-
mutuje klucze, musi również permutować dodatkowe dane. Jeśli każdy rekord
zawiera dużą liczbę dodatkowych danych, to cr.ęsto permutuje się tablicę
wskaźników do rekordów zamiast samych rekordów, żeby zminimalizować
przemieszczanie danych.
W pewnym sensie właśnie takie szczegóły implementacyjne odróżniają al-
gorytm od gotowego programu. To, czy sortujemy pojedyncze liczby, czy też
duże rekordy zawierające liczby, jest nieistotne pod względem wyboru metody,
za pomocą której procedura sortująca wyznacza kolejność elementów w posor-
towanym ciągu. Dlatego przy rozważaniu problemu sortowania na ogół za-
kładamy, że dane wejściowe składają się jedynie z liczb. Tłumaczenie algoryt-
mu sortowania liczb na program sortujący rekordy jest koncepcyjnie proste,
170
WPROWADZENIE
choć w danej sytuacji mogą zaistnieć subtelne trudności, które z zadania pro-
gramisty uczynią wyzwanie.
Algorytmy sortowania
W rozdziale 1 wprowadziliśmy już dwa algorytmy sortowania n liczb rzeczywi-
stych. Sortowanie przez wstawiane wymaga w najgorszym przypadku czasu
8(n ). Ponieważ jednak jego wewnętrzne pętle są krótkie, jest to szybki algo-
2
ten jest znacznie lepszy niż algorytm heapsort. Tak.jak sortowanie przez wsta-
wianie, sortowanie szybkie ma zwięzły kod, dzięki czemu stała ukryta w notacji
0 jest mała. Jest to popularny algorytm sortowania dużych tablic danych.
Sortowanie przez wstawianie, przez scalanie, przez kopcowanie i sortowa-
nie szybkie są algorytmami porównującymi: ustalają kolejność sortowanego
ciągu przez porównywanie elementów. Rozdział 9 rozpoczniemy od wprowa-
dzenia modelu drzew decyzyjnych w celu zbadania ograniczeń czasu działania
algorytmów porównujących. Używając tego modelu, udowodnimy, że dolna
granica pesymistycznej złożoności działania każdego algorytmu porównujące
go, służącego do sortowania n liczb wynosi O:(nlgn). Wykażemy w ten sposób,
że sortowanie przez kopcowanie i przez scalanie są asymptotycznie optymal-
nymi algorytmami porównującymi.
W rozdziale 9 pokażemy, że dolna granica !l(nlgn) może zostać przekro-
czona, jeżeli będziemy zbierali informacje o porządku posortowanych danych
wejściowych w inny sposób niż porównując elementy. W algorytmie sortowa-
nia przez zliczanie (counting sort), na przykład, zakłada się, że liczby wejścio
we należą do zbioru {1, 2, ... , k}. Przez użycie indeksowania tablic,jak.o narzę
dzia do ustaienia porządku elementów względem siebie, w algorytmie sortowa-
nia przez zliczanie można posortować n liczb w czasie O(k+n). Dlatego, kiedy
t O ile nie bierzemy pod uwagę pamięci potrzebnej na realizację rekursji (przyp. tłum.).
171
CZĘSC li. SORTOWANIE I STATYSTYKI P02YCYJNE
Statystyki pozycyjne
Mianem i-tej statystyk.i pozycyjnej zbioru n liczb określamy i-tą liczbę tego
zbioru posortowanego w kolejności rosnącej. Można oczywiście wybrać i-tą
statystykę pozycyjną zbioru przez posortowanie danych wejściowych i wybra-
nie i-tej liczby. Jeśli nie czyni się założeń o rozkładzie danych wejściowych, to
metoda ta działa w czasie O(nlgn), co wynika z rozważań przeprowadzonych
w rozdz. 9.
W raz.dziale 1O pokażemy, że można znaleźć i-ty najmniejszy element zbio-
ru w czasie O(n), nawet kiedy elementami są. dowolne liczby rzeczywiste. Za-
prezentujemy algorytm ze zwięzłym pseudokodem, którego czas działania
w najgorszym przypadku wynosi O(n 1 ), ale w średnim przypadku jest liniowy.
Podamy też bardziej skomplikowany algorytm, który działa w pesymistycznym
czasie O(n).
Wymagania matematyczne
Choć w tej części przeważnie nie używamy trudnej matematyki, jednak. przy
czytaniu niektórych podrozdziałów jest wymagane większe doświadczenie ma-
tematyczne. W szc:zególności przy analizie średniego czasu działania algoryt-
mów sortowania szybkiego, sortowania kubełkowego i wyznaczania statystyki
pozycyjnej wykorzystujemy rachunek prawdopodobieństwa, który jest omó-
wiony w rozdz. 6. Analiza pesymistycznego czasu działania liniowego algoryt-
mu wyznaczania statystyki pozycyjnej jest trochę bardziej złożona niż inne
analizy pesymistycznych przypadków omówione w tej części.
Rozdział 7
Heapsort- sortowanie
przezkopcowanie
7.1. Kopce
Kopiec(binarny)jest to tablicowa struktura danych, którą można rozpatrywać
jako pełne drzewo binarne (patrz podro7.dz.5.5.3),jak to widać na rys. 7.1. Każdy
węzeł drzewa odpowiada elementowi tablicy, w którym jest podana wartość
węzła. Drzewo jest pełne na wszystkichpoziomach z wyjątkiem być może najniż
szego, który jest wypełniony od strony lewej do pewnego miejsca. Tablica
A reprezentująca kopiec ma dwa atrybuty: length(A],określający liczbę elemen-
tów tablicy, i heap-size[A],określający liczbę elementówkopcaprzechowywanych
w tablicy. To znaczy, że żaden element tablicy A[l .. length[A]]występujący po
A(heap-size[A]],gdzie heap-size(A]~ length[A],nie jest elementem kopca. Korze-
niem drzewa jest A[l], a mając dany indeks i węzła, można łatwo obliczyć indeksy
jego ojca PARENT(i),lewego syna LEFr(i) i prawego syna R.IGHT(i).
173
ROZDZIAŁ 7. HEAPSORT - SORTOWANIE PRZEZ KOPCOWANIE
0)
i :J ) I II I
Rys. 7.1. Kopiec można rozpatrywać jako (a) drzewo binarne i {b) jako tablicę. Liczba w kółku
w każdym wężle drzewa jest wartością przechowywaną w tym wężle. Liczba obok węzła jest
odpowiadającym mu indeksem tablicy
PARENT(i)
return i/2
LEFf(i)
return2i
RIGHT(i)
return2i + 1
174
7.2. PRZYWRACANIE WŁASNO$CI KOPCA
ZADANIA
własności kopca
7.2. Przywracanie
HEAPIFY jest ważną procedurą służącą do manipulowania kopcami. Jej da-
nymi wejściowymi są: tablica A i indeks i tej tablicy. Przy wywołaniu HEAPIFY
Włada się, że drzewa binarne zaczepione w LEFT(i) i RIGHT(i) są kopcami,
ale że A[i] może być mniejszy od swoich synów, przez co narusza własność
kopca (7.1). Zadaniem HEAPIFY jest spowodowanie, żeby wartość A[i] ,,spły
nęła" w dół kopca tak:, żeby poddrzewo zaczepione w węźle i stało się kopcem.
HEAPIFY(A, i)
I 1-LEFT(i)
2 r +- RIGHT(i)
3 if I.; heap-size[A]i A[~ > A[i]
4 then largest +- I
5 else largest +- i
6 if r ~ heap-size[A]i A[r] > A[largest]
7 then largest +- r
175
ROZDZIAŁ 7. HEAPSORT- SORTOWANIE PRZEZ KOPCOWANIE
8 if largesl =!-i
9 l:henzamień A[i]-A[largest]
10 HEAPIFY(A, largest)
l l
2 ,.
~•.. . "·~ 3 2/ .
16
.A_,.A_
•
i ' '4 ,w 14
o 5 ,,
5 '
'·-:'% '
:,,.4
'
''.i:'1 '9 ..
'
l
10
'
,•.,
8
,,
;...
lo
'
'1·,'.
J
i1,'.}
• • ,K· )t,
:',°8 " ''
'
(al (b)
l
'16
2 /
,/
14 IO
' '
2 j
v:3··.
' ·: .l,
'
,, '
" '
10
''JJ
''
'"
4 l
lc I
Rys. 7.2. Działanie procedury HEAPIFY(A,2), gdzie heap-size[A]= IO. (a) Początkowa konfiguracja
kopca, w której wartość A[2] w węźle i = 2 narusza własność kopca, gdy nie jest on większy od obu
swoich synów. Własność kopca jest przywracana węzłowi 2 w (b) przez zamianę A[2] z A[4], co
narusza własność kopca w węźle 4. Rekurencyjne wywołanie HBAPIFY(A, 4) ustawia i= 4. Po
zamianie A[4] z A[9J, co jest pokazane w (c), węzeł 4 jest poprawiony, a rekurencyjne wywołanie
HEAPtFY(A, 9) nie zmienia więcej struktury danych
176
7.3. BUDOWANIE KOPCA
ZADANIA
7.2-1. Zilustruj (podobnie jak na rys. 7.2) działanie procedury HEAPIFY(A,3)
dla tablicy A - (27, 17, 3, 16, 13, IO, I, 5, 7, 12, 4, 8, 9, O).
7.2-2. Jalci jest skutek wywołania HEAPIFY(A, i), kiedy element A[i] jest więk
szy niż jego synowie?
7.2-3. Jaki jest skutek wywołania HEAPIFY(A, i) dla i> heap-size[A]/2?
7.2-4. Kod dla procedury HEAPIFYjest efektywny, jeśli chodzi o stałe. Jedynie
wywołanie rekurencyjne w wierszu 10 może spowodować, że niektóre
kompilatory wytworzą nieefektywny kod. N apisz efektywną wersję HEAPI-
FY, która będzie używać iteracji (pętli) zamiast rekursji.
7.2-S. Wykaż, że czas działania procedury HEAPIFY na kopcu rozmiaru n
w najgorszym przypadku wynosi .O:Qgn).(Wskazówka: Dla kopca o n węz
łach nadaj węzłom wartości, które spowodują rekurencyjne wywołania
HEAPIFY dla każdego węzła na ścieżce od korzenia do liścia).
7.3. Budowaniekopca
Procedury HEAPIFY możemy użyć w sposób wstępujący (ang. bottom-up) do
przekształcenia tablicy A[l .. n], gdzie n= length[A], w kopiec. Ponieważ ele-
menty podtablicy A[(ln/2J + I) .. n] są wszystkie liśćmi drzewa, zatem każdy
z nich jest 1-elementowym kopcem. Procedura BUILD-HEAP przechodzi przez
pozostałe węzły drzewa i wywołuje w każdym z nich HEAPIFY. Kolejność prze-
chodzenia węzłów zapewnia, że poddrzewa zaczepione w węźle i są kopcami,
kiedy HEAPIFY zostaje wywołana w tym węźle.
BUILD-HEAP(A)
I heap-size[AJ~ length[AJ
2 for i~ l/ength[A]/2J downto I
3 do HEAPIFY(A, i)
177
ROZDZIAŁ 7. HEAPSOAT - SORTOWANIE PRZEZ KOPCOWANIE
I
4
2 J
1 3
5 6 7 5
' ' '
/ /
I 2 16 9 IO 16
8 9
'
IO 8 9 10
:i'
14 • •
7
(al
14 8 7
(h)
4 4
2 J 2 J
l 3 1 lÓ
,, ' '
'14 /
' 5 /
' 7
' /
' 5
"9 /
' 7
8 9 IO
16 9 10
8
14
9 10 -
16 ·3\
..
2
• 7
(li.
2
• 7
(d)
I I
4 16
2
' s 2 J
16 10 14 ( 10
'
5
' 4
J J 5 6 J
' / 5 /
8
14
9 IO
7
6J 3
8
8
9 10
7 9 3•
2 8 1 2 4 1
(e) ro
Rys. 7.3. Działanie procedury BuILO-HBAP,pokazujące strukturę danych przed wywołaniem HEAPI-
FY w wierszu 3 BUILO-HBAP. (a) 10-elementowa tablica wejściowa i reprezentowane przez nią
drzewo binarne. Na rysunku widać indeks i pętli, który wskazuje na węzeł S przed wywołaniem
HEAPIFY(A, i). (b) Struktura danych, która jest rezultatem wywołania. Indeks pętli do następnego
wywołania wskazuje na węzeł 4. (c)-(e) Następne iteracje pętli for w BUII.D-HEAP. Zauważ, że kiedy
HEAPIFY jest wywoływana w węźle, oba poddrzewa tego węzła są kopcami. (Q Kopiec po zakoń
czeniu działania BUII.D-HBAP
178
7.3. BUDOWANIE KOPCA
(7.2)
:r,
• h 1/2
2• - ·<1- 112i2
-2
Dlatego C7.8.Sdziałania procedury BUILD-HEAP może być ograniczony przez
- O(n)
ZADANIA
179
ROZDZIAŁ 7. HEAPSORT- SORTOWANIEPRZEZKOPCOWANIE
7.4. Algorytmsortowaniaprzezkopcowanie(heapsort)
Algorytm heapsort rozpoczyna działanie, używając procedury BUILD-HEAPdo
skonstruowania kopca w tablicy wejściowej A[l „ n), gdzie n= length{A].Skoro
największy element tablicy znajduje się w korzeniu A[l], może on zostać umiew
szczony na swoim właściwym miejscu przez zamianę z A[n). Jeśli teraz „od-
rzucimy" węzeł n z kopca (przez zmniejszenie heap-size[A]),zauważymy, że
tablica A[l .. (n - 1)] może łatwo zostać przekształcona w kopiec. Synowie ko-
(14\
,/-
>
c,,,ie, (bi
(li)
.
1,1·
_.(i~
-
;· 3\
\:i) 2) c·
..-/ 'r---
\__ _J , -· • I
•
(
, l) I
,. •
••••
••• u, (kJ
180
7.5. KOLEJKI PRIORYTETOWE
rzenia pozostają kopcami, ale nowy korzeń może naruszać własność kopca
(7.1). Jedyne, co trzeba zrobić, żeby przywrócić własność kopca, to raz wywo-
łać HEAPIFY(A, 1), co pozostawi kopiec w A[l .. (n - 1)]. Algorytm heapsort
powtarza ten proces dla kopca o rozmiarze n - 1, aż do uzyskania kopca
o rozmiarze 2.
HEAPSORT(A)
I BUILD-HEAP(A)
2 for i- length[A] downto 2
3 do zamień A[l]+-+A[i]
4 heap-size[A]- heap-size[A]- 1
5 HEAPIFY(A, I)
ZADANIA
7.5. Kolejkipriorytetowe
Heapsort jest doskonałym algorytmem, ale dobra implementacja algorytmu
quicksort, taka jak opisana w rozdz. 8, jest na ogół lepsza w praktyce. Pomimo
to kopiec jako struktura danych ma wiele zastosowań. W tym podrozdziale
opisujemy jedno z najbardziej popularnych zastosowań kopca: jako kolejki
priorytetowej.
Kolejka priorytetowa to struktura danych służąca do przechowywania
zbioru S elementów, z których każdy ma przyporządkowaną wartość, zwaną
kluczem. Na kolejce priorytetowej można wykonać następujące operacje.
181
ROZDZIAŁ 7. HEAPSORT- SORTOWANIE PRZEZ KOPCOWANIE
EXTRACT-MAX(S)
usuwa i daje w wyniku element S o największym kluczu.
HEAP-E>ITRACT-MAX(A)
I if heap-size[A]< 1
2 tben ermr „kopiec pusty"
3 max-A[!]
4 A[l]-A[heap-size[AD
5 heap-size[A]- heap-size[A]- I
6 HEAPIFY(A, I)
7 return max
182
7.5. KOLEJKIPRIORYTETOWE
HEAP-INSBRT(A, key)
1 heap-size[A]- heap-size[A]+ 1
2 i-heap-size[A]
3 whl1ei> 1 i A[PARBNT(i)] < key
4 do A[i]-A[PARBNT(i)]
5 i-PARBNT(i)
6 A[i]-ltey
16 16
IO
7 9 3 8 7 9 3
2 4 I 2 4 I
(a) (b)
16 16
IO
9 3 8 14" 9 3
2 4 I 7 2 4 I 7
(o) (d)
Rys. 75. DZislanieprocedury HI!AP-INSEI.T. (a) Kopićc z tYJ.7.4(a) zanim wstawimydo niego wę&ł
z k11111e101s; (b) Nowy liść zoirta.jedodany do kopca. (c:)Ws:rtok:ina idei.oe z nowego liścia do
korzenia są kopiowane w dół, aż znajdzie si~ miejsce na klucz 15. (d) Klucz 1S jest wstawiony
183
ROZDZIAŁ 7. HEAPSORT- SORTOWANIE PRZEZ KOPCOWANIE
Problemy
7-1. Budowa kopca przez wstawianie
Procedura BUILD-HEAPz rozdz. 7.3 może zostać zaimplementowana przez
wielokrotne użycie HEAP-INSERTdo wstawiania elementów do kopca. Rozważ
następującą implementację:
BUILD-HEAP'(A)
l heap-size[AJ~ l
2 for i- 2 to length[A]
3 do HEAP-INSERT(A,A[i])
184
UWAGI DO ROZDZIAŁU
(d) Podaj efektywną implementację procedury INSERT. Wyraź jej czas działa
nia za pomocą d i n.
(e) Podaj efektywną implementację procedury HEAP-INCREASE-KEY(A,i, k),
która za A[i] podstawia max(A[i], k) i odpowiednio modyfikuje strukturę
kopca. Wyraź jej czas działania za pomocą d i n.
Uwagido rozdziału
Algorytm heapsort został wynaleziony przez Williamsa [202], który również
opisał implementację kolejki priorytetowej za pomocą kopca. Procedura Bu-
lLD-HEAP została zaproponowana przez Floyda [69].
Rozdział 8
Quicksort- sortowanie
szybkie
186
8.1. OPIS ALGORYTMU
QUICKSORT(A, p, r)
1 ilp<r
2 then q +-PARTITION(A, p, r)
J QUJCKSORT(A, p, q)
4 QUJCKSORT(A, q + I, r)
Dzielenie tablicy
Kluczem do algorytmu jest procedura PARTITION, która przestawia elementy
podtablicy A[p .. r] w miejscu.
PARTITION(A, p, r)
I x~Afp]
2 i+-p-1
3J+-r+1
4 while TRUE
5 do re-peatj +- j - 1
6 until A[j] ,;; x
7 repeati+-i+l
8 until A[i];;, x
9 if i <J
10 tben zamień A[i]+-+A[j]
11 else return j
187
ROZDZIAŁ 8. QUICKSORT - SORTOWANIE S2YBKIE
·,,, \.,•:
\\'j(,t,6'i'7
A' A
Rys. 8.1. Działanie procedury PARTITIONdla przykładowej tablicy. Jasnoszare elementy zostały
umieszczone we właściwych miejscach, a ciemnoszare jeszcze nie. (a) Tablicawejściowa z począ,t,
kowymi wartościami i ij znajdującymi się poza lewym i prawym końcem tablicy. Podział wzglę
dem x = A[p] = 5. (b) Pozycje i i jw wierszu 9 po pierwszej iteratji pętli wbile. (c) Rezultat zamiany
elementów wskazywanych przez i i jw wierszu 10. (d) Położenie ; i jw wierszui 9 podczas trzeciej
i ostatniej iteracji pętli wbile. Procedura zatrzymuje się, poniewa:i.:i ;;,c
j, i jest zwracana wartość
q = j. Elementy tablicywłącznie z A[j} są mniejsze lub równe x = 5, a elementy tablicy występują
ce po A[j] są większe lub równe x = 5
188
8.2. CZAS DZIAŁANIA ALGORYTMU QUICKSORT
ZADANIA
8.1-1. Zilustruj (podobnie jak na rys. 8.1) działanie procedury PARTITIONdla
tablicy A= (13, 19, 9, 5, 12, 8, 7, 4, li, 2, 6, 21).
8.1-2. Jaką wartość q zwraca procedura PARTITION, gdy wszystkie elementy
A{p .. r] mają taką samą wartość?
8.1-3. Podaj krótkie uzasadnienie faktu, że czas działania procedury PARTI-
TION dla podtablicy o rozmiarze n wynosi 0(n).
8.1-4. Jak zmienić procedurę QUICKSORT, żeby sortowała w porządku nie-
rosnącym?
Najgorszyprzypadekpodziałów
Najgorszy przypadek działania algorytmu quicksort zachodzi wtedy, kiedy
procedura dzieląca tworzy jeden obszar złożony z n - 1 elementów, a drugi
tylko z 1 elementu. (To stwierdzenie udowodnimy w podrozdz. 8.4.1). Załóż
my, że takie niezrównoważone podziały będą wykonywane w każdym kroku
algorytmu. Ponieważ koszt podziału wynosi 0(n) i T(l) = 0(1), to równanie
rekurencyjne opisujące czas działania wygląda następująco:
"
=L ®(kJ
k= 1
189
ROZDZIAŁ 8. OUICKSORT - SORTOWANIE 5ZYBKIE
- 0(n 2 )
n .._,..........................................................
._..................
)11>.
I / " n
n-1 ....................................................................
~1~-
n
1 / " n-3 ............................................
u,.. n-2
I/ "··
"
I /
!-·· 3
2 .....................
"-._ I ·········i•· 2
Rys. 8.2. Drzeworekursji dla algorytmu Qut(l(SORT,w którym procedura PARTITION uwsze umiesz..
cza tylko jeden element po jednej stronie podziału (najgorszyprzypadek:).W rezultacie czas działa
nia wynosi 8(112)
Najlepszyprzypadekpodziałów
Jeśliprocedura dzieląca produkuje dwa obszary o rozmiarach n/2, to algorytm
quicksort działa o wiele szybciej. Równanie rekurencyjne ma wtedy postać
0(n lg n)
Ry!I. 8.3. Drzewo rekursji dla algorytmu Qmct:.SORT, w którym procedura PARTITIONzawsze równo-
miernie dzieli tablicę na dwa obszary (najlepszy przypadek). Czas d:ziałania algorytmu wynosi
0(nlgn)
Podziały zrównoważone
Średni czas działania algorytmu quicksort jest dużo bliższy najlepszemu przypa-
dkowi niż najgorszemu,jak wykażemy w podrozdz. 8.4. Żeby zrozwnieć, dlacze-
go jest to możliwe, wystarczy zrozumieć, jak równowaga podziału jest odzwier-
ciedlana w równaniu rekurencyjnym, które opisuje czas działania algorytmu.
Załóżmy na przykład, że algorytm dzielący będzie zawsze dawał proporcje
podziału 9 do 1, co na pierwszy rzut oka wydaje się bardzo niezrównoważone.
Czas działania algorytmu quicksort opisuje wtedy równanie rekurencyjne
T(n) = T(9n/IO) + T(n/10) + n
w którym dla uproszczenia zastąpiliśmy E>(n)przez n. Na rysunku 8.4 widać
drzewo rekursji dla powyższego równania. Zauważmy, że każdy poziom drze-
wa ma koszt n, aż osiągnięty zostanie warunek brzegowy na głębokości
log 10 n = E>(lgn). Każdy z następnych poziomów, aż do głębokości log 1019 n =
= E>(lgn) ma koszt co najwyżej n. Całkowity koszt algorytmu wynosi zatem
E>(nlgn). Stąd widać, że dla podziału według proporcji 9 do 1 na każdym
poziomie rekursji, co intuicyjnie wydaje się podziałem niezrównoważonym,
algorytm quicksort działa w czasie E>(nlg n) - asymptotycznie takim samym,
jak gdyby podział następował w połowie. W rzeczywistości nawet podział 99
191
ROZDZIAŁ 8. QUICKSORT - SORTOWANIE SZVBKIE
1 9
Wn -10 n ···-·····-·······-···············-··~
n
1
./'"-._
100 n
9
100 n
9
100"
- -----
81
100 n ····--·-·····-·····-··;llto·
n
II \ , ,I \ , I \ /\
'
81 729 '
···-·-·- ..~!Io<· n
1 1000" 1000"
I \ I \ .....-.....-;.... Sn
' '
'\
I .......
_...,.,,. Sn
8(n lg n)
Rys. 8.4. Drzewo rekursji dla algorytmu QtJICKSORT,w którym procedura PARTITIONzawsze tworzy
podział 9 do I, co daje czas działania G(11lg11)
do 1 daje czas działania O(nlgn). Powodem tego jest fakt, że każdy podział
o stałym współczynnik.u proporcjonalności daje drzewo rekursji o głębokości
0(lgn), w którym koszt na każdym poziomie wynosi n. Czas działania wynosi
zatem 0{n lgn), kiedy tylko podziały mają stały współczynnik proporcjonalności.
192
8.2. CZAS DZIAŁANIA ALGORYTMU QUlCKSORT
gorsze. Na rysunku 8.5a widać dwa kolejne poziomy drzewa rekursji. W korze-
niu drzewa koszt podziału wynosi n, a utworzone podtablice mają rozmiar
n - 1 i 1 - najgorszy przypadek. Na następnym poziomie podtablica wielkości
n - 1 zostaje podzielona zgodnie z najlepszym przypadkiem na dwie podtabli-
ce rozmiaru (n - 1)/2. Załóżmy, że koszt graniczny wynosi 1 dla podtablicy
o długości 1.
•
/ ~ ······--·················Cl••·
0(n) n ·················--··················il~•·
0(n)
l
/
.....
'-----.._
/~
+
(n-1)12 1 (n-1)/2
(n-1)/2
(b)
Rys. 8.5. (a) Dwa poziomy drzewa rekursji dla algorytmu quicksorl. Podział w korzeniu kosztuje
11 i jest „zły": mamy dwie pod tablice rozmiaru 11 - I i I. Podział pod tablicy rozmiaru n - I
kosztuje n - I i daje „dobry" podział: dwie podtablice rozmiaru (11- 1)/2. (b) Pojedynczy poziom
drzewa rekursji, który jest gorszy niż połączone poziomy z (a), chOCjest bardzo 2'J"Ównoważony
ZADANIA
8.2-1. Pokaż, że czas działania procedury QtnCKSORT wynosi 0(nlgn), gdy
wszystkie elementy tablicy A mają taką samą wartość.
8.2-2. Pokaż, że czas działania procedury QUICKSORT wynosi 0(n 2), kiedy
tablica A jest posortowana w porządku nierosnącym.
8.2-3. Banki często zapisują operacje dokonywane na rachunku w kolejności
ich przeprowadzania, ale wiele osób lubi otrzymywać swoje wyciągi ban-
kowe z wydatkami zapisanymi w kolejności numerów zrealizowanych cze-
ków. Ludzie na ogól wypisują czek za czekiem z ksiązeczk.i, a sprzedawcy
realizują je dość szybko. Problem zamiany kolejności zgodnej z czasem
193
ROZDZIAŁ 8, OUlCKSORT ·· SORTOWANIE SZYBKIE
8.3. Probabilistyczne
wersjealgorytmuquicksort
Badając zachowanie algorytmu quicksort dla średniego przypadku, uczynili-
śmy założenie, że wszystkie permutacje liczb na wejściu są jednak.owo praw-
dopodobne. Kiedy takie założenie jest usprawiedliwione, wielu ludzi wybiera
quicksort jako algorytm sortowania dość dużych ilości danych. Nie można
jednak oczekiwać, że to założenie można poczynić do wszystkich zastosowań.
(Patrz zad. 8.2-3). W tym podrozdziale wprowadzamy pojęcie algorytmu pro-
babilistycznego i opisujemy dwie probabilistyczne wersje algorytmu quicksort,
które nie wymagają powyższego założenia.
Zamiast zakładać coś o rozkładzie danych wejściowych można pewien roz-
kład wymusić. Załóżmy na przykład, że przed posortowaniem tablicy algorytm
quicksort w losowy sposób permu tuje jej elementy, żeby wymusić własność, że
każda permutacja jest jednakowo prawdopodobna. (!N zadaniu 8.34 trzeba
podać algorytm, który w sposób losowy permutuje elementy tablicy o roz-
miarze n w czasie O(n)). Ta mtiana nie poprawia pesymistycznego czasu dzia-
łania algorytmu, ale uniezależnia czas działania od uporządkowania danych
wejściowych.
Algorytm nazywamy probabilistycznym (ang. randomized algorithm), jeśli
jego zachowanie zależy nie tylko od danych wejściowych, lecz również od war~
tości podanych przez generator liczb losowych. Będziemy zakładali, że mamy
do dyspozycji generator liczb losowych RANDOM. Wywołanie RANDOM(a, b)
zwróci liczbę całkowitą z przedziału między a i b, łącznie z końcami, przy czym
każda liczba jest jednakowo prawdopodobna. Na przykład RANDOM(O, 1)
zwraca O z prawdopodobieństwem 1/2 i 1 z prawdopodobieństwem 1/2. Każda
liczba zwrócona przez RANDOM jest niezależna od poprzednio zwróconych
liczb. Można myśleć o RANDOM jako o procedurze zwracającej rezultat rzutu
194
8.3. PROBABILISTYCZNE WERSJE ALGORYTMU OUICKSORT
RANDOMIZED-PARTITION(A,p, r)
1 i.._ RANDOM(p, r)
2 zamień A[p]+-+A[iJ
3 returnPARTITION(A, p, r)
195
ROZDZIAŁ 8. QUICKSORT - SORTOWANIE SZVBKIE
RANDOMIZED-QUJCKSORT(A, p, r)
1 ifp<r
2 then ą +-RANDOMIZRD-PARTITION(A,
p, r)
3 RANDOMIZED-QUJCKSORT(A, p, q)
4 RANDOMIZED-QUJCKSORT(A, q + I, r)
8.4. Analizaalgorytmuquicksort
W podrozdziale 8.2 przekazywaliśmy pewne intuicje o pesymistycznym zacho-
waniu algorytmu quicksort i dlaczego oczekujemy, że algorytm ten będzie
działał szybko. W tym podrozdziale staranniej analizujemy jego zachowanie.
Zaczynamy od analizy przypadku pesymistycznego, która stosuje się zarówno
do procedury QUICKSORT,jaki RANDOMIZED-QUICKSORT, a kończymy ana-
lizą średniego C7.3.SU
działania dla RANDOMIZED-QUICKSORT.
196
8.4. ANALIZA ALGORYTMU OUICKSORT
ponieważ możemy wybrać stałą c dość dużą, żeby wartość wyrażenia 2c(n - 1)
dominowała nad wartością wyrażenia 0(n).
197
ROZDZIAŁ 8. QUICKSORT- SORTOWANIE S2YBKIE
198
8.4. ANALIZA ALGORYTMU QUICKSORT
1( .-, )
T(n) - n T(I) + T(n - I)+ ,I, (T(q) + T(n - q)) + El(n) (8.2)
1 1
(T(l) + T(n - 1)) - - (0(1) + O(n'))
n n
- O(n)
i stąd wyrażenie E>(n) w równaniu (8.2) może pochłonąć wyrażenie
1
( T(I) + T(n - 1)). Możemy zatem przefonnułować równanie rekurencyjne
n
(8.2) do postaci
J n- 1
T(n) -
n
I
ą=1
(T(q) + T(n - q)) + El(n) (8.J)
2 n-1
T(n) -
n
I
i=1
T(k) + El(n) (8.4)
199
ROZDZIAŁ 8. QUICKSORT - SORTOWANIE 5ZYBKIE
2an-l 2b
= -- L
nJ:,,,
klgk + -- (n -
n
1) + 0(n)
1
n-1 1 1
L
t-,,,1
klgk ~ ···· n lgn - ---n 2
2
2
8
(8.5)
a
~anlgn- n+2b+0(n)
4
= anlgn + b + (@(n)+ b - : •)
~anlgn+b
ponieważ możemy wybrać a dość duże, żeby wartość wyrażenia an/4 domino-
wała nad wartością. wyrażenia 0(n) + b. Stąd widać, że średni czas działania
algorytmu quicksort wynosi O(nlgn).
,- 1
L klgk ~ n2 1gn
t= 1
200
8.4. ANALIZA ALGORYTMU QUICKSORT
n-1 fll/21-1
-lgnI;k- I k
k=l A"'l
1 2 1 2
~ 2 nlgn-g:n
jeśli n;;;.:2. Jest to ograniczenie (8,5).
ZADANIA
8.4-1. Pokaż, że najlepszy czas działania algorytmu quicksort wynosi O:(nlg n).
8.4-2. Pokaż, że ą 2 + (n - ą) 2 przyjmuje maksimum w przedziale q = l, 2, ... ,
n - 1 dla ą = I lub q = n - I.
8.4-3. Pokaż, że oczekiwany czas działania procedury RANDOMIZF.D-QUICK-
SORTwynosi .Q(nlgn).
8.4-4. Czas działania algorytmu quicksort może zostać w praktyce poprawio-
ny, jeżeli skorzysta się z szybkiego czasu działania sortowania przez wsta-
wianie dla danych wejściowych, które są „prawie" posortowane. Kiedy
quicksort jest wywoływany dla podtablicy, która ma mniej niż k elemen-
tów, niech po prostu zwróci nieposortowaną tablicę. Po powrocie z wywo-
łania algorytmu quicksort uruchom sortowanie przez wstawianie na całej
tablicy, żeby zakończyć jej sortowanie. Pokaż, że ten algorytm sortowania
ma oczekiwany czas działania O(nk + n lg(n/k)). Jak powinno się dobierać
k zarówno w teorii, jak i w praktyce?
* 8.4-5. Udowodnij tożsamość
l 2 1
Jxinxdx = x lnx- x2
2 4
--------~···-
201
ROZDZIAŁ 8. QUICKSORT - SORTOWANIE S2YBKIE
Problemy
(a) Indeksy i ij nigdy nie odnoszą się do elementu A spoza przedziału [p .. r].
(b) Indeks j nie jest równy r, kiedy procedura PARTITION kończy działanie
(czyli że podział zawsze jest nietrywialny).
(c) Każdy element A[p ..;1 jest mniejszy lub równy każdemu elementowi
A[j + 1 „ r], kiedy procedura PARTITION kończy działanie.
LOMlITO-PARTITION(A, p, r)
l x~ A[r]
2 i+-p-1
3 forj+-ptor
4 do if A[j] .; x
5 theni+-i+l
6 zamień A[i]-A[j]
7 ili<r
8 then return i
9 else return i - l
202
PROBLEMY
STOOGE-SORT(A, i, j)
I if A[i] > A[j]
2 tbeo zamień A[i] +-+ A[j]
3 ifi+l~j
4 tben return
s k-L(j-i+IJ/JJ t> Zaokrąglenie w dól.
6 STOOGE-SORT(A, i, j - k) [> Pierwsze dwie trzecie.
7 STOOGE-SORT(A, i+ k, J) [> Ostatnie dwie trzecie.
8 STOOGE-SORT(A, i, j - k) [> Znowu pierwsze dwie trzecie.
84. Głębokość
stosu dla algorytmu quicksort
Algorytm QUICKSORT z podrozdz. 8.1 zawiera dwa rekurencyjne wywołania
samego siebie. Po wywołaniu procedury PARTITION jest rekurencyjnie sorto-
wana lewa podtablica, a potem prawa podtablica. Drugie rekurencyjne wywo-
łanie QUICKSORT nie jest naprawdę potrzebne: można go uniknąć przez za-
stosowanie struktury iteracyjnej. Ta metoda, nazywana eliminacją rekursji koń
cowej (ogonowej), jest stosowana automatycznie przez dobre kompilatory. Oto
wersja algorytmu quicksort, która symuluje rekursję ogonową.
--------------------~---~-
203
ROZDZIAŁ 8. QUICKSORT - SORTOWANIE SZVBKIE
QUICKSORT'(A, p, r)
1 whilep<r
2 do t> Dziel i sortuj lewą podtablicę.
3 ą-PARTITION(A, p, r)
4 QUICKSORT'(A, p, q)
5 p-q+l
(b) Opisz scenariusz, w którym głębokość stosu QUICKSORT' wynosi 0(n) dla
n-elementowej tablicy wejściowej.
(c) Zmodyfikuj kod dla QUICKSORT' tak, żeby w najgorszym przypadku głę-
bokość stosu wynosiła 0(lgn).
=~-----------------------
204
UWAGI DO ROZDZIAŁU
Uwagido rozdziału
Procedura quicksort została wynaleziona przez Hoare'a [98]. Praca Sedgewi-
cka [174] jest dobrym źródłem wiadomości o szczegółach implementacji i ich
znaczeniu. Zalety algorytmów probabilistycznych były sformułowane przez
Rabina [165].
Rozdział 9
Sortowaniew czasie
liniowym
a;< ai, a,~ aj, a1 = a;, aj~ aj lub a1 > ai, aby wyznaczyć ich względne położe
nie. Nie możemy natomiast badać wartości elementów w sposób, który po-
zwalałby
. '
na określenie
.
ich względnego położenia inaczej niż przez bezpośred-
nie porownan1e.
W tym podrozdziale zakładamy bez zmniejszenia ogólności, że wszystkie
elementy do posortowania są parami różne. Przy takim założeniu porównania
typu a; = ai są zbędne, możemy więc przyjąć, że w ogóle nie są wykonywane.
Zauważmy też, że porównania następujących typów: a; ~ a;, a1 ~ a , a; > aj
1
i aj < aj są sobie równoważne, gdyż ich wykonanie daje taką samą infonnację
o wzajemnym położeniu a1 oraz aj. Możemy więc przyjąć, że wykonujemy
tylko porównania typu a1 ~ aj.
Drzewadecyzyjne
Algorytmy sortujące za pomocą porównań można prezentować w postaci
drzew decyzyjnych. Drzewo decyzyjne przedstawia porównania wykonywane
przez algorytm sortujący dla danych ustalonego rozmiaru. Sterowanie, prze-
pływ danych i inne aspekty algorytmu nie są w drzewie decyzyjnym uwzględ
nione. Na rysunku 9.1 jest przedstawione drzewo decyzyjne odpowiadające
algorytmowi sortowania przez wstawianie z pod.rozdz. 1.1, działającemu na
ciągu 3-elementowym.
>
,.
.,,.,
(2.1,3)
,,
.,,.,>
'<
) (2,3,1) (3,2,1)
Rys. 9.1, Drzewo decyzyjne odpowiadające algorytmowi sorlowania przez wstawianie, działającemu
na ciągu 3-eleme:ntowym. Istnieje 3! = 6 możliwych permutacji ciągu wejściowego, więc drzewo
decyzyjne musi mieć co najmniej 6 liści
207
ROZDZIAŁ 9. SORTOWANIE W CZASIE LINIOWYM
TwtERDZENIE 9.1.
Każde drzewo decyzyjne, odpowiadające algorytmowi poprawnie sortującemu
n elementów, ma wysokość !l(nlgn).
DOWÓD
Rozważmy drzewo decyzyjne o wysokości h odpowiadające algorytmowi sor-
tującemu n elementów. Liczba permutacji n elementów wynosi n!, a każda
permutacja odpowiada jednoznacznie pewnemu uporządkowaniu elementów,
drzewo musi więc mieć co najmniej n! liści. Drzewo o wysokości h nie może
mieć więcej niż 2" liści, mamy zatem
h ;a,;lg(n!)
n!>(:)"
gdzie e = 2,71828 ... jest podstawą logarytmu naturalnego, więc
h;,lg(;)"
= nlgn - nlge
= [l(nlgn) •
208
9.1. DOLNE OGRANICZENIA DLA PROBLEMU SORTOWANIA
WNIOSEK9.2.
Sortowanie przez kopcowanie i sortowanie przez scalanie są asymptotycznie
optymalnymi algorytmami sortującymi za pomocą porównań.
DOWÓD
Górne ograniczenie O(nlgn) dla algorytmów sortowania przez kopcowanie
i przez scalanie jest równe dolnej granicy O(n lgn) z twierdzenia 9.1.
•
ZADANIA
209
ROZDZIAŁ 9. SORTOWANIE W CZASIE LINIOWYM
9.2. Sortowanieprzezzliczanie
W sortowaniu przez zliczanie zakładamy, że każdy z n sortowanych elementów
jest liczbą całkowitą z przedziału od I do k dla pewnego ustalonego k. Jeśli
k = O(n), to sortowanie działa w czasie O(n).
Główna idea sortowania przez zliczanie polega na wyznaczeniu dla każdej
liczby wejściowej x, ile elementów jest mniejszych od x. Mając tę liczbę, znamy
dokładną pozycję x w ciągu posortowanym, wystarczy ją więc bezpośrednio na
tej pozycji umieścić. Jeśli na przykład 17 elementów jest mniejszych od x, to
w ciągu posortowanym x powinien znaleźć się na pozycji 18. To postępowanie
należy nieco zmodyfikować w sytuacji, kiedy dozwolonych jest więcej elemen-
tów o tej samej wartości, ponieważ nie chcemy, by wszystkie tak.ie elementy
trafiły na tę samą pozycję.
W procedurze COUNTING-SORT przyjmujemy, że dane wejściowe są za-
warte w tablicy A[l .. n], więc length[A] = n. Potrzebne będą nam jeszcze dwie
dodatkowe tablice: w B[l .. n] zostaną umieszczone posortowane dane wejścio
we, a w tablicy C[l „ k] będziemy zapamiętywać tymczasowe dane pomocnicze.
COUNTING-SORT(A, B, k)
I fori+-1 tok
2 do C[i] ~ O
3 for j +- l to length[A]
4 do C[A[ ill ~ C[A[ iTI+ 1
5 [> C[i] zawiera teraz liczbę elementów równych i.
6 fori+-2tok
7 do C[i] ~ C[i] + C[i - l]
8 [> C[i] zawiera teraz liczbę elementów mniejszych lub równych i.
9 for j +- length[A] downto 1
10 do B[C[A[ iil] ~ A[ i]
11 C[A[ i]]~ C[A[ iil - 1
12345678 12345678
,1,1,1,1,1,1,1,1,1 123456 B ... a
123456 cl2l2l•l1l7 lsl 123456
B B 12345678
Rys. 9.2. Działanie procedury CoUNTING·SoRTdla tablicy wejściowej A[l .. 8], w której każ.dy ele-
ment jest dodatnią liczbą całkowitą nie większą od k = 6. (a) Tablica A oraz pomocnicza tablica
C po wykonaniu wiersza 4. (b) Tablica. C po wykonaniu wiersza 7. (c)--(e)Tablica B oraz pomoc-
nicza tablica C po wykonaniu odpowiednio jednej, dwóch oraz trzech iteracji pętli w wierszach
9-1L Tylko jasnoszare elementy tablicy B zostały wypełnione. (f) Ostateczna zawartośc tablicy B
nie C[A[j]] elementów jest mniejszych lub równych A[j]. Ponieważ jednak
elementy nie zawsze są parami różne, więc zmniejszamy C(A[j]] o jeden za
każdym razem, gdy wstawiamy wartość A[j] do tablicy B. Dzięki temu następ
ny element o wartości A[j] Geśli taki istnieje) zostanie wstawiony do tablicy
B na pozycję o numerze o jeden mniejszym.
Jaki jest czas działania algorytmu sortowania przez zliczanie? Pętla for
w wierszach 1-2 działa w czasie O(k), pętla for w wierszach 3-4 działa w czasie
O(n), pętla for w wierszach 6-7 działa w czasie O(k), a pętla for w wierszach
9-11 działa w czasie O(n). Całkowity czas działania procedury wynosi więc
O(n + k). W praktyce używamy sortowania przez zlicranie, jeśli k = O(n); wte-
dy czas sortowania wynosi O(n).
Sortowanie przez zlicza.nie ma czas działania lepszy niż wynosi dolna gra-
nica O(nlgn) wyprowadzona w podrozdz. 9.1, ponieważ nie jest to sortowanie
za pomocą porównań. Zauważmy, że w procedurze CoUNTING-SORTnigdzie
nie występuje operacja porównywania dwóch elementów. Zamiast tego w sor-
towaniu przez zliczanie wykorzystujemy faktyczne wartości elementów, co po-
zwala nam wyznaczyć ich właściwe pozycje w ciągu posortowanym. Widać
więc, że ograniczenie dolne O(nlgn) dla problemu sortowania przestaje obo-
wiązywać, jeśli wychodzimy poza model sortowania za pomocą porównań.
Ważną własnością sortowania przez zliczanie jest jego stabilność: liczby
o tych samych wartościach występują w tablicy wynikowej w takiej samej ko-
lejności jak w tablicy początkowej. Oczywiście własność stabilności jest istotna
211
ROZDZIAŁ 9. SORTOWANIE W CZASIE LINIOWYM
ZADANIA
9.2-1. Zilustruj (podobnie jak na rys. 9.2) działanie procedury COUNTING-
-SORTdla tablicy A - (7, I, 3, I, 2, 4, 5, 7, 2, 4, 3).
9.2-2. Wykaż, że procedura COUNTING-SORTsortuje stabilnie.
9.2-3. Zmodyfikujmy pętlę for w wierszu 9 procedury COUNTJNG-SORTw na-
stępujący sposób:
9 for j +- 1 to length[A]
9.3. Sortowaniepozycyjne
Sortowanie pozycyjne to sposób sortowania stosowany w maszynach sortują
cych karty, które teraz można zobaczyć już tylko w muzeach techniki kom-
puterowej. Każda karta miała 80 kolumn, a w każdej kolumnie można było
wybić dziurkę w jednym z 12 miejsc. Maszynę sortującą karty można było
mechanicznie „zaprogramować", aby rozdzieliła plik kart do 12 pojemników,
w zależności od położenia dziurki w ustalonej kolumnie. Operator mógł wtedy
zebrać karty, pojemnik po pojemniku, tak aby na wierzchu znajdowały się
karty przedziurkowane na pierwszym miejscu, zaraz pod nimi karty przedziur-
kowane na drugim miejscu itd.
Do zapisu cyfr dziesiętnych wystarczy I Omiejsc w każdej kolumnie. (Pozo-
stałe dwa miejsca są używane do kodowania znaków nienumerycznych). Licz-
ba d-cyfrowa zajmuje przy takim kodowaniu d kolumn. Ponieważ urządzenie
sortujące karty może w jednym kroku zbadać tylko jedną kolumnę w pliku
212
9.3. SORTOWANIE POZYCYJNE
213
ROZDZIAŁ 9. SORTOWANIE W CZASIE LINIOWYM
dla danych dwóch dat porównuje lata; jeśli są sobie równe, to porównuje
miesiące; jeżeli i te się sobie równają, to porównuje dni. 7.amiast tego możemy
posortować zbiór dat trzy razy za pomocą pewnego stabilnego algorytmu sor-
towania: najpierw według dni, potem według miesięcy i w końcu według lat.
W następującej procedurze przyjm.ujemy, że każdy element w n-elemen-
towej tablicy A ma d cyfr, gdzie cyfra na pozycji 1 jest najmniej znacząca,
a cyfra na pozycji d jest najbardziej znacząca.
RADJX-SORT(A,d)
1 forirltod
2 do posortuj stabilnie tablicę A według cyfry i
ZADANIA
9.3-1. Zilustruj (podobnie jak na rys. 9,3) działanie procedury RADIX-SORT
dla następującego ciągu angielskich słów: COW, DOG, SEA, RUG,
ROW, MOB, BOX, TAB, BAR, EAR, TAR, DIG, BIG, TEA, NOW,
FOX
214
9.4. SORTOWANIE KUBEŁKOWE
kubełkowe
9.4. Sortowanie
Średni czas działania sortowania kubełkowego jest liniowy. Podobnie jak sor-
towanie przez zliczanie, sortowanie kubełkowe jest szybkie, ponieważ przyj-
muje się pewne szczególne założenia o danych wejściowych. W sortowaniu
przez zliczanie przyjmowaliśmy założenie, że elementy do posortowania są ma-
łymi liczbami całkowitymi. Przy analizie sortowania kubełkowego będziemy
zakładać, że dane wejściowe są liczbami rzeczywistymi wybieranymi losowo
z przedziału [O, I), zgodnie z rozkładem jednostajnym. (Definicja rozkładu
jednostajnego znajduje się w podrozdz. 6.2).
Sortowanie kubełkowe opiera się na triku polegającym na podziale prze-
działu [O, 1) na n podprzedziałów jednakowych rozmiarów, tzw. kubełków,
a następnie „rozrzuceniu" n liczb do kubełków, do których należą. Ponieważ
liczby są jednostajnie rozłożone w przedziale [O, I), więc oczekujemy, że w każ
dym z kubełków nie będzie ich zbyt wiele. Aby otrzymać ciąg wynikowy, sor-
tujemy najpierw liczby w każdym z kubełków, a następnie wypisujemy je, prze-
glądając po kolei kubełki.
W procedurze BuCKET-SORTprzyjmujemy, że dana jest n-elementowa tabli-
ca A, a każdy element A[i] w tablicy spełnia nierówności O ~ A[i] < 1. W proce-
durze korzystamy również z pomocniczej tablicy list (kubełków) B[O .. n~ 1]
oraz zakładamy, że są dostępne elementarne operacje na tych listach. (Implemen-
tacja tego typu elementarnych operacji na listach jest opisana w po drozd z. 11.2).
BUCKET-SORT(A)
l n - tength[A]
2 fori-lton
3 do wstaw A[i] do listy B[lnA[i]J]
215
ROZDZIAŁ 9. SORTOWANIE W CZASIE LINIOWYM
4 fori-Oton-1
5 do posortuj listę
B[i] przez wstawianie
6 połącz listy B[OJ,B[l], ..., B[n - 1] dokładnie w tej kolejności
o
,, " ,
2 :O,l7 1
3 '.ó.;w 2
40,U 3
5
6 ,0.?4
• '5
o.i),
7
8 ,o;u: ' '
•
'""'
9 ,O,a::J
'
8
' ' '
"""
"
10 9
(a) (b)
Rys. 9.4. Działanie procedury BuacET-SoRT. (a) Tablica A[l .. IO]. (b) Tablica B[O .. 9] posortowa-
nych list po wykonaniu wiersza S procedury. Na liście o numerze i majdują się wartości z prze-
działu [i/10, (i + 1)/10). Posortowany ciąg powstaje przez połączenie list w następującej kolejności:
B(O], 8(11 ..., B{9]
się
teraz sprawdzeniem poprawności działania sortowania ku-
Zajmiemy
bełkowego. Rozważmy w tym celu dwa elementy A[i] oraz A[j]. Jeśli oba
trafią do tego samego kubełka, to w ciągu wynikowym wystąpią w poprawnej
kolejności względem siebie, ponieważ wszystkie liczby z tego kubełka zostały
posortowane przez wstawianie, Przyjmijmy więc, że elementy A[i] oraz A[j]
należą do różnych kubełków. Niech będą to odpowiednio kubełki o numerach
i' orazj'; przyjmijmy też bez zmniejszenia ogólności, że i' <j'. Po połączeniu
list w wierszu 6 elementy z listy B[i1 znajdują się przed elementami z listy BU1,
więc element A[i] poprzedza element A[j] w ciągu wynikowym. Wystarczy
zatem wykazać, że A[i] ~ A[j]. Jeśli założymy przeciwnie, to otrzymamy
i' - L•A!iJJ
;,, LnA[jJJ
216
9.4. SORTOWANIE KUBEŁKOWE
ZADANIA
217
ROZDZIAŁ 9. SORTOWANIE W CZASIE LINIOWYM
* 9.4-3. Danych jest n punktów p 1 = (x;, y1) leżących w kole jednostkowym, tzn.
jest spełniony warunek O< xf + yf ~ l dla i= 1, 2, ..., n. Załóżmy, że
punkty są rozmieszczone jednostajnie, czyli prawdopodobieństwo zdarze-
nia, że punkt znajduje się w dowolnym ustalonym obszarze kola jedno-
stkowego, jest proporcjonalne do pola tego obszaru. Zaprojektuj algorytm
działający średnio w czasie E>(n), sortujący n punktów według ich odległo
ści d, = J"~r·+-Yf-od początku układu współrzędnych. (W.fkazówka: Po-
dziel koło na obszary odpowiadające jednostajnemu rozkładowi punktów
na kole jednostkowym).
* 9.44. Dystrybuantę P(x) zmiennej losowej X definiuje się jako P(x) =
= Pr{X ~ x}. Niech liczby z losowego ciągu mają ciągłą dystrybuantę P,
której wartości można liczyć w czasie 0(1). Zaprojektuj algorytm sortują
cy losowe ciągi liczb, którego średni czas działania jest liniowy.
Problemy
9-1. Dolne ograniczenia na średni czas działania sortowania
za pomocą porównań
Naszym celem będzie wykazanie, że dolna granica na oczekiwany czas działa
nia deteiministycznych lub probabilistycznych algorytmów sortowania za po-
mocą porównań wynosi O(nlgn). Rozpoczniemy od zbadania deterministycz-
nego algorytmu sortowania za pomocą porównań A, któremu odpowiada
drzewo decyzyjne TA. Zakładamy, że każda permutacja danych dla A jest jed-
nakowo prawdopodobna.
218
UWAGI DO ROZDZIAŁU
Uwagi do rozdziału
Drzew decyzyjnych do badania metod sortowania za pomocą porównań uży
wali Ford i Johnson [72]. Wszechstronna monografia o metodach sortowania,
autorstwa Knutha [123], zawiera wiele wariacji na temat sortowania, między
innymi podane przez nas dolne ograniczenie złożoności problemu sortowania
za pomocą porównań. Dolne granice złożoności problemu sortowania przy
użyciu uogólnień modelu drzew decyzyjnych badał intensywnie Ben-Or [23].
Knuth podaje, że sortowanie przez zliczanie zostało wynalezione w 1954 r.
przez H. H. Sewarda. Przypisuje mu też pomysł użycia sortowania przez zlicza-
nie jako sortowania pomocniczego w sortowaniu pozycyjnym. Sortowanie po-
zycyjne, począwszy od najmniej znaczącej cyfry, od dawna było powszechnie
stosowane przez operatorów mechanicznych urządzeń sortujących karty. We-
dług Knutha pierwszą publikacją wspominającą tę metodę jest dokument
z 1929 r. autorstwa L. J. Comrie'a, opisujący urządzenia związane z kartami
dziurkowanymi. Sortowanie kubełkowe jest stosowane od 1956 r., kiedy to
ogólna jego idea została zaproponowana przez E. J. lssaca i R. C. Singletona.
Rozdział 1O --·-···-·--·----------------
Medianyi statystyki
•
pozycyJne
220
10.1. MINIMUM I MAKSIMUM
tycznego punktu widzenia, który działa w czasie O(n) także w przypadku pesy-
mistycznym.
MIN!MUM(A)
1 min+- A[lJ
2 for i - 2 to /ength[A]
3 do jf min > A[i]
4 tben min-A[i]
5 return min
221
ROZDZIAŁ 10. MEDIANY ł STATYSTYKI POZYCYJNE
Nie jest trudno podać algorytm, który wyznacza minimum oraz maksi-
mum w zbiorze n-elementowym, wykonujący asymptotycznie optymalną f!(n)
liczbę porównań. Wystarczy niezależ.nie wyznaczyć minimum i maksimum,
stosując po n - 1 porównań, czyli w sumie 2n - 2 porównania.
Okazuje się jednak, że wystarczy 3 In/21 porównań, aby wyznaczyć zarów-
no minimum, jak i maksimum. W tym celu pamiętamy minimum i maksimum
dotychczas rozważonych elementów. Zamiast porównywać każdy element
z dotychczasowym minimum i maksimum (co daje koszt dwóch porównań na
jeden element), analizujemy kolejne elementy w parach. Porównujemy naj-
pierw parę elementów ze sobą, a następnie mniejszy z nich z dotychczasowym
minimum, większy z dotychczasowym maksimum, co w sumie wymaga trzech
porównań na dwa elementy.
ZADANIA
10.1-1. Wykaż, żew pesymistycznym przypadku drugą co do wielkości spo-
śród n liczb możoa wyznaczyć za pomocą n+ flgnl - 2 porównań.
(Wskazówka: Wymacz również najmniejszy element).
* 10.1-2. Wykaż, że w pesymistycznym przypadku do wyznaczenia zarówno ma-
ksimum, jak: i minimum z n liczb jest koniecznych f3n/2l - 2 porównań.
(Wskazówka: Rozważ, ile liczb może potencjalnie stanowić albo maksi-
mum, albo minimum, oraz zbadaj, jak jedno porównanie może wpłynąć na
te wielkości).
222
10.2. WYBÓR W OCZEKIWANYM CZASIE LINIOWYM
RANDOMIZED-SELECT(A, p, r, z)
1 ifp=r
2 then return A[p]
3 q +- RANDOMIZED-PARTITION(A,p, r)
4 k~ą-p+1
5 ifi~k
6 then return RANDOMIZED-SELECT(A,p, q, i)
7 else return RANDOMIZED-SELECT(A,q + 1, r, i - k)
1(
T(n) <; n T(max(l, n - 1))
.-,
+ .~, T(max(k, n - k))
)+ O(n)
223
ROZDZIAŁ 10. MEDIANY I STATYSTYKI POZVCYJNE
1(
<, - T(n - 1) + 2
,-1
T(k)I )
+ O(n)
n fl:"'n/21
2 n-1
- -- L (k) + O(n)
n [l:=n/21
Drugi wiersz wynika z pierwszego, ponieważ max(l, n - 1) = n - l oraz
2 n-1
T(n) <, - Ick + O(n)
n r~=n/21
2c
<, ,;·
(,-1 r.,1-1
)
,I k - ,L k + O(n)
1 1
,;c(n-1)-:
(;-1)(;)
+ O(n)
-c(!•-~)+o(n)
:E;en
ponieważ możemy dobrać tak duże c, aby c(n/4 + 1/2) było większe niż ustało~
ny składnik rzędu O(n).
224
10,3. WYBÓR W PESYMISTYCZNYM CZASIE LINIOWYM
ZADANIA
225
ROZDZIAŁ 10. MEDIANY I STATYSTYKI POZYCYJNE
Rys. 10.1. Analiza algorytmu SELECT.Wszystkie elementy są oznaczone jak.o małe kółeczka Kolum-
ny odpowiadają grupom. Mediany grup są omaczone na biało, a mediana median x jest wyróżnio
na etykietą. Str1J11kiprowadzą od większych do mniejszych elementów. Widać więc, że 3 elementy
z każ.dej grupy elementów na prawo od x są większe niż x, a 3 elementy z każdej grupy elementów
na lewo od x są mniejsze niż x. Elementy większe od x są przedstawione na szarym tle
226
10.3. WYBÓR W PESYMISTYCZNYM CZASIE LINIOWYM
®(!), jeśli n~ 80
T(n),;; { T(in/51) + T(7n/10 + 6) + O(n), jeśli n> 80
~ 9cn/10 + 7c + O(n)
~ en
ZADANIA
227
ROZDZIAŁ 10. MEDIANY I STATYSTYKI POZYCYJNE
Rys. 10.2. Chcemy wyznaczyć pozycję rurociągu wschód-zachód, dla której całkowita długość odnóg
północ-południe jest najmniejsm
228
PROBLEMY
Problemy
10-1. Sortowanie największych i elementów
Dla danego zbioru n liczb chcemy wyznaczyć oraz posortować i największych
spośród nich, używając algorytmu opartego tylko na porównaniach. Zastosuj
optymalne (pod względem pesymistycznego czasu działania) algorytmy imple-
mentujące podane metody oraz dokonaj analizy czasu ich działania jako funk-
cji n oraz i.
oraz
-------c2cc29
ROZDZIAŁ 10. MEDIANY I STATYSTYKI POZYCYJNE
jeśli n :i;;;2i
Utn) -{T(n),
n/2 + U/n/2) + T(21), w przeciwnym razie
Uwagido rozdziału
Algorytm wyszukiwania mediany, działający w pesymistycznym przypadku
w czasie liniowym, został wynaleziony przez Bluma, Floyda, Pratta, Rivesta
i Tacjana [29J. Szybki, w sensie średniego czasu działania, algorytm podał Hoa-
re [97]. Floyd i Rivest [70] zaproponowali ulepszoną jego wersję, w której zbiór
jest dzielony rekurencyjnie względem elementu wybranego z małej próbki
wszystkich elementów.
Część 11
Struktury
danyc
Wprowadzenie
Elementyzbioru dynamicznego
W większości realizacji zbiorów dynamicznych każdy element zbioru jest reM
prezentowany przez obiekt, którego pola można odczytywać oraz modyfikoM
wać, jeśli dysponujemy wskaźnikiem do tego obiektu. (W ro7.dziale 11 omówi-
my realizację obiektów i wskaźników w środowiskach programistycznych,
w których wskażniki nie występują jako wbudowane typy danych). W nie~
których rodzajach zbiorów dynamicznych zakłada się, że jedno z pól każdego
obiektu jest wyróżnione jako jego klucz (ang. key). Jeśli klucze wszystkich
232
WPROWADZENIE
234
WPROWADZENIE
Elementarnestruktury
danych
Stosy
Operację INSERT, wstawiania elementu do stosu, nazywa się zwyczajowo
PUSH, a bezargumentowa operacja DELETE, usuwania elementu ze stosu, jest
nazywana POP. Te nazwy nawiązują do tenninologii stosowanej w odniesieniu
do rzeczywistych „stosów", takich jak stosy talerzy spotykane w barach samo-
obsługowych. Talerze są zdejmowane z takiego stosu w kolejności odwrotnej
236
11.1. STOSY I KOLEJKI
STACK-EMPTY(S)
I if top[S] - O
2 then return TRUE
3 else return F ALSE
PUSH(S,x)
I top[SJ- top[S] + I
2 S[top[S]]- x
POP(S)
l if STACK-EMPTY(S)
2 then error „niedomiar"
3 else top[S] - top[SJ - I
4 return S[top[S] + I]
Na rysunku 11.1 widać wyniki działania operacji PUSH i POP. Każda z trzech
operacji na stosach działa w czasie 0(1).
l 2 3 4 5 6 7 I 2 3 4 5 6 7 I 2 3 4 5 6 7
s lisi6 I 21911ft s [~~161219111!31!]
s 1,sl6l219111
t t t
top[S] =4 top[SJ = 6 top[S]: 5
Rys. 11.1. Implementacja stosu S z.apomocą tablicy. Elementy stosu znajdują się tylko na jasno-
szarych pozycjach. (a) Stos S ma 4 elementy. Na jego wierzchołku znajduje się element 9. (b) Stos
S po wykonaniu operacji PuSH(S, 17) i PuSH(S, 3). (c) Operacja PoP(S) na stosie S daje w wyniku
element 3, który był najpóźniej wstawiony do S. Mimo że element 3 nadal znajduje się w tablicy,
nie należy już do stosu, bo na jego wierzchołku jest element 17
237
ROZDZIAŁ 11. ELEMENTARNE STRUKTURY DANYCH
Kolejki
Operację wstawiania do kolejki nazywa się zwyczajowo ENQUEUE,a operację
usuwania DEQUEUE (podobnie jak operacja POP na stosach, DEQUEUEjest
bezargumentowa). Kolejka funkcjonuje jak kolejka ludzi w sklepie: ma począ
tek (głowę) oraz koniec (ogon). Kiedy wstawiamy nowy element do kolejki,
zostaje on umieszczony na końcu kolejki (w ogonie); podobnie nowo przybywa-
jący klient zawsze staje (a przynajmniej powinien) na końcu kolejki. Element
może zostać usunięty z kolejki tylko wtedy, gdy znajduje się na jej początku
(w głowie); podobnie w sklepie w pierwszej kolejności jest obsługiwany klient
z początku kolejki, tj. ten który oczekiwał najdłużej. (Na szczęście w naszych
kolejkach nie będzie elementów, które próbują „wpychać" się poza kolejnością).
Na rysunku 11.2 jest pokazane, jak można zaffllplementować kolejkę o co
najwyżej n - l elementach za pomocą tablicy Q[l .. n}. Atrybut head[Q] takiej
kolejki wskazuje na jej głowę, tj. początek, natomiast atrybut tail[Q] wyznacza
następną wolną pozycję, na którą można wstawić do kolejki nowy element.
Elementy kolejki znajdują się na pozycjach head[Q], head[Q] + 1, ...,
tai/[Q1 - 1; umawiamy się tutaj, że tablica Q jest „cykliczna", tzn. pozycja
o numerze 1 jest bezpośrednim następnikiem pozycji o numerze n. Jeśli
head[Q] - tail[Q], to kolejka jest pusta, Początkowo head[Q] - tail[Q] - I.
Jeżeli kolejka jest pusta, to próba usunięcia elementu z kolejki za pomocą
(a)
(b)
tail[Q] = 3 head{Q]: 7
(c)
Rys. 11.2. Implementacja kolejki w tablicy Q[l „12]. Elementy kolejki majdują się tylko na jasno-
szarych pozycjach. (a) Kolejka zawiera 5 elementów na pozycjach Q[7 .. 1I]. (b) Ta sama kolejka
po wykonaniu operacji ENQUEUE(Q,17), ENQUEUE{Q,3) oraz ENQUEUE(Q,5). (c) Operacja DEQU-
EUE{Q)daje w wyniku wartość 15, która :majdowała się w chwili wywołania w głowie kolejki Po
jej wykonaniu w głowie majduje się liczba 6
238
11.1. STOSY I KOLEJKI
ENQUEUE(Q,x)
I Q[tail[QD- x
2 if tail[Q] - length[Q]
3 theu tail[Q] ..._1
4 clse lail[Q] - lail[Q] +I
DEQUEUE(Q)
I x- Q[head[QD
2 if head[Q] - length[Q]
3 then head[Q] - I
4 else head[Q] - head[Q] + I
5 return x
ZADANIA
11.1-1. Zilustruj (podobnie jak na rys. 11.1) wynik wykonania ciągu operacji
PUSH(S, 4), PUSH(S, I), PUSH(S, 3), POP(S), PUSH(S, 8) oraz POP(S) na
początkowo pustym stosie S znajdującym się w tablicy S[l .. 6].
11.1-2. Wyjaśnij,jak. zaimplementować dwa stosy w jednej tablicy A[l .. n], aby
do przepełnienia któregoś z nich dochodziło dopiero wtedy, gdy liczba
elementów w obu stosach osiąga n. Procedury PUSH i POP powinny działać
w czasie 0(1 ).
11.1-3. Zilustruj (podobnie jak na rys. 11.2) wynik wykonania ciągu operacji
ENQUEUE(Q,4), ENQUEUE(Q,I), ENQUEUE(Q,3), DEQUEUE(Q),ENQU"
EUE(Q, 8), oraz DEQUEUE(Q) na początkowo pustej kolejce Q znajdującej
się w tablicy Q[l .. 6].
11.1-4. Uzupełnij procedury ENQUEUEi DEQUElffi o wykrywanie błędów prze-
pełnienia i niedomiaru.
11.1-5. W stosach wstawianie i usuwanie elementów odbywa się na jednym
z końców, w kolejkach wstawia się elementy na jednym końcu, a usuwa
z drugiego. Kolejka dwustronna (dwukierunkowa) jest strukturą danych
pozwalającą na wstawianie i usuwanie elementów na obu końcach. Napisz
cztery procedury działające w czasie 0(1), służące do wstawiania i usuwa-
nia elementów z obu końców kolejki przechowywanej w tablicy.
239
ROZDZIAŁ 11. ELEMENTARNE STRUKTURY DANYCH
11.2. Listy
Lista z dowiązaniami jest strukturą danych, w której elementy są ułożone w li-
niowym porządku. Jednak w przeciwieństwie do tablicy, w której porządek.jest
wyznaczony przez jej indeksy, porządek na liście z dowiązaniami określają
wskaźniki związane z każdym elementem listy. Listy z dowiązaniami są prostą
i elastyczną strukturą, służącą do reprezentowania zbiorów dynamicznych,
umożliwiającą wykonywanie wszystkich operacji (choć nie zawsze optymalnie)
wymienionych na str. 233.
Jak można zobaczyć na rys. 11.3, każdy element listy dwukien1nkowej
L (ang. doubly linked list) jest rekordem składającym się z trzech pól: key
(zawiera klucz elementu), next oraz prev. W takim rekordzie mogą się jeszcze
znajdować inne dane. Dla danego elementu x na liście next[x] wskazuje na jego
następnik na liście, a prev[x] wskazuje na jego poprzednik. Jeśli prev{x] = NIL,
to element x nie ma poprzednika, jest więc pierwszym elementem listy. Mówi-
my wtedy, że x jest głową tej listy. Jeśli next(x] = NIL, to x nie ma następnika,
jest więc ostatnim elementem listy lub jej ogonem. Atrybut head[L]wskazuje na
pierwszy element listy. Jeżeli head[L] = NIL, to lista jest pusta.
Zależnie od potrzeby stosuje się listy różnego rodzaju. Listy mogą być na
przykład jednokierunkowe lub dwukien1nkowe, posortowane lub nieposorto-
240
11.2. LISTY
wane, cykliczne lub nie. Jeśli lista jest jednokierunkowa (ang. singly linked list),
to w jej elementach pomijamy wskaźnik prev. Jeśli lista jest posortowana, to
kolejność elementów na liście jest zgodna z porządkiem na ich kluczach; ele-
ment o najmniejszym kluczu znajduje się w głowie listy, a ten o największym
kluczu w jej ogonie. Jeżeli lista jest nieposortowana, to kolejność elementów jest
dowolna. W liście cyklicznej pole prev elementu w głowie wskazuje na ogon,
a pole next w ogonie wskazuje na głowę. Elementy takiej listy tworzą więc
pierścień. Do końca tego podrozdziału przyjmujemy założenie, że listy, na któ-
rych operujemy, są nieposortowane i dwukierunkowe.
LIST-SEARCH(L, k)
I x-head[L]
2 while x # NIL i key[x] # k
3 do x +- next(x]
4 return X
LIST-INSERT(L, x)
I next[x] +- head[L]
2 lf head[L] # NIL
3 tbenprev[head[L]]- x
4 head[L]-x
5 prev[x]+- NIL
241
ROZDZIAŁ 11. ELEMENTARNE STRUKTURY DANYCH
LIST-DELETE(L, x)
1 if prev[x] #- NIL
2 then next[prev{x]]+- next[x]
3 e]se head[L] +- next{x]
4 if next[x] i: NIL
5 tben prev[next[x]]+- prev{x]
Wartownicy
Gdyby można było pominąć warunki brzegowe dotyczące głowy i ogona listy,
treść procedury LIST-DELETEznacznie by się uprościła.
LIST-DELETE'(L, X)
I next[prev{x]]+- next[x]
2 prev{next[x]]+- prev[x]
242
11.2. LISTY
I
(a) ni/Il.I -
l
(bł nil[LI
~.4 I• I I.'I I I I ' ki
I• I 1.·1-I16 I 1.-'I-
(c) nil[l] r:.... ·1 125 I I.·1-I• I I.'I J I6 J '.t4 I• I '.t4 I I I 'kI
(d} nil[LJ l~ I,,I I.'I I• I I.'I I16I l.'I I• I I 41
Rys. 11.4. Lista L z dowiązaniami, z wartownikiem nif[L] (ciemnoszary), to cykliczna lista dwu-
kierunkowa, w której element nil[L] znajduje się zawsze między głową a ogonem. Atrybut headfL]
nie jest już niezbędny, ponieważ na głowę wskazuje zawsze next[nil[LJ]. (a) Lista pusta. {b) Lista
z rys. 11.3a z kluczem 9 w głowie i kluczem l w ogonie. (c) Ta sama lista po wykonaniu LIST·
-INSERT'(L, x), gd7ie key[x] = 25. Nowy element został umieszczony w głowie listy. (d) Lista po
usunięciu elementu o kluczu I. W ogonie znajduje się teraz element o kluczu 4
LIST-SEARCH'(L, k)
l x- next(nil[L]]
2 whilex cf,;nil[L] i key[x] cf,;k
3 do x .__next[x]
4 returnX
LIST-INSERT'(L, x)
I next[x] .__next[nil[L]]
2 prev[next[nil[L]]]+-- x
3 next[nil[LJ]-x
4 prev[x]- nil[LJ
243
ROZDZIAŁ 11. ELEMENTARNE STRUKTURY DANYCH
się znacznie uprościć treść procedur, lecz czas działania procedur LIST-INSERT'
i LIST-DELETE'skrócił się zaledwie o 0(1). Niekiedy jednak użycie wartow-
ników prowadzi do skrócenia treści pętli i wtedy daje to w efekcie 2l'.D.niejszenie
współczynnika przy, powied2'llly, n lub n2 w złożoności czasowej operacji na
struktur7.e danych.
Nie należy jednak stosować wartowników zupełnie bezkrytycznie i bez
ograniczeń. Jeśli pracujemy z dużą liczbą małych list, to marnujemy znaczącą
część pamięci na ich wartowników. W tej książce używamy wartowników tylko
wówczas, gdy pozwalają znacznie uprościć treść procedur.
ZADANIA
11.2-1. Czy da się tak zaimplementować operację INSERTna liście jednokie-
runkowej, aby działała w czasie 0(1)? A jak jest z operacją DELETE?
11.2-2. Zaimplementuj stos za pomocą listy jednokierunkowej L. Operacje
PUSH i POP powinny działać w czasie 0(1).
11.2-3. Z.aimplementuj kolejkę za pomocą listy jednokierunkowej L. Operacje
ENQUEUBi DBQUEUEpowinny działać w czasie 0(1).
11.24. Zaimplementuj operacje słownikowe INSERT,DELETEoraz SEARCHza
pomocą jednokierunkowych list cyklicznych. Jakie są czasy działania tych
procedur?
11.2-5. Argumentami operacji UNION są dwa zbiory rozłączne S 1 i S 2 , a wy-
nikiem jej działania jest zbiór S = S 1 u S 2 składający się z wszystkich ele-
mentów zbiorów S 1 i S 2 • Reprezentacje zbiorów S 1 i S 2 ulegają zwykle
zniszczeniu w wyniku wykonania operacji UNION.Zaprojektuj odpowied-
nią listową strukturę danych, umożliwiającą wykonywanie operacji
UNIONw czasie 0(1).
11.2-6. Napisz procedurę, która łączy dwie jednokierunkowe, posortowane li-
sty w jedną jednokierunkową, posortowaną listę, bez użycia wartowników.
Następnie 2'Jllodyfikujją, dodając wartownika o kluczu oo na koniec każ
dej z list. Porównaj stopień komplikacji obu procedur.
11.2-7. Napisz nierekurencyjną procedurę odwracającą kolejność elementów
na liście jednokierunkowej, działającą w czasie 0(n). Dodatkowa pamięć
(oprócz tej zajmowanej przez samą listę) powinna być stała (tj. niezależna
od liczby elementów na liście).
* 11.2-8. Wyjaśnij, jak. zaimplementować listę dwukierunkową, używając tylko
jednego wskaźnika np[x] na jeden element, zamiast dwóch (next i prev).
Przyjmij założenie, że wszystkie wskaźniki można reprezentować za pomo-
cą k-bitowych liczb całkowitych i zdefiniuj np[x] w następujący sposób:
np[x] = next[x] XOR prev[x], tj. wartość k-bitowej operacji „wykluczające
LUB" na liczbach next[x] i prev[x]. (Wartość NIL jest reprezentowana
przez liczbę O). Zwróć szczególną uwagę na to, jakie dane są potrzebne,
aby móc odwoływać się do głowy listy. Zaprojektuj operacje SEARCH,
244
11.3. REPREZENTOWANIE STRUKTUR WSKAZNIKOWYCH ZA POMOCĄ TABLIC
INSERT oraz DELETE na takiej liście. Pokaż także, jak odwracać kolejność
elementów na takiej liście w czasie 0(1).
Reprezentacja wielotablicowa
Zbiór rekordów o takiej samej strukturze można reprezentować za pomocą
tablic, z których każda odpowiada pewnemu polu rekordów. Na rysunku 11.5
jest przedstawiona reprezentacja listy z rys. 11.3a za pomocą trzech tablic.
Tablica key zawiera wartości kluczy znajdujących się na liście, a wskaźniki
znajdują się w tablicach next oraz prev. Dla danego indeksu x wartości key[x],
next[x] oraz prev{x] określają cały element listy, Przy takiej interpretacji rolę
wskaźników odgrywają indeksy w tablicach key, next oraz prev.
Na liście z rys. 11.3a element o kluczu 4 znajduje się bezpośrednio za
elementem o kluczu 16. Na rysunku 11.5 klucz 4 znajduje się w key[2], a klucz
16 w key{5], więc next[5] = 2 oraz pret{2] = 5. Chociaż w tablicy next na pozy-
cji odpowiadającej ogonowi listy oraz w tablicy prev na pozycji odpowiadającej
głowie listy znajduje się stała NIL, jednak zazwyczaj umieszcza się tam liczbę
całkowitą (jak np. O lub -1 ), która z pewnością nie oznacza żadnego popraw-
nego indeksu w tablicach. W zmiennej L jest pamiętany numer pozycji, na
której znajduje się głowa listy.
Rys. 11.5. Lista z rys, l l.3a reprezentowana za pomocą tablic key, next i prev. Ka:Wa kolumna
stanowi pojedynczy element listy. Wskaźniki odpowiadają indeksom umieszczonym ponad tabli-
cami; strzałki ilustrują tylko, jak należy je interpretować, Jasnoszare pozycje zawierają elementy
znajdują.ce się aktuaJnie na liście. W zmiennej L jest przechowywany indeks głowy listy
245
,, ,,,_ ...___
____ ,.,_,.,~, ...
__,,,_,.,_,,, -~..·-··
W treści procedur używaliśmy nawiasów kwadratowych zarówno do ozna-
czenia indeksowania w tablicy, jak i wyboru pola rekordu lub atrybutu struk-
tury danych. Znaczenia key[x], next[x] oraz prev[x} pokrywają się z tradycyjną
notacją stosowaną w wielu językach programowania.
Reprezentacjajednotablicowa
Komórki pamięci komputera są zwykle adresowane za pomocą liczb całkowi
tych od O do M - 1, gdzie M jest liczbą dostępnych komórek. W realizacjach
wielu języków programowania rekordy zajmują spójne obszary pamięci.
Wskaźnik do rekordu jest wtedy po prostu adresem komórki pamięci, w której
zaczyna się jego opis. Adresy poszczególnych pól rekordu otrzymuje się przez
dodawanie do powyższego wskaźnika odpowiednich liczb, określających prze-
sunięcie pola względem początku rekordu.
Taką samą strategię możemy zastosować do reprezentowania rekordów
w środowiskach programistycznych, w których nie ma wskaźnikowych typów
danych. Na rysunku 11.6 widać, w jaki sposób w pojedynczej tablicy A można
przechowywać listę z rys. 11.3a i 11.5. Każdy element listy zajmuje spójny
fragment tablicy A[j .. k]. Każdemu polu pojedynczego rekordu odpowiada
przesunięcie, będące liczbą z przedziału od Odok - j, a wskaźnikiem do rekor-
du jest po prostu indeks j. Przesunięcia odpowiadające polom key, next i prev,
przy reprezentacji jak na rys. 1I .6, wynoszą odpowiednio O, 1 i 2. Aby od-
czytać wartość prev[i], mając dane i, należy do wskaźnika i dodać przesunięcie
2. Otrzymamy w ten sposób właściwy indeks w tablicy A - poszukiwana war-
tość znajduje się więc w A[i + 2].
-Reprezentacja jednotablicowa jest o tyle elastyczna, że umożliwia przecho-
wywanie obiektów o różnych rozmiarach w jednej tablicy. Operacje na takim
heterogenicznym zbiorze obiektów są bardziej złożone niż na zbiorze, w któ-
rym wszystkie obiekty mają identyczne pola. Większość struktur danych, które
L [i9j
A
nexl
Rys. 11.6. Lista z rys. I I.Ja oraz 11.5 reprezentowana w pojedynczej tablicy A. Każdy element listy
zajmuje sp6jny fragment tablicy o długości 3. Trzy poJa key, next oraz prev odpowiadają od-
powiednio przesunięciom O, 1 i 2. Wskaźnikiem do rekordu jest indeks w tablicy, pod którym
majduje się jego początek. Pola w tablicy zawierające elementy listy są jasnoszare, a strzałki
ilustrują kolejność elementów na liście
11.3. REPREZENTOWANIE STRUKTUR WSKAi:NIKOWYCH ZA POMOCĄ TABLIC
ALLOCATE~0BJECT()
1 if free = NIL
2 then error „brak pamięci"
3 else x +- free
4 free+- next[x]
5 return x
247
ROZDZIAŁ 11. ELEMENTARNE STRUKTURY DANYCH
.tree rł---- - I 2 3 4 5 6 7 8
fr,, li I 2 3 4 5 6 7 8
0
~
P'"' P'"'
(a) (b)
free lfl1 I 2 3 4 5 6 7 8
l II next
key
P'"'
(c)
Rys. 11.7. Wyniki działania procedur Au.ocAn-Olm!cr i Flt.EE-Oamcr. (a) Lista z rys. 11.S (jasno-
szare) oraz lista wolnych rekordów (ciemnoszare). Strzałki ilustrują wskaźniki listy wolnych rekor-
dów. (b) Wynik wywołania Au.ocATB-OllJEcr() (które wyznacza wartość 4), wpisania wartości 25
w pole key[4] oraz wywołania LIST-INSERT(L, 4). Po wykonaniu tych operacji w głowie listy wol-
nych rekordów znajduje się rekord o numerze 8, który był wskazywany przez nexl (4) na liście
wolnych rekordów. (c) Po wykonaniu operacji LIST-DELBTE(L,5) wywołujemy FREE-Oall!CT(S).
Obiekt o numerze 5 staje się nową głową listy wolnych rekordów, jej nastęi,oikiem zostaje obiekt
o numerze 8
FREE-0DJECT(x)
1 next[x] +- free
2 free+- x
_tree Im I 2 J 5 6 7
' 9 IO
L, ne.,t
111!key
L, 131
J prev
___
RyL 11.8. Dwie listy L 1 (ja&nosrne) i L 2 (ciemnoszare) oraz lista wolnych pozycji (zacze.t1liona)
248
11.4. REPREZENTOWANIE DRZEW (UKORZENIONYCH)
ZADANIA
11.4. Reprezentowanie
drzew(ukorzenionych)
Metody reprezentowania list opisane w poprzednim podrozdziale można za-
adaptować do dowolnych homogenicznych struktur danych. W tym podroz-
dziale zajmiemy się zagadnieniem reprezentacji drzew ukorzenionych za pomo-
cą struktur wskaźnikowych. Najpierw przyjrzymy się drzewom binarnym,
a następnie omówimy metodę reprezentowania drzew, w których każdy węzeł
ma dowolną liczbę następników (synów).
Węzły drzewa będziemy reprezentować za pomocą rekordów. Podobnie
jak w przypadku list zakładamy, że każdy węzeł ma pole key, tj. klucz. Pozo-
249
ROZDZIAŁ 11. ELEMENTARNE STRUKTURY DANYCH
Drzewa binarne
Jak widać
na rys. 11.9, w każdym węźle drzewa binarnego Tpamiętamy wska-
źniki do ojca oraz lewego i prawego syna, odpowiednio w polach p, left i right.
Jeśli p[x] = NIL, to x jest korzeniem drzewa. Jeśli węzeł x nie ma lewego syna,
to left[x] = NIL i podobnie dla prawego syna. Atrybut root[T] zawiera wskaź
nik do korzenia drzewa T. Jeżeli więc root[T] = NIL, to znaczy, że drzewo
jest puste.
roo1[n
// / //
Rys. 11.9. Reprezentacja drzewa binarnego T. Kai.dy węzeł x ma trzy pola: p[x] (górne), /e/t[x] (lewe
dolne) i right[x] (prawe dolne). Pola key nie zostały na tym rysunku uwzględnione
250
11.4. REPREZENTOWANIE DRZEW (UKORZENIONYCH)
root[71
Rys. Il.IO. Reprezentacja „na lewo syn, na prawo brat" drzewa T. Każdy węzeł x ma pola: p[x]
(górne), kft-childfx] (lewe dolne) i right-sihling(x](prawe dolne). Klucze nie zostały na tym rysun-
ku uwzględnione
251
ROZDZIAŁ 11. ELEMENTARNE STRUKTURY DANYCH
ZADANIA
11.4-2. Napisz procedurę rekurencyjną działającą. w czasie O(n), która dla da-
nego drzewa binarnego o n węzłach wypisuje klucze wszystkich węzłów.
11.4-3. Napisz nierekurencyjną procedurę, która w czasie O(n) wypisuje klucze
wszystkich węzłów drzewa binarnego o n węzłach. Użyj stosu jako pomoc-
niczej struktury danych.
11.4-4. Napisz procedurę działającą. w czasie O(n), która wypisuje wszystkie
klucze dowolnego drzewa ukorzenionego o n węzłach, przedstawionego za
pomocą reprezentacji „na lewo syn, na prawo brat".
* 11.4-S. Napisz nierekurencyjną procedurę działającą w czasie O(n), która dla
danego drzewa binarnego o n węzłach wypisuje wszystkie jego klucze.
Twoja procedura może wykorzystywać tylko stałą liczbę dodatkowych
komórek pamięci oraz nie powinna zmieniać (nawet tymczasowo) stru-
ktury drzewa.
* 11.4-6. W reprezentacji „na lewo syn, na prawo brat" dowolnego drzewa
w każdym węźle są pamiętane trzy wskaźniki: /eft-child, right-sihling oraz
parent. Dzięki temu z kazdego węzła można wyznaczyć ojca i uzyskać do
niego dostęp. Wskaż, jak zachować tę własność, pamiętając w każdym
węźle tylko dwa wskaźniki oraz jedną zmienną boolowską.
Problemy
11-1. Porównanie list
Jakie są pesymistyczne złożoności asymptotyczne poszczególnych operacji na
zbiorach dynamicznych dla wymienionych w poniższej tabeli czterech typów list?
252
PROBLEMY
INSERT(L,x)
DELETE(L,x) .
x)
SUCCESSOR(L,
I
hEDECESSOR(L,x) I
I
MINIMUM(L) I
MAXIMUM(L)
Zaprojektuj każdą z operacji tak, aby była jak najbardziej efektywna. Oszacuj
czasy działania operacji, jako funkcje rozmiaru zbiorów dynamicznych na któ-
rych działają:
COMPACT-L!ST-SEARCH(L, k)
I i-head[L]
2 n - length[L]
3 wbile i #a NIL i key(i] < k
253
ROZDZIAŁ 11. ELEMENTARNE STRUKTURY DANYCH
4 do j +-RANDOM(!, n)
5 if key[i] < key[j] i key[j] < k
6 then i+- j
7 i+- next[i]
8 if key[i] - k
9 then return i
10 return NIL
254
UWAGI DO ROZDZIAŁU
Uwagido rozdziału
Książki Abo, Hopcrofta i Ullmana (5] oraz Knutha (121] są znakomitymi
źródłami informacji na temat elementarnych struktur danych. W książce Gon-
neta [90] można znaleźć dane eksperymentalne dotyczące wielu operacji wyko-
nywanych na strukturach danych.
Trudno sprecyzować, jakie jest pochodzenie stosów i kolejek jak.o struktur
danych używanych w informatyce, ponieważ analogiczne pojęcia występowały
już wcześniej w matematyce i praktyce biurowej, zanim jeszcze pojawiły się
komputery. K.nuth (121] wspomina A. M. Turinga, który w 1947 r. opracował
metodę łączenia pod.procedur przy użyciu stosów.
Wskaźnikowe struktury danych również należą do „folkloru" informa-
tycmego. Według K.nutha wskaźników używano już w pierwszych kompute-
rach z pamięciami bębnowymi. W języku A-1 stworzonym przez G. M. Hop-
pera w 1951 r. wyrażenia algebraiczne były reprezentowane za pomocą drzew
binarnych. Wyeksponowanie znaczenia wskaźników i ich popularyzację Knuth
przypisuje językowi IPL-11, stworzonemu w 1956 r. przez A. Newella,
J. C. Shawa oraz H. A. Simona. W zaprojektowanym przez nich w 1957 r.
języku IPL-111 są wbudowane jawne operacje na stosach.
Rozdział 12
Tablicez haszowaniem
' W literaturze jako tłumaczenie ang. hashing spotyka się również słowo mieszanie lub roz-
praszanie (przyp. red.).
256
12.1. TABLICE Z ADRESOWANIEM BEZPOŚREDNIM
DIRECT-AoDRESS-SEARCH(T, k)
return T[k]
DIRECT-AnDRESS-INSERT(T, x)
T[key[x]J - x
DIRECT-AnDRESS-DELETE(T, x)
T[key[x]] - NIL
Ki"o Doda(kowc
dane
'
J
'
257
ROZDZIAŁ 12. TABLICE Z HASZOWANIEM
ZADANIA
12.1-1. Niech zbiór dynamiczny S będzie reprezentowany przez tablicę
To długości m, z adresowaniem bezpośrednim. Opisz procedurę wyszuku-
jącą największy element zbioru S. Jaki jest pesymistyczny czas działania
Twojej procedury?
12.1-2. Wektor bitowy jest tablicą bitów (zer i jedynek). Wektor bitowy o dłu
gości m zajmuje mniej pamięci niż tablica m wskaźników. Opisz metodę
reprezentowania zbiorów dynamicznych za pomocą wektorów bitowych
(przyjmując, że w skład elementów nie wchodzą żadne dodatkowe dane).
Operacje słownikowe powinny działać w czasie 0(1).
12.1-3. Zaproponuj metodę implementacji tablicy z adresowaniem bezpośred
nim, w której klucze pamiętanych elementów nie muszą być różne, a z każ
dym elementem mogą być związane pewne dodatkowe dane. Wszystkie
trzy operacje słownikowe (INSERT, DELETE oraz SEARCH) powinny dzia-
łać w czasie 0(1). (Argumentem procedury DELETE jest wskaźnik do obie-
ktu, który ma zostać usunięty, a nie sam klucz).
* 12.1-4. Chcemy reprezentować słownik za pomocą bezpośredniego adresowa-
nia w ogromnej tablicy. Na początku w tablicy mogą znajdować się przypa-
dkowe wartości, a jej inicjowanie nie wchodzi w rachubę ze względu na jej
duży rozmiar. Zaprojektuj metodę reprezentowania słownika z adresowa-
niem bezpośrednim w ogromnej tablicy. Każdy przechowywany element
powinien zajmować tylko 0(1) pamięci, operacje SEARCH, INSERT i DELE~
TE powinny działać w czasie 0(1), a inicjowanie tej struktury danych
w czasie 0(1). (Wskazówka: Użyj dodatkowego stosu o rozmiarze równym
liczbie elementów przechowywanych w tablicy, za pomocą którego można
określać, czy dana pozycja w dużej tablicy zawiera sensowną wartość).
h:U-{O, l, ...,m-1)
Główna idea haszowania jest pokazana na rys. 12.2. Funkcje haszujące wpro-
wadza się, aby zmniejszyć liczbę potrzebnych pozycji w tablicy z IUJdo.m, co
. . . . . .
moze znacznie ogran1czyc wymagarua pam1ęc1owe.
.
T
• • ..........
.. "
.
""
,,,,,
,,.,,,. ...
'""" ' : ::
.... : '.: . . .
h( kl )
.. ...
.
., ' hl k 4)
.
......
K
*, .. • ••
. ""
{kl~= h(k:)=h(k.5)
. •• .
re zbioru)
,, ""
'' ...
'" ,.,
'
h1k3)
m,
Rys. 12.2. Funkcja haszująca Ir przyporządkowuje pozycje w tablicy z haszowaniem kluczom z uni-
wersum U. Klucze k 2 i k~ kolidują ze sobą, ponieważ odpowiada im ta sama pozycja
259
ROZDZIAŁ 12. TABLICE Z HASZOWANIEM
Oczywiście byłoby
w ogóle unikać kolizji. Zasadniczy jest tutaj
najlepiej
dobór funkcji haszującej h. Jednym z możliwych sposobów uniknięcia lub
przynajmniej zminimalizowania liczby kolizji jest wybranie funkcji h, która
wydaje się być „losowa". Angielski odpowiednik słowa „haszowanie" - ,,hash-
ing" - kojarzący się z losowym mieszaniem i siekaniem, dość dobrze oddaje
istotę tego podejścia. (Oczywiście funkcja haszująca h musi być deterministycz-
na, tzn. dla danego argumentu k musi dawać zawsze ten sam wynik h(k)). Ze
względu na fakt, że IUI > m, w U muszą być takie dwa klucze, dla których
funkcja haszująca ma taką samą wartość; całkowite uniknięcie kolizji nie jest
więc możliwe. Jeśli nawet użyjemy dobrze dobranej, ,,losowej" funkcji haszują
cej, która minimalizuje liczbę kolizji, to mimo wszystko nadal potrzebna jest
nam metoda ich rozwiązywania, jeśli już wystąpią.
W pozostałej części tego podrozdziału przedstawimy najprostszą technikę
rozwiązywania kolizji, nazywaną metodą łańcuchową. W podrozdziale 12.4
opiszemy inne podejście do rozwiązywania kolizji, zwane adresowaniem ot-
wartym.
,,,,,,
lc.c,,.
'
''
:,,:.,,.
,,,,
;;.Ti::;;,"1,.t.
,,,,,,,
"
,,.,.,,,
,,,,.,,.,
=~~
·:::J=::1---1''~,
->[~·
,, /
"'' ,, ,,
•
"' ,, /
Rys. 12.3, Rozwiązywame kolizji metodą łańcuchową. Na każdej pozycji jw tablicy T znajduje się
wskaźnik do listy wszystkich kluczy, d.Jaktórych funkcja haszują.ca. h daje wartośc j. Na przykład
h(k 1) = h(k4 ) oraz h(k 5 ) ""h(k 2) = h(k 1)
260
12.2. TABLICE Z HASZOWANIEM
CJłAINED-HASH-INSERT(T, x)
wstaw x na początek
listy T[h(key[x])]
CHAINED-HASH-SEARCH(T, k)
wyszukaj element o kluczu k na liście T[h(k)]
CHAINED-HASH-DELETE(T, x)
usuń element x z listy T[h(key[x])J
·-------ce ........
.
261
ROZDZIAŁ 12. TABLICE Z HASZOWANIEM
TwlERDZENIE 12.1.
W tablicy z haszowaniem wykorzystującym łańcuchową metodę rozwiązywa
nia kolizji, przy założeniu o prostym równomiernym haszowaniu, średni czas
działania procedury wyszukiwania zakończonego porażką wynosi 0(1 + a:).
DOWÓD
Przy założeniu prostego równomiernego haszowania każdy klucz k jest zjed-
nakowym prawdopodobieństwem odwzorowywany na dowolną z m pozycji
w tablicy. Średni czas wyszukiwania zakończonego porażką jest więc równy
średniemu czasowi przejścia do końca jednej z m list. Średnia długość takiej
listy jest równa współczynnikowi zapełnienia tablicy a= n/m. Stąd oczekiwana
liczba elementów sprawdzonych w czasie wyszukiwania zakończonego porażką
jest równa a:, całkowity czas (wliczając czas potrzebny na obliczenie h(k) oraz
dostęp do pozycji T[h(k)]) wynosi więc 0(1 + a).
•
TwlERDZENIE 12.l.
W tablicy z haszowaniem wykorzystującym łańcuchową metodę rozwiązywa
nia kolizji, przy założeniu o prostym równomiernym haszowaniu, średni czas
działania procedury wyszukiwania zakończonego sukcesem wynosi 0(1 + ix).
DOWÓD
Możemy przyjąć, że klucz, którego szukamy, jest z jednakowym prawdopodo-
bieństwem dowolnym spośród n kluczy znajdujących się w tablicy. Założymy
również, że procedura OfAINED-HASH-INSERT wstawia nowe elementy na
końcu listy, a nie na początku. (Z rozwiązania zad. 12.2-3 wynika, że średni
czas wyszukiwania nie zależy od tego, czy wstawiamy elementy na początek,
czy na koniec listy). Oczekiwana liczba rozpatrzonych w czasie wyszukiwania
elementów jest o l większa niż liczba określająca długość, jaką miała lista, na
której znajduje się szukany element, w chwilę przed jego dodaniem do tej listy
(ponieważ każdy nowy element zostaje dodany na koniec listy). W celu oblicze-
nia oczekiwanej liczby sprawdzonych elementów należy więc wziąć średnią, po
wszystkich n elementach w tablicy, z 1 plus oczekiwana długość listy, do której
został dodany i-ty element. Oczekiwana długość tej listy wynosi (i -1)/m, więc
-----·-------- -------------------
262
12.2. TABLICE Z HASZOWANIEM
I"( I+
n,L, i-1)
m - I+
I" (i- I)
nm,L,
-1 + " - I-
2 2m
ZADANIA
263
ROZDZIAŁ 12. TABLICE Z HASZOWANIEM
12.3. Funkcjehaszujące
W tym podro7.dziale zajmujemy się zagadnieniem projektowania dobrych
funkcji haszujących i przedstawiamy trzy metody ich tworzenia: haszowanie
modularne, haszowanie przez mnożenie oraz haszowanie uniwersalne.
I
L P(k) - - dla j- O, I, ..., m - I (12.1)
.t:li(.t)"'i m
Niestety, ogólnie nie daje się sprawdzić tego warunku, ponieważ zwykle nie
znamy P.
Czasem (rzadko) znamy rozkład P. Niech na przykład klucze będą losowy-
mi liczbami rzeczywistymi k rozłożonymi niezależnie i równomiernie w prze-
k < l. W tym przypadku można wykazać, że funkcja haszująca
dziale O ;:;,_;
264
12.3. FUNKCJE HASZUJĄCE
h(k)- LkmJ
spełnia równanie (12.1).
W praktyce przy doborze funkcji haszujących stosuje się rozmaite metody
heurystyczne. Jakościowe infonnacje na temat Pokazują się przy tym niejed-
nokrotnie bardzo użyteczne. We:hny na przykład tablicę symboli kompilatora,
w której kluczami są napisy reprezentujące identyfikatory występujące w pro-
gramie. Jest zwykle duże prawdopodobieństwo, że podobne symbole (np. adres
i adresy) występują w jednym programie. Dobra funkcja haszująca powinna
minimalizować szansę, że takie niewiele różniące się symbole będą odwzorowa-
ne na tę samą pozycję w tablicy z haszowaniem.
Typowe podejście polega na takim doborze wartości funkcji haszującej,
aby były one maksymalnie niezależne od możliwych tendencji mogących wy-
stępować w danych. Na przykład w haszowaniu modularnym (które omawia-
my poniżej) wartość funkcji haszującej jest równa reszcie z dzielenia klucza
przez pewną ustaloną liczbę pierwszą. Jeżeli nie ma żadnych związków między
tą liczbą pierwszą a rozkładem prawdopodobieństwa P, to metoda ta daje
bardzo dobre wyniki.
Należy na koniec wspomnieć, że w niektórych zastosowaniach wymagamy
spełnienia przez funkcję haszującą jeszcze silniejszych warunków niż samo pro-
ste równomierne haszowanie. Możemy na przykład postulować, aby „bliskim"
(w pewnym sensie) kluczom odpowiadały znacznie od siebie oddalone wartości
funkcji haszującej. (raka własność będzie szczególnie pożądana, jeśli do roz-
wiązywania kolizji użyjemy metody adresowania liniowego z podrozdz. 12.4).
h(k) - kmodm
12.3.2. Haszowanieprzezmnożenie
Tworząc funkcję haszującą za pomocą mnoZenia, obliczenia przeprowadza się
w dwóch krokach. Najpierw mnożymy klucz k przez stałą A z przedziału
O< A < I i wyi.naczamy ułamkową część kA. Następnie mnożymy tę wartość
przez m; wartość funkcji podłogi z uzyskanej liczby jest wartością funkcji ha-
szującej. Symbolicznie można więc wyrazić tę funkcję następująco:
266
12.3. FUNKCJE HASZUJĄCE
gdzie „kA mod I" oznacza ułamkową część kA, tj. kA - LkAJ.
Zaletą haszowania przez mnożenie jest dowolność wyboru m. Zwykle jed-
=
nak wybieramy jakom pewną potęgę 2 - m 2Pdla pewnej liczby naturalnej
p - ponieważ możemy wtedy łatwo zaimplementować funkcję haszującą na
większości komputerów w następujący sposób. Załóżmy, że słowo maszynowe
ma długość w bitów oraz że k mieści się w jednym słowie. Jak widać na rys.
12.4, najpierw mnożymy k przez w-bitową liczbę całkowitą LA· 2wJ. Wynik jest
2w-bitową liczbą r 12w + r 0 , gdzie r 1 jest bardziej znaczącym, a r 0 mniej znaczą
cym słowem iloczynu. Szukana p-bitowa wartość funkcji haszującej składa się
z p najbardziej znaczących bitów liczby r0 .
•
X I
,·~·---~~c____ _,1 ~ I
'---~ Wybieramy p bitów
I w,•i
Rys. 12.4. Haszowanie przez mnożenie. Reprezenlacja w-bitowa klucza k zostaje pomnożona przez
w-bitową liczbę LA· 2"'J, gdzie O < A < I jest odpowiednią stałą. Najbardziej maczącycb p bitów
dolnej w-bitowej połowy powyżBzego iloczynu jest wyznaczaną wartością funkcji haszującej h{k)
267
ROZDZIAŁ 12. TABLICE Z HASZOWANIEM
TWIERDZENIE 12.3.
Niech h będzie funkcją wybraną
losowo z uniwersalnej rodziny funkcji haszu-
jących. Jeśli rozpraszamy za jej pomocą n kluczy w tablicy o ro2ID.iarze m,
gdzie n ~ m, to oczekiwana liczba kolizji, w które wchodzi ustalony klucz
x jest mniejsza niż 1.
------~~ _,,-- -----------------·---
268
12.3. FUNKCJE HASZUJĄCE
DOWÓD
Dla każdej pary y, z różnych kluczy niech cyz będzie zmienną losową, która
przyjmuje wartość 1, jeśli h(y) = h(z) (tzn. jeśli y i z wchodzą w kolizję, gdy
używamy h), a w przeciwnym razie O. Z definicji uniwersalnej rodziny funkcji
haszujących wynika, że ustalona para kluczy koliduje ze sobą z prawdopodo-
bieństwem 1/m, więc
E[c,,J ~ 1/m
E[CJ ~ L E[c,,J
,,,
„r
- n-1
.
m
•
Zajmiemy się teraz zagadnieniem budowania uniwersalnych rodzin funkcji
haszujących. Nie jest to trudne zadanie, jeżeli używa się do tego celu prostych
narzędzi teorii liczb. Przyjmijmy, że rozmiar tablicy m będzie liczbą pierwszą
(podobnie jak to czyniliśmy w metodzie modularnej). Rozłóżmy klucz x na
r + I bajtów (tj. znaków lub podciągów binarnych o ustalonej długości), co
symbolicznie zapisujemy jako x = (x 0 , x 1 , ... , x,). Wymagamy przy tym jed-
nak, aby maksymalna wartość bajtu nie była większa odm. Niech a= (a 0 , a 1 ,
..., a,) oznacza ciąg r + 1 elementów wybranych losowo 7.e zbioru {O, 1, ... ,
m- I}. Odpowiadająca temu ciągowi funkcja haszująca h11E.Yt' jest zdefinio-
wana następująco:
(12.4)
•
mam'+ 1 elementów.
269
ROZDZIAŁ 12. TABLICE Z HASZOWANIEM
TwIERDZENlE12.4.
Rodzina Jll', zdefiniowana przez równości (12.3) oraz (12.4), jest uniwersalną
rodziną funkcji haszujących.
DOWÓD
Rozważmy parę różnych kluczy x, y. Niech x 0 'F y 0 . (Podobne rozumowanie
można przeprowadzić, jeśli x i y różnią się na dowolnej innej pozycji). Dla
każdego ustalonego ciągu a 1 , a2 , ••• , a, istnieje dokładnie jedna możliwa war-
tość a 0 , dla której zachodzi równość h(x) = h(y); takie a 0 jest rozwiązaniem
równania modularnego
Aby się o tym przekonać, należy zauważyć, że m jest liczbą pierwszą; liczba
x 0 -y 0 ma więc element odwrotny modulo m, czyli istnieje dokładnie jedno
rozwiązanie module m (patrz podrozdz. 33,4). Stąd wynika, że każda para
różnych kluczy x i y koliduje dla dokładnie m' wartości a, ponieważ dokładnie
jedna kolizja przypada na każdy możliwy ciąg (a 1 , a2 , ... , a,) (tzn. dla jedynej
wartości a 0 wyznaczonej powyżej). Wszystkich możliwych ciągów a jest nt+ 1 ,
klucze x i y wchodzą więc w kolizję z prawdopodobieństwem dokładnie
m'jm•+ 1 = 1/m. Stąd wynika, że rodzina Jll' jest uniwersalna.
ZADANlA
•
12.3-1. Przeszukujemy listę o długości n, w której każdy element zawiera klucz
k oraz odpowiadającą mu wartość funkcji haszującej h(k). Kluczami są
długie ciągi znaków. Jak możemy wykorzystać wartości funkcji haszującej
do wyszukiwania na liście elementu o danym kluczu?
12.3-2. W tablicy z haszowaniem o długości m przechowujemy napisy; napis
(ciąg znaków) o długości r traktujemy jako liczbę zapisaną w systemie
o podstawie 128; stosujemy haszowanie metodą modularną. Liczbę
m można łatwo reprezentować za pomocą 32-bitowego słowa maszyno-
wego, ale ciąg r znaków, traktowany jako liczba zapisana w układzie
o podstawie 128, jest zwykle tak duiy, że zajmuje wiele słów. Jak obliczać
wartości modularnej funkcji haszującej na długich napisach, używając tyl-
ko stałej dodatkowej pamięci?
12.3-3. Rozważmy modularną funkcję haszującą h(k) = kmodm dla
m = 29 - l oraz kluczy k będących ciągami znaków, interpretowanymi
jako liczby zapisane w układzie o podstawie 29 • Wykaż, że jeśli napis
x można uzyskać z napisu y przez permutację jego znaków, to h(x) = h(y).
Podaj przykład zastosowania, w którym ta własność dyskwalifikuje h jako
funkcję haszującą.
270
12.4. ADRESOWANIE OTWARTE
12.4. Adresowanieotwarte
W metodzie adresowania otwartego wszystkie elementy są przechowywane
wprost w tablicy. Każda pozycja w tablicy zawiera więc albo element zbioru
dynamicznego, albo stałą NIL. Wyszukiwanie elementu polega na systematycz-
nym sprawdzaniu pozycji w tablicy, aż zostanie znaleziony szukany element albo
wiadomo już, że na pewno nie ma go w tablicy. Nie ma żadnych dodatkowych
list i żadne elementy nie są przechowywane poza tablicą, jak w metodzie łańcu
chowej. Dlatego, jeśli używamy adresowania otwartego, to współczynnik zapeł
nienia tx nie może nigdy przekroczyć 1, aby nie nastąpiło „przepełnienie" tablicy.
Moglibyśmy oczywiście przechowywać listy, takie jak w metodzie łańcu
chowej, wewnątrz tablicy, korzystając z nie zajętych pozycji (patrz zad. 12.2-5),
ale adresowanie otwarte umożliwia całkowite wyeliminowanie konieczności
używania wskaźników. Zamiast śledzić wskaźniki, obliczamy ciąg pozycji, któ-
re należy sprawdzić. Dodatkowo, dzięki zaoszczędzeniu pamięci można umieś
cić w tablicy więcej elementów przy takiej samej zajętości pamięci, co daje
w efekcie (przynajmniej teoretycznie) mniej kolizji i szybszy dostęp.
Wstawianie do tablicy z wykorzystaniem adresowania otwartego wymaga
znalezienia w niej wolnej pozycji. Kolejność, w jakiej sprawdzamy pozycje
w tablicy, powinna zależeć od wstawianego klucza, ponieważ przy każdym usta-
lonym porządku czas wyszukiwania wolnej pozycji jest 0(n). W tym celu zmo-
dyfikujemy funkcję haszującą, która będzie teraz dwuargumentowa; drugi ar-
gument będzie oznaczał numer (począwszy od O) w ciągu pozycji rozpatrywa-
nych w czasie wyszukiwania wolnego miejsca dla klucza będącego pierwszym
argumentem. Będziemy zatem używać funkcji
o tej własności, że dla każdego klucza k ciąg pozycji (ciąg kontrolny klucza k)
jest permutacją ciągu (O, I, ... , m - I). Wynika stąd, że jeśli tablica będzie
prawie zupełnie wypełniona, to przy próbie wstawienia nowego klucza zostaną
271
ROZDZIAŁ 12. TABLICE Z HASZOWANIEM
HASH-lNSERT(T, k)
l i+- o
2 repeat j +- h(k, i)
3 if T[j] - NIL
4 then T[j] ~ k
5 returoj
6 elsei+-i+l
7 untili=m
8 error „przepełnienie tablicy z haszowaniem"
HASH-SEARCH(T, k)
1 i+- O
2 repeatj ~h(k, i)
3 uT[j] - k
4 theo return j
5 i+-i+l
6 until T[j] = NIL lub i = m
7 return NIL
272
12.4. ADRESOWANIE OTWARTE
Adresowanie liniowe
Dla zwykłej funkcji haszującej h': U-+ {O, 1, ... , m - 1} w metodzie adresowa-
nia liniowego stosuje się funkcję
dla i= O, I, ... , m - l. Dla danego klucza k jego ciąg kontrolny zaczyna się od
pozycji T[h'(k)]. Następną pozycją w tym ciągu jest T[h'(k) + I] i tak dalej, aż
do pozytji T[m - I]. Dalej występują pozytje T[O], T[I], ... , T[h'(k) - I]. Pierw-
sza pozycja w ciągu wyznacza cały ciąg jednoznacznie, w metodzie adresowania
liniowego generowanych jest więc tylko m różnych ciągów kontrolnych.
Adresowanie liniowe jest bardzo łatwe do realizacji, ale ma poważną wadę
polegającą na tendencji do grupowania się (ang. primary c/ustering) zajętych
pozycji. Długie spójne ciągi zajętych pozycji szybko się powiększają, co znacz-
nie spowalnia operację wyszukiwania. Jeśli na przykład w tablicy znajduje się
n= m/2 kluczy, które zajmują tylko pozycje o parzystych numerach, a pozycje
273
ROZDZIAŁ 12. TABLICE Z HASZOWANIEM
Adresowaniekwadratowe
W adresowaniu kwadratowym stosuje się funkcje haszujące postaci
gdzie (podobnie jak w adresowaniu liniowym) h' jest dodatkową funkcją ha-
szującą, c 1 i Cz#- O są pewnymi stałymi, a i= O, 1, ... , m - 1. Pierwszą od-
wiedzoną pozycją jest T[h'(k)]; kolejno rozpatrywane pozycje są oddalone od
początkowej o wielkość zależną od kwadratu numeru pozycji i w ciągu kon-
trolnym. Ta metoda jest lepsza od adresowania liniowego, ale aby była po-
prawna, należy narzucić pewne warunki na liczby c 1 , Cz im. Jeden ze sposo-
bów właściwego doboru tych parametrów jest przedstawiony w problemie 12-
-4. Jeśli jednak dwa klucze mają takie same początkowe pozycje, to i cale ich
ciągi kontrolne są równe, ponieważ z h(k 1 , O)= h(kz,O) wynika, że h(k 1 ,
i) = h(kz, i). Prowadzi to do mniej groźnego zjawiska grupowania, określa
nego jako grupowanie wtórne (ang. secondary c/ustering). Podobnie jak w ad-
resowaniu liniowym, początkowa pozycja określa jednoznacznie cały ciąg kon-
trolny, korzysta się więc tylko z m różnych ciągów kontrolnych.
Haszowanie dwukrotne
Haszowanie dwukrotne jest jedną z najlepszych praktycznych metod rozwiązy
wania kolizji za pomocą adresowania otwartego, ponieważ powstające permu-
tacje mają wiele cech permutacji losowych. W basz-0waniu dwukrotnym funkcja
haszująca ma postać
?7A
12.4. ADRESOWANIEOTWARTE
h,(k) -kmodm
h,(k) - I + (kmodm')
gdzie m' jest nieco mniejsze niż m (np. m - 1 lub m - 2). Jeśli na przykład
k = 123 456 im= 701, to h 1 (k) = 80 oraz h 2 (k) = 257, to jako pierwszą pozy-
cję w ciągu kontrolnym wybieramy 80, a następne pozycje co 257 (mod.ulam).
Haszowanie dwukrotne ma tę przewagę nad adresowaniem liniowym
i kwadratowym, że dopuszcza użycie @(m2 ) istotnie różnych ciągów kontrol-
nych (a nie tylko @(m)), ponieważ każda para (h 1 (k), h2 (k)) wyznacza inny ciąg
kontrolny, a dla różnych kluczy wartości h 1 (k) i h2 (k) zmieniają się niezależnie.
275
ROZDZIAŁ 12. TABLICE Z HASZOWANIEM
TwIERDZENIE 12.S.
Jeśli współczynnik zapełnieniatablicy z haszowaniem wynosi a: = n/m < 1, to
oczekiwana liczba porównań kluczy w czasie wyszukiwania elementu, który
nie występuje w tablicy, jest nie większa niż 1/(l - a), o ile jest spełnione
założenie o równomiernym haszowaniu.
DOWÓD
W czasie wyszukiwania elementu, które nie zakończy się sukcesem, każdy
klucz jest porównywany z kluczami znajdującymi się na pozycjach z ciągu
kontrolnego; wyszukiwanie zostaje przerwane po napotkaniu pierwszej wolnej
pozycji w ciągu kontrolnym szukanego klucza. z.definiujmy
•
1+ I
i=O
ip, (12.6)
Niech
• •
I ip, - I ą,
i"O i=l
n
m
Przy założeniu
równomiernego haszowania w drugim porównaniu fjeśli jest
jeszcze w ogóle konieczne) odwołujemy się do jednej z m - I pozostałych po~
zycji, z których n - 1 jest zajętych. Drugie porównanie wykonujemy tylko
wtedy, kiedy pierwsza pozycja była zajęta, więc
.; (;)'
= r:t,j
dla i= 1, 2, ... , n, ponieważ (n - J)/(m - J) ~ n/m, jeśli n~ m orazj ~O.Po
n porównaniach wszystkich n zajętych pozycji zostało już odwiedzonych i nie
będą one więcej brane pod uwagę, więc ą; = O dla i> n.
277
ROZDZIAŁ 12. TABLICE Z HASZOWANIEM
1+
"
z:ip; - 1
.
+ z: ą;
Ja,Q 1"'1
1
I-•
WNIOSEK12.6.
Wstawianie do tablicy z haszowaniem przez adresowanie otwarte, jeżeli współ
czynnik zapełnienia tablicy wynosi a:, wymaga średnio co najwyżej 1/(1 - a:)
porównań, o ile spełniony jest warunek równomiernego haszowania.
DOWÓD
Element może zostać wstawiony do tablicy tylko wtedy, kiedy jest w niej jesz-
cze miejsce, tj. jeśli (X< 1. Wstawienie elementu wymaga malezienia w tablicy
wolnej pozycji, na której będzie go można zapisać. Aby znaleźć takie wolne
miejsce, wystarczy wykonać procedurę wyszukiwania wstawianego elementu.
Stąd oczekiwana liczba potrzebnych porównań nie przekracza 1/(1 - a:).
•
Teraz zajmiemy się obliczeniem oczekiwanej liczby porównań wykonywa-
nych przez procedurę wyszukiwania w przypadku, gdy szukany element znaj-
duje się w tablicy.
278
12.4. ADRESOWANIE OTWARTE
TwJERDZENIE 12.7.
Załóżmy, że element znajduje się w tablicy z haszowaniem przez adresowanie
otwarte, a współczynnik zapełnienia tablicy o:spełnia nierówność o:< 1. Wtedy
oczekiwana liczba porównań wykonywanych w czasie wyszukiwania tego ele-
mentu jest nie większa niż
I 1 1
-ln~-
o: 1-o:
+ o:
jeżeli jest spełniony warunek równomiernego haszowania oraz każdy klucz
znajdujący się w tablicy jest tym wyszukiwanym z jednakowym prawdopodo-
bieństwem.
DOWÓD
Wyszukanie elementu k wymaga wykonania dokładnie takiego samego ciągu
porównań, jak w czasie jego wstawiania. Z wniosku 12.6 wynika, że jeśli k był
(i+ 1)-szym elementem wstawionym do tablicy, to oczekiwana liczba porów-
nań potrzebnych do jego odszukania nie jest większa niż 1/(1 - i/m) =
= m/(m - i). Uśredniając po wszystkich n kluczach znajdujących się w tablicy,
otrzymujemy oczekiwaną liczbę porównań;
,
gdzie H, = L 1/j jest i-tą liczbą hannoniczną (patrz równość (3.5)). Korzysta-
i"1
jąc z zale7.ności In i~ H; ~ In i+ 1 (patrz nierówności (3.11) oraz (3.12)), otrzy-
mujemy następujące oszacowanie oczekiwanej liczby porównań potrzebnych do
znalezienia elementu w tablicy z haszowaniem przez adresowanie otwarte
1 1
···· (H. - II.-.) ,; (In m +1- ln(m - n))
" "1 m 1
·In--+
o: m-n o:
I I I
--In- - +-
o: 1-o: o:
279
ROZDZIAŁ 12. TABLICE Z HASZOWANIEM
ZADANIA
H =Inn+,,,+-----
' , '
2n (12.8)
280
PROBLEMY
Problemy
12-1. Szacowanie liczby porównań wykonywanych przez operacje na tablicach
z haszowaniem
W tablicy z haszowaniem o długości m znajduje się n elementów, gdzie
n~ m/2. Do rozwiązywania kolizji używamy adresowania otwartego.
(a) Wykaż, że jeśli przyjmiemy założenie o równomiernym haszowaniu, to dla
i= 1, 2, ... , n prawdopodobieństwo zdarzenia, że wstawienie i-tego elemen-
tu wymaga więcej niż k porównań, jest nie większe niż 2-t_
(b) Wykaż, że dla i= 1, 2, ... , n prawdopodobieństwo zdarzenia, że operacja
wstawienia i-tego elementu wymaga ponad 2 lg n porównań, wynosi co
najwyżej 1/n2 •
12-4. Adresowaniekwadratowe
Załóżmy, że szukamy klucza kw tablicy z haszowaniem o pozycjach O, I, ... ,
m - l, oraz załóżmy, że mamy funkcję haszującą h, która odwzorowuje uni-
wersum kluczy w zbiór {O, 1, ..., m - 1}. Wyszukiwanie przebiega w następują
cych krokach.
282
UWAGI DO ROZDZIAŁU
Uwagido rozdziału
Książki K.nutha [123) i Gonneta [90] są znakomitym źródłem przykładów ana-
lizy tablic z haszowaniem. Wynalezienie tablic z haszowaniem Knuth przypisu-
je H. P. Luhnowi (1953), który stosował metodę łańcuchową do rozwiązywa
nia kolizji. Mniej więcej w tym samym czasie G. M. Amdahl zaproponował
metodę adresowania otwartego.
Rozdział 13
Drzewaposzukiwań
binarnych
Drzewa poszukiwań binarnych, w skrócie BST (od ang. binary search trees), są
strukturami, na których można wykonywać różne operacje właściwe dla zbio-
rów dynamicznych, takie jak SEARCH,MINIMUM,MAXIMUM,PREDECESSOR,
SUCCESSOR,INSERToraz DELETE. Drzewo poszukiwań może więc być użyte
:zarówno jako słownik, jak i jako kolejka priorytetowa.
Podstawowe operacje na drzewach poszukiwań binarnych wymagają czasu
proporcjonalnego do wysokości drzewa. W pełnym drzewie binarnym o n węz
łach takie operacje działają w najgorszym przypadku w czasie 0(lgn). Jeśli
jednak drzewo składa się z jednej gałęzi o długości n, to te same operacje
wymagają w pesymistycznym przypadku czasu E>(n). W podrozdziale 13.4
przekonamy się, że wysokość losowo zbudowanego drzewa poszukiwań binar-
nych wynosi O(lgn), podstawowe operacje na zbiorach dynamicznych działają
więc w czasie 0(lgn).
W praktyce nie mo7.emy zawsze :.r.agwarantować, że drzewa poszukiwań
binarnych są konstruowane losowo, ale istnieją odmiany drzew BST, dla któ-
rych pesymistyczny czas wykonywania podstawowych operacji jest mały.
W rozdziale 14 omówimy jeden z takich sposobów modyfikacji drzew BST,
tzw. drzewa czerwono-czarne, których wysokość wynosi O(lgn). W rozdziale
19 zaś poznamy B-drzewa, które znakomicie nadają się do przechowywania
danych na zewnętrznych nośnikach o dostępie swobodnym (dyskach).
Najpierw przedstawimy podstawowe własności drzew BST. W następnych
podrozdziałach opiszemy: w jaki sposób należy przechodzić drzewo BST, aby
wypisać znajdujące się w nim wartości w kolejności zgodnej z porządkiem
określonym przez klucze, jak wyszukiwać wartości w drzewie, jak znajdować
najmniejszy lub największy element, jak wyznaczać bezpośredni poprzednik
lub następnik danego elementu oraz jak wstawiać i usuwać elementy z drzewa
BST. Elementarne własności drzew podaliśmy w rozdz. 5.
284
13.1, CO TO JEST DRZEWO POSZUKIWAŃ BINARNYCH?
5 2
3 7 3
'
2 5 8 7
' 8
(a) (b)
Rys. 13.1. Drzewo poszukiwań binarnych. Dla kai'.dego węzła x klucze majdując(l się w jego lewym
poddrzewie są nie większe niż key[xJ, a klucze w jego prawym poddrzewie są nie mniejsze niż
key[x]. Ten sam zbiór wartości może być przedstawiony za pomocą wielu różnych drzew BST.
Pesymistycmy czas działania większości operacji na drzewach BST jest proporcjonalny do wyso-
kości drzewa. (a) Drzewo BST o wysokości 2 składające się z 6 węzłów. (b) Nieco mniej efektywne
drzewo BST zawierające te same klucze; jego wysokość wynosi 4
285
ROZDZIAŁ 13. DRZEWA POSZUKIWAl'il BINARNYCH
INORDER-TREE-WALK(x)
I ifx#-NIL
2 then INORDER-TREE-WALK(/e/t[x])
3 wypisz key[x]
4 INORDER-TREE-WALK(right[x])
ZADANIA
286
13.2. WYSZUKIWANIE W DRZEWIE POSZUKIWAN BINARNYCH
Wyszukiwanie
Do wyszukiwania w drzewie BST węzła, który zawiera dany klucz, można użyć
następującej procedury. Mając dany wskaźnik do korzenia drzewa oraz klucz
k, procedura TREE-SEARCH wyznacza wskaźnik do węzła zawierającego klucz
k, jeżeli taki węzeł istnieje. W przeciwnym razie daje w wyniku wartość NIL.
TREE-SEARCH(x, k)
1 if x = NIL lub k = key[x]
2 then return x
3 if k < key[x]
4 then return TREE-SEARCH(lefi[x], k)
5 else return TREE-SEARCH(righl[x],k)
ITERATIVE-TREE-SEARCH(x,k)
1 while x ::/=-NIL i k ::/=-key{xJ
2 do if k < key[x]
3 then x ...._feft[x]
4 else x ...._right[x]
5 return x
287
ROZDZIAŁ 13. DRZEWA POSZUKIWAŃ BINARNYCH
15
6
Il\
3 1" •
11•
~
' -•lót·
...
2 4 13
•
Rys. 13.2. Wyszukiwanie w drzewie BST. Wyszukanie klucza 13 wymaga przejścia po ścieżce
15-+ 6-> 7-> 13. Najmniejszym kluczem w drzewie jest 2. Aby do niego dotrzeć, na1eży podą.ż.ać
za.wsze wedhig wskażników /eft, począwszy od korzenia. Największy klucz (tutaj 20) w drzewie
mozna mależc, podążając od korzenia według wskaźników right. Następnikiem węzła o kluczu 15
jest węzeł o kluczu 17, ponieważ jest to najmniejszy klucz w prawym poddrzewie węzła 15. Węzeł
o kluczu 13 nie ma prawego poddrzewa, jego następnikiem jest więc najniższy przodek, którego
lewy syn jest również przodkiem 13. Następnikiem węzła o kluczu 13 jest więc węzeł o kluczu 15
Minimum i maksimum
Element w drzewie BST o najmniejszym kluczu można łatwo odszukać, podą
żając według wskaźników /eft, począwszy od korzenia, aż napotkamy NIL
(patrz rys. 13.2). Następująca procedura wymacza wskaźnik do minimalnego
elementu poddrzewa o korzeniu w węźle x.
TREE-MINIMUM(x)
I while left[x] ,' NIL
2 do x +-- left[x]
3 return x
288
13.2. WYSZUKIWANIE W DRZEWIE POSZUKIWAŃ BINARNYCH
TREE-MAXIMUM(x)
1 while right[x] '# NIL
2 do x +- right[x]
3 return X
Następniki i poprzedniki
Często zachodzi potrzeba wyznaczenia następnik.a danego węzła w drzewie
BST, tj. następnego węzła odwiedzanego w czasie przechodzenia drzewa w po-
rządku inorder. Jeśli wszystkie klucze są różne, to następnikiem węzła x jest
węzeł o najmniejszym kluczu większym niż key[x]. Struktura drzewa BST umo-
żliwia wyznaczenie następnika węzła bez konieczności wykonywania żadnych
porównań kluczy. Następująca procedura wyznacza następnik danego węzła x,
nie wykonując przy tym żadnych porównań kluczy. Jeśli x ma największy
klucz w drzewie, to zostaje wyznaczona wartość NIL.
TREE-SUCCESSOR(x)
1 if right[x] '# NIL
2 then return 1'REE-MINIMUM(right[x])
3 y-p[x]
4 whiley ;< NIL i X - right[y]
5 dox+-y
6 y-p[y]
7 returny
289
ROZDZIAŁ 13. DRZEWA POSZUKIWAf.ł BINARNYCH
TwIERDZENIE 13.1.
Następujące operacje na zbiorach dynamicznych: SEARCH, MIN1MUM, MAXI~
MUM, SUCCESSORoraz PREDECESSORsą wykonywane na drzewie binarnym
o wysokości h w czasie O(h).
ZADANIA
•
13.2-1. Przyjmijmy, że w drzewie BST znajdują się liczby od 1 do 1000 i chce-
my wyszukać liczbę 363. Które z poniższych ciągów węzłów nie mogą
zostać sprawdzone w procedurze SEARCH7
290
13.3. OPERACJE WSTAWIANIA I USUWANIA
Wstawianie
Nową wartość v można wstawić do drzewa poszukiwań binarnych T za pomo-
cą procedury TREE-INSERT. Do procedury przekazujemy jako argument węzeł
z, w którym key[z] = v, left[z] = NIL oraz right[z] = NIL. W wyniku wykonania
procedury drzewo T oraz niektóre pola z są modyfikowane w sposób, który
odpowiada wstawieniu z we właściwe miejsce w drzewie.
TREE-INSERT(T, z)
1 y+-NIL
2 x+- root[TJ
3 while X cf. NIL
4 doy+-x
5 if key[z] < key[x]
6 then x +- left[x]
7 else x +- right[x]
8 p[z]-y
9 ify=NIL
IO then root[TJ +- z
11 else if key[z] < key[y]
12 then left[y] +- z
13 else right[y] +- z
291
ROZDZIAŁ 13. DRZEWA POSZUKIWAŃ BINARNYCH
12
18
15
17
Rys, 13.3. Wstawienie węzła z kluczem 13 do drzewa poszukiwań binarnych. Jasnoszare węzły wcho-
dzą w skład ścieżki od korzenia do miejsca, w którym węzeł zostaje wstawiony. Przerywaną linią.
jest oznaczony wskaźnik, który zostaje utworzony w wyniku dodania elementu do drzewa
Usuwanie
Argumentem procedury służącej do usuwania danego węzła z z drzewa po-
szukiwań binarnych jest wskaźnik do z. W procedurze tej są rozpatrywane trzy
przypadki przedstawione na rys. 13.4. Jeśli z nie ma synów, to w jego ojcu p[z]
zastępujemy wskaźnik do z wartością NIL. Jeśli węzeł ma tylko jednego syna,
to „wycinamy" z przez ustalenie wskaźnika między jego ojcem a jedynym
synem. Wreszcie, jeśli węzeł ma dwóch synów, to wycinamy następnik y węzła
z, o którym wiadomo, że nie ma lewego syna (patrz zad. 13.3-4), oraz za-
stępujemy zawartość z zawartością y.
W treści procedury TREE-DELETE powyższe trzy przypadki są realizowane
nieco inaczej.
TREE-DELETE(T, z)
1 if left[z] - NIL lub right[z] - NIL
2 tbeny+-z
3 else y +-TREE-SUCCESSOR(z)
4 if /eft[y] # NIL
5 then x +- left[y]
6 else x +- right[y]
7 ifx-#NIL
8 tbenp[x]-p[y]
9 if p[y] - NJL
10 tben root[T]+- x
11 else if y -left[p[y]J
12 tben left[p[y]] ~ x
292
13.3. OPERACJE WSTAWIANIA I USUWANIA
J5:
' ' •'
-'16
•,,_J 5 16,
'_, 'i(J.
___ 12
,'
20
)S; ·23 J8',
..6
- /
'
,,
--·
"
15,
' '
20
''
3
'--·
' '
t!ł\
'
'· .i
23\
,, 6 ', : 16:
l1l 20, ,,' ·-- ' i --··20
• ,yi : 12) '
,'
' ' 12'
"
l()\ ' 13',
'
7
,, ,I ' ,, ,,'
Rys.. 13.4. Usunięcie węzła z z drzewa prn;zukiwań binarnych. W ka:alym przypadku faktycznie usu-
rrięly węzeł jest jasnoszary.(•) Jeśli z nie ma synów, to zostaje po prostu usunięty. (b) Jeśli z ma
tylko jednego syna, to wycinamy z. (c) Jeśli z ma dwóch synów, to wycinamy y, który jest następ
nikiem z i ma co najwyżej jednego syna, po czym zastępujemy zawartość z iawartością y
13 else right[pfy]]+---x
14 if y -=fez
15 thcn key[z) - key(y)
16 I> Jeśli y ma inne pola, to je także należy skopiować.
17 returny
293
ROZDZIAŁ 13. DRZEWA POSZUKIWAN BINARNYCH
Tw!ERDZENIE 13.2.
Operacje INSERT i DELETE działają na drzewie BST w czasie O(h), gdzie h jest
wysokością drzewa.
ZADANIA
•
13.3-1. Napisz rekurencyjną wersję procedury TREE-lNSERT.
13.3-2. Przyjmijmy, że tworzymy drzewo BST, wstawiając po kolei różne pa-
rami wartości. Wykaż, że liczba węzłów rozpatrywanych przy wyszukiwa-
niu wartości w drzewie jest o jeden większa niż liczba węzłów cxlwiedzo-
nych podczas wstawiania tej wartości do drzewa.
13.3-3. Dany zbiór n liczb można posortować, budując z nich najpierw drzewo
BST (wywołując procedurę TREE-INSERT po kolei dla każdej liczby), a na-
stępnie wypisując je według porządku inorder w drzewie. Jaki jest pesymis-
tyczny czas działania tego algorytmu sortowania? Jaki jest najmniejszy
możliwy czas jego działania?
13.3-4. Wykaż, że jeśli w drzewie BST węzeł ma dwóch synów, to jego następ
nik nie ma lewego syna, a jego poprzednik nie ma prawego syna.
13.3-S. Załóżmy, że w innej strukturze danych znajduje się wskaźnik do węzła
y w drzewie BST. Rozważmy sytuację, w której z - poprzednik węzła
y- został usunięty z drzewa przez procedurę TREE-DELETE. Jaki problem
może wyniknąć w takiej sytuacji? Jak poprawić procedurę TREE-DELETE,
aby rozwiązać ten problem?
13.3-6. Czy operacja usuwania jest „przemienna" w takim sensie, że usuwając
węzły x oraz y z drzewa BS'f, otrzymujemy takie samo drzewo niezależnie
od kolejności, w jakiej je usuwamy? Udowodnij, że tak: jest lub podaj
kontrprzykład.
13.3-7, Jeśli węzeł z w procedurze TREE-DELETB ma dwóch synów, to może
my usunąć jego poprzednik zamiast jego następnik.a. Niektórzy przekonu-
ją, że „sprawiedliwa" strategia polegająca na zrównaniu priorytetu po-
przednika i następnika pozwala uzyskać w praktyce lepsze efekty. Jak
można zmodyfikować procedurę TREE-DELETE, aby realizowała ona tego
typu „sprawiedliwą" strategię?
294
* 13.4. LOSOWO SKONSTRUOWANE DRZEWA POSZUKIWAŃ BINARNYCH
~-----------------------------
* 13.4. Losowoskonstruowanedrzewaposzukiwań binarnych
Wykazaliśmy, że wszystkie podstawowe operacje na drzewach BST są wykony~
wane w czasie O(h), gdzie h jest wysokością drzewa. Wysokość drzewa BST
ulega jednak ciągłym m:iianom podczas wstawiania lub usuwania elementów.
Aby stwierdzić coś w praktyce o szybkości wykonywania operacji na drzewach
BST, rozsądnie jest przyjąć pewne założenia statystyczne, dotyczące rozkładu
kluczy w ciągu operacji wstawiania i usuwania.
Niestety niewiele wiadomo o średniej wysokości drzewa BST, jeśli powstaje
ono w wyniku ciągu operacji wstawiania i usuwania elementów. Jeśli jednak
drzewo powstaje w wyniku wykonania samych tylko operacji wstawiania, to
potrafimy przeprowadzić odpowiednią analizę. Niech losowo skonstruowane
drzewo BST o n kluczach będzie drzewem powstającym przez wykonanie ciągu
operacji wstawiania kluczy w losowej kolejności do początkowo pustego drzewa.
Zakładamy przy tym, że każda z n! permutacji kluczy jest jednakowo prawdopo-
dobna. (Zadanie 13.4-2 polega na wykazaniu, że jeśli założymy, iż każde drzewo
poszukiwań binarnych o n kluczach jest jednakowo prawdopodobne, to uzyska-
my pojęcie istotnie różne od losowo skonstruowanego drzewa BST). W tym
podrozdziale będziemy chcieli wykazać, że oczekiwana wysokość losowo skon-
struowanego drzewa BST, do którego należy n kluczy, wynosi O(lgn).
Na początek zajmiemy się zbadaniem struktury drzew BST skonstruowa-
nych za pomocą samych tylko operacji wstawiania.
LEMAT13.3.
Jeśli T jest drzewem powstałym w wyniku wstawienia n różnych kluczy k 1,
k 2 , ••• , k~ (w takiej właśnie kolejności) do początkowo pustego drzewa po-
szukiwań binarnych, to k 1 jest przodkiem ki w T, dla 1 ~ i< j ,s;;n, wtedy
i tylko wtedy, gdy
lub
DOWÓD
=- Niech ki będzie przodkiem kr Rozważmy drzewo T; będące wynikiem
wstawienia elementów k 1 , k 2 , ..• , k;. Ścieżka w T; od korzenia do węzła ki
jest taka sama jak ścieżka od korzenia do k 1 w drzewie T. Dlatego też, jeśli
wstawiamy kJ do drzewa T1, to zostanie on lewym albo prawym synem k;.
W rezultacie (patrz. zad. 13.2-6) k;jest albo najmniejszym kluczem spośród
k 1, k 2 , ••• , k 1 większym od ki, albo największym kluczem spośród k 1 , k 2 , ..• ,
k 1 mniejszym niż kJ.
295
ROZDZIAŁ 13. DRZEWA POSZUKIWAŃ BINARNYCH
WNIOSEK13.4.
Niech T będzie drzewem powstałym przez wstawienie n parami różnych kluczy
k 1 , k 2 , ••• , kn (w takiej właśnie kolejności) do początkowo pustego drzewa
poszukiwań binarnych. Dla danego klucza ki, gdzie 1 ::!,,j::;,,n, określmy
oraz
L; = {k 1: I ~ i <j oraz k 1 < k 1 < ki dla każdego/< i takiego, że k 1 > k 1}
•
Na rysunku 13.5 są pokazane zbiory G1 i Li' Zbiór G1 zawiera wszystkie
klucze k 1 wstawione przed k 1, takie że k 1 jest najmniejszym kluczem spośród
k 1 , k 2, ... , k 1 większym od k 1• (Zbiór Li jest symetryczny do G1). Aby lepiej
zrozumieć konstrukcję zbioru G , omówimy teraz sposób wyznaczania jego
1
elementów, Z kluczy k 1 , k 2 , ••• , k 1 _ 1 rozważamy tylko te, które są większe
od k1. Na rysunku klucze te zostały oznaczone jak.o GJ. Rozpatrując po
kolei każdy z kluczy, pamiętamy cały czas ich minimum. Zbiór G1 składa
się z tych elementów, które w chwili ich rozpatrywania są mniejsz.e od do-
tychczasowego minimum.
Dla celów analizy dokonamy pewnego uproszczenia. Załóżmy, że po kolei
wstawiamy do zbioru dynamicznego n parami różnych liczb. Ile razy, średnio,
jest aktualizowane dotychczasowe minimum, jeśli przyjmiemy, że każda per-
mutacja wstawianych liczb jest jednak.owo prawdopodobna? Aby odpowie-
dzieć na to pytanie, załóżmy, że i-tą wstawianą liczbą jest k;, dla i= 1, 2,
..., n. Prawdopodobieństwo, że k1 jest najmniejszą z i początkowych liczb jest
296
* 13.4. LOSOWO SKONSTRUOWANE DRZEWA POSZUK!WAN BINARNYCH
4 29
3 7 10 26
k.; 17
'
18
(a)
Klw,re 21 9 4 25 7 12 3 10 19 29 17 6 26 18
G'; 21 25 19 29
G.; 2( (9
L:; 9 4 7 12 3 IO
L.; 9 12
(b)
Rys. 13.5, Zbiory G1 oraz L 1, do których należą klucze na ścieżce od korzenia drzewa poszukiwań
binarnych do klucza k 1 = l 1. (a) Węzły o kluczach w G1 są czarne, a węzły o kluczach ze zbioru L
1
białe. Pozostałe węzły są szare. Ścieżka z korzenia drzewa do węzła o kluczu k jest pogrubiona.
1
Klucze na lewo od przerywanej linii są mniejsze niż kJ>a klucze położone na prawo od niej są
większe. Drzewo zostało skonstruowane za pomocą ciągu operacji wstawiania kluczy w kolejności
podanej w górnej części. (b) Zbiór G~ = {21, 25, 19, 29} składa się z elementów wstawionych przed
17, większych od 17. Zbiór G1 = {21, 19} składa się z elementów, które są mniejsze niż dotych·
czasowe minimum elementów z Gj. Tak więc klucz 21 należy do G1, ponieważ jest pierwszy w ko-
lejności. Klucz 25 nie należy do G1, ponieważ jest większy niż dotychczasowe minimum 21. Klucz
19 należy do G1, ponieważ jest mniejszy niż dotychczasowe minimum 21. Klucz 29 nie należy do
G1, bo jest większy od dotychczasowego minimum 19. Zbiory LJ oraz L1 są względem siebie
symetryczne
~ I~ H
L, . "
i= 1 I
297
ROZDZIAŁ 13. DRZEWA POSZUKIWAŃ BINARNYCH
gdzie H" = ln n+ 0(1) jest n-tą liczbą harmoniczną (patrz równanie (3.5) oraz
problem 6.2).
Wartość oczekiwana liczby zmian wartości minimalnej wynosi więc
w przybliżeniu 1n n, a z następującego lematu wynika, że prawdopodobień
stwo, iż ta liczba jest istotnie większa, jest bardzo małe.
LEMAT13.5.
Niech k 1 , k 2 , ... ,k 11 będzie losową permutacją n parami różnych liczb oraz
niech IS1będzie zmienną losową równą liczności zbioru
Wtedy Pr{ISI ;;i:,(ft+ l)H"} ~ 1/n2 , gdzie H" jest n-tą liczbą harmoniczną,
ap „
4,32 spełnia równaoie (!np - I)P - 2.
DOWÓD
Liczność zbioru S można traktować jak.o liczbę sukcesów w schemacie Ber-
noulliego o długości n, jeśli sukces w i-tej próbie oznacza, że k1jest mniejsze od
k 1 , k 2 , ... , k1_ 1 . Sukces w i-tej próbie występuje z prawdopodobieństwem 1/i.
Próby są niezależne, zatem prawdopodobieństwo, że k 1 jest najmniejsze spo-
śród k 1 , k2 , ••. , k 1, jest niezależne od względnego porządku elementów k 1 , k 2 ,
... , k;-1·
Do oszacowania prawdopodobieństwa, że ]SI~ (ft+ l)H 11 użyjemy twier-
dzenia 6.6. Wartość oczekiwana ISI wynosi µ = Hn ~ Inn. Paniewa.z P> I,
z twierdzenia 6.6 wnioskujemy więc, że
<; (;;:)'B•
= ,f..1-ln/f)/JH,
~ e-(lnP-1).8lnn
= n-(ln/J-1)/J
= 1/n 2
co wynika z definicji p.
•
Udało się
nam zgromadzić narzędzia, których użyjemy teraz do oszacowa-
nia wysokości losowo zbudowanego drzewa poszukiwań binarnych.
298
* 13.4. LOSOWO SKONSTRUOWANE DRZEWA POSZUKIWAii! BINARNYCH
TwIERDZENIE 13.6.
Średnia wysokość losowo zbudowanego drzewa BST składającego się z n para·
mi różnych kluczy wynosi O(lgn).
DOWÓD
Niech k 1 , k 2 , •.• , k„ będzie losową permutacją n kluczy, a T drzewem BS1
powstałym przez wstawienie kluczy do początkowo pustego drzewa w kolejno·
ści określonej przez tę permutację. Rozważmy najpierw prawdopodobieństwo,
że głębokość d(k 1, 1) danego klucza ki wynosi co najmniej t dla dowolnej
wartości t. Z wniosku 13.4 wynika, że jeśli głębokość d(k , 1) klucza ki wynosi
1
co najmniej t, to liczba elementów w jednym ze zbiorów G1 oraz L jest równa
1
co najmniej t/2. Stąd
Pr{IGJI;,, t/2)
= Pr{]{ki: 1 ~ i <j oraz k 1 > k 1 > k1 dla każdego/< i}I ;;i, t/2}
~ Pr{l{k 1:i~n oraz k 1 > k; dla każdego I< i}J;;;i,t/2}
- Pr{ISI;,, 1/2)
gdzie Sjest określone jak we wzorze (13.1). Rozumowanie przebiega tu na-
stępująco: prawdopodobieństwo nie zmniejszy się, jeśli rozszerzymy zakres
iz i <j do i~ n, ponieważ dodamy wtedy do zbioru więcej elementów. PodobM
nie, prawdopodobieństwo nie zmaleje, jeśli usuniemy warunek, że k 1 > kJ, po-
nieważ zastępujemy tylko permutację potencjalnie mniejszej niż n liczby ele-
mentów (tych k 1, które są większe od kJ) permutacją n elementów.
Rozumując „symetrycznie", możemy wykazać, że
299
ROZDZIAŁ 13. DRZEWA POSZUKlWAril BINARNYCH
Problemy
13-1. Drzewa poszukiwań
binarnych z powtarzającymi się kluczami
Powtarzające się klucze mogą niekorzystnie wpływać na implementację
drzew BST.
(a) Jaki jest asymptotyczny czas działania ciągu n operatji TREE-INSERT,jeśli
do początkowo pustego drzewa BST wstawiamy n elementów o identycz-
nych kluczach?
Proponujemy w następujący sposób ulepszyć procedurę TREE·INSERT: przed
wierszem 5 należy sprawdzać, cr,y key[z] = key{x], a przed wierszem 11, czy
key[z] = key[y]. Jeśli równości zachodzą, to stosujemy jedną z poniższych stra·
tegii. Dla każdej z nich wyznacz asymptotyczny czas potrzebny do wstawienia
300
PROBLEMY
(b) Dla każdego węzła pamiętaj zmienną logiczną b[x] i w zależności od jej
wartości przypisuj zmiennej x wartość left[x] albo right[x]. Wartość zmien-
nej b[x] jest zmieniana na przeciwną (TRUE albo FALSE) za każdym razem,
gdy procedura TREE-INSERT odwiedza węzeł x.
(c) W węźle x jest przechowywana lista elementów o jednakowych kluczach;
z zostaje wstawiony do tej listy.
(d) Przypisz losowo zmiennej x jedną z wartości left[x] albo right[x]. (Opisz
zachowanie w przypadku pesymistycznym oraz podaj nieformalną analizę
zachowania w przypadku średnim).
301
ROZDZIAŁ 13. DRZEWA POSZUKIWAŃ BINARNYCH
o 1
o
1 o
10
011 100
1011
Rys. 13.6. Drzewo pozycyjne z.awierające ciągi bitowe 101l, IO, 011, 100 i O. Klucz każdego węzła
można wyznaczyć jednoznacznie ze ścieżki od korzenia do tego węzła. Nie ma więc potrzeby
zapamiętywania kluczy w węzłach; na rysunku klucze zostały przedstawione tylko dla ilustracji.
Ciemnoszare węzły odpowiadają kluczom, które nie należą do zbioru; w drzewie znajdują się tylko
jako fragmenty ścieżki do innych węzłów
jest w istocie słabszy niż teza twierdzenia 13.6, ale metoda, jakiej użyjemy,
ukazuje zaskakujące podobieństwo konstruowania drzew poszukiwań binar-
nych i działania algorytmu RANDOMIZED-QUICKSORT z pod.rozdz. 8.3.
Przypomnijmy sobie najpierw z ro7.dz. 5, że wewnętrzna długość ścieżki
P(1) drzewa binarnego T jest sumą głębokości wszystkich węzłów x drzewa T;
głębokość węzła x oznaczamy przez d(x, 1).
l l
.I
n=T
d(x, n ~ n P(n
Wystarczy więc teraz wykazać, że wartość oczekiwana P(T) wynosi O(nlgn).
(c) Niech P(n) oznacza średnią wartość wewnętrznej długości ścieżki losowo
zbudowanego drzewa poszukiwań binarnych o n węzłach. Wykaż, że
=~·-------·-----------------
302
PROBLEMY
1 11- l
P(n) - I (P(O + P(n - i - I)+ n - I)
n '""o
2 11-1
P(n) -
n t= 1
I P(k) + ®(n)
•
B(x) - I b.x"
11= 0
I ,---
B(x) - (I - .j I - 4x)
2x
303
ROZDZIAŁ 13. DRZEWA POSZUKIWAŃ BINARNYCH
ro [<'I( )
/(x) - L x - a (x - a)'
l.cO k!
(c) Wykaż, że
b - ---
~ n+ 1
I (2") n
(d) Wykaż, że
4"
b. - .;·· . 312 (I + 0(1/n))
nn
---- ______________________
""""""""""""""""' _
Uwagido rozdziału
Książka Knutha [123] zawiera solidne omówienie zarówno prostych drzew
BST, jak. i wielu ich modyfikacji. Drzewa BST zostały wynalezione niezależnie
przez wiele osób pod koniec lat pięćdziesiątych.
Rozdział 14
Drzewaczerwono-czarne
305
ROZDZIAŁ 14. DRZEWA CZERWONO-CZARNE
._ - _________ __
~---~-----
,~- -
.,,.
2 '-- 2 'li' -
Rys. 14.1. Drr.ewo czerwono-czarne; czarne wę:zly mają na rys. kolor czarny, a czerwone - kolor
szary. Każdy węzeł drzewa czerwono-czarnego jest albo czerwony, albo czarny; każdy liść (NIL)
jest c1..amy;obaj synowie czerwonego węzła są czami; każda prosta ścieżka z węzła do potomnego
liścia zawiera tyle samo czarnych węzłów. Przy ka:Wym niepustym węźle jest zamaczana jego
czarna wysokość; węzły NIL mają czarną wysokośc O
LEMAT14.1.
Drzewo czerwono-czarne o n węzłach wewnętrznych ma wysokość co najwyżej
2lg(n + !).
DOWÓD
Wykażemy najpierw, że każde poddrzewo o korzeniu w dowolnym węźle x ma
co najmniej 2hh(xJ - 1 węzłów wewnętrznych.
Dowodzimy tego faktu przez in-
dukcję względem wysokości węzła x. Jeśli x ma wysokość O, to x musi być
liściem (NIL), a poddr?.ewo o korzeniu w x zawiera w istocie co najmniej
306
14.1. WłASNOSCI DRZEW CZERWONO-CZARNYCH
ZADANIA
307
ROZDZIAŁ 14. DRZEWA CZERWONO-CZARNE
14.2. Operacjerotacji
Operacje TREE-lNSERT i TREE-DELETE działają na drzewach czerwono-czar-
nych o n kluczach w czasie O(lgn). Ponieważ modyfikują one strukturę drze-
wa, mogą więc przestać być spełnione własności z pod.rozdz. 14.1. Aby je przy-
wrócić, należy zmienić kolory pewnych węzłów w drzewie i zmodyfikować
wartości niektórych wskaźników.
y
X y
, LEFr-ROTATE(T,
x)
a • r
Rys. 14.2. Operatja rotatji na drzewie DST. Operacja RioHT-ROTATE(T, x) za.mienia konfigurację
wętlów po lewej stronie na konfigurację po prawej przez zmianę wartości stałej liczby wskaźDików.
Z konfiguracji po prawej stronie można przejść z powrotem do konfiguracji po lewej, stosując
odwrotną operację: 1.EFT-ROTATE(T,y). Węzły x i y mogą był położone gdziekolwiek w drzewie
poszukiwań binarnych. Litery o:,p oraz y symbolizują dowolne poddrzewa. Operacja rotacji za.
chowu je porządek inorder kluczy: klucz.ew poddrzewie o:są mniejsz.e od key[x], który jest mniejszy
niż klucze w poddrzewie p, które są z kolei mniejsze niż key{y),od którego większ.e są klucze
w poddrzewie y
LEFT-ROTATE(T, x)
1 y ~ right[x] t> Inicjuj y.
2 right[x] ~ left[y] I> Zamień lewe poddrzewo y na prawe poddrzewo x.
308
14.2. OPERACJE ROTACJI
2 14 19
LEFf"ROTATE(T,
x) /
I 12 17 22
'i 20
'
3 6 19
2 9 14 22
12 17 20
Rys. 14.3. Przykład. działania procedury LEFT-ROTATE(T,x) na drzewie DST. Liście (węzły NIL) ZO·
stały pominięte. Przejście w porządku inorder dla obu drzew (oryginalnego i zmodyfikowanego
przez operację rotacji) daje ten sam ciąg kluczy
ZADANIA
309
ROZDZIAŁ 14. DRZEWA CZERWONO-CZARNE
węzeł
pokolorujemy na czerwono, to otrzymamy w wyniku drzewo czer-
wono-czarne? A co będzie, gdy pokolorujemy go na czarno?
14.2-2. Napisz procedurę RIGHT-ROTATE.
14.2-3. Wykaż, że operacja rotacji zachowuje porządek inorder kluczy w drze-
wie binarnym.
14.2-4. Niech a, b i c będą dowolnymi węzłami w poddrzewach a:, fi i y, od-
powiednio, lewego drzewa na rys. 14.2. Jak się zmieniają głębokości a,
b oraz c po wykonaniu operacji lewej rotacji węzła x z rysunku?
14.2-5. Wykaż, że każde drzewo o n węzłach można przekształcić w dowolne
inne drzewo o n węzłach za pomocą O(n) operacji rotacji. (Wskazówka:
Wykaż najpierw, że co najwyżej n - I rotacji wystarczy, aby przekształcić
dowolne drzewo w łańcuch).
14.3. Operacjawstawiania
Wstawienie nowego węzła do drzewa czerwono-czarnego o n węzłach można
wykonać w czasie O(lgn}. Najpierw wstawiamy węzeł x do drzewa T za po-
mocą operacji TREE-INSERT(podrozdz.13.3), tak jak.by to było zwykłe drzewo
BST, po czym kolorujemy x na czerwono. Aby zagwarantować zachowywanie
przez operację wstawiania własności czerwono-czarnych, musimy naprawić po-
wstałe drzewo, zmieniając kolory oraz wykonując odpowiednie rotacje. Więk
sza część procedury RB-INSERT dotyczy obsługi różnych przypadków, które
zachodzą w czasie naprawy drzewa zmodyfikowanego przez wstawienie no-
wego węzła.
RB-INSERT(T, x)
1 TREE-INSERT(T, x)
2 color[x] - RED
3 while x 'F root[T] i color[p[x]] = RED
4 do if p[x] - le/l[p[p[x]]]
5 theny - right[p[p[x] ]]
6 if color[y] - RED
7 then color[p[x]] - BLACK r.>Przypadek 1
8 color[y] - BLACK t> Przypadek I
9 co/or[p[p[x]] J - RED t> Przypadek I
IO x- p[p[x]] r.>Przypadek I
Il else if x - right[p[x]]
12 then x- p[x] r.>Przypadek 2
13 LEFT-ROTATE(T, x) r.>Przypadek 2
14 co/or[p[x]] - BLACK r.>Przypadek 3
15 color[p[p[x] J - RED r.>Przypadek 3
~~--------~-- ..,_,,, ________________ _
310
14.3, OPERACJA WSTAWIANIA
311
ROZDZIAŁ 14. DRZEWA CZERWONO-CZARNE
2
(a) IS
s 8 y
X 4 '
'. Przypadek I
t
2
(b) IS
4
Przypadek 2
t
7
(c) X 2 IS
.
4 i Przypadek 3
~·
X 2 11
(d)
4 IS
Rys. 14.4. Działanie procedury RB-INSERT.(a) Węzeł x został właśnie wstawiony. 7.arówno x, jak
i jego ojciec p[x] są pokolorowane na czerwono, nie jest więc spełniony warunek (3). Stryj y węzła
x jest czerwony, zachodzi więc przypadek I z treści procedury. Węzły zostają, przekolorowane,
a wskaznik x zostaje przeniesiony wyżej w drzewie, w wyniku czego otrzymujemy drzewo (b).
Znowu x oraz jego ojciec są czerwone, ale tym razem stryj y węrla x jest czarny. Węz.el x jest
prawym synem swego ojca p[x], zachodzi więc przypadek 2. Wykonana zostaje lewa rotatja,
w wynik.uktórej powstaje drzewo przedstawione w punkcie (e). Teraz x jest lewym synem swojego
ojca, zachodzi więc przypadek 3. Wykonanie prawej rotacji daje w wyniku drzewo (d), które jest
poprawnym drzewem c::u;rwono-czamym
312
14.3. OPERACJA WSTAWIANIA
..................
,,,,,,,,,,,,,,,,,,,,,,,,
. ..
( a) A ----
,,
•
B
r r
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.
N o~_!--@_.
.
__
_
··.a
(b)
A
8
'
u
{ ',
A r
a
•µ a µ
Rys. 14,5. Przypadek I z procedury RB-INSERT. Własność (3) zostaje nBiuszona, ponieważ x oraz
p[x] Uego ojciec) są czerwone. Podejmowane działania nie zaJeżą od tego, czy (a) x jest prawym czy
(b) lewym synem. Każde z poddrzew ar:,fJ,-;,ó i e ma czarny korzeń, a co więcej, każde z nich ma tę
samą czarną wysokość. Kolory niektór~h węzłów zostają zmienione, ale zostaje zachowana włas
ność (4), Ze każ.da ścieżka biegnąca :z węzła w dół do liścia ma taką samą liczbę czarnych węzłów.
Działanie pętli widie zostaje wznowione z węzłem p[p[x]] w roli x. Jedyne naruszenie własności (3)
może tera.z wystąpić tylko między nowym x, który jest czerwony, a jego ojcem, jeżeli jest również
pokolorowany na czerwono
313
ROZDZIAŁ 14. DRZEWA CZERWONO-CZARNE
Przypadek 2 Przypadek 3
••••••••••••••.••••••
,....... ,11,, .........
,..,................
;u,,
A y B 8y ' A C
a B ' X A y a y ;;
Y a
Rys. 14.6. Przypadki 2 i 3 z procedury RB-INSERT.Podobnie jak w przypadku I, własność (3) zostaje
naru~zona w przypadku 2 lub 3, ponieważ x oraz jego ojciec p(x} mają jednocześnie kolor czerwo-
ny. Każde z poddrzew a:, /1,y i ,5 ma czarny korzeń oraz tę samą czarną wysokośC. Przypadek
2 zostaje sprowadzony do przypadku 3 za pomocą lewej rotacji, która zachowuje własność (4):
wszystkie ścieżki biegnące z węzła w dół do liścia mają tę samą liczbę czarnych węzłów. W przypa-
dku 3 odbywają się pewne przekolorowania oraz jest wykonywana prawa rotacja, które równie:i:
zachowują własność (4). Wykonywanie pętli while zostaje wtedy przerwane, ponieważ własność (3)
jest już spełniona: nie ma sąsiadujących ze sobą czerwonych węzłów
ZADANIA
14.3-1. W wierszu 2 procedury RB-INSERT właśnie wstawionemu węzłowi x
zostaje przypisany kolor czerwony. Zauważmy, że gdybyśmy pokolorowali
x na czarno, to nie zostałaby naruszona własność (3) drzew czerwono-
-czarnych. Dlaczego więc nie kolorujemy węzła x na czarno?
14.3-2. W wierszu 18 procedury RB-INSERT przypisujemy czarny kolor korze-
niowi. Jaka z tego wynika korzyść?
14.3-3. Narysuj drzewo czerwono-czarne, które powstaje w wyniku wstawie-
nia po kolei elementów 41, 38, 31, 12, 19, 8 do początkowo pustego drze-
wa czerwono-czarnego.
14.3-4. Przyjmijmy, że czarna wysokość każdego z poddrzew ex, P, y, I>,
e z rys. 14.5 i 14.6 wynosi k. Wyznacz czarną wysokość każdego węzła,
314
14.4. OPERACJA USUWANIA
a następnie sprawdź, czy własność (4) jest zachowana przez opisane prze-
kształcenia.
14.3-5. Rozważmy drzewo czerwono-czarne powstałe przez wstawienie n węz
łów za pomocą procedury RB-INSERT. Wykaź, że jeśli n> 1, to drzewo
ma co najmniej jeden czerwony węzeł.
14.3-6. Wskaż, jak efektywnie zaimplementować procedurę RB-INSERT,jeśli
w reprezentacji drzew czerwono-czarnych nie ma wskaźników do ojca każ
dego węzła.
14.4. Operacjausuwania
Podobnie jak pozostałe elementarne operacje na drzewie czerwono-czarnym
o n węzłach, usuwanie elementu jest wykonywane w czasie O(lg n). Usuwanie
jest tylko nieco bardziej skomplikowane niż wstawianie węzła.
Aby uprościć obsługę warunków brzegowych, będziemy używać wartow-
nika reprezentującego stałą NIL (patrz str. 242). Dla drzewa czerwono-czar-
nego T wartownik nil[T] jest węzłem o takich samych polach jak wszystkie
inne węzły. Wartością jego pola co/or jest BLACK,a jego pozostałe pola - p,
left, right oraz key - mogą przyjmować dowolne wartości. W drzewie czerwo-
no-czarnym wszystkie wskaźniki do NIL zostają zastąpione wskaźnikami do
wartownika nil[TJ.
Wartownika używamy po to, aby móc traktować węzeł NIL, będący synem
węzła x, jako zwyczajny węzeł, którego ojcem jest x. Można by dodać różnych
wartowników w miejsce każdego NIL w drzewie, tak aby dla każdej wartości
NIL był dobrze określony jej ojciec, ale byłoby to niepotrzebne marnowanie
pamięci. Zamiast tego używamy jednego wartownika nil[T], który reprezen-
tuje wszystkie stałe NIL. Jeśli jednak chcemy manipulować synem węzła x, to
musimy zadbać o to, aby najpierw przypisać wskazanie na x polu p[nil[T]J.
Procedura RB-DELETE powstaje w wyniku niewielkiej przeróbki procedu-
ry TREE-DELETE (patrz podrozdz. 13.3). Po wycięciu usuwanego węzła jest
wywoływana pomocnicza procedura RB-DELETE-FIXUP,która przekolorowu-
je węzły i wykonuje rotacje w celu przywrócenia własności czerwono-czarnych.
RB-DELETE(T, z)
I if left[z] = nil[T] lub right[z]= nil[T]
2 theny+-z
3 else y -TREE-SUCCESSOR(z)
4 if left[y] #c nil(T]
5 dien x - teft[y]
6 else x +- right[y]
7 p[x] - p[y]
-------
315
ROZDZIAŁ 14. DRZEWA CZERWONO-CZARNE
8 if p[y] = nil[T]
9 then root[T] ..._x
10 else if y = /eft[p[y]]
li then left[p[y]]-x
12 else right[p[y]] '"- x
13 ify#z
14 thenkey[z]- key[y]
15 t> Jeśli y ma inne pola, to należy je również skopiować.
16 if color[y] = BLACK
17 tben RB-DELETE-FIXUP(T, x)
18 returny
RB-DELETE-FIXUP(T, x)
I while x =Froot[T] i color[x]= BLACK
2 do if x = left[p[x]]
3 then w- right[p[x]]
4 if color[w]= RED
5 then color[w]..._BLACK. t> Przypadek 1
6 co/o,[p[x]]-RED t> Przypadek I
7 LEFT-ROTATE(T, p[x]) t> Przypadek I
8 w- right[p[x]] t> Przypadek I
9 if colo,[left[w]] = BLACK i color[right[w]]= BLACK
10 then color[w]..._RED t> Przypadek 2
14.4. OPERACJA USUWANIA
-----------------------~ 317
ROZDZIAŁ 14. DRZEWACZERWONO-CZARNE
Przypadek 1
............. ,,,,.
,,,,,, ...
,,,,...............
I ,1
Ib I
. '
Przypadek 2
.....................................··!I••· Nowe x 8 f
. ,. Przypadek 3
,,,.,
........................................
. '
Nowe w
(d)
.' Przypadek 4
............. ,,,,
,.,,,,,,....................
D '
'
C c'
Nowex = roo/[71
Rys. 14.7. Przypadki rozważane w pętli while procedury RB-DELETE. Najciemniejsze węzły mają
kolor czarny, ciemnosmre mają kolor czerwony, a jasnoszare węzły mogą byi: zarówno czerwone,
jak i czarne; ich kolory są oznaczone przez c i c'. Litery tr, p, ..., { odpowiadają dowolnym
poddrzewom. W każdym przypadku konfiguracja po lewej stronie jest przekształcona na kon-
figurację po prawej stronie przez przekolorowllIUe niektórych węzłów i/lub wykonanie rotacji.
Węzeł wskazywany przez zmienną x jest „podwójnie czarny". Wykonywanie pętli jest kontynuo-
wane tylko po zajściu przypadku 2. (a) Przypadek 1 zostaje sprowadzony do przypadku 2, 3 lub
4 przez zamianę kolorów węzłów B i D oraz wykonanie lewej rotacji. (b) W przypadku 2 nad-
miarowa „cza.ma jednostka" węzła x zostaje przesunięta do góry w drzewie przez pokolorowanie
węzła Dna czerwono i przesunięcie wskaźnika x do węzła B. Jeśli przypadek 2 zachodzi po zajściu
przypadku I, to wykonywanie pętli whllezostaje przerwane, ponieważ c jest kolorem czerwonym.
(c) Przypadek 3 sprowadza się do przypadku 4 przez zamianę kolorów węzłów Ci D oraz wykona-
nie prawej rotacji. (d) W przypadku 4 nadmiarowa „czarna jednostka" węzła x może zostać
usunięta przez przekolorowanie pewnych węzłów oraz wykonanie lewej rotacji (nie naruszając
przy tym własności czerwono-czarnych), po czym wykonywanie pętli zostaje przerwane
318
14.4. OPERACJA USUWANIA
319
ROZDZIAŁ 14. DRZEWA CZERWONO-CZARNE
ZADANIA
14.4-1. Wykaż, że po wykonaniu procedury RB-DELETE korzeń drzewa czer-
wono-czarnego jest zawsze pokolorowany na czarno.
14.4-2. W zadaniu 14.3-3 skonstruowałeś drzewo czerwono-czarne przez wsta-
wianie po kolei elementów 41, 38, 31, 12, 19, 8 do początkowo pustego
drzewa. Narysuj teraz ciąg drzew czerwono-czarnych powstających w wy-
'"niku usuwania elementów w następującej kolejności: 8, 12, 19, 31, 38, 41.
14.4-3. W których wierszach procedury RB-DELETE-FIXUP odczytujemy lub
modyftk.ujemy zawartość wartownika nil[T]?
14.4-4. Uprość treść procedury LEFr-ROTATE, używając wartownika zamiast
NIL oraz drugiego wartownika, który wskazuje na korzeń drzewa.
14.4-5. Dla każdego z przypadków na rys. 14.7 podaj liczbę czarnych
węzłów na ścieżce od korzenia poddrzewa do każdego z poddrzew a, p, ...,
( oraz sprawdź, że odpowiednie przekształcenia nie zmieniają tych liczb.
Jeśli węzeł ma kolor club c', to do symbolicznych obliczeń użyj oznaczeń
count(c) lub count(c').
14.4-6. Załóżmy, że węzeł x został wstawiony do drzewa czerwono-czarnego
za pomocą procedury RB-INSERT, a następnie natychmiast usunięty za
pomocą procedury RB-DELETE. Czy powstałe w wyniku drzewo czerwo-
no-czarne jest takie samo jak początkowe? Odpowiedź uzasadnij.
Problemy
14-1. Trwale zbiory dynamiczne
W czasie wykonywania pewnych algorytmów zachodzi czasami potrzeba zapa-
miętywania starszych wersji zbiorów dynamicznych. Tego typu zbiory nazywa-
my trwałymi. Jednym ze sposobów implementacji zbiorów trwałych jest zapa-
miętywanie całej ich zawartości przy każdej modyfikacji, ale takie postępowa
nie może drastycznie spowolnić działanie programu i zwiększyć jego zapotrze-
bowanie na pamięć. Postaramy się robić to bardziej efektywnie.
320
PROBLEMY
4 '
3 8 3
2 7 IO 2
(•) (b)
Rys. 14,8. (a) Drzewo poszukiwań binarnych o kluczach 2, 3, 4, 7, 8, JO. (b) Trwałe drzewo BST
powstałe przez dodanie klucza 5, Najnowsza wersja zbioru składa się z węzłów osiągalnych z ko-
rzenia r', a poprzednia wersja zawiera węzły osiągalne z,. Ciemnoszare węzły były dodane przy
wstawianiu klucza 5
(a) Jakie węzły muszą ulec zmianie w ogólnym przypadku, gdy wstawiamy
klucz k do trwałego drzewa poszukiwań binarnych lub usuwamy z niego
węzeł y?
(b) Napisz procedurę PERSISTENT-TREE-INSERT, która dla danego trwałego
drzewa T oraz klucza k wyznacza nowe trwale drzewo T', powstające przez
dodanie k do T. Przyjmij, że każdy węzeł w drzewie ma pola key, left oraz
right, ale nie ma pola wskazującego na ojca. (Patrz również zad. 14.3-6).
(c) Jaka jest złożoność czasowa i pamięciowa Twojej implementacji procedury
PERSJSTENT-TREE-INSERTjako funkcja wysokości h trwałego drzewa po-
szukiwań binarnych T? (Złożoność pamięciowa jest proporcjonalna do
liczby dodanych węzłów).
321
ROZDZIAŁ 14. DRZEWA CZERWONO-CZARNE
(d) Załóżmy, że w każdym węźle znajduje się pole wskazujące na ojca tego
węzła. Wtedy w procedurze PERSISTENT-TREE-INSERT należy wykonać
dodatkowe operacje kopiowania. Wykaż, że w takim przypadku złożoność
czasowa i pamięciowa procedury PERSISTENT-TREE-lNSERT wynosi O(n),
gdzie n jest liczbą węzłów w drzewie.
(e) Jak użyć drzew czerwono-czarnych, aby zagwarantować, żeby pesymistycz-
ny czas wykonywania operacji oraz zużywana pamięć w przypadku opera-
cji wstawiania lub usuwania wynosiły O(lgn).
Uwagi do rozdziału
Pomysł równoważenia drzew poszukiwań przedstawili Adel'son-Vel'skii i Lan-
dis [21, którzy w 1962 r. wprowadzili klasę drzew zwanych „drzewami AVL".
322
UWAGIDO ROZDZIAŁU
Wzbogacaniestrukturdanych
3•~2~4------------------------
15.1. DYNAMICZNE STATYSTYKI PDZVCYJNE
15.1. Dynamiczne
statystyki
pozycyjne
sue
Rys. 15.1. Drzewo statystyk pozycyjnych powstałe przez wzbogacenie drzewa czerwono-czarnego.
2.aczemione węzły mają kolor czarny, a jasnoszare - czerwony. Kamy węzeł x ma dodatkowe pole
size[xJ zawierające liczbę węzłów w poddrzewie o korzeniu w wężle x
Wyznaczanieelementu o zadanejrandze
Zanim opiszemy, jak aktualizować informacje o rozmiarze poddrzew w trakcie
wstawiania i usuwania elementów, przyjrzyjmy się, w jaki sposób można te
informacje wykorzystać przy obliczaniu dwóch rodzajów statystyk pozycyj-
nych. Najpierw zajmiemy się implementacją procedury OS-SELECT(x, i), która
wyznacza wskaźnik do węzła zawierającego i-ty co do wielkości klucz w pod-
drzewie o korzeniu w x. Wywołanie procedury OS-SELECT(root[T],i) powodu-
je znalezienie i-tego co do wielkości klucza w drzewie statystyk pozycyjnych T.
0S-SELECT(x, i)
1 r ~ size[left[x]] + 1
2 ifi=r
3 then return x
4 elseif i < r
5 then returnOS-SELECT(left[x],i)
6 else returnOS-SELECT(righl[x],i - r)
326
15.1. DYNAMICZNE STATYSTYKI POZVCYJNE
którego jest korzeniem, rangę 6. Stąd wynika, że węzeł o randze 4 jest czwar-
tym co do wielkości elementem w lewym poddrzewie. Po rekurencyjnym wy-
wołaniu x wskazuje na węzeł o kluczu 30 i randze 2 w poddrzewie. Wyszukuje-
my więc rekurencyjnie 4 - 2 = 2 (drugi) element w poddrzewie o korzeniu
w węźle zawierającym klucz 38. Lewe poddrzewo ma teraz rozmiar I, co ozna-
cza, że x jest drugim co do wielkości elementem. Dlatego wartością wyznaczo-
ną przez procedurę OS-SELECT jest wskaźnik do węzła o kluczu 38.
Każde rekurencyjne wywołanie procedury powoduje przejście o jeden po-
ziom niżej w drzewie statystyk pozycyjnych, całkowity czas działania procedu-
ry OS-SELECT jest zatem co najwyżej proporcjonalny do wysokości drzewa.
Ponieważ jest to drzewo czerwono-czarne, jego wysokość wynosi O(lg n), gdzie
n jest liczbą węzłów. Czas działania procedury OS-SELECTna n-elementowym
zbiorze dynamicznym można więc ograniczyć przez O(lgn).
OS-RANK(T,x)
I r +- size[left[x]] + I
2 y+-x
3 while y i=-root[T]
4 do if y - right[p[y]]
5 then r - r + size[/eft[p[y]]] + I
6 y-p[y]
7 return r
Procedura OS-RANK działa w taki oto sposób. Ranga węzła x to, inaczej
mówiąc, liczba o jeden większa od liczby węzłów, które poprzedzają x przy
przechodzeniu drzewa metodą inorder. Utrzymywany jest następujący nie-
zmiennik: na początku pętli while, w wierszach 3-6, r jest rangą elementu key[x]
w poddrzewie o korzeniu w węźle y. Niezmiennik ten jest zachowywany w taki
o to sposób, W wierszu 1 przypisujemy zmiennej r rangę elementu key[x]
w poddrzewie o korzeniu w x. Przypisujący+- x w wierszu 2, sprawiamy, że
niezmiennik jest spełniony za pierwszym razem, gdy sprawdzamy warunek
w wierszu 3. W każdej iteracji pętli while rozważamy poddrzewo o korzeniu
w p[y]. Policzyliśmy już liczbę węzłów w poddrzewie o korzeniu w węźle y,
które poprzedzają x przy przechodzeniu drzewa metodą inord.er, musimy więc
do tego dodać liczbę węzłów w poddrzewie, którego korzeniem jest brat węzła
y oraz dodać I, jeśli p[y] też poprzedza x. Jeśli y jest lewym synem, to ani p[y],
---·
327
ROZDZIAŁ 15. WZBOGACANIE STRUKTUR DANYCH
ani żaden węzełw prawym poddrzewie p[y] nie poprzedza x, zatem nic nie
dodajemy do r. W przeciwnym razie y jest prawym synem i wszystkie węzły
w lewym poddrzewie p[y] poprzedzają x, jak również p[y]. Dlatego w wierszu
5 dodajemy size{left[y]] + 1 do bieżącej wartości r. Przypisując y....-p[y] spra-
wiamy, że niezmiennik znowu jest spełniony przed kolejną iteracją pętli.
Dla y = root[T] procedura wymacza wartość r, która jest równa randze ele-
mentu key[x].
Dla przykładu prześledźmy wykonanie procedury OS-RANK na drzewie
statystyk pozycyjnych z rys. 15.1 przy wyznaczaniu rangi elementu o kluczu
38. Oto wartości key[y] oraz r na początku pętli while w kolejnych iteracjach:
Iteracja key[y] r
I 38 2
2 30 4
3 41 4
4 26 17
328
15.1. DYNAMICZNE STATYSTYKI POZVCYJNE
13 size[y]+--size{x]
14 size[xJ~ size[left[xJJ+ size[right[xJJ+ I
RIGHT.ROT ATE(T. y)
...................
,.,,................
,.,1,,,
,,,1,••,.........................._.•••••••.•
LEFr-RoT ATF(T. x)
,, "
I
/4,
Rys. 15.2. Aktualizacja rozmiarów poddrzew w czasie rotacji. Jedyne dwa pola, które trzeba za"
ktualizować, przylegają do krawędzi, wokół której jest wykonywana rot.acja. Zmiany mają charak-
ter lokalny, do ich przeprowadzenia potrzebne są tylko wartości pól size węzłów x, y oraz korzeni
poddrzew oznaczonych przez tróJkąty
329
ROZDZIAŁ 15. WZBOGACANIE STRUKTUR DANYCH
ZADANIA
DOWÓD
Zasadnicza dla dowodu jest obserwacja, że ZID.ianawartości pola f w węźle
x może wpłynąć tylko na przodków x w drzewie. Oznacza to, że modyfikacja
/lx] może wymusić tylko aktualizacjęf(p{x]] i tak dalej w górę drzewa. Jeśli
ZID.ienionazostaje wartość firoot(T] J, to można zakończyć poprawki, ponie-
waż zawartość żadnego innego węzła nie zależy od nowej wartości w korzeniu.
Wysokość drzewa czerwono-czarnego wynosi O(lgn), zmiana wartości pola
f dowolnego węzła wymaga więc czasu O(Jgn} na akutalizację w węzłach, na
które ta zmiana może wpłynąć.
Wstawianie nowego węzła x do drzewa T można rozbić na dwa etapy
(patrz pod.rozdz. 14.3). W pierwszym etapie x zostaje wstawiony jako syn pew-
nego istniejącego węzła p(xJ. Wartośćfix] można obliczyć w czasie 0(1), ponie-
waż zgodnie z założeniem zależy ona tylko od wartości innych pól samego
elementu x oraz jego synów, ale x nie ma synów. Po obliczeniu flxJ należy
odnutować tę zmianę na ścieżce w górę drzewa. Całkowity czas działania
pierwszego etapu wstawiania wynosi więc O{lgn). Jedyne zmiany w strukturze
drzewa do jakich dochodzi w drugim etapie to rotacje. Rotacja modyfikuje
tylko dwa węzły, zatem calk:owity czas aktualizacji pól f po jednej rotacji wy-
332
15.2. JAK WZBOGACAC STRUKTURĘ DANYCH
nosi O(lgn). Przy wstawianiu wykonujemy co najwyżej dwie rotacje, wobec tego
sumaryczny czas działania operatji wstawiania można ograniczyć przez O(lgn).
Usuwanie można, podobnie jak wstawianie, podzielić na dwa etapy (patrz
podrozdz. 14.4). W pierwszym etapie zmiany mogą wystąpić, gdy usuwany
węzeł zostaje zastąpiony przez swój następnik, a potem gdy usuwany węzeł lub
jego następnik zostaje usunięty z drzewa. Aktualizację wszystkich pól/, na
które może wpłynąć taka zmiana, można wykonać w czasie O(lgn), ponieważ
zmiany w drzewie mają charakter lokalny. Poprawienie struktury drzewa czer-
wono-czarnego w drugim etapie wymaga co najwyżej trzech rotatji, a aktuali-
zację pól/po każdej rotacji można wykonać w czasie O(lgn). Stąd, podobnie
jak w przypadku wstawiania, sumaryczny czas działania operacji usuwania
można ograniczyć przez O(lgn).
•
W wielu przypadkach, takich jak aktualizatja pól size w drzewach statys-
tyk pozycyjnych, koszt „napraw" po wykonaniu rotatji można ograniczyć
przez 0(1), a nie tylko przez O(lgn), jak w twierdzeniu 15.1. Zadanie 15.2-4
stanowi przykład takiej sytuacji.
ZADANIA
333
ROZDZIAŁ 15. WZBOGACANIE STRUKTUR DANYCH
15.3. Drzewaprzedziałowe
W tym podrozdziale zajmiemy się takim wzbogaceniem drzew czerwono-czar-
nych, aby móc zaimplementować operacje na dynamicznych zbiorach prze-
działów. Przedział domknięty jest uporz.ądkowaną parą liczb rzeczywistych [t1 ,
t 2], gdzie t 1 ~ t 2 • Przedział [t 1 , t 2 ] reprezentuje zbiór {teR:t 1 ~ t ~ t 2 }. Prze-
działy otwarte i jednostronnie otwarte nie zawierają odpowiednio obu albo jed-
nego z końców zbioru. Na potrzeby tego podrozdziału przyjmiemy założenie,
że przedziały są domknięte; łatwo uogólnić wszystkie przedstawione tu wyniki
na przedziały otwarte i jednostronnie otwarte.
Przedziały dobrze nadają się do reprezentowania zdarzeń zachodzących
przez pewien ciągły odcinek czasu. Możemy na przyklad wysunąć zapytanie do
bazy danych zawierającej przedziały, jak.ie zdarzenia zaszły w zadanym prze-
dziale czasu. Struktura danych, którą przedstawimy w tym rozdziale, umoż
liwia efektywne wykonywanie tego rodzaju operacji.
Przedział [t 1 , tz] można reprezentować jak.o obiekt i o polach /ow[i] = t 1
; ; ;
; . '
. ' ;' ;' '
(•)
; ;' .' ;
'
(b) (,)
Rys. 15.3. Trychotomia przedziałowa dla dwóch domkniętych przedziałów i oraz i'. (a) Jesli i oraz i'
zachodzą na siebie, to zachodzi jedna z czterech sytuacji; w ka Mej z nich spełnione są nierówności
low(i] ~ high(i'] oraz low[i'] ~ high[i]. (b) high[i] < low{i']. (c) high[i'J < /11w{i]
(lewy koniec) oraz high[i] = t 2 (prawy koniec). Dwa przedziały i oraz i' za-
chodzą na siebie, jeśli i n i' # 0, tj. jeśli /ow[i] ~ high[i'] oraz /ow[i'] ~ high[i].
Każde dwa przedziały i oraz i' spełniają dokładnie jeden z trzech następujących
warunków (trychotomia przedziałowa):
334
15.3. DRZEWA PRZEDZIAŁOWE
335
ROZDZIAŁ 15. WZBOGACANIE STRUKTUR DANYCH
Krok 4: Projektowanienowychoperacji
Jedyną nową operacją, jakiej potrzebujemy, jest INTERVAL-SEARCH(t, i), która
wyszukuje przedział w drzewie T zachodzący na przedział i lub zwraca NIL,
jeśli takiego przedziału nie ma.
lNTERVAL-SEARCH(T, i)
I x +-- root{t]
2 wbile x 'F-NIL oraz i nie zachodzi na int[x]
261 26
25 JO
I 9 H 20
17 19
16 ·~21
15 ---- s2J
8H9
6 10
5 8
o J
L~
o 5 10 15 20 25 JO
(a)
[8.0!
• · !25,30] '' :
.
1.\ _\(I
lt1Jj
• [6,101 119,20]
" . ., . •· .
Rys. 15.4. Drzewo przedziałowe. (a) Zbiór IO przedziałów, uporządkowany według lewego końca.
(b) Drzewo przedziałowe, które reprezentuje ten zbiór przedziałów. Porządek inorder węzłów tego
drzewa odpowiada upori.ą.dkowaniu przedziałów według ich lewego końca
336
15.3. DRZEWA PRZEDZIAŁOWE
337
ROZDZIAŁ 15. WZBOGACANIE STRUKTUR DANYCH
TwIERDZENIE 15.2.
Rozważmy dowolną iterację pętli while w czasie wykonywania procedury IN-
TERVAL-SEARCH(T, i).
DOWÓD
Dowód obu przypadków opiera się na trychotomii przedziałowej. Udowod-
nimy najpierw przypadek 2, ponieważ jest łatwiejszy. Zauważmy, że jeśli zo-
staje wykonana instrukcja w wierszu 5, to z warunku w wierszu 3 wynika, że
left[x] = NJL lub max[/efąx]] < /ow[i]. Jeśli lefąx] = NJL, to poddrzewo o ko-
rzeniu w left{x] z pewnością nie zawiera przedziału zachodzącego na i, bo nie
ma w nim żadnych przedziałów. Załóżmy więc, że left[x] 'F NIL oraz
max[/efąx]] < iow[i]. Niech i' będzie dowolnym przedziałem z lewego poddrze-
wa węzła x (patrz rys. 15.Sa). Największym możliwym końcem prawego prze-
działu z lewego poddrzewa x jest max[left[x]], więc
."
."
'
•
'
.
'
i' i" •
i' i i' •
'
(•) (b)
Rys. 15.5. Przedziały w dowodzie twierdzenia 15.2. Wartość max(/eft[x]J w obu przypadka.eh jest
oznaczona przerywaną linią. (a) Przypadek2: wyszukiwanie zostaje skierowane w prawo. żaden
przedział i' nie zachodzi na i. (b) Przypadek I: wyszukiwanie zostaje skierowane w lewo. Lewe
poddrzewo węzła x zawiera przedział zachodzący na i (sytuacja nie pokazana na rysunku) lub istnieje
przedział i' w lewym poddrz.ewiex, taki że high(i'J = max(left[x]]. Skoro inie zachodzi.na i', to tym
bardziej nie za.chodzina Zaden prmdział ,~ z prawego poddrzewa, ponieważ low(i'J "low(iPJ
338
15.3. DRZEWA PRZEDZIAŁOWE
high[i'J - maxfleft[xJJ
~ low[i]
(Na rysunku 15.5b znajduje się odpowiednia ilustracja tej sytuacji). Przedziały
i oraz i' nie zachodzą na siebie, skoro więc nie jest prawdą, że highf..i']< low[i],
to z trychotomii przedziałowej wynika, że zachodzi high[i](low[i']. Kluczami
w drzewach przedziałowych są lewe końce przedziałów, wobec tego z własności
drzewa wyszukiwań wynika, że dla każdego przedziału i" z prawego poddrze-
wa węzła x zachodzi
high[iJ< low[i1
~ low[i"J
Z trychotomii przedziałowej wnioskujemy więc, że i oraz i" nie zachodzą
na siebie.
•
Twierdzenie 15.2 daje gwarancję, że jeśli w procedurze INTERVAL-SEARCH do
dalszych wyszukiwań będzie wybrany jeden z synów węzła x i w rezultacie nie
będzie znaleziony żaden przedział zachodzący na i, to wyszukiwanie w drugim
poddrzewie węzła x będzie równie bezowocne.
ZADANIA
15.3-1, Napisz procedurę LEFT-ROTATE działającą na węzłach drzewa prze-
działowego aktualizującą pola max w czasie 0(1 ).
15.3-2. Zmodyfikuj tak: procedurę INTERVAL-SEARCH, aby działała popraw-
nie, gdy wszystkie przedziały są otwarte.
15.3-3. Zaprojektuj efektywny algorytm, który dla danego przedziału i daje
w wyniku przedział na niego zachodzący o najmniejszym lewym końcu lub
NIL, jeśli taki przedział nie istnieje.
1S.34, Opisz, jak: dla danego drzewa przedziałowego T oraz pr7.edziału i wy-
znaczyć w czasie O(min(n, klgn)) wszystkie przedziały zachodzące na i,
gdzie k jest liczbą tych przedziałów. (Dodatkowo: Podaj rozwiązanie, które
nie wykonuje żadnych modyfikacji w drzewie).
15.3-S. Zaproponuj modyfikacje w procedurach działających na drzewach
przedziałowych umożliwiające wykonywanie operacji INTERVAL-
339
ROZDZIAŁ 15. WZBOGACANIE STRUKTUR DANYCH
Problemy
lS-1. Punkt o największej liczbie przecięć
Załóżmy, że w zbiorze przedziałów chcemy mieć dostęp do punktu o najwięk
szej liczbie przecięć, tj. punktu w którym zachodzi na siebie największa liczba
przedziałów. Opisz, jak: można efektywnie aktualizować punkt o największej
liczbie przecięć podczas wstawiania i usuwania przedziałów.
15-2. PermutacjaJózefa
Problem Józefa definiuje się następująco. Niech n osób stoi w okręgu oraz niech
dana będzie liczba m ~ n. Rozpoczynając od wskazanej osoby, przebiegamy po
okręgu, usuwając co m-tą osobę. Po usunięciu każdej kolejnej osoby odliczanie
odbywa się w nowo powstałym okręgu. Proces ten postępuje, aż zostaną usu-
nięte wszystkie osoby. Porządek, w którym osoby stojące początkowo w okrę
gu są z niego usuwane, definiuje permutację Józefa typu (n, m) liczb 1, 2, ... , n.
Na przykład permutacją Józefa typu (7, 3) jest (3, 6, 2, 7, 5, l, 4).
340
PROBLEMY
(a) Przyjmij, że m jest stałą. Opisz algorytm działający w czasie O(n), który dla
danej liczby n wypisuje permutację Józefa typu (n, m).
(b) Rozważ sytuację, w której mnie jest ustalone. Zaprojektuj algorytm dzia-
łający w czasie O(nlgn), który dla danych n oraz m wypisuje permutację
Józefa typu (n, m).
Uwagido rozdziału
W książce Preparaty i Shamosa [160} są opisane różne typy drzew przedziało
wych występujące w literaturze. Do najważniejszych z teoretycznego punk.tu
widzenia należy zaliczyć drzewa wynalezione niezależnie przez H. Edelsbrun-
nera (w 1980 r.) i E. M. McCreighta (w 1981 r.), które w zbiorze n przedziałów
umożliwiają wypisanie w czasie O(k + lgn) wszystkich k przedziałów zacho-
dzących na dany przedział i.
_______ Część IV
Zaawansowane metody
konstruowan
i analizowania
algorytmów
Wprowadzenie
W tej części omówimy trzy ważne metody konstruowania i analizowania efek-
tywnych algorytmów: programowanie dynamiczne (ro7.d.z. 16), algorytmy za-
chłanne (rozdz. 17) oraz analizę kosztu zamortyzowanego (rozdz. 18). We wcześ
niejszych częściach opisaliśmy inne powszecbnie stosowane metody, takie jak
.,dziel i zwyciężaj", algorytmy probabilistyczne i rozwiązywanie równań reku-
rencyjnych. Nowe metody są bardziej wyrafmowane, choć niejednokrotnie ich
zastosowanie jest niezbędne do uzyskania efektywnych algorytmów. Do zagad-
nień poruszanych w tej części będziemy wracać w dalszych partiach książki.
Programowanie dynamiczne jest metodą stosowaną zwykle w odniesieniu
do problemów optymalizacyjnych. Znalezienie optymalnego rozwiązania ta-
kiego problemu wymaga podejmowania różnych decyzji w obliczeniach. Takie
wybory prowadzą do pod.problemów tego samego typu. Zastosowanie progra-
mowania dynamicznego daje dobre rezultaty, jeśli różne ciągi wyborów mogą
doprowadzić do identycznych podproblemów. Można wtedy zapamiętywać
rozwiązania takich podproblemów, aby ich powtórnie nie obliczać, jeśli wy~
stąpią ponownie w trakcie obliczeń, W rozdziale 16 za pomocą tej prostej
metody algorytmy o złożoności wykładniczej są przekształcane w algorytmy
działające w czasie wielomianowym.
Algorytmy zachłanne, podobnie jak programowanie dynamiczne, są stoso~
wane do problemów optymalizacyjnych, w których osiągnięcie optymalnego
rozwiązania wymaga podejmowania wielu decyzji. W algorytmie zachłannym
są podejmowane decyzje „lokalnie" optymalne. Prostym przykładem takiego
podejścia jest wydawanie reszty: aby 7lllinimalizować liczbę monet składają~
cych się na określoną sumę pieniędzy, wystarczy wybierać za każdym razem
monetę o największym nominale, której dołożenie nie przekroczy wydawanej
sumy. Jest wiele takich problemów, w których metoda zachłanna prowadzi do
optymalnego rozwiązania znacznie szybciej niż rozwiązania oparte na progra~
344
WPROWADZENIE
mowaniu dynamicznym. Nie zawsze jednak łatwo jest stwierdzić, czy zastoso-
wanie algorytmu zachłannego jest rozwiązaniem poprawnym, tzn. czy otrzy-
mane rozwiązanie jest zawsze optymalne. W rozdziale 17 omówimy teorię ma-
troidów, która często jest pomocna przy określaniu poprawności algorytmów
zachłannych. .
Analiza zamortyzowanego kosztu algorytmów służy do szacowania kosztu
algorytmów, w których następują ciągi podobnych operacji. Zamiast oceniać
koszt ciągu operacji, ograniczając koszt każdej z nich z osobna, wykorzystując
analizę kosztu zamortyzowanego możemy lepiej oszacować faktyczny koszt
całego ciągu operacji. Podejście takie może dać istotnie lepsze jakościowo re-
zultaty, ponieważ niejednokrotnie faktyczny koszt wielu pojedynczych operacji
jest znacznie mniejszy niż ich koszt w najgorszym przypadku. Mimo że nie-
które operacje są kosztowne, większość pozostałych może być tania. Analiza
kosztu zamortyzowanego służy nie tylko do analizy algorytmów. Dzięki niej
można inaczej spojrzeć na metody konstruowania algorytmów; projektowanie
i analiza algorytmów są bowiem często ściśle ze sobą powiązane. W rozdziale
18 wprowadzimy trzy równoważne metody analizy kosztu zamortyzowanego
algorytmów.
Rozdział 16
Programowaniedynamiczne
(A,(A,(A,AJ))
(A,((A,A,)A,))
1
Sposób wnieszczania nawiasów będziemy też określać mianem nawiasowania (przyp. red.).
347
ROZDZIAŁ 16. PROGRAMOWANIE DYNAMICZNE
((A,A,XA,A,))
((A,(A,A,))A,)
(((A,A,)A,)AJ
348
16.1. MNOŻENIE CIĄGU MACIERZV
I dlan=l
P(n)- ·-'
L P(k)P(n - k) dla n~ 2
k"' 1
P(n) - C(n - I)
gdzie
C(n) - I
n+
(2")
1 n
- !l(4"/n 312 )
Liczba możliwych nawiasowań jest zatem określona i.ależnością wykładniczą
ze względu na n, wobec tego metoda wyczerpującego przeszukiwania wszyst-
kich rozwiązań jest skrajnie nieefektywna jak.o sposób obliczania optymalnego
nawiasowania iloczynu macierzy.
349
ROZDZIAŁ 16. PROGRAMOWANIE DYNAMICZNE
Rozwiązanie rekurencyjne
Drugim etapem w metodzie programowania dynamicznego jest zdefiniowanie
kosztu rozwiązania optymalnego jako funkcji optymalnych rozwiązań podpro-
blemów. W przypadku problemu nawiasowania iloczynu macierzy jako pod-
problemy występują problemy wyznaczenia optymalnego nawiasowania dla
iloczynów A;A. i ,:::;;j~n.Niech m[i, 11 będzie minimalną
1 + 1 ... A.,. gdzie 1,:::;;
liczbą mnożeń skalarnych, niezbędnych do obliczenia macierzy A, ..1• NajniiSZy
możliwy koszt obliczenia Ai..,. wynosi zatem m[l, n].
Możemy zdefiniować m[i, 11 następująco. Jeśli i= j, to ciąg składa się
z tylko jednej macierzy A 1•.1 = A;, nie trzeba więc wykonywać żadnych dodat-
kowych mnożeń skalarnych. Dlatego m[i, i] = O dla i= 1, 2, ... , n. Aby ob-
liczyć m[i,11 dla i <j, należy wykorzystać strukturę optymalnego rozwiązania
scharakteryzowaną w etapie 1. Za.łóżmy, że optymalne nawiasowanie iloczynu
A,A1+ 1 ... A1 dzieli go między Ak a A.t+ 1, gdzie i~ k <j. Wtedy m[i, 11 jest
równe sumie minimalnych kosztów obliczenia iloczynów A 1•.k i At+ 1..J oraz
pomnożenia ich przez siebie. Ponieważ obliczenie iloczynu macierzy AL.t
i A.,,.+1..J kosztuje Ps-iPkPJskalarnych mnożeń, otrzymujemy następujący wzór:
o dlai=j
(16.2)
m[i,j] - min {m[i, kJ+ m[k + 1, Jl+ p,_JJ,PJ) dla i <j
ł.r;;k<J
350
16.1. MNOŻENIE CIĄGU MACIERZV
Obliczanieoptymalnegokosztu
Teraz możemy już łatwo napisać rekurencyjny algorytm oparty na równaniu
(16.2), służący do obliczania minimalnego kosztu m[l, n] mnożenia A 1A2 ... A".
Jak się jednak przekonamy w pod.rozdz. 16.2, ten rekurencyjny algorytm działa
w czasie wykładniczym, nie jest więc wiele lepszy niż algorytm wyczerpującego
sprawdzania wszystkich możliwości nawiasowania iloczynu.
Zauważmy, że - co jest bardzo istotne - mamy tutaj stosunkowo niewiele
pod.problemów: dokładnie jeden podproblem dla każdego wyboru i oraz} ta-
kich, że 1 " i "j " n, czyli w sumie (;) + n = 0(n 2) podproblemów. Algo-
rytm rekurencyjny może napotkać każdy podproblem wielokrotnie w różnych
gałęziach drzewa rekursji. Własność wspólnych podproblemów jest drugim
niezbędnym warunkiem stosowalności programowania dynamicznego.
Zamiast obliczać rekurencyjnie rozwiązanie zależności (16.2), należy
przejść do trzeciego etapu metody programowania dynamicznego i obliczyć
optymalny koszt w sposób następujący. W następującej procedurze zakłada
my, że macierz A 1 ma wymiar p,_ 1 x p 1, dla i= 1, 2, ... , n. Dane wejściowe
stanowi ciąg (p 0, p 1, ... , Pn>,gdzie /ength[p] = n + 1. W procedurze MATRIX-
-CHAIN-ORDER są używane pomocnicze tablice: m[l „ n, 1 .. n] do zapamięty
wania kosztów m[i, J] oraz s[l .. n, I .. n] do zapamiętywania odpowiednich
indeksów k, dających optymalny podział przy obliczaniu m[i, j].
MATRIX-CHAIN-0RDER(p)
1 n+- length[p] - l
2 fori+-1 ton
3 do m[i, 11+- O
4 forl+-2ton
5 dofori+-lton-l+l
6 doj+-i+l- l
7 m[i, j] +- oo
8 fork+-itoj-1
9 do q+-m[i, k] +m[k+ l,J1 + Pi-1PkPi
10 if q < m[i,j]
11 then m[i, 11+- q
351
ROZDZIAŁ 16. PROGRAMOWANIE DYNAMICZNE•
12 s[i,11-k
13 return m oraz s
I I I
= 7125
352
16.1. MNOŻENIE CIĄGU MACIERZY
optymalnegorozwiązania
Konstruowanie
Chociaż procedura MATRIX-CHAIN-ORDBR wyznacza optymalną liczbę mno-
żeń skalarnych potrzebnych do policzenia iloczynu ciągu macierzy, jednak nie
podaje jawnie kolejności mnożeń, która pozwala to minimum osiągnąć. Etap
4 metody programowania dynamicznego to konstruowanie optymalnego roz-
wiązania na podstawie wcześniejszych obliczeń.
Do wyznaczenia najlepszej kolejności mnożenia macierzy użyjemy tablicy
s[l .. n, I .. n]. Każde pole s[i,j] zawiera taką wartość k, że optymalne nawiaso-
wanie dla AiA-1+1 ••• AJ dzieli iloczyn między Ak a Ak+i· Stąd wiadomo, że
ostatnim mnożeniem pary macierzy w czasie optymalnego obliczania A 1 n po- „
winno być A 1 „s[l, 111As[I,111+ J ••11• Wcześniejsze mnożenia mogą być odtworzone
rekurencyjnie, ponieważ s[l, s[l, n]] wyznacza ostatnie mnożenie w czasie ob-
liczania A 1 „s[l, li]' a s[s[l, n]+ 1, n] wyznacza ostatnie mnożenie w czasie
353
ROZDZIAŁ 16. PROGRAMOWANIE DYNAMICZNE
MATRIX-CHAIN-MULTIPLY(A,s, i,J)
1 ifj>i
2 then X +-MATRIX-CHAIN-MULTIPLY(A, s, i, s[i, jD
3 Y+-MATRIX-CHAIN-MULTIPLY(A, s, s[i,j] + l,;)
4 return MATRIX-MULTIPLY(X, Y)
5 else return A 1
((A,(A,A,))((A,A,)A,)) (16.3)
ZADANIA
16.1-1. Wyzna.c:z optymalne nawiasowanie iloczynu ciągu macierzy, których
wymiary stanowią ciąg (5, IO, 3, 12, 5, 50, 6).
16.1-2. Napisz szybki algorytm PRINT-0PTIMAL-PARENSwypisujący optymalne
nawiasowanie iloczynu ciągu macierzy, mając daną tablicę s obliczoną przez
procedurę MATRIX-CHAIN-ORDER.Przeprowadź analizę swego algorytmu.
16.1-3. Niech R(i, j) będzie liczbą odwołań do elementu m[i, j] tablicy m
w procedurze MATRIX-CHAIN-ORDERpodczas obliczania wartości innych
pól tej tablicy. Wykaż, że całkowita liczba odwołań do tablicy m wynosi
" n nl - n
L L R(i,J)- 3
i"'l}=I
+ IX2n + I)/6).
16.1-4. Wykaż, że pełne nawiasowanie n-elementowego wyrażenia zawiera do-
kładnie n - I par nawiasów.
354
16.2. PODSTAWY METODY PROGRAMOWANIA DYNAMICZNEGO
Optymalna podstruktura
Pierwszym etapem w metodzie projektowania algorytmów dla problemów op-
tymalizacyjnych za pomocą programowania dynamicznego jest scharakteryzo-
wanie struktury optymalnego rozwiązania, Powiemy, że problem wykazuje op-
tymalną podstrukturę, jeśli jego optymalne rozwiązanie jest funkcją optymal-
nych rozwiązań podproblemów. Jeżeli problem ma własność optymalnej pod-
struktury, to można się zwykle spodziewać, że za pomocą metody programo-
wania dynamicznego można będzie znaleźć algorytm do rozwiązania tego pro-
blemu. (Może to także czasem oznaczać, że daje się stosować strategia zachłan
na. O algorytmach zachłannych trak.tuje rozdz. 17).
W podrozdziale 16.1 stwierdziliśmy, że problem optymalnego nawiasowa-
nia iloczynu ciągu macierzy ma własność optymalnej podstruktury. Zauważyli
śmy, że optymalne nawiasowanie ciągu A 1A 2 ••• An, które dzieli ten iloczyn
między A;; a AJ:+ 1, zawiera optymalne nawiasowania dla iloczynów A 1A2 ••• A;;
oraz AA:+1AJ:+ 2 ••• An. Metoda, której użyliśmy do pokazania, że rozwiązania
podproblemów są optymalne, jest dość ogólna. Zakładamy najpierw, że ist-
nieje lepsze rozwiązanie podproblemu, po czym pokazujemy, iż to założenie
zaprzecza optymalności rozwiązania całego problemu.
Optymalna pod.struktura problemu sugeruje często odpowiednią prze-
strzeń podproblemów, na której działa programowanie dynamiczne. Zwykle
jest wiele klas podproblemów, które wydają się „naturalne" dla problemu. Na
przykład przestrzenią podproblemów, którą rozpatrywaliśmy dla optymalnego
nawiasowania iloczynu macierzy, były wszystkie spójne podciągi wejściowego
ciągu macierzy. Mogliśmy równie dobrze brać pod uwagę dowolne podciągi
macierzy z ciągu wejściowego, lecz ta przestrzeń podproblemów jest niepo-
trzebnie wielka. Algorytm zbudowany za pomocą metody programowania dy-
namicznego działający w tej przestrzeni podproblemów wykonuje więcej ob-
liczeń, niZ jest to naprawdę potrzebne.
Zbadanie optymalnej podstruktury problemu, przez przeliczenie kilku
przykładów, mo:Ze czasami znacznie ułatwić dobranie odpowiedniej przestrzeni
pod.problemów dla programowania dynamicznego. Na przykład zbadanie opty-
malnej podstruktury problemu optymalnego nawiasowania iloczynu macierzy
ROZDZIAŁ 16. PROGRAMOWANIE DYNAMICZNE
Wspólne podproblemy
Drugą właściwością problemu optymalizacyjnego wymaganą z punktu widze-
nia stosowalności metody programowania dynamicznego jest właśnie „rozsąd
nie mała" przestrzeń istotnie różnych pod.problemów. Zwykle liczba wszyst-
kich takich podproblemów jest wielomianowa ze względu na ro2llliar danych
wejściowych. Jeśli algorytm rekurencyjny wielokrotnie oblicza rozwiązanie te-
go samego pod.problemu, to mówimy że problem optymalizacyjny ma włas
ność wspólnychpod.problemów. Przeciwnie, problemy, dla których właściwe jest
podejście „dziel i zwyciężaj", generują istotnie różne podproblemy w każdym
kroku rekursji. Algorytmy oparte na programowaniu dynamicznym wykorzys-
tują własność wspólnych pod problemów, rozwiązując każdy podproblem tylko
raz i zapamiętując gotowe rozwiązania, które wystarczy później tylko odczytać
w stałym czasie, jeśli podproblem pojawia się w obliczeniach wielokrotnie.
Aby zilustrować własność wspólnych podproblemów, wróćmy raz jeszcze
do problemu optymalnego nawiasowania iloczynu macierzy. Na rysunku 16.l
łatwo zaobserwować, że procedura MATRIX-CHAIN-ORDER wielokrotnie ko-
rzysta z rozwiązań podproblemów w dolnych wierszach do rozwiązania pod-
problemów w wyższych wierszach. Na przykład wartość m[3, 4] jest wykorzys-
tana 4 razy: do obliczenia m[3, 4], m[l, 4], m[3, 5] oraz m[3, 6]. Jeśli m[3, 4]
byłoby obliczane za każdym razem od nowa, to znacznie wzrósłby czas działa
nia algorytmu. Aby się o tym przekonać, rozważmy następującą (nieefektyw-
ną) procedurę rekurencyjną, obliczającą m[i,J1, czyli minimalną liczbę mnożeń
skalarnych potrzebną do obliczenia iloczynu ciągu macierzy A1..1 = AiA 1 + 1...
... A . Procedura ta jest oparta bezpośrednio na wzorze (16.2).
1
RECURSIVE-MATRIX-CHAIN(p, i, J)
I ifi=j
2 then return O
3 m[i, j] +- oo
4 fork+-itoj-1
5 do q+-RECURSIVE-MATRIX-CHAIN(p, i, k)
+ RECURSIVE-MATRIX-CHAIN(p, k + 1,)) + P1- 1P1<PJ
6 if q < m[i,j]
7 tben m[i, j] +- q
8 returnm[i, j]
356
16.2. PODSTAWY METODY PROGRAMOWANIA DYNAMICZNEGO
1..4
2„2 3„4 2..3 4„4 1..1 2..2 3.3 4„4 1..1 2„3 1..2 3 ..3
/1
3..3 4„4
~
2..2 3..3
/1 ~
2..2 3 ..3 1•.1 2..2
Rys. 16.2. Drzewo rekursji dla procedury RECURSIVE-MATRIX-CHAIN(p, I, 4). Każdy węzeł drzewa
jest oznaczony przez parę parametrów i oraz j. Obliczenia wykonywane w zacieniowanych gałę
ziach drzewa są w wersji ze spamięlywaniem MEMOIZEO-MATRIX-CHAIN(p, I, 4) zastąpione prze2;
odczytanie odpowiedniej wartości z tablicy
7\1);, I
T\n);, I + L ·-·
k "' 1
(T\k) + T(n - k) + I) dla n> I
T(n) ;,
·-'
2 L 2•-' +n
i= 1
_________________________ ,,, ___ _
357
ROZDZIAŁ 16. PROGRAMOWANIE DYNAMICZNE
n"" 2
=2I2'+n
I ""O
= 2(2'~, - l) +n
= (2' -2) +n
~ 2n~1
Spamiętywanie
358
16.2. PODSTAWY METODY PROGRAMOWANIA DYNAMICZNEGO
Następująca
procedura jest wersją procedury RECURSIVE-MATRIX-CHAIN
z wbudowanym mechanizmem spamiętywania.
MEMOIZED-MATRIX-CHAIN(p}
l n+--lengthfp] - 1
2 fori+--lton
3 doforj+-iton
4 do m[i, j] +--oo
5 return LOOKUP-CHAIN(p, 1, n)
LOOKUP-CHAIN(p, i, 1)
I if m[i,JJ < oo
2 then return m[i, j]
3 il i= j
4 tben m[i, j] +--O
5 elsefork+--itoj-1
6 do q +-- LOOKUP-CHAIN(p,i, k)
+ LOOKUP-CHAIN(p, k + 1,1) + P;-1PkPJ
7 if q < m[i,JJ
8 tbenm[i,j]+--q
9 return m[i, j]
2
przez jedno wywołanie procedury LOOKUP-CHAIN. Każde z tych @(n ) wywo-
łań LoOKUP-CHAIN zajmuje O(n) jednostek czasu, nie wliczając czasu prze-
znaczonego na obliczanie innych pól tablicy, łączny czas działania wynosi więc
O(n 3). Dzięki spamiętywaniu można miniejszyć złożoność czasową algorytmu
z 0(2") do O(n').
Podsumowując możemy stwierdzić, że problem optymalnego nawiasowa-
nia iloczynu ciągu macierzy można rozwiązać w czasie O(n ) zarówno w spo-
3
ZADANIA
16.2-1. Porównaj równanie rekurencyjne (16.4) z równaniem (8.4), które wyni-
kło przy analizie średniego czasu wykonania algorytmu quicksort. Wyjaś
nij intuicyjnie, dlaczego rozwiązania tych równań różnią się tak znacznie.
16.2-2. Który z następujących sposobów obliczania optymalnego nawiasowa-
nia iloczynu ciągu macierzy jest efektywniejszy: wygenerowanie wszystkich
poprawnych nawiasowań iloczynu i obliczenie liczby mnożeń skalarów
potrzebnych w każdym z nich czy wywołanie procedury RECURSIVB-MAT-
RJX-CHAIN? Odpowiedź uzasadnij.
16.2-3. Narysuj drzewo rekursji dla procedury MERGE-SORTz podrozdz. 1.3.1
działającej na tablicy z 16 elementami. Wyjaśnij dlaczego spamiętywanie
nie pomaga przyspieszyć dobrego algorytmu typu „dziel i zwyciężaj", ta-
kiego jak MERGE-SORT.
360
16.3. NAJDŁUŻSZY WSPÓLNY PODCIĄG
(albo żadnego). Bardziej formalnie, dla danego ciągu X= (xi, x 2, ••• , xm> inny
ciąg Z= (z 1, z2, ••• , z.,) jest podciągiem X, jeśli istnieje ściśle rosnący ciąg
indeksów (i 1, i2 , ••• , im) taki, że dla wszystkichj = 1, 2, ... , k zachodzi równość
x,i = z1. Na przykład Z= (B, C, D, B) jest podciągiem ciągu X= (A, B, C, B,
D, A, B), a odpowiadający mu ciąg indeksów to (2, 3, 5, 7).
Mówimy, że ciąg Z jest wspólnym podciągiem ciągów X i Y, jeśli Z jest
zarówno podciągiem X, jak i Y. Na przykład dla danych ciągów X= (A, B, C,
B, D, A, B) i Y - (B, D, C, A, B, A) ciąg (B, C, A) jest wspólnym pod-
ciągiem X i Y. Ciąg (B, C, A) nie jest jednak najdłuższym wspólnym pod-
ciągiem (NWP) ciągów X i Y, ponieważ ma długość 3, a ciąg (B, C, B, A)
o długości 4 jest również wspólnym podciągiem ciągów X i Y. Podciągi (B, C,
B, A) oraz (B, D, A, B) są najdłuższymi wspólnymi podciągami ciągów X i Y,
ponieważ nie istnieje wspólny podciąg X i Yo długości 5 lub większej.
Danymi wejściowymi dla problemu najdłuższego wspólnego podciągu
(w skrócie: problemu NWP) są dwa ciągi X= (x 1, x 2, ••• , xm) i Y = (y 1, Y2,
..., Yn>· Zadanie polega na znalezieniu ich najdłuższego wspólnego podciągu.
W tym podrozdziale omawiamy efektywny algorytm służący do rozwiązywania
tego problemu oparty na programowaniu dynamicznym.
I. Jeśli xm = Yn, to z.,= x,.. = Yn, a z.,_1 stanowi NWP ciągów Xm-i i Yn-i·
2. Jeśli xm #, Yn i z.,#, xm, to Z stanowi NWP ciągów Xm-i i Y.
3. Jeśli Xm #, Yn i Z;, "FYn to Z stanowi NWP ciągów X i Yn-I·
361
ROZDZIAŁ 16. PAOGAAMOWANlE DYNAMICZNE
DOWÓD
(I) Jeśli zk =ftx,,,, to moglibyśmy dołączyć x,,, = y 11 do Z, uzyskując wspólny
podciąg X i Yo długości k + 1, co przeczy założeniu, że Z jest najdłuższym
podciągiem X i Y. Muszą więc zachodzić równości zk = x,,, = y 11 . Prefiks
Zk-t długości k - I jest z kolei wspólnym podciągiem ciągów X,,,_1 i Y11_ 1•
Pokażemy teraz, że jest to NWP. Załóżmy przeciwnie, że istnieje wspólny
podciąg W ciągów X,,,_1 i Y11•• 1 o długości większej niż k - l. Wtedy, doda-
jąc do W element x,,, = y 11, otrzymujemy wspólny podciąg ciągów
X i Y o długości większej niż k - sprzeczność.
(2) Jeśli zk =Fx,,,, to Z jest wspólnym podciągiem ciągów X,,,_1 i Y. Gdyby
istniał wspólny podciąg W ciągów X,,,_1 i Yo długości większej niż k,
wtedy W byłby jednocześnie podciągiem. X,,, i Y, co jest w sprzeczności
z założeniem, że Z stanowi NWP ciągów X i Y.
(3) Dowód jest analogiczny do tego z przypadku (2).
•
Charakterystyka, którą daje twierdzenie 16.1, pozwala stwierdzić, że prob-
lem NWP ma własność optymalnej pod struktury. W twierdzeniu tym jest za-
warta obserwacja, że NWP dwóch ciągów zawiera NWP prefiksów tych cią
gów. Jak. się wkrótce przekonamy, rekurencyjny algorytm dla tego problemu
również ma własność wspólnych podproblemów.
362
16.3. NAJDŁUŻS2Y WSPÓLNY PODCIĄG
o, jeśli i= O lub j =O
c[i,J]= c[i-1,j-1]+1, jeśli i, j > Oi XI= Y1 (16.5)
max (c[i, j - I], c[i - I), J], jeśli i, j > O i xJ of. Y1
363
ROZDZ1AŁ 16. PROGRAMOWANIE DYNAMICZNE
10123456
1 ~ B D C A B A
- .
o o o o o o o o
''
1 A 1
o o o
1 1
' '-,
1 -1 ""
1...
' 1
2
3
B
C
o 1- -1
1 1
1 2
1 1
o 1 1 2 -.1 2 2
'
4 B 1 1 11,
'
o 1 1 2 2 3
1 1 1 t 1
-,
5
6
D
A,
o 1 2 2 2
1 1 1
3
- o 1 2 21 ' 3 3 4
'
1 1 1 t
7 B
o
' 1 2 2 3
' 4 4
Rys. 16.3. Tablice ci b obliczone pr:rez procedurę LCS-LENOTH dla ciągów X= (A, B, C, B, D, A,
=
B) oraz Y (B, D, C, A, B, A). Kwadrat w wierszu i oraz kolumnie j zawiera wartość c[i, 11,
a także odpowiednią strzałkę będącą. wartością pola b(i,J1· Wartość 4 w c[7, 61- prawym dolnym
narożniku tablicy - jest długoicią NWP (B, C, B, A) ciągów X i Y. Dla i, j > O wartość c(i, j]
zależy tylko od tego, czy x 1 = Yp oraz od wartości c{i - l, 11, c[i, j - l] i c[i - I, j - l], które są
obliczane wcześniej niż c(i, Jl W celu skonstruowania NWP wystarczy podążać zgodnie ze strzał
kami w tablicy b, począwszy od prawego dolnego narożnika; ta ścieżka została zacieniowana,
Ka:Wa strzałka typu,,," na tej ścieżce odpowiada pozycji, dla której x 1 = y1jest elementem NWP
Konstrukcja NWP
Ko12ystając z tablicy b obliczonej przez LCS-LENGTH, można szybko obliczyć
NWP ciągów X= (xi, x 1, ... , x,,.) i Y = (y 1, y 2 , ••• , Y~>·Wystarczy rozpocząć
od b[m, n], a następnie kierować się zgodnie ze strzałkami w tablicy b. Każda
strzałka typu ., '\" w polu b[i, 11oznacza, że x 1 = YJnależy do NWP. Postępu
jąc w ten sposób, otrzymujemy elementy NWP w odwrotnej kolejności. Na-
stępująca procedura rekurencyjna wypisuje NWP ciągów X i Y we właściwej
kolejności. W tym celu należy ją wywołać następująco: PRINT-LCS(b, X,
length[X], length[Y].
PRINT-LCS(b, X, Y, i, J)
I ifi=Olubj=O
2 tben return
3 ifb[i,J1=,,1'"
4 then PRINT-LCS(b, X, i- 1,j- 1)
5 wypisz X;
6 else if b[i, 11 = ,,1"
364
16.3. NAJDŁUŻSZY WSPÓLNY PODCIĄG
Dla tablicy b z rys. 16.3 procedura ta wypisuje „BCBA". Czas jej działania
wynosi O(m + n), ponieważ co najmniej jedna z wartości i lub j jest zmniejsza-
na w każdym kroku rekurencyjnym.
Ulepszanie algorytmu
Algorytm zaprojektowany według ogólnych metod można często ulepszyć za-
równo pod względem złożoności czasowej, jak i pamięciowej. Jest to bardzo
powszechne zjawisko w przypadku narzucających się rozwiązań opartych na
programowaniu dynamicznym. Niektóre zmiany mogą uprościć algorytm i spo-
wodować zmniejszenie stałych czynników, lecz nie są w stanie poprawić złożono
ści asymptotycznej. Pewne ulepszenia mogą jednak dać w rezultacie znaczne
oszczędności asymptotyczne, jeśli chodzi o zajmowaną pamięć lub czas obliczeń.
Możemy na przykład zupełnie wyeliminować tablicę b. Wartość każdego
pola c[i, j] zależy tylko od co najwyżej trzech innych pól tablicy c: c[i - 1,
j - 1], c{i - 1, J1oraz c[i, j - 1]. Mając dane c{i, j], możemy w czasie 0(1)
ustalić bez odwoływania się do tablicy b, która z tych trzech wartości została
użyta do obliczenia c[i, j]. Dzięki temu możemy zrekonstruować NWP przy
użyciu procedury podobnej do PRINT-LCS w czasie O(m + n). (Zadanie 16.3-2
polega na implementacji tej procedury). Mimo że oszczędzamy w ten sposób
E>(mn)pamięci, pomocnicza pamięć potrzebna do obliczenia NWP nie zmniej-
sza się dzięki temu asymptotycznie, ponieważ nadal jest potrzebne E>(mn) pa-
mięci na tablicę c.
Okazuje się jednak, że możemy mimo wszystko zmniejszyć asymptotyczną
złożoność pamięciową procedury LCS-LENGTH, gdyż wystarczają zawsze tyl-
ko dwa wiersze tablicy c: wiersz właśnie obliczany oraz wiersz bezpośrednio go
poprzedzający. (W rreczywistości do obliczenia długości NWP trzeba wykorzy-
stać tylko odrobinę więcej pamięci niż jeden wiersz tablicy c. Patrz zad. 16.3-4).
To ulepszenie działa jedynie wtedy, kiedy potrzeba podać tylko długość NWP.
Jeśli musimy także zrekonstruować elementy NWP, to mniejsza tablica nie
zawiera dość informacji do odtworzenia rozwiązania w czasie O(m + n).
ZADANIA
365
ROZDZIAŁ 16. PROGRAMOWANIE DYNAMICZNE
16.3-4. Pokaż, jak obliczyć długość NWP, używając tylko 2min(m, n} elementów
tablicy coraz 0(1} dodatkowej pamięci. Następnie uzasadnij, że w rzeczywiff
stości wystarczy min(m, n) pól w tablicy oraz 0(1} dodatkowej pamięci.
16.J..5. Podaj algorytm znajdujący w czasie O(n 2} najdłuższy monotonicznie
rosnący podciąg danego ciągu n liczb.
* 16.3-6. Podaj algorytm znajdujący w czasie O(nlogn} najdłuższy monotonicz~
nie rosnący podciąg danego ciągu n liczb. (Wskazówka: Zauważ, że ostatni
element kandydata na najdłuższy podciąg długości i jest nie mniejszy
niż ostatni element pewnego kandydata na najdłuższy podciąg długości
i - 1. Przechowuj informacje o takich kandydujących podciągach w osobff
nej tablicy).
16.4. Optymalnatriangulacjawielokąta
W tym podrozdziale poddamy analizie problem optymalnej triangulacji wieloff
kąta wypukłego. Mimo że pozornie tak różny od dotychczas rozważanych
zagadnień, ten geometryczny problem okaże się zaskakująco podobny do pro~
blemu optymalnego nawiasowania iloczynu ciągu macierzy.
Wielokąt to płaska figura geometryczna ograniczona łamaną z.amkniętą,
czyli krzywą mającą początek i koniec w tym samym punkcie i złożoną z od~
cinków, zwanych bokami wielokąta. Punkty wspólne dwóch sąsiednich boków
wielokąta nazywamy jego wierzchołkami. Zbiór punktów na płaszczyźnie za~
mknięty przez wielokąt nazywamy jego wnętrzem. Punk.ty leżące na krzywej
wielokąta tworzą jego bneg, a zbiór punktów otaczających wielokąt stanowi
jego zewnętrze. Wielokąt jest wypukły, jeśli jest spełniony następujący warunek:
dla dowolnej pary punktów leżących na jego brzegu lub we wnętrzu wszystkie
punk.ty na odcinku łączącym tę parę punktów należą do brzegu lub do wnętrza
wielokąta.
Każdy wielokąt wypukły możemy reprezentować za pomocą ciągu jego
wierzchołków, uporządkowanego przeciwnie do ruchu wskazówek zegara.
Zgodnie z tą umową P = (v 0, v1, ••• , vn_1) reprezentuje wielokąt wypukły
o n bokach V0v;, v1vz, ..., v,,._1vn, gdzie vn utożsamiamy z v0 • (Ogólnie będziemy
zakładać, że arytmetyka na indeksach wierzchołków będzie arytmetyką moduff
Io liczba wierzchołków).
Dla dowolnych nie sąsiadujących wierzchołków v1 i v1 odcinek v1v1 nazywaff
my przekątną wielokąta. Przekątna vpi dzieli wielokąt na dwa wielokąty:
(v 1, v1+ 1, ••• , v1) oraz (v 1, v1 + u ... , v1). Triangulacja wielokąta to tak.i zbiór
T jego przekątnych, który dzieli wielokąt na rozłączne trójkąty (wielokąty
o trzech bokach}. Na rysunku 16.4 widać dwie triangulacje siedmiokąta (wiele~
kąta o 7 bokach}. W triangulacji wielokąta nie ma przecinających się przekątff
nych (poza punktami końcowymi}; zbiór T jest też maksymalny: każda prze-
366
16.4. OPTYMALNA TRIANGULACJA WIELOKĄTA
'
'''
''
''
...•' ' ' --------------------~
•• .
''
' ''' ..' ''
..
'' '
'
..• .
''
' '
'''
'
..... ''
'' ,,
''
'
'' ...
''
.,'
.. ..
' ' '
' '\
.' ,
-- ,' -,,"'s
'' ''
'' '' ,'
'' '''
, ' , .. '
\
''
.--.,
, ,
-·---- ,
,,
•.
'' ''. ;
\
' ;•,
,' ,,-
,,' '• ,,
(>) (b)
367
ROZDZIAŁ 16. PROGRAMOWANIEDYNAMICZNE
'o
A,
''
,, ''' ''
'
A, '' '' ,''
' ' A
' '
/ ' ''
'' '' ,,
'' ' '
'' '
I ''
j , , '
'
'''
'I ' '
''
j , I
(•) (b)
Rys. 16.5, Drzewa struktury. (a) Drzewo struktury ponawiasowanego iloczynu ((A.1(A0 1))
(A4 (A.sA~)))oraz triangulacji siedmiokąta wypukłego z rys. 16.4a. (b) Triangulacja wielokąta
z wpisanym drzewem struktury. Każda macierz A 1 odpowiada bokowi v,_1v1 dla i= 1, 2, ..., 6
368
16.4. OPTYMALNA TRIANGULACJA WIELOKĄTA
369
ROZDZIAŁ 16. PROGR.A.MOW.A.NłE DYNAMICZNE
Rozwiązanie rekurencyjne
Podobnie jak m[i, ;1 oznaczało minimalny koszt obliczenia iloczynu podciągu
macierzy A;A; + 1 ••• Ap tak przez t[i, j] dla 1 ~ i~ n będziemy oznaczać wagę
optymalnej triangulacji wielokąta (v;_ 1, vl" ... , v1). Dla wygody przyjmijmy, że
zdegenerowany wielokąt (v 1_ 1, vj) ma wagę O. Waga optymalnej triangulacji
wielokąta P jest równa t[l, n].
Zdefiniujemy teraz wartość t[i, j] za pomocą tożsamości rekurencyjnej.
Warunek brzegowy dotyczy wielokątów zdegenerowanych (2-kątów): t[i, i] =
= Odla i= I, 2, ... , n. Jeślij - i;;,-1, to mamy do czynienia z wielokątem (v;_ 1,
V;, ... , v ) o co najmniej 3 wierzchołkach. Musimy teraz zminimalizować po
1
wszystkich wierzchołkach vk> dla k = i, i+ 1, ..., j - 1, sumę wag trójkąta
.1.v_ vkv oraz optymalnych triangulacji wielokątów (v;_ 1, V;, ..., vk) i (vk,
11 1
vk+ 1, ••• , v1). Oto odpowiednia zależność rekurencyjna:
o dla i=j
dla i <J (16.7)
l[i, Jl - min {t[i, kJ + l[k + 1, Jl + w(av,_, v,v1))
ł,o;;t<!;J-1
ZADANIA
16.4-1. Udowodnij, że każda triangulacja n-wierzchołkowego wielokąta wypu-
kłego zawiera n - 3 przekątne i dzieli wielokąt na n - 2 trójkąty.
16.4-2. Profesor Guinevere wysunął hipotezę, że istnieje szybszy algorytm dla
szczególnego przypadku problemu optymalnej triangulacji, w którym
funkcja wagi trójkąta jest jego polem powierzchni. Czy profesor ma rację'}
16.4-3. Przyjmijmy, że funkcja wagi w została zdefiniowana na przekątnych
triangulacji, a nie na jej trójkątach. Waga triangulacji względem w jest
w tym wypadku sumą wag jej przekątnych. Wykaż, że ta wersja problemu
optymalnej triangulacji jest szczególnym przypadkiem problemu optymal-
nej triangulacji z wagą określoną na trójkątach.
16.4-4. Wym.acz optymalną triangulację ośmiokąta foremnego o boku długo
ści jednostkowej. Użyj następującej funkcji wagi:
370
PROBLEMY
Problemy
16-1. Bitoniczny problem komiwojażera
Enklidesowy problem komiwojażera polega na wyznaczeniu najkrótszej za-
mkniętej ścieżki, która łączy zbiór n punktów na płaszczyźnie. Na rysunku
16.6a widać rozwiązanie dla 7 punktów. Ogólny problem jest NP-zupełny, co
w przekonaniu wielu informatyków oznacza, że raczej nie istnieje algorytm
działający w czasie wielomianowym (patrz rozdz. 36).
<•> (b)
Rys. 16.6. Siedem punktów na płaszczyźnie, UI.Zllaczonychna siatce. (a) Najkrótsz.a zamknięta ścież
ka o długości 24,88 ... Ta ścieżka nie jest bitoniczna. {b) Najkrótsza ścieżka bitoniczna dla tego
samego zbioru punktów. Jej długość wynosi 25,58 ...
--------------------~--··----~
371
ROZDZIAŁ 16. PROGRAMOWANIE DYNAMICZNE
372
PROBLEMY
(a) Opisz algorytm tworzą.cy listę zaproszonych gości w ten sposób, aby zmak-
symalizować sumę ich „współczynników towarzyskości". Oszacuj czas
działania tego algorytmu.
(b) Jak profesor może zagwarantować, że szef firmy zostanie zaproszony na
organizowany przez siebie bankiet?
(b) Ulepsz swoje rozwiązanie części (a), aby algorytm wyznaczał zawsze naj-
bardziej prawdopodobną ścieżkę o początku v0 i etykiecie s. Oszacuj czas
działania tego algorytmu.
Uwagido rozdziału
Systematyczne badanie metody programowania dynamicznego rozpoczął
R. Bellman w 1955 r. Słowo „programowanie" zarówno tutaj, jak i w pro-
gramowaniu liniowym odnosi się do metody tabelarycznej rozwiązywania pro-
blemów. Mimo ze metody optymalizacyjne o cechach programowania dyna-
micznego były znane już wcześniej, Bellman zbudował solidne podstawy mate-
matyczne tej metody [21]. Hu i Sbing [106] podali algorytm dla problemu
optymalnego nawiasowania iloczynu ciągu macierzy działający w czasie
O(nlogn). Zauważyli też bliski związek problemu optymalnej triangulacji wie-
lokąta z problemem optymalnego nawiasowania.
Algorytm wyszukiwania najdłuższego wspólnego podciągu działający
w czasie O(mn) był powszechnie znany od dawna. Knuth [43] postawił pytanie,
czy istnieje algorytm dla problemu NWP o złożoności mniejszej niż kwadrato-
wa. Pozytywnej odpowiedzi na to pytanie udzielili Masek i Paterson [143],
podając algorytm działający w czasie O(mnjlogn), gdzie n~ m, a ciągi należą
do zbioru o ograniczonym rozmiarze. Dla szczególnego przypadku, w którym
żaden element nie występuje wielokrotnie w ciągu wejściowym, Szymanski
[184] poda! algorytm działający w czasie O{{n + m)log(n + m)). Wiele z tych
rezultatów daje się uogólnić do problemu obliczania odległości redakcyjnej
między napisami (problem 16-3).
Rozdział 17
Algorytmy zachłanne
375
ROZDZIAŁ 17. ALGORYTMY ZACHŁANNE
(17.l)
GREEDY-ACTIVITY-SELECTOR(s,.f)
1 n +- length [s]
2 A-{l}
3 j +-1
4 fori+-2ton
5 doifs 1;;=:Jj
6 thenA-Au{i}
7 j +- i
8 return A
Działanie
tego algorytmu jest zilustrowane na rys. 17. I. W zbiorze A są
gromadzone wybrane zajęcia. Zmiennaj zawiera ostatnio dodane do A zajęcie.
376
17.1. PROBLEM WYBORU ZAJĘC
' s, !,
I I 4
2 3 5 ~-,
' '
1 'j
3 o 6 b 3 1
1
4 5 7 4
I
5 3 8 b 5
1 4 '
7
6 5 9 6 :_____J
1 4
'
7 6 IO 7
1 f''l ' ----1
'
-
~
8 8 II 8
1 I 4
'
'
' '-
9 8 12
1 4' f 8
~
9
I
J
IO 2 I3 IO
E--··
1 4 I
'
II 12 14
1 4 I 8 v II I
I 4 8 li
--~--~--·:
O 1 2 J 4
--=-----c--:----:---:-------:::-----:
5 6 7 R 9 IO l l
----:::---:~---:::~
12 13 14
c,~
Rys. 17.1. Działanie procedury GREEDY-ACTMTY-SELECTOR na 11-eJementowym zbione zajęć
przedstawionym po lewej stronie rysunku. Każdy poziomy rząd na rysunku odpowiada jednej
iteracji pętli for w wierszach 4-7. Zajęcia włączone do zbioru A zostały zacieniowane, a zajęcie
i (białe na rysunku) jest aktualnie rozpatrywane. Jeśli czas rozpoczęcia s1 zajęcia i jest wcześniejszy
niż czas zakończenia!, zajęcia ostatnio dcxianego do A (strzałka między nimi wskazuje na lewo), to
zostaje ono odrzucone. W przeciwnym razie (strzałka wskazuje do góry lub w prawo) zostaje ono
wybrane i dodane do zbioru A
ROZDZIAŁ 17, ALGORYTMY ZACHŁANNE
W wierszach 2-3 jest wybierane zajęcie 1, jednoelementowy zbiór {1} staje się
wartością zmiennej A, a zmiennej j zostaje przypisany numer tego zajęcia.
W wierszach 4-7 są kolejno rozpatrywane wszystkie zajęcia i; każde z nich
zostaje dołączone, jeżeli jest zgodne ze wszystkimi dotychczas dołączonymi
zajęciami. Aby stwierdzić, czy zajęcie i jest zgodne z każdym zajęciem ze zbioru
A, wystarczy zgodnie z równaniem (17 .2) sprawdzić (wiersz 5), czy jego czas
rozpoczęcia s; nie jest wcześniejszy niż czas zakończenia /j zajęcia ostatnio
dodanego do A. Jeśli zajęcie i jest zgodne, to w wierszach 6-7 zostaje ono
dodane do zbioru A oraz jest aktualizowana wartość j. Procedura GREEDY-
-ACTIVITY-SELECTOR jest dość efektywna. Zakładając, że dane wejściowe są
uporządkowane rosnąco według czasów zakończenia zajęcia, GREEDY-ACTIVI-
TY-SELECTORwyznacza maksymalny podzbiór zajęć z n-elementowego zbioru
S w czasie E>(n).
Zajęcie wybierane przez GREEDY-ACTIVITY-SELECTOR ma zawsze najwcze-
śniejszy czas zakończenia wśród zajęć, które mogą być dołączone bez zakłócenia
zgodności zbioru A. Ten wybór jest „zachłanny" w tym sensie, 7.epozostawia
intuicyjnie możliwie najwięcej swobody przy wyborze pozostałych zajęć. Jest tak,
bo wybór tak.i maksymalizuje ilość nie zajętego czasu po jego dokonaniu.
TWIERDZENIE 17.1.
Algorytm GREEDY-ACTMTY-SELECTORgeneruje rozwiązanie problemu wy-
boru zajęć o największym rozmiarze.
DOWÓD
Niech S = {1, 2, ... , n} będzie zbiorem zajęć. Ponieważ zakładaliśmy, że zajęcia
są uporządkowane według czasu zakończenia, zajęcie 1 ma najwcześniejszy
czas zakończenia. Wykażemy, że istnieje optymalne rozwiązanie, które można
rozpocząć od wyboru zachłannego, tj. od wybrania zajęcia 1.
Załóżmy, że A s; Sjest optymalnym rozwiązaniem. Niech elementy A bę
dą uporządkowane ze względu na czas zakończenia. Przyjmijmy też, że pierw-
szym zajęciem należącym do A jest zajęcie o numerze k. Jeśli k = 1, to tworze-
378
17.1. PROBLEM WYBORU ZA.JĘC
•
ZADANIA
17.1-1. Podaj algorytm optymalnego wyboru zajęć oparty na programowaniu
dynamicznym, obliczający iteracyjnie wartość m1 dla i= 1, 2, ... , n, gdzie
m; jest rozmiarem największego zgodnego podzbioru zbioru {1, 2, ... , i}.
Przyjmij założenie, że czynności na wejściu zostały uporządkowane tak, by
spełniały zależność (17.1). Porównaj czas działania swojego rozwiązania
z czasem działania procedury GREEDY-ACTIVITY-SELECTOR.
17.1-2. Mamy dany zbiór zajęć, które mają się odbywać w pewnej liczbie sal
wykładowych. Chcemy użyć do tego celu możliwie najmniejszej liczby sal.
Podaj efektywny algorytm zachłanny wyznaczający przydział zajęć do sal.
(Problem ten jest również znany jako kolorowanie grafu przedziałów. Graf
przedziałów tworzymy, traktując zajęcia jako wierzchołki i łącząc krawę
dziaini wzajemnie kolidujące zajęcia. Najmniejsza liczba kolorów potrzebna
do pokolorowania wszystkich wierzchołków, tak aby żadna para sąsiednich
wierzchołków nie miała tego samego koloru, odpowiada najmniejszej liczbie
sal wykładowych potrzebnych do odbywania się wszystkich zajęć).
17.1-3. Nie każde zachłanne podejście do problemu wyboru zajęć daje największy
zgodny zbiór zajęć. Podaj odpowiedni kontrprzykład dla strategii polegającej
na wyborze zajęcia o najmniejszym czasie trwania spośród zajęć zgodnych
z dotychczasowo wybranymi. Zrób to samo dla strategii opartej na wyborze
zajęcia, które koliduje z najmniejszą liczbą zajęć pozostałych do rozpatrzenia.
379
ROZDZIAŁ 17. ALGORYTMY ZACHŁANNE
17.2. Podstawystrategiizachłannej
Algorytm zachłanny dochodzi do optymalnego rozwiązania przez podejmowa-
nie ciągu decyzji. Za każdym razem jest podejmowana decyzja, która wydaje
się w tej chwili najlepsza. Stosując taką heurystyczną strategię, nie zawsze
otrzymuje się optymalne rozwiązania, lecz jak się przekonaliśmy na przykła
dzie problemu wyboru czynności, dla niektórych problemów jest to w pełni
uzasadnione. W tym podrozdziale omówimy ogólne własności metody za-
chłannej.
Jak przekonać się, czy algorytm zachłanny poprawnie rozwiązuje dany
problem optymalizacyjny? Nie ma niestety żadnej ogólnej metody, lecz dwie
cechy są charakterystyczne dla większości problemów poddających się strategii
zachłannej: własność wyboru zachłannego oraz optymalna podstruktura.
380
17.2. PODSTAWY STRATEGII ZACHŁANNEJ
Optymalna podstruktura
381
ROZDZIAŁ 17. ALGORYTMY ZACHŁANNE
80 ,I
Przedmiot 3 30 120 zł
+
Przedmiot 2 + 30 120 zł
20 100 zł 20 100 ,I
Przedmiot J 30 + +
zł
~
20 100
20 60 ,I 60 ,I
60 zł 100 zł 120 zł Plecak =220 zł "'160 zł =IROzl =240 zł
(a) (b) (c)
Rys. 17.2, Sl.ralegia zachłanna nie jest poprawna dla dyskretnego problemu plecak.owego. (a) 710-
dziej może wybrać podzbiór trzech pr:redmiotów, którego waga nie przekracza 50 kg. (b) Optymal-
ny podzbiór składa się z prt.edmiotów 2 i 3. Żadne rozwiązanie zawierające przedmiot I nie jest
optymalne, mimo że ma on najwięksZ\ wartość na jednostkę masy. (c) Wybór substancji w kolej-
ności ich wartości na kilogram masy daje optymalne rozwiązanie ciągłego problemu plecak.owego
382
17.3. KODY HUFFMANA
----~----~ -----"------"-·- -=
383
ROZDZIAŁ 17. ALGORYTMY ZACHŁANNE
• b
' d • t
Częstość (w ty&iącach) 4S 13 12 16 9 S
Słowo kodowe o ustalonej długości OOO 001 010 011 100 101
Słowo kodowe o zmiennej długości O 101 100 111 1101 1100
Rys. 17.3. Problem kodowania maków. W pliku o długości 100000 występują tylko znaki a-t,
z podanymi częstościami. Jeśli każdemu makowi przypiszemy 3-bitowykod, można ten plik zapisać
za pomocą, 300000 bitów. Używając kodów o zmiennej długości, można zmniejszyć tę liczbę do
224OOObitów
Kody prefiksowe
Będziemy teraz rozważać tylko takie kody, w których kod żadnego znaku nie
jest prefiksem kodu innego znaku. Takie kody nazywa się kodami prefiksowy-
mi. Można pokazać (choć nie udowodnimy tutaj tego faktu), że za pomocą
kodów prefiksowych można uzyskać maksymalny stopień kompresji, osiągal
ny za pomocą kodów przypisanych znakom na stałe. Dzięki temu, rozpatrując
tylko kody preftksowe, nie tracimy ogólności w naszych poszukiwaniach op-
tymalnych kodów.
384
17.3. KODY HUFFMANA
100 100
o 1 o
a:45
Il
14
(a) (bi
Rys. 17.4, Drzewa odpowiadające kodom z rys. 17.3. Kai.dy liść jesl etykielowany znakiem i liczbą
jego wystąpień w pliku. Każ.dy węzeł wewnętrmy jest etykielowany sumą wag liści w poddrzewie,
którego jest korzeniem. (a) Drzewo odpowiadające kodowi o sWej długości 11= OOO,..., f = !Ol.
(b) Orz.ewo odpowiadające optymalnemu kodowi prefiksowemu 11 = O, b = 101, ... , f = 1100
385
ROZDZIAŁ 17. ALGORYTMY ZACHŁANNE
są kody rozpoczynające się od 10... , lecz nie ma kodu o początku 11... Możemy
się, bez zmniejszenia ogólności, ograniczyć do regularnych drzew binarnych,
wobec tego jeśli bierzemy pod uwagę znaki ze zbioru (alfabetu) C, to drzewo
optymalnego kodu prefiksowego ma dokładnie ]Clliści oraz dokładnie ICI- 1
węzłów wewnętrznych.
Mając dane drzewo T odpowiadające kodowi prefiksowemu, łatwo jest
obliczyć liczbę bitów potrzebnych do zakodowania pliku. Niech dla każdego
znaku c z alfabetu C liczba /(c) będzie liczbą występień znaku c w pliku,
a dr(c) długością kodu znaku c. Liczba bitów potrzebnych do zakodowania
pliku jest więc równa
Tworzeniekodu Huffmana
Huffman wynalazł algorytm zachłanny, za pomocą którego jest tworzony op-
tymalny kod prefiksowy, nazywany na jego cześć kodem Huffmana. Algorytm
polega na budowaniu w sposób wstępujący drzewa T odpowiadającego op-
tymalnemu kodowi. Zaczyna się od zbioru ICI liści, a następnie wykonuje się
ICI- 1 operacji „scalania", które dają w efekcie jedno drzewo.
W następującej procedurze przyjmujemy, że C jest zbiorem n znaków i że
każdemu znakowi ce C odpowiada jego liczba wystąpień/{c}. Kolejka priory-
tetowa Q z atrybutami/ w roli kluczy została użyta do wyznaczania dwóch
obiektów o najmniejszej liczbie wystąpień, które należy scalić. Wynikiem scale-
nia dwóch obiektów jest nowy obiekt, którego liczba wystąpień jest sumą licz-
by wystąpień jego składowych.
HUFFMAN(C)
1 n~1c1
2 Q~c
3 fori+-1 ton-I
4 do z +- AL LOCATE-N ODEQ
5 x~ /eft[z] ~ EXTRACT-MIN(Q)
6 y +- right[z] +- EXTRACT-MIN(Q)
7 /[z]~ /[x] +f[y]
8 INSERT(Q, z)
9 return EXTRACT-MIN(Q)
386
17.3. KODY HUFFMANA
,,, 14 (d)
'
25 30
o I o I
1c:121 1b:IJ1 14 ld:16
o I
lf:511•:91
Rys. 17.5. Kroki algorytmu Huffmana dla częstości wystąpień znaków z rys. 17.3. Każda część
przedstawia zawartość kolejki uponądkowaną według częstości wystąpień. W każdym kroku dwa
drzewa o najmniejszej liczbie wystąpień zostają sca..lone.Liście są pnedstawione jako prostokąty
zawierające znak i częstość jego wystąpień. Węzły wewnętrzne są reprezentowane przez kółka
zawierające sumę częstości wystąpień ich dzieci. Krawędż etykietowana O łączy węzeł wewnętrzny
z jego lewym synem, a etykietowana I - z prawym. Kod litery jest ciągiem etykiet krawędzi na
ścieżce cxl korzenia do liścia etykietowanego tą literą. (•) Początkowy zbiór n = 6 liści, po jednym
dla każdej litery. (bKe) Fazy przejściowe. (0 Końcowe drr.ewo
387
ROZDZIAŁ 17. ALGORYTMY ZACHŁANNE
LEMAT17.2.
Niech C będzie alfabetem, a każdy znak ce C występuje J[c] razy. Niech
x i y będą parą znaków z C o najmniejszej liczbie wystąpień. Istnieje wtedy
optymalny kod prefiksowy dla C, w którym kody dla x i y mają tę samą
długość i różnią się tylko na ostatnim bicie.
DOWÓD
Idea dowodu polega na zmodyfikowaniu drzewa T reprezentującego dowolny
optymalny kod prefiksowy, aby odpowiadało ono innemu optymalnemu ko-
dowi prefiksowemu o tej własności, że znaki x i y są reprezentowane przez
bliźniacze liście o największej głębokości w drzewie. Jeśli uda się nam wykonać
taką operację, to kody x i y będą rzeczywiście miały równą długość i będą się
różnić tylko na ostatnim bicie.
T' T"
T"
- /-
b
-b
y
' • ' y
Rys. 17.6. llustraeja kluczowego kroku w dowodzie lematu 17.2. W optymalnym drzewie T liście
bi c są najgłębszymi liśćmi i slanowią rodzeństwo. Liście .:ci y są liśćmi, które algorytm Huffma-
na scala w pierw&zym kroku; znajdują się one na dowolnych pozycjach w T. Liście b oraz
x zostają rnmienione miejscami, przez co otrzymujemy drzewo r. Następnie liściec oraz y zo-
stają zamienione miejscami, w wyniku czego otrzymujemy drzewo T». Ponieważ iadna zamiana
nie powiększa kosztu, wynikowe drzewo T" jest również optymalne
3~8~8-----------------------
17.3. KODY HUFFMANA
LEMAT17.3.
Niech T będzie regularnym drzewem binarnym odpowiadającym optymalne-
mu kodowi prefiksowemu nad alfabetem C. Dla każdego znaku ce C definiuje-
my /[c] jako liczbę jego wystąpień. Załóimy, że znaki x oraz y występują
w T jako bracia i niech z będzie ich ojcem. Wtedy, traktując z jako znak
389
ROZDZIAŁ 17. ALGORYTMY ZACHŁANNE
DOWÓD
Wykażemy najpierw, że koszt B(T) drzewa T można wyrazić w kategoriach
kosztu B(T') drzewa T', biorąc pod uwagę składniki kosztu w równaniu 17.3.
Dla każdego ccC- {x, y} mamy d,(c) = d,,(c), więc też i f[c]dr(c) =
= f[y]dT,(c). Ponieważ dT(x) = dT(y) = dT,(z) + 1, zachodzą więc równości
TwlERDZENIE 17.4.
•
Procedura HUFFMANgeneruje optymalny kod prefiksowy.
DOWÓD
Natychmiastowy z lematów 17.2 i 17.3.
ZADANIA
•
17.3-1. Udowodnij, że drzewo binarne, które nie jest regularne, nie może od-
powiadać optymalnemu kodowi preftk:sowemu.
17.3-2. Jaki jest optymalny kod Huffinana dla następującego zbioru częstości
wystąpień liter opartego na początkowych 8 liczbach Fibonacciego?
390
* 17.4. TEORETYCZNE PODSTAWY STRATEGII ZACHŁANNYCH
17.3-3. Udowodnij, że koszt całego
drzewa kodu można obliczyć jako sumę, po
wszystkich węzłach wewnętrznych, sum częstości wystąpień ich potomków.
17.3-4. Udowodnij, że dla optymalnego kodu i ciągu znaków o nierosnących
częstościach wystąpień odpowiedni ciąg długości ich kodów jest niemalejący.
17.3-5. Niech C = {O, 1, ..., n -1} będzie zbiorem znak.ów. Udowodnij, że
każdy optymalny kod prefiksowy dla C można przedstawić za pomocą
•
ciągu
2n-l +n 1Ignl
bitów. (Wskaz6wka: Użyj 2n - 1 bitów do reprezentacji drzewa).
17.3-6. Uogólnij algorytm Huffmana do kodów trójkowych (tzn. kodów uży~
wających symboli O, 1 i 2) i udowodnij, że generuje on optymalne kody
trójkowe.
17.3-7. Załóżmy, że plik danych zawiera 8-bitowe znaki i wszystkich 256 zna-
ków występuje w przybliżeniu równie często: maksymalna częstość wystą
pienia znak.u jest co najwyżej dwa razy większa od najmniejszej częstości
wystąpienia innego znaku. Udowodnij, że kody Huffmana nie dają w ta-
kiej sytuacji żadnego zysku w porównaniu ze zwykłym 8-bitowym kodem.
17.3-8. Wykaż, że żadna metoda kompresji nie może zagwarantować zmniej-
szenia pliku losowo wybranych 8-bitowych znaków nawet o jeden bit.
(Wskazówka: Porównaj liczbę plików z liczbą potencjalnych plików skom-
presowanych).
*17.4. Teoretycznepodstawystrategiizachłannych
W tym podrozdziale przedstawiamy teorię związaną z algorytmami zachłan
nymi. "feoria ta bywa użyteczna w określaniu, w jakich sytuacjach strategia
zachłanna prowadzi do optymalnych rozwiązań. Dotyczy ona obiektów kom-
binatorycznych zwanych „matroidami". Mimo że teoria matroidów nie obej-
muje wszystkich przypadków stosowania metody zachłannej (w szczególności
nie daje się zastosować do problemu wyboru zajęć z podrozdz. 17.1 lub prob-
lemu kodów Huffmana z podrozdz. 17.3), jednak znajduje wiele praktycznych
zastosowań. Co więcej, teoria ta gwałtownie się rozwinęła i znalazła wiele róż
norodnych zastosowań; w uwagach na końcu tego rozdziału moi-na znaleźć
odpowiednie odnośniki do literatury.
17.4.1. Matroidy
Matroid jest parą uporządkowaną M = (S, Jf) spełniającą następujące warunki:
391
ROZDZIAŁ 17. ALGORYTMY ZACHŁANNE
TwlERDZENIE17.5.
Jeśli G jest grafem nieskierowanym, to MG = (SG, JG) jest matroidem.
DOWÓD
Oczywiście SG = E jest zbiorem skończonym. Zbiór Jo jest dziedziczny, ponie-
waż podzbiór lasu jest też lasem. Inaczej mówiąc, usuwając krawędzie z acyk-
licznego zbioru krawędzi, nie można utworzyć nowego cyklu.
Pozostaje zatem wykazać, że MG ma własność wymiany. Załóżmy, że
A i B są lasami w G oraz że IBI> IAI,tzn. A oraz B są acyklicznymi zbiorami
krawędzi, przy czym B zawiera więcej krawędzi niż A.
Z twierdzenia 5.2 wynika, że las zawierający k krawędzi składa się z do-
kładnie IV]- k drzew. (Oto inne uzasadnienie: rozpoczynamy od IVIdrzew
i żadnych krawędzi. Dodanie do lasu każdej nowej krawędzi miniejsza liczbę
drzew o 1). Stąd wnioskujemy, że las A składa się z IVI- IAIdrzew, a las
B składa się z IV]- IBJdrzew.
Las B zawiera mniej drzew niż las A, musi więc zawierać pewne drzewo T,
którego wierzchołki leżą w dwóch różnych drzewach lasu A. Co więcej, Tmusi
zawierać taką krawędź (u, v), że wierzchołki u oraz v znajdują się w różnych
drzewach lasu A, ponieważ T jest spójne. Krawędź (u, v) łączy wierzchołki
w dwóch różnych drzewach w lesie A, może więc ona zostać dołączona do A,
392
* 17.4. TEORETYCZNE PODSTAWY STRATEGI! ZACHŁANNYCH
TwlERDZENIE 17.6.
Wszystkie maksymalne niezależne podzbiory matroidu mają ten sam rozmiar.
DOWÓD
Załóżmy przeciwnie, że A jest maksymalnym niezależnym podzbiorem M oraz
że istnieje inny, większy, maksymalny niezależny podzbiór B matroidu M.
Wtedy z własności wymiany wynika, że A można rozszerzyć do większego
zbioru niezależnego Au{x} dla pewnego xEB-A, co przeczy założeniu
o maksymalności A. +
Jako ilustrację tego twierdzenia rozpat..t2llly matroid grafowy MG dla spój-
nego grafu nieskierowanego G. Każdy maksymalny niezależny podzbiór MG
musi być drzewem o dokładnie IVl- I krawędziach, które łączą wszystkie
wierzchołki grafu G. Takie drzewo jest nazywane drzewemrozpinającym (ang.
spanning tree) grafu G.
Mówimy, że matroid M = (S, J) jest ważony, jeśli istnieje związana z nim
funkcja wagi w, która przypisuje dodatnią wagę w(x) każdemu elementowi
xES. Funkcja wagi w rozszerza się do podzbiorów Sza pomocą sumowania
w(A) ~ L w(x)
~,
po dowolnym zbiorze A c S. Jeśli na przykład w(e) oznacza długość krawędzi
e wmatroidzie grafowym MG, to w(A) jest sumą długości krawędzi ze zbioru A.
393
ROZDZIAŁ 17. ALGORYTMY ZACHŁANNE
GREEDY(M, w)
1 A.._0
2 uporządkuj S[.M] nierosnąco według wagi w
3 for xeS[.M], brane w porządku nierosnącym według wagi w(x)
4 do if A u {x}E.f[M]
5 thenA-Au{x}
6 return A
394
* 17.4. TEORETYCZNE PODSTAWY STRATEGII ZACHŁANNYCH
DOWÓD
Jeś1i nie istnieje takie x, to jedynym zbiorem niezależnym jest zbiór pusty i teza
jest trywialnie spełniona. W przeciwnym razie niech B będzie niepustym zbio-
rem optymalnym. Przypuśćmy, że xfB (w przeciwnym wypadku bierzemy
A = Bi teza znów wynika trywialnie).
Żaden element zbioru B nie ma wagi większej niż w(x). Aby się o tym
przekonać, wystarczy zauważyć, że jeśli y EB, to {y} jest niezależny, ponieważ
BEJ, a J jest dziedziczne. Nasz wybór x gwarantuje więc, że w(x) ;?!=w(y) dla
każdego y EB.
Tworzenie zbioru A przebiega następująco. Zaczynamy od A= {x}. Dzięki
wyborowi x zbiór A jest zbiorem niezależnym. Korzystając wielokrotnie z włas
ności wymiany, dodajemy do A pewne elementy B, zachowując niezależność A,
aż nie osiągniemy IAI =IBI.Wtedy A= B - {y} u {x} dla pewnego yEB, więc
Zbiór A jest zatem optymalny (bo B jest optymalny) oraz xEA, co kończy
dowód lematu. ł
395
ROZDZIAŁ 17. ALGORYTMY ZACHŁANNE
LEMAT 17.8.
Niech M = (S, .I) będzie dowolnym matroidem. Jeśli xe S nie jest rozszerze-
niem zbioru 0, to x nie jest rozszerzeniem żadnego niezależnego zbioru A.
DOWÓD
Dowód przeprowadzamy przez doprowadzenie do sprzeczności, Załóżmy, że
x jest rozszerzeniem zbioru A, choć nie jest rozszerzeniem zbioru pustego 0.
Ponieważ x jest rozszerzeniem A, zbiór A u {x} jest więc niezależny. Ale z defi-
nicji matroidu wiadomo, że .I jest dziedziczny, zatem {x} jest zbiorem nieza-
leżnym, co jest sprzeczne z założeniem, że x nie jest rozszerzeniem 0.
•
Lemat 17.8 mówi, że jeśli elementu nie daje się użyć natychmiast, to na
zawsze pozostaje bezużyteczny. Dlatego nie może być błędem pomijanie w pro-
cedurze GREEDY elementów S, które nie są rozszerzeniem 0, bo i tak nie
należą do żadnego zbioru niezależnego.
oraz funkcja wagi dla M' jest funkcją wagi dla M ograniczoną do S'. (Taki
matroid M' nazywamy kontrakcją Mo element x).
DOWÓD
Jeśli A jest niezależnym podzbiorem o maksymalnej wadze zawierającym x, to
A'= A - {x} jest niezależnym podzbiorem w M'. Odwrotnie, każdy niezależ
ny podzbiór A' matroidu M' odpowiada niezależnemu podzbiorowi
A - A' u {x} matroidu M. W obu przypadkach w(A) - w(A') + w(x), zatem
rozwiązanie o maksymalnej wadze w matroidzie M zawierające x odpowiada
optymalnemu rozwiązaniu w M' i na odwrót.
•
396
* 17.4. TEORETYCZNE PODSTAWY STRATEGII ZACHŁANNYCH
TwIERDZENIE17.10. (Poprawność algorytmu zachłannego na matroidacb)
Jeśli M = (S, $) jest ważonym matroidem z funkcją wagi w, to w wyniku
wywołania procedury GREEDY(M, w) jest wyznaczany optymalny podzbiór.
DOWÓD
Lemat 17,8 daje gwarancję, że każdy element początkowo pominięty, ponieważ
nie jest rozszerzeniem 0, może być pominięty w dalszym postępowaniu, bo
i tak pozostanie bezużyteczny. Z kolei z lematu 17.7 wynika, że pierwszy wy-
brany element x można dodać do A, ponieważ istnieje optymalny zbiór zawie-
rający x. Wreszcie z lematu 17.9 wynika, że po wyborze elementu x problem
polega na znalezieniu optymalnego podzbioru w matroid:rie M', będącym
kontrakcją matroidu M o element x. Po zainicjowaniu zmiennej A jednoele-
mentowym zbiorem {x} działanie procedury GREEDY można interpretować
jako działanie na matroidzie M' = (S', $'), ponieważ B jest zbiorem niezależ
nym w M' wtedy i tylko wtedy, gdy Bu {x} jest niezależny w M. Następne
kroki algorytmu GREEDYdoprowadzą zatem do znalezienia niezależnego pod-
zbioru w M' o maksymalnej wadze, a w ostatecznym rozrachunku w wyniku
wykonania całej procedury GREEDY zostanie wyznaczony podzbiór niezależny
matroidu M o maksymalnej wadze. +
ZADANIA
397
ROZDZIAŁ 17. ALGORYTMY ZACHŁANNE
*17.5. Problemszeregowaniazadań
Jednym z interesujących problemów, które można rozwiązać przy użyciu ma-
troidów, jest problem optymalnego szeregowania zadań o jednostkowym cza-
sie wykonywania z karami za przekroczenie terminu wykonania. Problem wy-
daje się dość skomplikowany, lecz daje się go rozwiązać zaskakująco łatwo za
pomocą algorytmu zachłannego.
Zadanie o jednostkowym czasie wykonania jest czynnością, taką jak pro-
gram działający na komputerze, której wykonanie wymaga jednostkowego
czasu. Dla danego zbioru zadań S ich uszeregowanie jest permutacją S od-
powiadającą kolejności ich wykonywania. Pierwsze zadanie w uszeregowaniu
zaczyna się w chwili O i kończy w chwili 1, drugie zaczyna w chwili I i kończy
w chwili 2 itd.
Problem szeregowania zadań o jednostkowym czułe wykonania z karami za
przekroczenie terminu wykonania ma następujące dane wejściowe:
• zbiór S = {1, 2, ... , n} zawierający n zadań o jednostkowym czasie wykonania;
• zbiór n dopuszczalnych terminów wykonania d 1 , d2 , ... , dn, takich że
1 ~ d1 ~ n, gdzie wykonanie zadania i ma zostać zakończone przed chwilą di;
• zbiór nieujemnych wag lub kar w1 , w2 , ••• , wn, takich że kara w1 zostaje
naliczona tylko wtedy, kiedy zadanie i nie jest zakończone przed chwilą d1•
Zadanie polega na znalezieniu uszeregowania zadań ze zbioru S, dla którego
suma naliczonych kar za niedotrzymanie terminu wykonania jest najmniejsza.
Rozważmy pewne uszeregowanie. Powiemy, że zadanie jest spóźnione
w tym uszeregowaniu, jeśli jego wykonanie kończy się po terminie. W przeciw-
nym razie mówimy, że zadanie jest terminowe. Dowolne uszeregowanie można
zawsze doprowadzić do terminowej postaci normalnej, w której terminowe za-
dania poprzedzają zadania spóźnione. Aby się o tym przekonać, wystarczy
zauważyć, że jeśli pewne spóźnione zadanie x poprzedza terminowe zadanie y,
to można zamienić je miejscami, po c-zym zadanie x nadal będzie spóźnione,
a y pozostanie terminowe.
Co więcej, przekonamy się, że każde uszeregowanie można sprowadzić do
postaci kanonicznej, w której terminowe zadania poprzedzają zadania spóźnio
ne oraz wszystkie terminowe zadania są uporządkowane niemalejąco według
dopuszczalnych terminów wykonania. W tym celu sprowadzamy najpierw
uszeregowanie do terminowej postaci normalnej. Następnie, dopóki można
znależć terminowe zadania i oraz j, których wykonanie kończy się odpowied-
nio w chwilach ki k + 1, takie że di< tł,,, zamieniamy je miejscami w naszym
uszeregowaniu. Ponieważ zadanie j jest terminowe przed zamianą, więc
k + 1 ~ di. Stąd k + 1 < d1, czyli zadanie i po zamianie jest nadal terminowe.
Zadanie jw oczywisty sposób pozostaje nadal terminowe (zostanie teraz wyko-
nane jeszcze wcześniej).
398
* 17.5. PROBLEM SZEREGOWANIA ZADAŃ
LEMAT17.11.
Dla dowolnego zbioru zadań A są równoważne następujące warunki:
DOWÓD
Oczywiście, jeśli
Nr(A) > t dla pewnego t, to nie jest możliwe uszeregowanie dla
A bez spóźnionych zadań, ponieważ jest więcej niż t zadań, które należy wyko-
nać przed chwilą t. Dlatego (I) implikuje (2). Jeśli z kolei zachodzi (2), to już
wynika (3): skoro bowiem każdy i-ty w kolejności dopuszczalny termin wyko-
nania jest nie mniejszy od i, to szeregując zadania niemalejąco według tego
terminu, żadne zadanie nie jest spóźnione. Wreszcie z (3) trywialnie wynika (1) .
•
Używając własności (2) z lematu 17.11, łatwo możemy sprawdzić, czy dany
zbiór zadań jest niezależny (por. zad. 17.5-2).
Problem minimalizacji sumy kar za spóźnione zadania jest tożsamy z pro-
blemem maksymalizacji sumy kar odpowiadających terminowym zadaniom.
Następujące twierdzenie uzasadnia użycie algorytmu zachłannego do wyzna-
czania niezale7..nego zbioru zadań A o maksymalnej sumie kar.
TwlERDZENIE 17.12.
Jeśli
Sjest zbiorem zadań o jednostkowym czasie wykonania, a J jest rodziną
wszystkich niezależnych zbiorów zadań, to (S, $) jest matroidem.
399
ROZDZIAŁ 17. ALGORYTMY ZACHŁANNE
DOWÓD
Każdy podzbiór niezależnego zbioru zadań jest też oczywiście niezależny. Aby
wykazać własność wymiany, załóżmy, że Bi A są zbiorami niezależnymi oraz
że ]BI > IAI. Niech k będzie największym takim t, że zachodzi Nr(B) ~ N 1(A).
Wiadomo, że N.(B) = IBI,N.(A) = IAIi [BI> IAI,więc k < n oraz dla każde
go jz przedziału k + 1 ~j < n zachodzi N;(B) > Ni(A). Stąd B zawiera więcej
zadań niż A o dopuszczalnym terminie wykonania nie większym od k + 1.
Niech x będzie zadaniem w B - A o dopuszczalnym terminie nie większym od
k +I.Niech A'= A u {x}.
Korzystając z własności (2) z lematu 17.11, wykażemy teraz, że zbiór A'
musi być niezależny. Dla 1 ~ t ~ k mamy Nr(A') ~ Ni(A) ~ t, ponieważ A jest
niezależny. Dla k < t ~ n mamy Nt(A')::;;; Nr(B) ~ t, ponieważ B jest niezależ·
ny. Stąd A' jest niezależny, co kończy dowód, że (S, .I') jest matroidem.
•
Twierdzenie 17.10 uzasadnia użycie algorytmu zachłannego do znajdowa·
nia niezależnego zbioru zadań A o największej wadze. Możemy następnie łat.
wo utworzyć optymalne uszeregowanie, mając dany zbiór jego terminowych
zadań A. Metoda ta daje efektywny algorytm szeregowania zadań o jednow
stkowym czasie wykonania z karami za przekroczenie terminu wykonania.
Czas działania tego algorytmu wynosi O(n 2 ), ponieważ algorytm GREEDY wy-
konuje O(n) sprawdzeń, czy zbiór jest niezależny; każde takie sprawdzenie
wymaga czasu O(n) (patrz zad. 17.5-2). Szybsza implementacja jest opisana
w problemie 17-3.
Zadanie
I 2 3 4 5 6 7
d(4243146
w1 70 60 50 40 30 20 10
Rys. 17.7. Przykład problemu szeregowania zadań o jednostkowym czasie wykonania z karami za
przekroczenie terminu wykonania
(2, 4, 1, 3, 7, 5, 6)
Z4DANIA
Problemy
17-1. Wydawaniereszty
Rozważmy problem wydawania reszty za pomocą jak najmniejszej liczby monet.
401
ROZDZIAŁ 17. ALGORYTMY ZACHŁANNE
Uwagido rozdziału
Znacznie więcej informacji o algorytmach zachłannych i matroidach można
znaleźć w publikacjach Lawlera [132] oraz Papadimitriou i Steiglitza [154].
Algorytm zachłanny pojawił się po raz pierwszy w literaturze na temat
optymalizacji kombinatorycznej w artykule Edmondsa [62), choć teoria mat-
roidów jest znana od 1935 r., gdy swój artykuł na ten temat opublikował
Whitney [200].
Nasz dowód poprawności algorytmu zachłannego dla problemu wyboru
zajęć pochodzi od Gavrila [80]. Problem szeregowania zadań był studiowany
przez Lawlera [132], Horowitza i Sahniego [105] oraz Brassarda i Bratleya [33].
Kody Huffmana zostały wynalezione w 1952 r. [107]; w pracy Lelewera
i Hirchberga [136] znajduje się przegląd metod kompresji danych znanych
w 1987 r.
Teoria matroidów została rozszerzona do teorii greedoidów w pionierskich
pracach Korte'a i Lovasza [127, 128, 129, 130], którzy znacznie uogólnili teorię
przedstawioną w tym rozdziale.
Rozdział 18
Analizakosztu
zamortyzowanego
403
ROZDZIAŁ 18. ANALIZA KOSZTU ZAMORTYZOWANEGO
18.1. Metodakosztusumarycznego
W metodzie kosztu sUD1arycznego wykazujemy, że dla każdego n pesymistyczny
czas wykonania ciągu n operacji można ograniczyć przez T{n). W pesymistycz-
nym przypadku średni koszt lub koszt zamortyzowany pojedynczej operacji
wynosi wtedy 'I{n)/n. Należy zaznaczyć, że koszt zamortyzowany odnosi się
tutaj jednakowo do każdej operacji, nawet jeśli w ciągu pojawiają się operacje
różnych typów. Pozostałe dwie metody analizy kosztu zamortyzowanego (me-
toda księgowania i metoda potencjału) umożliwiają przypisywanie różnych ko-
sztów zamortyzowanych różnym rodzajom operacji.
Operacjena stosie
Pierwszy przykład zastosowania metody kosztu sumarycznego dotyczy stosów,
na których można wykonywać dodatkową operację MULTIPOP.W podrozdziale
11.l omówiliśmy dwie elementarne operacje na stosach, działające w czasie 0(1):
Ponieważ każda z tych operacji działa w czasie 0(1 ), możemy przyjąć, i.e
jej koszt jest równy 1. Całkowity koszt ciągu n operacji PUSH i POP jest więc
równy n, a faktyczny czas działania n operacji wynosi 0(n).
Bardziej interesujący jest przypadek, kiedy dodamy operację MULTI-
POP(S, k), która usuwa k elementów z wierzchu stosu S lub opróżnia go, jeśli
na stosie było mniej niż k elementów. W następującej procedurze operacja
404
18.1. METODA KOSZTU SUMARYCZNEGO
SrACK~EMPTY daje w wyniku wartość TRUE, jeśli stos jest pusty, a wartość
FALSEw przeciwnym razie.
MULTIPOP(S,k)
I wbilenot STACK-EMPTY(S)i k 'F o
2 do POP(S)
3 k-k-1
wieuchołek .... 23
17
6
39
IO wierzchołek .... I O
47 47
Rys. 18.1. Przykład działania procedury MULTIPOPna stosie S. (a) Sytuatja początkowa. (b) Stos
S po wykonaniu operacji MULTIPOP(S, 4), która usunęła 4 elementy z wierzchu stosu. (c) Stos S po
wykonaniu operacji MULTIPOP(S, 7) jest pusty, ponieważ na stosie majdowało się mniej niż 7 ele-
mentów
405
ROZDZIAŁ 18. ANALIZA KOSZTU ZAMORTYZOWANEGO
Licznik binarny
Następnym przykładem użycia metody kosztu sumarycmego jest analiza dzia-
łania k-bitowego licznika binarnego, który może przyjmować nieujemne war-
tości całkowite. Licznik jest reprezentowany przez tablicę bitów A [O„ k - l],
gdzie length(A] = k. Najmniej znaczącym bitem liczby binarnej x, będącej war-
tością licznika, jest A {O], a najbardziej znac:zącym - A [le- l], więc
,-1
x= L A[i]·2 1• Początkowo x = O, więc A[i] = O dla i= O, I, ... , k- 1. Aby
i=O
zwiększyć wartość licznika o 1 (module 21), używamy następującej procedury:
lNCREMENT(A)
1 i+- O
2 wbllei< Iength[A] i A[i] = I
3 do A[i]-o
4 i+-i+l
5 H i < length [A]
6 thenA[i]-1
406
18.1. METODA KOSZI U SUMARYCZNEGO
=2n
407
ROZDZIAŁ 1 8. ANALIZA KOSZTU ZAMORTYZOWANEGO
ZADANIA
18.1-1. Czy ograniczenie 0(1) na koszt zamortyzowany operacji na stosie po-
zostanie w mocy, jeśli dopuścimy operację MULTIPUSH, która umożliwia
jednoczesne umieszczanie wielu elementów na stosie?
18.1-2. Uzasadnij, że jeśli dopuścimy operację DECREMENT, która zmniejsza
wartość k-bitowego licznika o 1, to ciąg n operacji może wymagać czasu
®(nk).
18.1-3. Wykonujemy ciąg n operacji na strukturze danych. Koszt i-tej operacji
jest równy i, jeśli i jest potęgą dwójki; w przeciwnym razie wynosi 1.
Dokonaj analizy kosztu zamortyzowanego za pomocą metody kosztu su-
marycznego.
18.2. Metodaksięgowania
Stosując do analizy kosztu zamortyzowanego metodę księgowania, możemy
przypisywać różne koszty zamortyzowane różnym rodzajom operacji. Niektóre
z nich są większe, inne mogą być mniejsze niż koszt faktyczny. Jeśli koszt
zamortyzowany operacji przewyższa jej koszt faktyczny, to różnica tych kosz-
tów jest przypisywana pewnym obiektom w strukturze danych Gest księgowa
na) jak.o kredyt. Kredyt może być później wykorzystany na zapłacenie za ope-
racje, których faktyczny koszt jest większy niż ich koszt zamortyzowany. Moż
na :zatem wyobrażać sobie, że koszt zamortyzowany operacji dzieli się na jej
koszt faktyczny oraz kredyt, który jest albo składany w depozyt, albo wykorzy-
stywany. Podejście takie różni się znacznie od metody kosztu sumaryczn.ego,
w której wszystkim operacjom przypisujemy ten sam koszt zamortyzowany.
Koszty zamortyzowane poszczególnych operacji należy dobierać z dużą
dozą ostrożności. Jeśli oczekujemy od analizy u pomocą kosztów zamortyzo-
wanych wykazania, że w najgorszym przypadku śrei:łni koszt operacji jest ma-
ły, to musimy zapewnić, że całkowity koszt zamortyzowany ciągu operacji
stanowi górne ograniczenie faktycznego kosztu tego ciągu. Co więcej, podob-
nie jak w metodzie kosztu sumarycznego, musimy udowodnić tę własność dla
wszystkich ciągów operacji. Dlatego suma kredytów związanych ze strukturą
da.Dych musi być przez cały czas nieujemna, ponieważ określa ona, o ile cał
kowity koszt zamortyzowany ciągu operacji przekracza jego koszt faktyczny.
Jeśli dopuścimy do sytuacji, w której kredyt jest ujemny (rezultat zainkasowa-
nia zbyt małego kredytu od wcześniejszych operacji w nadziei, że później po-
408
18.2. METODA KSIĘGOWANIA
Operacjena stosie
W celu zilustrowania metody księgowania powróćmy do przykładu ze stosem.
Przypomnijmy, że faktyczne koszty operacji na stosie są następujące:
PUSH I
POP I
MULTIPOP min(k, s)
PuSH 2
POP O
MULTIPOP 0
409
ROZDZIAŁ 18. ANALIZA KOSZTU ZAMORTYZOWANEGO
Co więcej,
nie musimy też obciążać żadnymi opiatami operacji MULTIFOP.
Aby zdjąć pierwszy talerz, wystarczy wziąć z niego 1 zł kredytu i zapłacić za
operację POP. W celu zdjęcia drugiego talerza znowu wystarczy wziąć z niego
1 zł kredytu i zapłacić za operację POP itd. Widać więc, że w każdej chwili
wystarczy uinkasowanych wcześniej pieniędzy na zapłacenie za następną ope-
rację MULTIPOP.Inaczej mówiąc, ponieważ na każdym talerzu znajduje się 1 zł
kredytu, a na stosie jest zawsze nieujemna liczba talerzy, kredyt jest więc za-
wsze wielkością nieujemną. Zagwarantowaliśmy w ten sposób, że dla każdego
ciągu n operacji PUSH, POP i MULTIPOP ich koszt zamortyzowany stanowi
górne ograniczenie na faktyczny koszt wykonania tych operacji. Ponieważ cał
kowity koszt zamortyzowany jest ograniczony przez O(n), tym bardziej to
ograniczenie jest słuszne dla kosztu faktycznego.
Licznik binarny
Kolejną ilustracją zastosowania metody księgowania jest analiza operacji IN-
CREMENTna liczniku binarnym. Jak wcześniej zaobserwowaliśmy, czas dzia-
łania tej operacji jest proporcjonalny do liczby zmodyfikowanych bitów - mo-
żemy traktować ją jak.o miernik faktycznego kosztu. Użyjmy raz jeszcze mo-
nety 1 zł do reprezentacji jednostkowego kosztu (w naszym przykładzie mo-
dyfikacji bitu).
Dla celów analizy zwiążmy z operacją przypisania bitowi wartości 1 koszt
2 zł. Gdy przypisujemy bitowi wartość 1, używamy 1 zł (z zainkasowanych
2 zł) na zapłacenie za modyfikację bitu, a drugą monetę 1 zł „kładziemy" na
tym bicie jako kredyt. W każdej chwili każdy bit 1 w liczniku ma 1 zł kredytu,
nie musimy więc nic inkasować, aby wyzerować ten bit, bo możemy użyć kre-
dytu związanego z tym bitem.
Teraz możemy już wyznaczyć koszt zamortyzowany operacji INCREMENT.
Koszt zerowania bitów w pętli wbile pokryty zostaje przez złotówki związane
z zerowanymi bitami. Co najwyżej jednemu bitowi przypisujemy wartość
I w wierszu 6 procedury INCREMENT,więc jej koszt zamortyzowany wynosi co
najwyżej 2 zł. Liczba jedynek w liczniku nie jest nigdy ujemna, zatem i kredyt
jest zawsze nieujemny. Wnioskujemy stąd, że całkowity koszt mmortyzowany
ciągu n operacji INCREMENTwynosi O(n), co jest także ograniczeniem na cal~
kawi.ty koszt rzeczywisty tego ciągu.
ZADANIA
18.2-1. Na stosie, którego rozmiar nigdy nie przekracu k, jest wykonywany
ciąg operacji. Co każde k operacji jest wykonywana kopia bezpieczeństwa
całego stosu. Wykaż, że koszt n operacji, wliczając koszt kopiowania, jest
ograniczony przez O(n); przypisz w tym celu operacjom na stosie odpo-
wiednie koszty zamortyzowane.
410
18.3. METODA POTENCJAŁU
18.3. Metodapotencja/u
W metodzie potencjału zamiast reprezentować nadpłatę kosztu jak.o kredyt ściś
le związany z pewnym.i obiektami w strukturze danych, trak.tuje się ją jako
,,energię potencjalną" (lub po prostu „potencjał"), która może być wyzwolo-
na, aby zapłacić za późniejsze operacje. Potencjał jest związany ze strukturą
danych jako całością, a nie z jej pojedynczymi obiektami.
Stosując metodę potencjału, postępujemy następująco. Na początku ma-
my strukturę danych D 0 , na której chcemy wykonać n operacji. Dla kaidego
i= 1, 2, ... , n niech c; oznacza faktyczny koszt i-tej operacji, a D 1 niech będzie
strukturą danych powstałą ze struktury D 1_ 1 po wykonaniu i-tej operacji.
Funkcja pot.encjalutl>przyporządkowuje każdej strukturze D 1 liczbę rzeczywi-
stą ll>(DJ, nazywaną pot.entjałem. struktury Di. Koszt zamortyzowany C1 dla i-tej
operacji względem funkcji potencjału tl>definiuje się jako
Druga równość wynika z równania (3. 7), ponieważ tl>(D1) się redukują.
Jeśli zdefiniujemy funkcję potencjału tł> tak, że tl>(D11) ~ tl>(D0 ), to całkowi-
411
ROZDZIAŁ 18. ANALIZA KOSZTU ZAMORTYZOWANEGO
Operacjena stosie
Aby zilustrować metodę potencjału, powróćmy jeszcze raz do przykładu ope-
racji na stosie: PUSH, POP i MULTIPOP. Zdefmiujmy funkcję potencjału Cl»na
stosie jako jego wysokość. Dla stosu pustego, od którego rozpoczynamy,
Cl>(D0 ) = O. Wysokość stosu jest zawsze nieujemna, więc
<!>(DJ;,, O
= q)(D,)
Całkowity koszt zamortyzowany ciągu n operacji ze względu na Cl»stanowi
więc górne ograniczenie faktycznego kosztu.
Obliczmy koszt zamortyzowany różnych operacji na stosie. Jeśli i-ta ope-
racja na stosie zawierającym s elementów jest operacją PUSH, to przyrost po-
tencjału wynosi
<i>(D
1) - q)(D,_ 1 ) = (s + 1) - s
=l
Z równania (18.1) wynika, że koszt zamortyzowany tej operacji PUSH jest
równy
c1 = c1 + q)(DJ- q)(D1_ 1)
=l+l
=2
412
18.3. METODA POTENCJAŁU
= k' - k'
Licznik binarny
Jako kolejny przykład zastosowania metody potencjału dokonamy jeszcze raz
analizy przykładu z licznikiem binarnym. Potencjał licznika po i-tym zwięk
szeniu zdefiniujemy jako b1 - liczbę jedynek w liczniku po i-tej operacji.
Obliczymy teraz koszt z.amortyzowany operacji INCREMENT. Załó2my, że
i-ta operacja INCREMENT zeruje t1 bitów. Faktyczny koszt tej operacji jest więc
nie większy niż t1 + 1, ponieważ oprócz zerowania t 1 bitów może ona przypisać
wartość 1 co najwyżej jednemu bitowi. Liczba jedynek w liczniku po wykonaniu
i-tej operacji jest równa b1 ~ b;_ 1 - t 1 + 1, zatem przyrost potencjału wynosi
<l)(DJ- Cl>(D
1_ 1 ) ~ (b1_ 1 - t 1 + I) - b1_ 1
=I- t1
Stąd koszt zamortyzowany
Jeśli 0 ) = O. Ponie-
zaczynamy zliczać za pomocą licznika od zera, to Cl>(D
waż Cl>(D
1) ~ Odla każdego i, całkowity koszt zamortyzowany ciągu n operacji
413
ROZDZIAŁ 18. ANALIZA KOSZTU ZAMORTYZOWANEGO
" "
L c, - L c,+ ll>(D.) - ll>(D,) (18.3)
J='l 1="1
"
Lei~ "
L2-h,. + ho
focl J,c,1
=2n-b,.+b 0
W szczególności
b0 ~ k, więc jeśli wykonamy co najmniej n= O(k) operacji
lNCREMENT, to ich faktyczny całkowity koszt wyniesie O(n), niezależnie od
początkowej wartości licznika.
ZADANIA
18.3-1. Niech dana będzie funkcja potencjału Cl>taka, że tl>(D,)~ fl>(D 0 ) dla
kaWego i, lecz Cl>(D0 ) #O.Wykaż. że istnieje funkcja potencjału Cl>'
spełnia
jąca warunki tl>'(D0) = O,tl>'(Di}~ Odla i~ 1 oraz koszty zamortyzowane
operacji względem Cl>'są takie same jak koszty zamortyzowane względem tl>.
18.3-2. Rozwiąż zadanie 18.1-3 za pomocą metody potencjału.
18.3-3. Rozważ zwyczajny binarny n-elementowy kopiec, na którym są dopu-
szczalne operacje INSERT i EXTRACT-MIN, których pesymistyczny czas
działania wynosi O(lgn). Podaj funkcję potencjału Cl>,względem której
koszt zamortyzowany operacji INSERT wynosi O(lgn), a koszt z.amortyzo-
wany operacji EXTRACT-MIN wynosi 0(1 ).
18.3-4. Jak.ijest koszt wykonania na stosie n operacji PUSH,POPi MULTIPOP
przy założeniu, że na początku wysokość stosu jest równa s0 , a po n opera-
cjach wynosi s,..
18.3-5. Zakładając, że licznik zaczyna zliczać nie od zera, lecz od pewnej liczby
z b jedynkami w jej binarnej reprezentacji, wykaż, że koszt wykonania n
operacji INCREMENT jest równy O(n), jeśli n= O:(b).(Nie możesz przyj-
mować założenia, że b jest stałą).
18.3,-6.Pokaż, jak zaimplementować kolejkę za pomocą dwóch zwyczajnych
stosów (zad. 11.1~6),aby koszt zamortyzowany każdej operacji INSERT
i DELETE wynosił 0(1 ).
414
18.4. TABLICE DYNAMICZNE
18.4. Tablicedynamiczne
W wielu zastosowaniach nie wiemy z góry, ile elementów trzeba będzie zapa-
miętać w tablicy. Może dojść do sytuacji, że obszar pamięci zarezerwowany dla
tablicy okazuje się zbyt mały. Wtedy trzeba przydzielić tablicy większy obszar
pamięci, a wszystkie elementy zapamiętane w starym obszarze należy skopio-
wać do nowej, większej tablicy. Podobnie, jeśli bardzo wiele obiektów zostało
z tablicy usuniętych, to może się opłacać zmniejszyć rozmiar zajmowany przez
tablicę. W tym podrozdziale zajmiemy się problemem dynamicznego zwiększa
nia i zmniejszania tablic. Za pomocą analizy kosztu zamortyzowanego wyka-
żemy, że średni koszt wstawiania i usuwania elementów z odpowiednio za-
projektowanej tablicy dynamicznej wynosi tylko 0(1), mimo że faktyczny
koszt operacji może być bardzo duży, jeśli w jej trakcie zajdzie potrzeba powię
kszenia lub zmniejszenia tablicy. Co więcej, pokażemy, jak zagwarantować, że
nie wykorzystana pamięć w tablicy dynamicznej nigdy nie stanowi więcej niż
pewien ustalony ułamek zajmowanej pamięci.
Zakładamy, że na tablicy dynamicznej można wykonywać operacje TAB-
LE-INSERTi TABLE-DELETE. Operacja TABLE-INSERTumożliwia wstawienie
do tablicy elementu, który zajmuje wtedy jedną komórkę, tzn. pamięć prze-
maczoną na jeden element. Analogicznie TABLE-DELETEumożliwia usunięcie
elementu z tablicy, zwalniając zajmowaną przezeń komórkę. Szczegóły doty-
czące struktury danych użytej do reprezentacji tablicy są nieistotne; możemy
równie dobrze zastosować stos (pod.rozdz. 11.1), kopiec (podrozdz. 7.1) lub
tablicę z haszowaniem (rozdz. 12). Możemy także użyć w tym celu zwykłej
tablicy lub kilku tablic, podobnie jak to czyniliśmy w pod.rozdz. 11.3.
Dogodnie będzie użyć pojęcia, z którego korzystaliśmy przy analizie ha-
szowania (rozdz. 12). Zdefiniujmy współczynnik zapełnienia 1X(7)niepustej tab-
licy T jako iloraz liczby elementów zapamiętanych w tablicy i jej rozmiaru
(liczby komórek). Pustej tablicy (czyli nie zawierającej żadnych elementów)
przypisujemy rozmiar Oi współczynnik zapełnienia równy 1. Jeśli uda się nam
ograniczyć od dołu współczynnik zapełnienia, to będziemy mieli gwarancję, że
nie wykorzystana część tablicy nigdy nie stanowi więcej niż pewien ustalony
ułamek zajmowanej pamięci.
Rozpoczniemy od analizy tablicy dynamicznej, na której można wykony-
wać tylko operacje wstawiania. Następnie rozważymy ogólniejszy przypadek,
w którym będą taicie dopuszczalne operacje usuwania elementów z tablicy.
415
ROZDZIAŁ 18. ANALIZA KOSZTU ZAMORTYZOWANEGO
TABLB-lNSERT(T, x)
I if size[TJ - O
2 tben przydziel I komórkę dla table[TJ
3 size[T] +-1
4 if num [TJ - size [TJ
5 tben przydziel 2·size[TJ komórek dla new-table
6 wstaw wszystkie elementy z table{T] do new-table
7 zwolnij table[TJ
8 table [T] +- new-table
9 size [TJ - 2 · size [TJ
10 wstaw x do table[T]
li num[TJ-num[TJ + I
416
18.4. TABLICE DYNAMICZNE
<n+2n
= 3n
417
ROZDZIAŁ 18. ANALIZA KOSZTU ZAMORTYZOWANEGO
418
18.4. TABLICE DYNAMICZNE
Ć1 = C; + Cl>l- Cl>1-1
= num + (2 · num; - 1 sizeJ - (2 ·num 1_ 1 - size 1_ 1)
= num; + 2 - (num 1 - 1)
-3
32
A •
••
24
size.
'
num1 / ''
/ '' '
•
'
16
/ '' '
d>. ,'
/::'
' ' '''
'
•' '' '' '
''
8 '' ''
' '' '' '' ''
'' '' '' '' ''
' ' '' ';' '
'
' '' '
' i
8 16 24 32
Rys. 18.3. Wynik działania ciągu n operacji TABLE-INSERT na liczby: num1 elementów w tablicy, size1
komórek należących do tablicy, oraz potencjału~. "" 2 · num1 - size1mierzonych po wykonaniu i-tej
operacji. Cienka linia ornacza numi, gruba linia pokazuje sizei, a linia przerywana potencjał ~j-
2.auważ, żena chwilę przed powiększ.eniem tablicy wartość potencjału jest równa liczbieelementów
w tablicy, więc możemy za jego pomocą opłacić koszt skopiowania wszystkichelementów do nowej
tablicy.Po tym kopiowaniu potencjał spadado O,leczjego wartość natychmiast przyrasta do 2, jako
efekt wykonania elementarnego wstawienia elementu, który wywołał powiększenie tablicy
419
ROZDZIAŁ 18. ANALIZA KOSZTU ZAMORTYZOWANEGO
I, D, D, I, I, D, D, I, I, ... ,
420
18.4. TABLICE DYNAMICZNE
nać operację 2lllniejszenia rozmiaru tablicy, trzeba będzie najpierw usunąć po-
łowę jej zawartości, bo 2lllniejszenie jest dozwolone dopiero wówczas, gdy
współczynnik zapełnienia maleje poniżej 1/4. Po zmniejszeniu rozmiaru tablicy
współczynnik zapełnienia jest równy 1/2. Zanim więc zostanie wykonane po-
większenie rozmiaru tablicy, trzeba podwoić liczbę jej elementów, ponieważ
operacja powiększania jest dopuszczalna tylko w sytuacji, w której współczyn
nik zapełnienia przekroczy 1.
Nie podajemy tutaj implementacji operacji TABLE-DELETE, ponieważ jest
analogiczna do operacji TABLE-INSERT. Do celów analizy wygodnie będzie
przyjąć, że jeśli liczba elementów w tablicy maleje do O, to pamięć przydzielona
tablicy jest zwalniana, tzn. jeśli num[T] = O, to size[T] = O.
Użyjemy teraz metody potencjału do analizy kosztu ciągu n operacji TAB.
LE-INSERT i TABLE-DELETE. Zdefmiujemy najpierw funkcję potencjału et,rów-
ną O zaraz po wykonaniu operacji powiększenia lub zmniejszenia tablicy,
a przyrastającą, jeśli współczynnik zapełnienia wzrasta do l lub maleje do 1/4.
Oznaczmy współczynnik zapełnienia niepustej tablicy T przez ix(J) = nwn[T]/
/size[T]. Przyjęliśmy że dla pustej tablicy Tmamy num [T] = .vize[T] = Ooraz
ix(J) = 1, więc dla każdej tablicy Tzachodzi równość num[T] = ix(l)·size[T].
Zdefiniujemy funkcję potencjału następująco:
Zauważmy, że potencjał pustej tablicy jest równy O oraz że potencjał jest za-
wsze nieujemny. Dlatego sumaryczny koszt zamortyzowany ciągu operacji ze
względu tł> stanowi górne ograniczenie ich faktycznego kosztu.
Zanim przejdziemy do ścisłejanalizy, przyjrzymy się własnościom funkcji
potencjału. Jeżeli współczynnik zapełnienia jest równy 1/2, to wartość poten-
cjału wynosi O. Kiedy współczynnik ten osiąga 1, zachodzi równość size[T] =
= nwn[T], potencjał jest więc wtedy równy cI>(7)= nwn{T], co wystarczy na
zapłacenie za koszty powiększenia tablicy, jeśli zajdzie taka potrzeba. Jeśli
z kolei współczynnik zapełnienia jest równy 1/4, to mamy size[T] =
= 4 · nwn [T], więc znów lf,(1) = num [T], czyli wystarczy potencjału na opła
cenie wydatków na operację zmniejszenia tablicy. Na rysunku 18.4 widać
zmiany potencjału dla pewnego ciągu operacji.
Aby przeanalizować ciąg n operacji TABLE-INSERT i TABLE-DELETE,
wprowadźmy następujące oznaczenia: niech c; oznacza faktyczny koszt i-tej
operacji, C1 - będzie jej kosztem zamortyzowanym względem potencjału <I>,
num1 niech oznacza liczbę elementów znajdujących się w tablicy po i-tej opera-
cji, size 1 - liczbę komórek wchodzących wtedy w skład tablicy, IX; - jej współ
czynnik zapełnienia po i-tej operacji, a <It1 - odpowiedni potencjał. Początkowo
num0 = O, size 0 = O, ix0 = O, a <Il0 = O.
421
ROZDZIAŁ 18. ANALIZA KOSZTU ZAMORTYZOWANEGO
32 ~
24
size;
~.
...
7f
~
16
um,
'
/ '' '' l
8
'' '•
.•• -
-
• ''
'' • '' ' : (J). ,0,,
' • • •
' '' •
'' '• , ' • ' ' '' ''
,' ' '
' ,· '
',' ' ' '1'
'
',, ,
,
'' ''
'' '• ' '
' •
' " ''
'' ''
' '' ;
8 16 24 32 40 48
Rys. 18.4. Wpływ driałanią ciągu Il operacji TABLE-INSERToraz TABLE-DELETEna liczby: 11Um1 ele-
mentów w tablicy, size1 komórek wchodzących w jej skład oraz potencjał
2 · nwn 1 - size1, jeśli a(1)~ l /2
'11,= {
sizeJ2 - num1, jeśli ~(1)< 1/2
mierzone po wykonaniu i-tej operacji. Cienką Hnią oznaczono num1, grubą - sizei, a przerywaną
- potencjał '11
1• Zauważ., h: w chwili przed powiększeniem tablicy wartość potencjału jest równa
liczbie elementów w tablicy, możemy więc z.ajego pomocą opłacić koszt skopiowania wszystkich
elementów do nowej tablicy. Podobnie, przed zmniejmmi.emtablicy potencjał zrównuje się z liczbą
jej elementów
C;= C1 + cl>i-tl>1-1
=I+ (sizeJ2 - nwn 1) - (size1_ 1/2 - num 1_ 1)
= I + (sizeJ2 - num,) - (size,/2 - (num, - I))
=0
Jeżeli a 1_ 1 < 1/2, ale cx1 ~ 1/2, to
422
18.4. TABLICE DYNAMICZNE
3 .
=3·nwn 1_ 1 - size 1_ 1 +3
2
3 3
< size 1_ 1 - size;_ 1 + 3
2 2
c1 = c, + Cl>i- Cl>1-1
=I+ (size1/2- nwni) -(size 1_ 1 /2 - num1_ 1 )
- 1 + (sizeJ2 - num,)- (size,/2- (num,+ I))
-2
Jeżeli natomiast a:1_ 1 < 1/2 oraz i-ta operacja powoduje zmniejszenie
rozmiaru tablicy, to jej faktyczny koszt wynosi c1 = nwn 1 + 1, ponieważ usu-
wamy jeden oraz kopiujemy num 1 elementów. Zachodzą przy tym równości
.vize;/2= size1_ 1 /4 = nwn 1 + 1, wobec tego koszt zamortyzowany i-tej operacji
•
wynosi
- I
Jeśli i-tą operacją jest TABLE-DELETE, a przy tym a:1_ 1 ~ 1/2, to koszt zamor-
tyzowany jest także ograniczony przez stałą. Szczegółowa analiza została po-
zostawiona jako zad. 18.4-3.
Podsumowując, koszt zamortyzowany każdej operacji jest ograniczony
przez stałą, faktyczny koszt ciągu n operacji na tablicy dynamicznej wynosi
więc O(n).
423
ROZDZIAŁ 18, ANALIZA KOSZTU ZAMORTYZOWANEGO
ZADANIA
18.4-1. Wyjaśnij intuicyjnie, dlaczego jeśli «J-t,::;; 1/2 oraz a:1 ,::;; 1/2, to koszt
zamortyzowany operacji TABLE-INSERT jest równy O.
18.4-2. Mamy zamiar zaimplementować dynamiczną tablicę z haszowaniem
z wykorzystaniem adresowania otwartego. Dlaczego lepiej traktować tab-
licę jak.o wypełnioną już wtedy, gdy jej współczynnik zapełnienia przekra-
cza pewną ustaloną wartość a: mniejszą od 1? Opisz pokrótce, jak zagwa-
rantować, że oczekiwany cz.aszamortyzowany operacji wstawiania do dy-
namicznej tablicy z haszowaniem z wykorzystaniem adresowania otwar-
tego jest 0(1). Dlaczego wartość oczekiwana faktycznego kosztu operacji
wstawiania nie musi być dla wszystkich wstawień równa 0(1)?
18.4-3. Wykaż, że jeśli i-tą operacją na tablicy dynamicznej jest TABLE-DELE-
TE oraz a1_ 1 ~ 1/2, to koszt zamortyzowany tej operacji względem funkcji
potencjału (18.5) jest ograniczony przez stałą.
18.4-4. Przyjmij, że zamiast dwukrotnego zmniejszania rozmiaru tablicy w sy-
tuacji, gdy jej współczynnik zapełnienia maleje poniżej 1/4, zmniejszamy
jej rozmiar, mnożąc go przez 2/3, jeśli jej współczynnik zapełnienia spada
poniżej 1/3. Użyj funkcji potentjalu
<P(T)= 12·num[T]-size[T]I
Problemy
18-1. Licznik binarny z odwróconymibitami
W rozdziale 32 omówimy ważny algorytm zwany szybkim przekształceniem
Fouriera (FFT, ang. Fast FourierTransform).Pierwszy krok tego algorytmu
stanowi wykonanie permutacji odwracającej bity na tablicy A.[O.. n - 1] o dłu
gości n= 2!'dla pewnej nieujemnej liczby c.ałkowitej k. Polega to na zamianie
miejscami elementów, których indeksy zapisane binamie mają wzajemnie od-
wrócone bity.
Każdy indeks a można zapisać jako k-bitowy ciąg (a,._ 1 , at-z, ..., a 0 ),
gdzie a=
•L a;J.'.Zdefiniujmy operację rev" następująco:
i"" o
czyli
424
PROBLEMY
•-'
rev (a) = L a 21
1 1 _ 1_ 1
j"' o
(a) Dla danej funkcji rev1 działającej w czasie 0(k) podaj algorytm wykonują
cy permutację odwracającą bity, działający w czasie O(nk) na tablicy o roz-
miarze n= 21 .
0000, 1000, 0100, 1100, 0010, 1010, ... -o, 8, 4, 12, 2, 10, ...
(b) Przyjmij założenie, że słowaw komputerze mają długość k, czyli mogą
reprezentować liczby k-bitowe. Dzięki temu można wykonywać ta.kie ope-
racje na liczbach binarnych, jak przesunięcia bitowe w lewo lub w prawo
o dowolną długość, bitowy AND, bitowy OR itp. Opisz implementację
procedury BIT-REVERSED-INCREMENT, która wykonuje permutację od-
wracającą bity na n-elementowej tablicy w czasie O{n).
(c) Przypuśćmy, że można wykonywać operacje przesunięcia tylko o jeden bit
w lewo lub w prawo. Czy nadal można ograniczyć czas wykonania per-
mutacji odwracającej bity przez O(n)?
18-2. Dyoamiczne wyszukiwanie binarne
Wyszukiwanie binarne uporządkowanej tablicy działa w czasie logarytmicz-
nym, lecz czas wstawienia nowego elementu jest liniowy względem jej rozmia-
ru. Można poprawić czas wstawiania, korzystając w odpowiedni sposób z wie-
lu uporządkowanych tablic.
Załóżmy, że chcemy wykonywać operacje SEARCHoraz INSERTna zbiorze
n-elementowym. Niech k = Llg(n+ l)J i niech (n 1 _ 1 , n1r;-z,... , n0 ) będzie bi-
narną reprezentacją n. Mamy k uporządkowanych tablic A 0 , A 1 , •.• , A 1 _ 1 ,
gdzie dla i= O, 1, ..., k - 1 tablica A 1 ma ro7llliar 21• Każda z tablic jest albo
pusta, albo zapełniona w zależności od tego, czy n1 = O, czy n1 = l. Sumarycz~
na liczba elementów znajdujących się w k tablicach wynosi więc
•-'
L n 2; = n.
1
i=O
425
ROZDZIAŁ 18. ANALIZA KOSZTU ZAMORlYZOWANEGO
size[left[x]] ,:s:;;o:·size[x]
oraz
426
UWAGI DO ROZDZIAŁU
<P(7)- c L A(s),
;q;T:A(~);;.2
Uwagido rozdziału
Metoda kosztu sumarycznego była używana już przez Aho, Hopcrofta
i Ullmana [4]. W pracy Tarjana [189] można znaleźć liczne zastosowania meto-
dy księgowania i metody potencjału. Do autorów metody księgowania zostali
przez niego zaliczeni między innymi M.R. Brown, R.E. Tarjan, S. Huddleston
i K. Melhorn. Metoda potencjału pochodzi według niego od D.D. Sleatora.
Termin „zamortyzowany" pochodzi od D.D. Sleatora i R.E. Tarjana.
Część V
Złożone strukturydanych
Wprowadzenie
W tej części powracamy do badania struktur danych umożliwiających wykony-
wanie operacji na zbiorach dynamicznych. Poziom złożoności naszych rozwa-
żań będzie jednak dużo wyU.zy od tego z części III. Dla przykładu, w dwóch
rozdziałach zastosujemy szeroko metody analizy kosztu zamortyzowanego,
o których była mowa w ro7.dziale 18.
Rozdział 19 poświęcimy B-drzewom, które są odmianą zrównoważonych
drzew poszukiwań specjalnie zaprojektowanych do organizacji danych na dys-
kach magnetycznych. Ponieważ dostęp do danych na dysku jest dużo wolniej-
szy od dostępu do danych w pamięci wewnętrznej, zachowanie się B-Ofzew
będziemy oceniali nie tylko przez pryzmat czasu potrzebnego na wykonanie
operacji na zbiorach dynamicznych. Będzie nas także interesowała liczba do-
stępów do dysku. Liczba odwołań do dysku w każdej operacji na B-drzewie
wzrasta wraz z jego wysokością. Z drugiej strony operacje te gwarantują utrzy-
mywanie niewielkiej wysokości B-drzewa.
W rozdziałach 20 i 21 podamy implementację kopców złączalnych, które
umożliwiają wykonywanie operacji INSERT, MINIMUM, EXTRACT-MIN
i UNION. Operacja UNIONzłącza Oub inaczej - scala) dwa kopce. Struktury
danych opisane w tych podrozdziałach umożliwiają tak.że wykonywanie opera-
cji DELETEi DECREASE-KEY.
W podrozdziale 21 omówimy kopce dwumianowe, dla których koszt pesy-
mistyczny wykonania każdej z powyższych operacji wynosi O(lgn), gdzie n jest
łączną liczbą elementów w kopcu wejściowym (lub w dwóch kopcach w przy-
padku operacji UNION).Ponieważ kopce złączalne mają umożliwiać wykony-
wanie operacji UNION, kopce dwumianowe mają przewagę nad kopcami bi-
narnymi wprowadzonymi w rozdz. 7, których scalenie zabiera w najgorszym
przypadku czas 0(n).
430
WPROWADZENIE
• Struktura danych odkryta przez van Emde Boasa (194] umo:iliwia wykony-
wanie operacji MINIMUM, MAXIMUM, INSERT, DELETE, SEARCH, EX-
TRACT-MIN, EXTRACT-MAX, PREDECESSORoraz SUCCESSORw pesymis-
tycznym czasie O(lglgn) pod warunkiem, że przestrzenią kluczy jest zbiór
{!, 2, ... , n).
• Drzewadynamiczne,wprowadzone przez Sleatora i Tarjana [177] i omawia-
ne przez Tarjana w pracy [188], umożliwiają utrzymywanie lasu rozłącznych
drzew z korzeniami. Każda krawędź w drzewie ma koszt o wartości rzeczy-
wistej. Drzewa dynamiczne umo:iliwiają realizację zapytań dotyczących oj.
ców, korzeni, kosztów krawędzi, minimalnego kosztu krawędzi na ścieżce
od danego węzła do korzenia. Drzewami można manipulować, odcinając
krawędzie, zmieniając koszty wszystkich krawędzi na ścieżce od danego wę·
zła do korzenia, przyłącz.ając korzeń jednego drzewa do innego drzewa,
431
WPROWADZENIE
1 W literaturze angielskojęzycznej drzewa te występują pod nazwą splay trees (przyp. tłum.).
Rozdział 19
B-drzewa
433
ROZDZIAŁ 19. 8-DRZEWA
root[n
Ry&. 19.1. B-drrewo, którego klucze są spółgłoskami w języku angielskim. Węzeł wewnętrzny x za-
wierający n[x} kluczy ma n{x] + l synów. Wszystkie liście w drzewie znajduj11,&ię na tej samej
głębokości. Jasnoszare wę7.ły są badane podczas wyszukiwania litery R
434
ROZDZIAŁ 19. 8-DRZEWA
Powierzchnia magnetyczna
Dysk dysku
\ Ramię,
i
.···......... ·•·..
- \
• •
Ścieżka dysk.owa
Rys. 19.2. Typowy napęd dyskowy
435
ROZDZIAŁ 19. B-DRZEWA
1 """
2 żądanie dostępu do obiektu x
3 DISK-READ(x)
4 operacje, które odwołują się i/lub modyfikują pola x
5 DISK.-WRITE(x) I> Ta operacja jest pomijana, jeśli żadne z pól x nie
zostało zmienione.
6 inne operacje, które odwołują się do pól x, ale ich nie modyfikują
7 """
root[11
l wę,ci
1000 kluczy
1001 ~złów
•••
1 001 OOOkluczy
1002001 węzłów
1000 1000 •• • 1002001 OOOkluczy
Rys. 19.3. B-dr:zewo o wysokości 2, zawierające ponad miliard kluczy. Każdy węzeł wewnęlrzny
i każdy liść zawiera 1000 kluczy. Na głębokości I jest 1001 węzłów, a na głębokości 2 jest ponad
jeden milion liści. Wewnątrz każdego węzła x jest za.pisana liczba mwartych w nim kluczy - n[x]
436
19.1. DEFINICJA B-DRZEWA
19.1. DefinicjaB-drzewa
Dla uproszczenia, podobnie jak to zrobiliśmy dla drzew poszukiwań binarnych
i drzew czerwono..czarnych, zakładamy, że każda dodatkowa informacja zwią
zana z kluczem jest pamiętana w tym samym węźle co klucz. W praktyce
można by pamiętać z każdym kluczem tylko wskaźnik do innej strony na
dysku, na której są przechowywane informacje związane z tym kluczem.
W tym rozdziale, zapisując algorytmy, niejawnie zakładamy, że informacja
związana z kluczem Oub wskaźnik do niej) wędruje razem z kluczem, kiedykol-
wiek jest on przesuwany z węzła do węzła. W innej, często spotykanej organi-
zacji danych za pomocą B-drzew, dodatkowe informacje gromadzi się w li-
ściach B-drzewa, a w węzłach wewnętrznych znajdują się tylko klucze i wskaź
niki do synów, przy czym maksymalizuje się wtedy współczynnik rozgałęzienia
węzłów wewnętrznych.
B-drzewo T jest drzewem z korzeniem (o korzeniu root [T]) o poniższych
własnościach.
437
ROZDZIAŁ 19. B·OAZEWA
Wysokość B-drzewa
Liczba dostępów do dysku potrzebnych przy realizacji większości operacji na
B--drzewiejest proporcjonalna do jego wysokości. Przeanalizujemy teraz pesy-
mistyczną wysokość B--drzewa.
'fWIERDZENIE 19.1.
Jeślin ~ 1, to dla każdego B--drzewa o n kluczach, wysokości hi minimalnym
stopniu t ~ 2 mamy
DOWÓD
JeśliB--drzewo ma wysokość h, to liczba jego węzłów jest najmniejsza, gdy
korzeń zawiera jeden klucz, a wszystkie pozostałe węzły zawierają t - 1 kluczy.
W takim przypadku mamy 2 węzły na głębokości 1, 2t węzłów na głębokości 2,
438
19.1. DEFINICJA 8-DRZEWA
-1 +2(1-1)(
1
;_ i)
=2t,,-1
co kończy dowód.
•
Liczba
Głębokość węzłów
O I
I 2
2 2,
439
ROZDZIAŁ 19. B-DRZEWA
Wyszukiwanie w B-drzewie
Wyszukiwanie w B-drzewie jest bardzo podobne do wyszukiwania w drzewie
poszukiwań binarnych (BST). Różnica polega na tym, że w każdym węźle
B-drzewa dokonuje się wyboru poddrzewa, w którym ma być kontynuowane
wyszukiwanie, spośród poddrzew, których liczba zależy od liczby kluczy w tym
węźle. Dokładniej, takich poddrzew w węźle x jest n[x] + 1. W drzewach bi-
narnych zawsze wybiera się jedno poddrzewo spośród dwóch.
B-TREE-SEARCH jest prostym uogólnieniem procedury TREB-SEARCH dla
drzew BST. Dane wejściowe procedury B-TREE-SEARCHstanowią: wskaźnik
do węzła x i klucz k, który należy znaleźć w poddrzewie o korzeniu w x.
Wywołanie B-TREE-SEARCH(root[7],k) spowoduje rozpoczęcie wyszukiwania
w całym B-drzewie. Jeśli k jest w drzewie, to B-TREE-SEARCH daje w wyniku
uporządkowaną parę (y, z) składającą się z węzła y oraz indeksu i takich, że
key 1 [y] = k. W przeciwnym razie jest zwracana wartość NIL.
B-TREE-SEARCH(x,k)
1 i-1
2 while i~ n[x] i k > keyt[x]
3 doi+-i+l
4 if i .:is;n[x] i k = key 1 [x]
5 then return (x, z)
440
19.2. PODSTAWOWE OPERACJE NA B-DRZEWACH
6 if leaflx]
7 then return NIL
8 else DISK-READ(c,[x])
9 return B-TREE-SEARCH(c,[x],k)
B-TREE-CREATE(7)
1 X+- ALLOCATE-NODEQ
2 leaflx] +- TRUE
3 n[x]-o
4 DISK-WRITE(x)
5 root [1] +- x
441
ROZDZIAŁ 19. B-DRZEWA
Rozbijaniewęzła w B-drzewie
Wstawianie klucza do B-drzewa jest znacznie bardziej skomplikowane niż
wstawianie klucza do dr rewa BST. Zasadniczą operacją używaną podczas
wstawiania jest rozbijanie pełnego węzła y (mającego 2t - l kluczy) na dwa
węzły o t - 1 kluczach. Rozbicia dokonuje się względem środkowego klucza
key 1[y], który jest przesuwany do ojca y. O ojcu y zakłada się, że w momencie
rozbijania y nie jest pełny. Klucz key 1[y] wyznacza punkt podziału między
nowymi drzewami. Jeśli y nie ma ojca, to wysokość drzewa rośnie o 1. Rozbija-
nie może zatem spowodować zwiększenie wysokości drzewa.
Rozbijanie jest wykonywane za pomocą procedury B-TREE-SPLIT-CHILD,
której dane wejściowe stanowią: niepełny węzeł wewnętrzny x (o którym zakła
da się, że jest w pamięci wewnętrznej), indeks i oraz węzeł y taki, że y = c1[x]
jest pełnym synem x. Procedura B-TREE-SPLIT-CHILD rozbija y na dwa węzły
i aktualizuje x tak, że zostaje uwzględniony jego nowy dodatkowy syn.
Ten proces został zilustrowany na rys. 19.5. Pełny węzeł y jest rozbijany
względem klucza środkowego S, który zostaje przesunięty w górę do x - ojca
y. Klucze z y, większe od klucza środkowego, są 1nnieS7.Czane w nowym węźle
z, który następnie zostaje synem x.
B-TREE-SPUT-CHILD(x, i, y)
l z+- ALLOCATE-NODEQ
2 leafiz] - leafly]
3 n[z]-1-l
4 forj+-ltot-1
5 dokey 1[z]-key 1+,CYl
6 H not leafly]
7 tb.enfor j +- 1 to t
8 do c 1[z]+-c 1 + 1[y]
9 n[y]-1-l
10 forj+-n[x]+ I downtoi+ I
11 doc J+ 1 [x]+- c1[x]
12 C 1 + 1 [x]+-z
13 for j +- n[x] downto i
14 do key 1 + 1[x)+-key 1[x]
15 key,[x] -key,[y]
16 n[x]- n[x] + l
17 DISK-WRITE(y)
18 DISK-WRITE(z)
19 DISK-WRITE(x)
Procedura B-TREE-SPLIT-CHILD działa na zasadzie „rozetnij i sklej".
W naszym przypadku jest rozbijany węzeł y, który jest i-tym synem x. Począt-
442
19.2. PODSTAWOWE OPERACJE NA B·DRZEWACH
p ' '
T· tł:1--vtr.
'
''
ł' j ł l' j !T T
T, T, T, T T T, T, T T~ T~
" ' ' ' 6 7
Rys. 19.5. Rozbijanie węzła z t = 4. Węzeł y jest rozbijany na dwa węzły, y oraz z, środkowy klucz
S z y wędruje w górę do ojca y
B-TREE-INSERT(T, k)
1 r +- root [1]
2 if n [r] - 21 - I
3 tben s +- ALLOCATE-NODE( )
4 root [TJ+- s
5 /eaf1s]+- FALSE
6 n[s]+-0
__________________ ,,,_,,_ ---------
443
ROZDZIAŁ 19. B-DRZEWA
rootln
'
..........................
:w~··
Rys. 19.6. Rozbijanie korzenia z I = 4. Węzeł-korzeń r jest rozbijany na dwa węzły i jest tworzony
nowy węzeł-korzeń 1. Nowy korzeń zawiera środkowy klucz z r, a oba węzły powttałe z rozbicia
zostają. jego synami. Rozbicie korzenia powoduje zwiększenie wysokości drzewa o I
7 c1[s]+-r
8 B-TRBB-SPLIT-CHlw(s, I, r)
9 B-TRBB-INSBRT-NONFULL(s, k)
10 else B-TREE-INSERT-NONFULL(r,
k)
B-TRBB-INSBRT-NONFULL(x, k)
1 i+-n[x]
2 if leafix]
3 tben while i~ 1 i k < key1[x]
4 do key1 + 1 [x]+-key 1[x]
5 i+-i-1
6 keY1+1[X]+-k
7 n[x]~n[x]+I
8 DISK-WRITB(x)
9 else while i~ 1 i k < key1[x]
10 doi+-i-1
11 i+-i+l
444
19.2. PODSTAWOWE OPERACJE NA B-DRZEWACH
12 DISK-READ(c,[x])
13 if n[c,[x]] - 21-1
14 then B-TREE-SPLIT-CHILD(x,
i, c1[x])
15 if k > key,[x]
16 tben i+-i+ I
17 B-TREE-INSERT-NONFULL(c1[x],
k)
1
Przyjmij, że stopień B-drzewa t jest równy 3 (przyp. tłum.).
445
FtOLDZIAl 18 l:l DH/I VVA
. M -p,,!:f]
t''lJ-",,_4 ___=:;:_,_,,
AB(:DE
' _..,--*---------.
cJ:~~
i~.tJJu~ •'r:1rw11
------- -
(;AfPT,\'
(cl \\-'s;ta""iono(J ' ../· ; '," -~..~-·
. - -'
{d) \\. ~la\\ l011U /
p
•
!' (1 ..___,
M ...
•2 • ,-"· .J
[J~Jic-,•.'.ó~&] J
ii!=••. K l. i N a
~-----~·
(<:\ \\.stav..1nrhll
c-·P 1
,_____
... ,.J_
--"
•
•B D
•E f'
A
Rys. 19.7. Wstawianie kluczy do B-drzewa. Minimalny stopień tego 8-drzewa wynosi 3, lak więc
w każdym wężle można pamiętać co najwyżej 5 kluczy. Węzły modytlk.owane w procesie wstawia-
nia są jasnoszare. (•) Drzewo początkowe. (b) Wynik wstawienia B do drzewa z (a); prollle wsta-
wienie do ~zła-liścia. (c) Wynik wstawienia Q do poprzedniego dnewa. Węzeł RSTUV jest roz-
bijany na dwa ~zły mwierają.ce RS i UV, klucz T jest prze$Uwany do korzenia, Q jest wstawiany
do lewej połowy (węzła RS). (d) Wynik wstawienia L do poprzcdniego drz.ewa. Ponieważ korz.eń
jest pełny, zostaje rozbity. Wysokość B-drzewa rośnie o I. L jest wstawiane do liścia zawierającego
JK. (e) Wynik wstawienia F do poprzcdniego drzewa. Węzeł A.BCDE jest rozbijany, a następnie
F jest wstawiany do prawej połowy (węzła DEJ
446
19.3. USUWANIE KLUCZA Z B-DRZEWA
447
ROZDZIAŁ 19. B-DRZEWA
(a) Jeśli w węźle c 1[x] jest tylko t - 1 kluczy, ale jeden z jego sąsiednich
braci ma t kluczy, to umieść w c 1[x] dodatkowy klucz, przesuwając
odpowiedni klucz z x, a w jego miejsce przenosząc klucz z lewego lub
prawego brata - z tego, który :zawiera t kluczy. Na koniec przesuń
jeszcze z wybranego brata do c 1[x] wskaźnik do odpowiedniego syna.
(b) Jeśli c 1[x] i sąsiedni bracia mają po t - 1 kluczy, to połącz c 1 zjed·
nym z sąsiednich braci, przesuwając odpowiedni klucz z x do nowo
powstałego węzła. Przesunięty klucz jest kluczem środkowym w nowym
węźle.
448
PROBLEMY
ZADANIA
Problemy
19-1. Stosy w pamięci zewnętrznej
Rozważmy implementację stosu na komputerze, którego szybka pamięć we-
wnętrzna ma stosunkowo małą pojemność w przeciwieństwie do pamięci dys-
kowej. Operacje na stosie PuSH i Pop są wykonywane dla wartości mieszczą
cych się w jednym słowie maszynowym. Chcemy wnożliwić wykonywanie ope-
racji na stosie, który może urosnąć tak bardzo, że nie zmieści się w pamięci
wewnętrznej i dlatego musi być pamiętany na dysku.
W prostej, ale nieefektywnej implementacji cały stos jest pamiętany na
dysku. W pamięci wewnętrznej jest trzymany tylko „wskaźnik" do wierzchołka
stosu. Jeśli wartością wskaźnika jest p, to wierzchołek stosu jest zapisany w sło
wie (pmod m) ze strony l_p/mJna dysku, gdzie m jest liczbą słów na stronie.
Operację PUSH implementujemy w następujący sposób. Wskaźnik do stosu
zwiększamy o jeden, wczytujemy odpowiednią stronę z dysku do pamięci we-
wnętrznej, element wkładany na stos zapisujemy w odpowiednim słowie wczy-
tanej strony, a następnie zapisujemy tę stronę z powrotem na dysk. Operację
POP wykonujemy podobnie. Wskaźnik do stosu zmniejszamy o jeden, wczytu-
jemy odpowiednią stronę z dysku i zwracamy element z wierzchołka stosu. Nie
musimy zapisywać wczytanej strony z powrotem na dysk, ponieważ informacja
w niej zapisana nie została zmieniona.
Ponieważ operacje dyskowe są stosunkowo drogie.jakość każdej implemen-
tacji mierzymy liczbą dostępów do dysku. Liczymy także czas wykorzystania
449
ROZDZIAŁ 19. B-DRZEWA
C GL
j,c ::i_l
t ..··-
...
D EJKl!ilif3
Rys. 19.8. Usuwanie kluczy z B--<irzewa.Minimalny stopień w tym B--O!zewiewynosi t = 3, tak więc
w żadnym węźle (różnym od korzenia) nie może być mniej niż 2 klucze. Modyfikowane węzły są
jasnoszare. (a) B-drzewo z rysunku l 9.7e. (b) Usuwanie P. Przypadek I: proste usuwanie z liścia.
(c} Usuwanie M. Przypadek 2a: poprzednik L klucza M zostaje przesunięty na pozycję zajmowaną
ptT.el M. (d) Usuwanie G. Przypadek 2c: klucz G zostaje przesunięty w dół i wykorzystany do
utworzenia węzła DEGJK, a następnie jest z niego usuwany. (e) Usuwanie D. Przypadek 3b: nie
można wykonać zejścia rekurencyjnego do węzła CL, ponieważ są. w nim tylko 2 klucze. Dlatego
P jest przesuwane w dól i współtworzy z CL i TX węzeł CLPTX. Następnie D jest usuwane z liścia
{przypadek 1). (e'} Po wykonaniu (e) zostaje usunięty korzeń drzewa i wysokość drzewa maleje o I.
(f) Usuwanie B. Przypadek Ja: C jest przesuwane w dól na miejsce B, a E jest przesuwane w górę
na miejsce C
4~50~-----------------------~
PROBLEMY
Usunięto D:
{e) przypadek 3b
L P T
(b) Ile wynosi liczba dostępów do dysku dla n operacji PUSH w najgorszym
przypadku? Jaki jest czas wykorzystania procesora?
(c) Ile wynosi liczba dostępów do dysku dla n operacji na stosie w najgorszym
przypadku? Jaki jest czas wykorzystania procesora?
Przypuśćmy teraz, że implementujemy stos, przechowując w pamięci dwie
strony (plus dodatkowo kilka słów na pamiętanie pomocniczych informacji).
(d) Opisz, jak należy zarządzać stronami stosu, żeby zamortyzowana liczba
dostępów do dysku dla każdej operacji na stosie wynosiła 0(1/m), a za-
-------·-··---·"------------------~~
451
ROZDZIAŁ 19, 8-DRZEWA
(a) Z każdym węzłem x 2-3-4 drzewa wiążemy atrybut h [x], którego wartością
jest wysokość poddrzewa o korzeniu w x. Pokaż, jak wykonywać na 2-3-4
drzewie operacje wyszukiwania, wstawiania i usuwania, żeby wartości
height [x] dla wszystkich węzłów x w drzewie były zawsze poprawne. Pa-
miętaj, żeby utrzymywanie poprawności atrybutu height nie wpływało na
asymptotyczny czas działania poszczególnych operacji.
(b) Pokaż, jak zaimplementować operację sklejania. Dla danych 2-3-4 drzew
T' i T" i klucza k algorytm powinien działać w czasie O(lh' - h"\), gdzie h'
i h" są wysokościami, odpowiednio, T' i T".
(c) Rozważmy ścieżkę p w 2-3-4 drzewie T prowadzącą od korzenia do węzła
zawierającego klucz k, zbiór S' zawierający klucze z Tmniejsze od ki zbiór
S" zawierający klucze większe od k. Pokaż, że p rozbija S' na zbiór drzew
(a dokładniej na zbiory kluczy z ich węzłów) {TO,TJ,,..., T:.,}i zbiór kluczy
{kl, k',,, ..., k;,,}takie, że y < kl < z dla i = 1, 2, ..., m i każdej pary kluczy
YE Tj_ 1 i ZE Tj. Jaki jest związek między wysokościami drzew Tf_ 1 i Tj?
Opisz, w jaki sposób p rozbija S" na zbiory drzew i kluczy.
(d) Pokaż, jak zaimplementować operację rozbijania drzewa T. Wykorzystaj
operację sklejania do połączenia wszystkich kluczy z S' w jedno 2~3-4 drze~
wo T' i wszystkich kluczy z S" w jedno 2-3-4 drzewo T". Czas działania
operacji rozbijania powinien wynosić O(lgn), gdzie n jest liczbą kluczy
w T. (Wskazówka: Koszty scalania powinny sumować się teleskopowo).
Uwagido rozdziału
Więcejo różnych rodzajach drzew zrównoważonych i B-drzewach można prze-
czytać w książkach Knutha [123], Aha, Hopcrofta, Ullmana [4] i Sedgewicka
[175]. Wyczerpujący przegląd tematyki dotyczącej B-drzew można znaleźć
452
UWAGI 00 ROZDZIAŁU
w pracy Camera [48]. Guibas i Sedgewick [93] omówili związki między róż
nymi rodzajami drzew zrównoważonych, włącznie z drzewami czerwono-czar-
nymi i 2-3-4 drzewami.
W 1970 r. J.E. Hopcroft odkrył 2-3 drzewa, które były zwiastunami
B-drzew i 2-3-4 drzew. W 2-3 drzewach każdy węzeł wewnętrzny ma albo
dwóch, albo trzech synów. B-drzewa zostały wprowadzone przez Bayera
i McCreighta w 1972 r. [18]; autorzy nie uzasadnili wyboru przyjętej nazwy.
Rozdział 20
Kopcedwumianowe
---------
Rys. 20.1. Czasy wykonania poszczególnych operacji w trzech implementacjach kopców złączalnych;
n jest liczbą elementów w kopcu(ach) w chwili wykonywania operacji
(o)
8 1-1
B1-1
•• •• G~bokość
o
I
(b) 2
:
••• .,
3
4
B, B, ••
(c) •••
B •,
Bł-l '
••
Rys. 20.2, (•) Rekurenc)'ina definicja drzewa dwumianowego Bk. Trójkąty przedstawiają ukorzenio-
ne poddrzewa. (b) Drzewa dwumianowe od B0 do B4 • W B4 zamaczono głębokości węzłów. (c)
Inne ą,ojrzenie na drzewo dwumianowe Bk
456
20.1. DRZEWA I KOPCE DWUMIANOWE
DOWÓD
Dowód przeprowadzamy przez indukcję względem k. Łatwo sprawdza się, że
B 0 ma każdą z powyższych własności.
W celu przeprowadzenia kroku indukcyjnego załóżmy, że lemat zachodzi
dla drzewa Bk-1·
I. Drzewo dwumianowe Bk składa się z dwóch kopii drzewa Bk-l• tak więc Bk
ma 2k- I + 2A- l = 2k węzłów.
2. Sposób, w jaki dwie kopie drzewa B 1 _ 1 są łączone w celu utworzenia drze-
wa B1 , implikuje, że maksymalna głębokość węzła w B1 jest o jeden większa
od maksymalnej głębokości w B 1 _ 1. Z założenia indukcyjnego głębokość ta
wynosi (k-1)+ 1-k.
3. Niech D(k, 1) będzie liczbą węzłów na głębokości i w drzewie dwumiano-
wym Bk. Ponieważ Bk jest zbudowane z dwóch, połączonych ze sobą kopii
drzewa Bk- l• więc węzeł o głębokości i w Bk- 1 występuje w Bk raz na
głębokości i i raz na głębokości i+ I. Innymi słowy, liczba węzłów na
głębokości i w Bk jest liczbą węzłów na głębokości i w Bk- i powiększoną
o liczbę węzłów na głębokości i - 1 w Bk- t · A zatem
D(k, 1) - D(k - 1, 1) + D(k - 1, i - 1)
-(k~l)+(~~
:)
-(~)
Druga z równości wynika z założenia indukcyjnego, trzecia zaś z zadania
6.1-7.
4. Jedynym węzłem o większym stopniu w Bk niż w B1:-i jest korzeń, który ma
jednego syna więcej niż w Bk- l · Ponieważ korzeń drzewa B1 _ 1 ma stopień
k - 1, więc stopień korzenia drzewa B1:wynosi k. Z założenia indukcyjnego
synowie korzenia drzewa B 1 _ 1 są korzeniami drzew, od lewego do prawego,
B 1 _ 2 , Bk- 3, ... , B 0 • Po połączeniu dwóch drzew Bk-I synowie korzenia
wynikowego drzewa są korzeniami drzew, od lewej do prawej, Bk- t• Bk- 2 ,
... , B 0 (zob. rys. 20.2c).
•
457
ROZDZIAŁ 20. KOPCE DWUMIANOWE
WNIOSEK 20.2.
Maksymalny stopień węzła w n-węzłowym drzewie dwumianowym wynosi lgn.
DOWÓD
Natychmiastowy wniosek z własności (1) i (4) z lematu 20.1.
•
Określenie „drzewo dwumianowe" pochodzi z własności (3) z lematu 20.1,
(a)
head[H] @--
:,, .,(i)
(b)
head[H]-
Rys. 20.3. Kopiec dwumianowy Ho n= 13 węzłach. (a) Kopiec składa się z drzew dwumianowych
B0 , B 2 oraz B 3 , które mają, odpowiednio, I, 4 i 8 węzłów, co daje w sumie n= 13 węzłów.
Ponieważ na drzewach dwumianowych jest zachowany porządek kopcowy, klucz w każdym węźle
jest nie mniejszy od klucza w jego ojcu. Korzenie drzew znajdują s.ię na liście uporządkowanej
rosnąco względem ich stopni. (b) Bardziej szczegółowa reprezentacja kopca dwumianowego H.
Każde drzewo dwumianowe jest pamiętane w reprezentacji „na lewo syn, na prawo brat". Z każ
dym węzłem jest pamiętany jego stopień
458
20.1. DRZEWA ł KOPCE DWUMIANOWE
459
ROZDZIAŁ 20. KOPCE DWUMIANOWE
na liście korzeni. (Jak zwykle sibling[x] = NIL, jeśli x jest ostatnim korzeniem
na liście korzeni).
Dany kopiec dwumianowy H jest dostępny przez pole head[H}, któ~
re jest po prostu wskaźnikiem do pierwszego korzenia na liście korzeni H.
Jeżeli kopiec dwumianowy H nie zawiera żadnych elementów, to
head[H] - NIL.
ZADANIA
1110
460
20.2. OPERACJE NA KOPCACH DWUMIANOWYCH
BINOMIAL-HEAP-MINIMUM(Jl)
1 y+- NlL
2 x +- head[ll]
3 min+- oo
4 while x -:ft NIL
5 do if key [x} < min
6 then min +-key [x]
7 y+-x
8 X+- sib/ing[x]
9 returny
BINOMIAL-LINK(y, z)
I p[yJ-z
_______________ ___________
____
,, ,,, _
461
ROZDZIAŁ 20. KOPCE DWUMIANOWE
2 sib/;ng[y] ~ ,h;/d[z]
3 child[z]...._
y
4 degree[z]...._degree[z] + 1
BINOMIAL-llEAP-UNION(H 1, H 2 )
1 H ...._
MAKE-BINOMIAL-HEAPQ
2 head[H]- BINOMIAL-łlEAP-MERGE(H1, H2)
3 zwolnij obiekty H 1 i H 2 , ale nie listy na które wskazują
4 if head[H] - NIL
5 then return Il
6 prev-x ...._
NIL
1 x-head[H]
8 next-x- sibling[x]
9 while next-x of.NIL
10 do if (degree[x] of.degree[next-x]) lub
(sibling[next-x] 'F NIL
i degree[sibling[next-x]J= degree[x])
Il then prev-x ...._ x I> Przypadki I i 2
12 x ...._next-x t> Przypadki 1 i 2
13 else if key [x] .:::;key [next-x]
14 then sibling [x] ...._siblin.g[next-x] t> Przypadek 3
15 BINOMIAL-LINK.(next-x, x) t> Przypadek 3
16 else if prev-x = NIL I> Przypadek 4
17 then head[H] ...._next-x I> Przypadek 4
18 else sibling[prev-x]- next-x I> Przypadek 4
19 BINOMIAL-LlNK(x, next-x) I> Przypadek 4
20 x- next-x I> Przypadek 4
21 next-x ...._ siblin.g[x]
22 return H
462
20.2. OPERACJE NA KOPCACH DWUMIANOWYCH
463
ROZDZIAŁ 20, KOPCE DWUMIANOWE
30 23 =y® 17
BINOM!AL-HEAP-MERGE •• 32@)
(b)
'
head[H]
Przypadek. 3
(c)
X ne.xt-.x
head[HJ
'._3}-- --,."""------;;;~~
2a"33 29
41 48
Przypadek 2 SO
i
Rys. 20.5. lluslracja działania procedury BtNOMIAL-HEAP-UNtON. (a) Kopce dwumianowe H 1
i H 1 . (b) Kopiec dwumianowy H powstały w wyniku wywołania procedury B1NOM1AL-HJW
-MERGE(H1,H 2). Początkowo x jest pierwszym korzeniem na liście H. Ponieważ oba węzły,
x i next-x, mają stopień Oi key[x] < key [11ext-xJ,
ma u.stosowanie przypadek 3. (c) Po dowiązaniu
next-x do x, korzeń x jest pierwszym z trzech korzeni o tym samym stopniu, tak więc ma za-
stosowanie przypadek 2. (d) Po przesunięciu wszystkich trzech wskażnik.ów o jedną pozycję w pra-
wo na liście ma Zlllitosowanie przypadek 4 (x jest pierwszym z dwóch korzeni o takim samym
stopniu). (e) Po dowiązaniu next-x ma u.stosowanie przypadek 3. (f) Po połączeniu dwóch kolej-
nych drzew ma zastosowanie przypadek 1 (x ma stopień 3, a 11ext-xma stopień 4). Ta iteracja pętli
wbile jest ostatnia, ponieważ po przesunięciu wskaźników o jedną pozycję na liście, 11ext-x= NIL
464
20.2. OPERACJE NA KOPCACH DWUMIANOWYCH
(d)
prel'-t
head[Hl >@
@ 8 -
41
IPrzypadek 4
®
(cl
pre1•-.t nexl-.t
12 3' . ~ 1
head[ln -
'®
--
® ~
/42><, 29 10 44
ć
25 41 30\ 23 22 ~®@
i Przypadek 3 '4 " 32 ® ®
55
(0
prn·-x ne.tl-x
heud[IIJ ----@--
@ /2_8", ------·i9 '
10 @
28 ®"'' 22 48 ®@
Przypadek 1 @ @®® ®
®
Rys. 20,5, cd.
465
ROZDZIAŁ 20. KOPCE DWUMIANOWE
(•)
sihling[ next- xJ
prev-x
~
next-.l
...
Przypadek 1
.....
..................11<,
B, B, B, B,
(b)
next-x sihling[next-x]
~ >-----<
Przypadek 2
........ ·~··
.,.......
B, B, B, B, B,
(c)
prev-x
1'?- ~
nexl-x
~- sibling[next-x]
... pr1!11-x
... --1'( nexr-x
.....
LJ '..~
B, B, 81
Pr~.~~.~._3 /_\
B,
iB,
~
key[xl key[next-x]
-~--
B,
B 1+1
(d)
prev-x
L...'.~-
x
>--><
next-x
·i ..
sibling[next-x]
·>p~~~ •.4
> ...
B, B1. B1 B,
key[x] > key[next-xj
B ,,,
Rys. 20.6. Cztery przypadki występujące w BINOMIAL-HEAP-UNION. Etykiety a, b, c oraz d służą
tylko do identyfikacji rozważanych korzeni; etykiety te nie oznaczają ani ich stopni, ani ich kluczy.
W każdym przypadku x jest korzeniem pewnego Bk-drzewa i I> k. (a) Przypadek I:
degree(x] 'F degree[next-x]. Wskażniki przesuwają się o jedną pozycję na liście. (b) Przypadek 2:
degree[x] = degree[next-x]= degree[sibling[next-x]]. Ponownie wskaźniki przesuwają się na liście
i w następnej iteracji zachodzi albo przypadek 3, albo przypadek 4. (c) Przypadek 3:
degree[x]""degree[next-x] 'F degree(sibling(next-x)] i key[x) ~ key[next-x); next-x jest usuwany
z listy i dowiązywany do x, tworząc B1 + 1-drzewo. (d) Przypadek 4: degree[x] = degree[next-xJ'F
'F degree(.l"ibling[next-x]}
i key [next-x] < key [x]; x jest usuwany z listy i dowiązywany do next-x,
tworząc ponownie B1 + 1-drzewo
466
20.2. OPERACJE NA KOPCACH DWUMIANOWYCH
korzeniem na liście (wiersz 17) czy nie (wiersz 18). W wierszu 19 x zostaje
skrajnie lewym synem next-x, a w wierszu 20 następuje aktualizacja x przed
następną iteracją.
Zarówno w przypadku 3, jak i w przypadku 4 ustawianie zawartości
zmiennych przed następną iteracją pętli while jest takie samo. Połączone właś
nie dwa Bk-drzewa tworzą Bk+ 1 -d.rzewo, na które wskazuje x. Na liście po-
wstałej w wyniku wywołania procedury BINOMIAL-HEAP-MERGEmieliśmy ze-
ro, jedno lub dwa inne Bt+ 1 -d.rzewa, wobec tego x jest teraz pierwszym zjed-
nego, dwóch lub trzech Bk+ 1 -drzew na liście korzeni. Jeśli x jest tylko jednym
takim drzewem, to w następnej iteracji mamy do czynienia z przypadkiem 1:
degree[x] =Fdegree[next-x]. Jeśli x jest pierwszym z dwóch drzew, to w następ
nej iteracji zachodzi albo przypadek 3, albo przypadek 4. Gdy x jest pierwszym
z trzech drzew, w następnej iteracji zachodzi przypadek 2.
Czas działania procedury BINOMIAL-HEAP-UNION wynosi O(lgn), gdzie
n jest łączną liczbą węzłów w kopcach dwumianowych H 1 i H 2 • Możemy to
uzasadnić następująco. Niech n 1 będzie liczbą węzłów w H 1, a n2 liczbą węzłów
w H 2 • Wtedy H 1 zawiera co najwyżej LlgnJ + I korzeni, a H 2 zawiera co
najwyżej LlgnJ + 1 korzeni i dlatego bezpośrednio po wywołaniu proce-
dury BINOMIAL-HEAP-MERGE kopiec H zawiera co najwyżej llgnJ +
+ llgn,J + 2.; 2 LlgnJ + 2 - OQgn) korzeni. Czas wykonania BINDMIAL-
-HEAP-MERGE wynosi zatem O(lgn). Każda iteracja pętli while zabiera czas
0(1), a liczba iteracji wynosi co najwyżej LlgnJ + llgni.J + 2 -w każdej ite-
racji albo wskaźniki przesuwają się o jedną pozycję na liście korzeni H, albo
jeden korzeń jest usuwany z listy. Łączny czas działania wynosi zatem O{lg n).
Wstawianie węzła
BINOMIAL-HEAP-INSERT(H, x)
1 H' +- MAKE-BINOMIAL-HEAP( )
2 p[x) ~ NIL
3 chi/d[x] +- NIL
4 .vibling[xJ+-- NIL
5 degree[x] +- O
6 head[H1 +-- x
1 H +- BINOMIAL-HEAP-UNION(H, HJ
467
ROZDZIAŁ 20. KOPCE DWUMIANOWE
BINOMIAL-HEAP-EXTRACT-MIN(H)
I znajdź korzeń x z minimalnym kluczem na liście korzeni H
i usuń x z listy korzeni H
2 H' +- MAKE-BINOMIAL-HEAP( }
3 odwróć kolejność elementów na liście synów węzła x
i zapamiętaj wskaźnik do głowy wynikowej
listy w zmiennej head[H1
4 H +- BINOMIAL-HEAP-UNION(H, H')
5 return X
468
20.2. OPERACJE NA KOPCACH DWUMIANOWYCH
(a)
head[H] -~
(b)
headflfl -~ 10
13
li
27
(c)
head[Hl -~ 37 10 head[H'J-~ 12
41 13 18
(d)
head[ HJ ~ IZ
41
42
Rys. 20.7. Działanie procedury BINOMIAL·HEAP-ExTRACT-MlN. (•) Kopiec dwumianowy H. (b) Ko-
rzeń x z Illlnimalnym kluczem został usunięty z listy korzeni H. (c) Odwrócona lista synów węzła
x tworzy kopiec dwumianowy H'. (d) Wynik połączenia kopców Hi H'
BINOMIAL-HEAP-DECREASE-KEY(H, x, k)
1 if k > key[x]
2 tben error „nowy klucz jest większy od bieżącego klucza"
3 key[x] ~ k
4 y+- X
5 z~p[y]
6 while z 'F NIL i key [y] < key [z]
469
ROZDZIAŁ 20. KOPCE DWUMIANOWE
7 do zamiana key[y]+-+key[z]
8 [> Jeśli y i z zawierają pola z dodatkowymi
informacjami, to zamień wartości tych pól
9 y+-z
10 z-p[y]
Jak pokazano na rys. 20.8, nnniejszanie wartości klucza odbywa się tak
samo jak w kopcu binarnym: przez „wypychanie klucza do góry". Po upew-
nieniu się, że nowy klucz jest rzeczywiście nie większy od bieżącego klucza, i po
przypisaniu go do węzła x, posuwamy się w górę drzewa re wskaźnikiem y po-
czątkowo wskazującym na x. W każdej iteracji pętli while (wiersze 6-10) key [y]
jest porównywany z kluczem z węzła z - ojca węzła y. Jeśli y jest korzeniem lub
key[y] ~ key [z], to porządek kluczy w drzewie dwumianowym jest porządkiem
' ' i i
".' ' "
'
'.
'Jl;
'
Ją; i (J (ijJ(j (j)
4i; @ ((~)1!~(ił (8
\li
"'·..6
'.}J; .)-4)
:.4t,
·--
/
470
20.2. OPERACJE NA KOPCACH DWUMIANOWYCH
Usuwaniewęzła
Usuwanie klucza (i związanej z nim informacji) z danego węzła x w kopcu
dwumianowym Hwykonuje się łatwo w czasie O(lgn). Do tego celu stosujemy
procedurę BJNOMIAL-łłEAP-DELETE. W implementacji tej procedury zakłada
my, że żaden węzeł w drzewie nie ma klucza - oo.
BINOMIAL-HEAP-DELETE(H,x)
1 BINOMIAL-HEAP-DECREASE-KEY(H,x, - oo)
2 BINOMIAL-HEAP-EXfRACT-MIN(Jl)
ZADANIA
20.2-1. Podaj przykład dwóch n-elementowych kopców binarnych, których
scalenie za pomocą procedury BUILD-HEAP wymaga czasu 0(n).
20.2-2. Napisz pseudokod dla procedury BINOMIAL-HEAP-MERGE.
20.2-3. Narysuj kopiec dwumianowy powstały w wyniku wstawienia węzła
z kluczem 24 do kopca dwumianowego z rys. 20.7d.
20.2-4. Narysuj kopiec dwumianowy powstały w wyniku usunięcia klucza 28
z kopca dwumianowego z rys. 20.7c.
20.2-5. Wyjaśnij, dlaczego procedura BINOMIAL-HEAP-MINIMUMmogłaby
nie zadziałać poprawnie, gdyby klucze mogły przyjmować wartość oo. Na-
pisz od nowa pseudokod dla tej procedury w taki sposób, żeby działała
poprawnie i w takim przypadku.
20.2-6. Przypuśćmy, że nie mamy możliwości reprezentacji klucza - oo. Na-
pisz od nowa pseudokod dla procedury BINOMIAL-HEAP-DELETEtak,
--- '"" -··- - '" ' -- """"""""""""-"'_, ____
,,,_, ,,,,.,._.,,,~
471
ROZDZIAŁ 20. KOPCE DWUMIANOWE
Problemy
20-1. :Z.-3-4kopce
W rozdziale 19 zostały przedstawione 2-3-4 drzewa, w których każdy węzeł
wewnętrzny ma dwóch, trzech lub czterech synów i wszystkie liście znajdują się
na tej samej głębokości. Zajmiemy się teraz implementacją 2-3-4 kopców, które
umożliwiają wykonywanie operacji na kopcach złączalnych.
2-3-4 kopce różnią się od 2-3-4 drzew następująco. W 2-3-4 kopcach klu-
cze są przechowywane tylko w liściach i w każdym liściu x jest zapisany do-
kładnie jeden klucz w polu key [x]. Nie istnieje żaden szczególny porządek
kluczy w liściach ~ patrząc od strony lewej do prawej, klucze mogą wystę
pować w dowolnym porządku. W każdym węźle wewnętrznym x jest prze-
chowywana wartość sma/l[x], która jest równa najmniejszemu kluczowi z liści
w poddrzewie o korzeniu w x. Korzeń drzewa r zawiera pole height [r], którego
wartością jest wysokość drzewa. Zakładamy, że 2-34 kopce są pamiętane
w pamięci wewnętrznej (żadne operacje dyskowe (odczyt i zapis) nie są wy-
konywane).
Podaj implementacje następujących operacji na 2-3-4 kopcach. Każda
z operacji z punktów (a)-(e) powinna być wykonywana w czasie O(lgn) na
n-węzłowym 2-3-4 kopcu. Operacja UNION z punktu (f) powinna być wykony-
wana w czasie O(lgn), gdzie n jest liczbą węzłów w obu wejściowych kopcach.
472
PROBLEMY
w(1) - L w(u, v)
(u, u)eT
jest najmniejsza.
Algorytm MST-MERGE-HEAP opisany poniżej, którego poprawność moż
na udowodnić z pomocą metod z podrozdz. 24.1, znajduje minimalne drzewo
rozpinające T. W algorytmie jest utrzymywany podział { V1} zbioru wierzchoł
ków V, a z każdym zbiorem V1 zbiór
MST-MERGEABLE-HEAP(G}
1 r-0
2 for każdy wierzchołek V;E V[G]
3 do V1 +--{v1}
4 E,-{(v,, v)eE[G])
5 whilejest więcej niż jeden zbiór V1
6 do wybierz dowolny zbiór V1
7 znajdź i usuń krawędź (u, v) w E 1 o minimalnej wadze
8 załóż bez straty ogólności, że u E V 1, a vE Vi
9 ilia'j
IO then T- Tu {(u, v))
473
ROZDZIAŁ 20. KOPCE DWUMIANOWE
Il V1 +- V1 u V1, niszcząc Vi
12 E;+-E;uE 1
Uwagido rozdziału
Kopce dwumianowane zostały wprowadzone w 1978 r. przez Vuillemina [I 96].
Brown [36, 37] zbadał szczegółowo ich własności.
Rozdział 21 ---------------"""""'-~------
KopceFibonacciego
475
ROZDZIAŁ 21. KOPCE FIBONACCIEGO
min [H]
.j,
' 'I > (73) ('i) ,G)
··--·
• (f:i)(_'iii)
~y
6ó)
,,
.,
/)I/!/ I/fi
d» ·.'(i~). \V.
'
'
,c-.
~t46l
,_,,
.'@ .•
Rys. 21.1. (a) Kopiec Fibonacciego złożony z 5 drzev. z własnością kopca i 14 węzłów. Linia przery-
wana oznacza listę korzeni. Węzeł minimalny w tym kopcu to ten zawierający klucz 3. Trzy węzły
zaznaczone zostały zamalowane na czarno. Potencjał tego kopca Fibonacciego wynosi
5 + 2 · 3 = 11. (b) Pełniejsze przedstawienie, uwidaczniajfł,Ce wskaźniki p (strzałki do góry), child
(strzałki do dołu) oraz le/t i right (strza.łk.i na bok.i). Szczegóły te będziemy pomijać na wszystkich
pozostałych rysunkach w tym rozdziale, ponieważ całą zawartą tu informację można odczytać
i z tego, co przedstawia część (a)
w podrozdz. 21.3. Nowo utworzone węzły są nie zaznaczone, a węzeł x staje się
nie zaznaczony za każdym razem, kiedy zostaje synem innego węzła.
Dostęp do kopca F'ibonacciego Hzapewnia wskaźnik min[H} do korzenia
drzewa zawierającego najmniejszy klucz; węzeł ten nazywamy węzłem minimal-
nym kopca Fibonacciego. Jeśli kopiec Fibonacciego H jest pusty, to
min[H] = NIL.
Korzenie wszystkich drzew w kopcu Fibonacciego są połączone za pomo-
cą wskaźników left i right w cykliczną listę dwukierunkową, zwaną listą ko-
rzeni kopca Fibonacciego. Wskaźnik min [H] wskazuje zatem na ten węzeł na
liście korzeni, którego klucz jest najmniejszy. Kolejność drzew na liście korzeni
jest dowolna.
Będziemy korzystać z jeszcze jednego atrybutu kopca Fibonacciego H:
liczba węzłów należących aktualnie do H jest przechowywana w polu n [H].
Funkcja potencjału
Jak.już wspomnieliśmy, do analizy efektywności
operacji na kopcach Fibonac-
ciego zastosujemy metodę potencjału z podrozdz. 18.3. Dla danego kopca Fi-
bonacciego H przez t(H) oznaczamy liczbę drzew na liście korzeni H, a przez
m(H) liczbę zaznaczonych węzłów w H. Potencjał kopca Fibonacciego H jest
wówczas zdefiniowany wzorem
Ograniczenie stopnia
Przeprowadzając analizę kosztu zamortyzowanego, którą przedstawiamy
w dalszej części tego rozdziału, zakładamy, że znane jest górne ograniczenie
D(n) maksymalnego stopnia dowolnego węzła w n-węzłowym kopcu Fibonac-
ciego. Celem zadania 21.2-3 jest wykazanie, że jeśli wykonywane są wyłącznie
478
21.2. OPERACJE KOPCA ZŁĄCZALNEGO
21.2. Operacjekopcaz/ączalnego
W niniejszym podrozdziale zajmiemy się opisem i analizą operacji kopca złą
czalnego zaimplementowanych dla kopca Fibonacciego. Jeśli ograniczymy się
tylko do tych operacji - MAKE-HEAP, INSERT, MINIMUM, ExrRACT-MIN
i UNION - to zauważymy, że każdy kopiec Fibonacciego stanowi po prostu
zbiór „nieuporządkowanych'' drzew dwumianowych. Nieuporządkowane drze-
wo dwwnianowejest podobne do zwykłego drzewa dwumianowego i, podobnie
jak tamto, definiuje się je rekurencyjnie. Nieuporządkowane drzewo dwumia-
nowe U0 składa się z pojedynczego węzła, a nieuporządkowane drzewo dwu-
mianowe Ukjest zbudowane z dwóch nieuporządkowanych drzew dwumiano-
wych Ut- t w ten sposób, że korzeń jednego z nich zostaje dowolnym synem
korzenia drugiego drzewa. Lemat 20.1, dotyczący własności drzew dwumiano-
wych, pozostaje w mocy także dla drzew nieuporządkowanych, tyle że ze zmo-
dyfikowaną jak niżej wersją własności (4) (patrz zad. 21.2-2):
479
ROZDZIAŁ 21. KOPCE FIBONACCIEGO
Wstawianie węzła
Następująca procedura wstawia węzeł x do kopca Fibonacciego H, zakJadając
oczywiście, że sam węzeł został utworzony i że pole key [x] jest już wypełnione.
FJB-HEAP-lNSERT(H,x)
1 degree[x]- O
2 p[x] +- NIL
3 child[xJ +- NIL
4 /eft(x] - x
5 right[x]+-x
6 mark[x] +-FALSE
7 połącz Gednoelementową) listę korzeni zawierającą x z listą korzeni H
8 if min(H] - NJL lub key[x] < key[min[H]
9 then min[H] +-x
10 n[H]-n[H]+l
(a) (b)
Rys. 21.2. Wstawienie węzła do kopca Fibonacciego. (1.}Kopiec Fibonacciego H. (b) Kopiec Fibo-
nacciego H po wstawieniu węzła o kluczu 21. Węzeł staje się osobnym drzewem z własnością
kopca, a następnie, dodany do listy korzeni, zostaje lewym bratem korzenia
480
21.2. OPERACJE KOPCA ZtĄCZALNEGO
PonieważfaktycznykoszttoO(l),kosztzamortyzowanywynosiO(l) + 1 = 0(1).
FIB-HEAP-UNION(H1, H 2 )
1 H - MAKE-FIB-HEAPO
2 min[H]+-min[H 1]
3 sklej listę korzeni H 2 z listą korzeni H
4 il (min[H,]- NIL) lub (min[H 2] # NIL i min[H,] < min[H,J)
5 then min[H]-min[H 2]
6 n[H]-n[H,] + n[H,]
7 zwolnij pamięć przydzieloną obiektom H 1 i H 2
8 return H
481
ROZDZIAŁ 21. KOPCE FIBONACCIEGO
Usuwaniewęzła minimalnego
Proces usuwania węzła minimalnego jest najbardziej skomplikowaną operacją
przedstawioną w tym podrozdziale. To właśnie tu jest wykonywana odkładana
wcześniej praca polegająca na sklejaniu drzew z listy korzeni. Przedstawiona
poniżej procedura realizuje usuwanie węzła minimalnego. Dla wygody zakłada
my, że przy usuwaniu węzła z listy wskaźniki zawarte w elementach listy zostają
uaktualnione, ale wskaźniki w usuwanym węźle pozostają bez zmian. Korzys-
tamy także z pomocniczej procedury CONSOLIDATE, przedstawionej dalej.
FIB-HF.AP-EXTRACT-MIN(H)
1 z+-min[H]
2 ifz#-NIL
3 then for każdy syn x węzła z
4 do dodaj x do listy korzeni H
5 p[x]+-NIL
6 usuń z z listy korzeni H
7 if z= right [z]
8 then min [H] +- NIL
9 elsemin[H]+-right[z]
10 CONSOLIDATE(H)
Il n[H]-n[H]-1
12 return z
Jak widać
na rysunku 21.3, procedura FIB-HEAP-ExTRACT-MIN zaczyna
działanie od uczynienia korzeniem każdego z synów węzła minimalnego i usu-
nięcia węzła minimalnego z listy korzeni. Następnie skraca listę korzeni, łącząc
482
21.2. OPERACJE KOPCA ZŁĄCZALNEGO
1. Znajdź na liście korzeni dwa węzły x i y tego samego stopnia, przy czym
key[x].; keyfy].
2. Dołącz y do x: usuń y z listy korzeni i uczyń go synem x. Operację tę
realizuje procedura FIB-HEAP-LINK. Wartość w polu degree[x] jest zwięk
szana o 1, a y przestaje być zaznaczony fjeśli był).
CoNSOLIDATE(R)
1 for i-O to D(n[H])
2 do A [1]+- NlL
3 for każdy węzeł w na liście korzeni H
4 dox+-w
5 d +- degree[xJ
6 wbile A [dj ,' NIL
7 doy-A[dj
8 if key [x] > key [y]
9 thenzamień x +-+y
10 FIB-HEAP-LINK(H, y, x)
11 A[d]-NJL
12 d+-d+ l
483
H(llDZIAl 11 KOf'Cf I IBUNACClf CiO
A ~>F·MTJm~•
(C) (d)
Ołfa9(E)8.@' li
• if)~ $ I!)
( l')
lli.'1-1 • ,n
•
l)i:1.1
"c:11,1=i,, (h)
Rys. 21.3. Działanie procedury FIB·lłEAP-EXTRACT-MIN. (•) Kopiec Fibonacciego H. (b) Sytuacja po
usunięciu węzła minimalnego z i dodaniu jego synów do listy korzeni. (c)-.{e)Tablica A i wchodzą
ce w skład kopca drzewa po kazdym z pierwszych trzech prmbiegów pętli for w wierszach 3-13
procedury CoNSOUPATE. Lista korzeni jest prmtwarzana, poczynając od węzła minimalnego
i przechodząc po wskaźnikach right. Na każdej części rysunku widać wartości mriennych w i x pod
koniec przebiegu. (f)-(h) Kolejny prz.ebieg pętli lor z pokazanymi wartościami w i x pod koniec
każdego przebiegu pętli wbite w wiersiach 6-12. Częśc (I) dotyczy sytuacji po pierwszym przejściu
pętli wbile. Węzeł o kluczu 23 został dołączony do węzła o kluczu 7, wskazywanego obecnie przez
x. W części (g) węzeł o kluczu 17 zostaje dołączony do węzła o kluczu 7, nadal wskazywanego
przez x. W części (h) do tego samego węzła zostaje dołączony kolejny, o kluczu 24. Ponieważ do tej
pory wskaźnik w komórce A (3] nie wskazywał na żaden węzeł, pod koniec tego przebiegu pętli for
w A [3] zostaje iapisany wskai:nik do korzenia otrzymanego drzewa. (i)-0) Sytuacja po każdym
z kolejnych czterech przebiegów pętli ror. (m) Kopiec Fibonacciego H po odtwoneniu listy korzeni
z tablicy A i malezieniu nowej wartości wskaźnika min[H]
484
21.2. OPERACJE KOPCA ZŁĄCZALNEGO
012.14 O I 2 3 4
__ •I 11I 11I I Af!III 111I
(i) 1w~·@38 u) <ti)
7 __________ 38
41 23 41
24 \!~ 21 ~ 41 21 @)
52 52
1nin[H]
(m)
'
7 ---------·-· 38
24 @ 23 21 41
46@) 52
13 A[dJ-x
14 min [H] +- NIL
15 for i-O to D(n[H])
16 doif A[1] #NlL
17 then dodaj A [l] do listy korzeni H
18 =
if min [H] NIL lub key [A [1] < key[min [H]]
19 thenmin[H]-A[1]
FlB-HEAP-L!NK(H, y, x)
1 usuń y z listy korzeni H
2 uczyń y synem x i zwiększ degree[x] o 1
3 mark[y]+-FALSE
485
ROZDZIAŁ 21. KOPCE FIBONACCIEGO
486
21.2. OPERACJEKOPCAZŁĄCZALNEGO
ZADANIA
21.2-1. Narysuj kopiec Fibonacciego otrzymany w wyniku wywołania proce-
dury FIB-HEAP-EXTRACT-MIN dla kopca Fibonacciego z rys. 21.3m.
21.2-2. Udowodnij, że lemat 20.1 zachodzi również dla nieuporządkowanych
drzew dwumianowych, jeśli własność (4) zastąpimy przez (4').
21.2-3. Wykaż, że jeśli wykonujemy tylko operacje kopca zlączalnego, to ma-
ksymalny stopień węzła D(n) w n-węzłowym kopcu Fibonacciego nie prze-
kracza llgnJ.
21.24. Profesor McGee obmyślił nową strukturę danych opartą na kopcach
Fibonacciego. Kopiec profesora ma taką samą strukturę jak kopiec Fibo~
nacciego i umożliwia wykonywanie wszystkich operacji kopca złączalnego.
Implementacja tych operacji jest taka sama jak dla kopców Fibonacciego
487
ROZDZIAŁ 21. KOPCE FIBONACCIEGO
Zmniejszaniewartości klucza
w przedstawionym poniżejpseudokodzie operacji FIB-HEAP-DECREASE-KE
zakładamy jak poprzednio, że usunięcie węzła z listy nie zmienia zawartości
żadnych pól w strukturze reprezentującej usuwany węzeł.
FIB-HEAP-DECREASE-K.EY{H, x, k)
1 if k > key[x]
2 then ermr „nowa wartość klucza jest większa niż bieżąca"
3 key[x] -k
4 y-p[x]
5 if y ,' NIL i key[x] < key[y]
6 then Cur(H, x, y)
7 CASCADING-Cur(H, y)
8 if key[x] < key[min[H]]
9 then min [HJ- x
CUT(H, X, y)
1 usuń x z listy synów y i zmniejsz degree[y] o I
2 dodaj x do listy korzeni H
488
21.3. ZMNIEJSZANIE WARTOSCI KLUCZA I USUWANIE WĘZŁA
3 p[x] ~ NIL
4 mark[x]- FALSE
CASCADING-CUT(H,y)
I z~p[yJ
2 if z -;i, NIL
3 then if mark[y] = FALSE
4 tb.enmark[y]+-TRUE
5 else Cur(H, y, z)
6 CASCADING-Cur(H, z)
Zaraz po utracie drugiego syna węzeł x zostaje odcięty od swojego ojca i zo-
staje nowym korzeniem. Pole mark[x] ma wartość TRUE,jeśli zaszły zdarzenia
1 i 2 oraz został odcięty jeden z synów x. W wierszu 4 procedury CUT pole
mark[x] przyjmuje zatem wartość FALSE, ponieważ następuje właśnie zdarze-
nie 1. (Widzimy teraz, dlaczego w wierszu 3 procedury FIB-HEAP-LINK pole
mark[y] przyjmuje wartość FALSE:węzeł y zostaje dołączony do innego węzła,
zachodzi więc zdarzenie 2. Następnym razem, kiedy zostanie odcięty syn y,
pole mark[y] przyjmie wartość TRUE).
To jeszcze nie koniec, ponieważ x mógł być drugim synem odciętym od
swojego ojca y, licząc od chwili, kiedy y został dołączony do innego węzła.
W wierszu 7 procedury FIB-HEAP-DECREASE-KEY wykonujemy zatem na wę
źle y operację odcięcia kaskadowego. Jeśli y jest korzeniem, to sprawdzenie
warunku w wierszu 2 procedury CASCADING-CUT powoduje jedynie powrót
z wywołania. Jeśli y nie jest zaznaczony, to w wierszu 4 zostaje zaznaczony,
489
ROZDZIAŁ 21. KOPCE FIBONACCIEGO
ponieważ jego pierwszy syn został właśnie odcięty, po czym następuje powrót
z wywołania. Jeśli natomiast y jest zaznaczony, to oznacza, że utracił on właś
nie drugiego syna; w wierszu 5 y zostaje odcięty, a w wierszu 6 następuje
rekurencyjne wywołanie procedury CASCADINO-CUT dla węzła z będącego oj-
cem y. Rekurencyjne wywołania procedury CASCADINO-Cur „wędrują" w ten
sposób w górę drzewa, aż do napotkania korzenia lub nie zaznaczonego węzła.
Po wykonaniu wszystkich kaskadowych odcięć procedura FIB-HEAP-DEC
REASE-KEY kończy działanie, uaktualniając (jeśli trzeba) wartość min [Il]
w wierszach 8-9.
Na rysunku 21.4 widać przebieg dwóch wywołań procedury FIB-HEAP-
-DECREASE-KEY, zaczynając od kopca Fibonacciego z rys. 21.4a. W pierw-
•
'
al'I • c1n9 $' ~ 9
,w"••••
"417..• @e
$
fllee •
••
G>•
• nun IIIJ
• rmn I/fi
'
••
~·
min Ili!
,,,eeee '
§i ~ e
• -• @e
• u
Ry&.llA. Dwa wywołania procedury FIB-HEAP-DECREASE-KEY. (a) Początkowy kopiec FibonaOO.e-
go. (b) Klucz 46 zostaje zmniejszony do wartości 15. 2.awierają.cy go węzeł staje się korT.CDiem,
a jego ojciec (z kluczem 24), który poprzednio nie był zaznaczony, zostaje zaznaczony. (c)-(e)
Klucz 35 zostaje zmniejszony do wartości 5. W części (c) ~zeł zawierający teraz klucz 5 staje się
korzeniem. Jego ojciec, z kluczem 26, zostaje zaznaczony i następuje kaskadowe odcięcie. Węzeł
z k1uczem 26 zostaje odcięty od swojego ojca i staje się n.ie zaznaczonym korzeniem w części (d).
Ponieważ ~zeł z k1uczem 24 jest również zaznaczony, następuje kolejne kaskadowe odcięcie.
W części (e) rysunku węzeł ten zostaje odcięty od swojego ojca i staje się nie mznaczonym korze-
niem. Kaskadowe odcinanie zatrzymuje się w tym punkcie, ponieważ węzeł z k1uczem.7 jest korze-
niem. (Nawet gdyby nie był, seria odcięć skol\czylaby się, ponieważ ~zeł ten nie jest zaznaczony).
Część (e) przedstawia otrzymany w wyniku operacji Fm-HEAP-DECR.EASE-KEY kopiec Fibonac-
ciego, w którym wskaźnik min [/l] wskazuje na nowy węzeł minima.lny
490
21.3. ZMNIEJSZANIE WARTO$CJ KLUCZA I USUWANIE WĘZŁA
O(c) + 4 - c - 0(1)
Usuwanie węzła
Nietrudno usunąć dowolny węzeł z n-węzłowego kopca Fibonacciego w za-
mortyzowanym czasie O(D(n)), co realizuje poniższa procedura. Zakładamy,
że w kopcu Fibonacciego nie ma aktualnie klucza o wartości - oo.
491
ROZDZIAŁ 21. KOPCEFIBONACCIEGO
FIB-HEAP-DELETE(H, x)
1 x, -co)
FIB-HEAP-DECREASE-KEY(H,
2 FIB-HEAP-EXTRACT-MIN(H)
21.4. Oszacowaniemaksymalnego
stopnia
Aby udowodnić, że :zamortyzowany koszt operacji FIB-HEAP-EXTRACT-MIN
i Fm-HEAP-DELETEwynosi O(lgn), musimy wykazać, że górne ograniczenie
D(n) na stopień dowolnego węzła w n-węzłowym kopcu Fibonacciego jest rów-
ne O(lgn). W myśl zadania 21.2-3, jeśli wszystkie drzewa w kopcu Fibonac-
ciego są nieuporządkowanymi drzewami dwumianowymi, to D(n) = llgnJ.
Odcięcia wykonywane w trakcie operacji FIB-HEAP-DECREASE-KEY mogą je-
dnak spowodować naruszenie przez drzewa w kopcu Fibonacciego własności
nieuporządkowanych drzew dwumianowych. W niniejszym podrozdziale wy-
każemy, że dzięki temu, iż odcinamy węzeł od jego ojca, kiedy tylko traci on
drugiego syna, dalej zachodzi oszacowanie D(n) = O(lgn). Dokładniej, poka-
żemy, że D(n) <; Liog, nJ,gdzie</>= (I + ,,/5)/2.
Dla każdego węzła x w kopcu Fibonacciego definiujemy size(x) jako liczbę
węzłów (z x włącznie) w poddrzewie o korzeniu x. (Nadmieńmy. że x nie musi
znajdować się na liście korzeni - może być zupełnie dowolnym węzłem). Najis-
totniejszy w naszej analizie okaże się fakt, że wartość size(x) jest wykładnicza
ze względu na degree[x].Pamiętajmy, że w polu degree[x]jest stale przechowy-
wana dokładna wartość stopnia węzła x.
492
21.4. OSZACOWANIE MAKSYMALNEGO STOPNIA
LEMAT 21.1.
Niech x będzie dowolnym węzłem w kopcu Fibonacciego. Załóżmy, że de-
gree[x] = k. Oznaczmy przez y 1 , y 2 , ••• , Yt synów węzła x w kolejności przyłą
czania ich do x, od najwcześniej do najpóźniej przyłączonego. Wówczas de-
gree [y1] ~ O oraz degree[y,] ~ i- 2 dla i= 2, 3, ..., k.
DOWÓD
Oczywiście degree[y1] ~O.Dla i~ 2 zauważmy, że kiedy węzeł y 1 byl przy-
łączany do x, węzły y 1 , y 2 , ••• , y 1_ 1 były już synami x, musiało zatem być
degree[x] ~i-I. Węzeł y 1 zostaje przyłączony do x tylko wtedy, kiedy
degree[x] = degree[y1], musiało więc także zachodzić wówczas
degree[y1] ~ i - 1. Od tamtej pory węzeł y 1 stracił co najwyżej jednego syna,
bo gdyby stracił dwóch, to zostałby odcięty od x. Stąd wniosek, że de-
gree[y1]~ i - 2.
•
Doszliśmy wreszcie do tej części analizy, która wyjaśnia nazwę „kopce
Fibonacciego". Przypomnijmy z podrozdz. 2.2, że dla k = O, 1, 2, ... k-ta liczba
Fibonacciego jest zdefiniowana wzorem rekurencyjnym
o, jeśli k=O
F" = 1, jeśli k =I
Ft-1 + Ft-2 jeśli k ~ 2
LEMAT 21.2.
Dla wszystkich liczb całkowitych k ;,i:.O
Ft+2=
•
1 + I F1
J"' o
DOWÓD
Dowód przeprowadza się przez indukcję względem k. Dla k =O
i"' o
=1+0
=1
493
ROZDZIAŁ 21. KOPCE FIBONACCIEGO
•
Następujący lemat i wynikający z niego wniosek kończą analizę. Będziemy
korzystać z nierówności (której udowodnienie jest celem zad. 2.2-8)
LEMAT 21.3.
Niech x będzie dowolnym węzłem w kopcu Fibonacciego i niech k = de-
gree [x]. Wówczas size(x) > Ft+ 2 > cpt, gdzie cf,= (I+ /5)/2.
DOWÓD
Oznaczmy przez St najmniejszą możliwą wartość size(z) dla wszystkich węzłów
z takich, że degree[zJ= k. Widać, że s0 = 1, s 1 = 2, a s 2 = 3. Liczba St jest
mniejsza bądź równa size(x). Tak jak w lemacie 21.1 oznaczmy przez y 1 , y 2 ,
..., Yt synów x w kolejności ich przyłączania do x. Aby wyznaczyć dolne ogra-
niczenie na wartość size(x), liczymy jednostkowe wkłady do sumy samego węz
ła x i jego pierwszego syna y 1 (dla którego size(y 1) ~ 1), a następnie stosujemy
lemat 21.l do pozostałych synów. Mamy zatem
size(x) > st
St~2+
•
L S1-2
I= 2
494
PROBLEMY
•
WNIOSEK 21.4.
Maksymalny stopień D(n) dowolnego węzła w n-węzłowym kopcu Fibonac-
ciego wynosi 00gn).
DOWÓD
Niech x będzie dowolnym węzłem w n-węzłowym kopcu Fibonacciego i niech
k = degree[x]. Na mocy lematu 21.3 mamy n~ size(x) ~ rj,1. Biorąc logarytm
przy podstawie <p,otrzymujemy nierówność k ~ log.;n. (W rzeczywistości, po-
nieważ k jest liczbą całkowitą, zachodzi k ~ llog,;nJ). Maksymalny stopień
D(n) dowolnego węzła jest zatem równy O(Jgn).
ZADANIA
•
21.4-1. Profesor Pinoccbio twierdzi, że wysokość n-węzłowego kopca Fibonac-
ciego wynosi O(lgn). Wykaż, że profesor jest w błędzie, podając dla do-
wolnej dodatniej liczby całkowitej n przykład ciągu operacji na kopcu Fi-
bonacciego, tworzącego kopiec złożony tylko z jednego drzewa stanowią
cego liniowy łańcuch n węzłów.
21.4-2. Przypuśćmy, że uogólnilibyśmy zasadę kaskadowego odcinania w ten
sposób, że węzeł x byłby odcinany od swojego ojca zaraz po utracie swoje-
go k-tego syna dla pewnej ustalonej liczby całkowitej k. (W regule z pod-
rozdz. 21.3 jest k = 2). Dla jakich wartości k zachodzi D(_n)= O(lgn)?
Problemy
21-1. Alternatywnaimplementacjaoperacjiusuwaniawęzła
Profesor Pisano zaproponował następujący wariant procedury FIB-HEAP-DE-
LETE,twierdząc, że działa on szybciej, kiedy usuwany węzeł nie jest wskazywa-
ny przez wskaźnik min [H].
495
ROZDZIAŁ 21. KOPCEFIBONACCIEGO
PISANO-DELETE(H,x)
I ifx-min[H]
2 lhen FIB-HEAP-EXTRACT-MIN(H)
3 elsey~p[x]
4 ify;<NJL
5 lheo CUT(H, x, y)
6 CASCADING-CUT(H,y)
7 dodaj synów węzła x do listy korzeni H
8 usuń x z listy korzeni H
(a) Teza profesora, że powyższa procedura jest szybsza, opiera się w części na
założeniu, iż operację w wierszu 7 można wykonać z faktycznym kosztem
0(1 ). Gdzie tkwi błąd w tym założeniu?
(b) Podaj dobre górne oszacowanie faktycznego kosztu wykonania procedury
PISANO-DELETE,kiedy x =J:. min [H]. W Twoim oszacowaniu powinna wy-
stępować wartość degree[x] oraz c, czyli liczba wywołań procedury CAs-
CADING-Cur.
(c) Niech H' będzie kopcem Fibonacciego otrzymanym w wyniku wykonania
procedury PISANO-DELETE(H, x). Zakładając, że węzeł x nie jest korze-
niem, osza<Uj potencjał H' ze względu na degree [x], c, t(H) i m(H).
(d) Wyprowadź stąd wniosek, że zamortyzowany koszt operacji PISANO-DE-
LETE asymptotycznie nie jest lepszy niż koszt FIB-HEAP-DELETE, nawet
jeśli x 'F min [H].
496
UWAGI DO ROZDZIAŁU
Uwagi do rozdziału
Strukturydanych
dla zbiorów rozłącznych
498
22.1. OPERACJE NA ZBIORACH ROZŁĄCZNYCH
499
ROZDZIAŁ 22. STRUKTURY DANYCH DLA ZBIORÓW ROZŁĄCZNYCH
CONNECTED-COMPONENTS( G}
1 for każdy wierzchołek ve V[G]
2 do MAKE-SET(v)
3 for każda krawędź (u, v)eE[G]
4 do if FIND-SET(u) 'F FIND-SET(v)
5 then UNION(u, v)
SAME-COMPONENT(u, v)
I if FIND-SET(u) - FIND-SET(v)
2 then return TR UE
3 else return F ALSE
I
(,)
Rys. 22.1. (a) Graf o czterech spójnych składowych: {a, h, c, d}, {e,f, g}, {h, i} oraz {i}. (b) Rodzina
zbiorów rozłącznych po przetworzeniu kaidej krawędzi
Jesli krawędzie grafu są „statyczne" - nie zmieniają się w czasie - to spójne składowe
!)
można obliczyć szybciej za pomocą algorytmu przeszukiwania w głąb (zad. 23.3-9). Czasem jednak
krawędzie są dodawane „dynamicznie" i musimy w miarę ich przybywania uaktualniać spójne
składowe. W takim przypadku przedstawiona tu implementacja może być bardziej efektywna niż
wykonywanie algorytmu przeszukiwania w głąb dla każdej nowej krawędzi.
500
22.2. LISTOWA REPREZENTACJA ZBIORÓW ROZŁĄCZNYCH
ZADANIA
zbiorówrozłącznych
22.2. Listowareprezentacja
Prostym sposobem implementacji struktury danych dla zbiorów rozłącznych
jest reprezentowanie każdego zbioru za pomocą listy. Pierwszy element na
każdej liście służy jako reprezentant swojego zbioru. Każdy obiekt na liście
składa się z elementu zbioru, wskaźnika do obiektu zawierającego następny
element zbioru oraz prowadzącego wstecz wskaźnika do reprezentanta.
Na rysunku 22.2a widać dwa zbiory. Na każdej liście obiekty mogą występo
wać w dowolnej kolejności (przy uwzględnieniu naszego założenia, że pierwszy
obiekt na każdej liście jest reprezentantem odpowiadającego jej zbioru).
W reprezentacji listowej wykonanie zarówno MAKE-SET, jak i FIND-SET
jest proste i wymaga czasu 0(1). Żeby wykonać MAKE-SET{x), tworzymy no-
wą listę, której jedynym elementem jest x. FIND-SET{x) wykonujemy, zwraca-
jąc po prostu wskaźnik od x do reprezentanta jego zbioru.
501
ROZDZIAŁ 22. STRUKTURY DANYCH DLA ZBIORÓW ROZŁĄCZNYCH
Ee C· h
•/
I 3-
d
/
(a)
d.
(b)
Rys. 22.2. (a) Listowe reprezentacje dwóch zbiorów. Jeden :zawiera obiekty b, c, e, h, oraz c jako
reprezentanta, a w skład drugiego wchodzą d, fi g, zaś jego reprezentantem jest/ Każdy obiekt
na liście :zawiera element zbioru, wskaźnik. do następnego elementu na liście oraz wskainik. prowa-
dzący do pierwszego obiektu na liście, będącego jej reprezentantem. (b) Wynik. wykonania
UNloN(e, g). Reprezentantem otrzymanego zbioru jest/
502
22.2. LISTOWA REPREZENTACJA ZB10R0W ROZŁĄCZNYCH
MAKE-SET(x 1) I
MAKE-Strr(x2) I
• •
• •
MAKE-SET(x.) I
1, x2)
UNION(X I
UNION{X2,X3) 2
UNION(X3,X4) 3
• .
• •
q-1
Rys. 22.3. Ciąg m operacji, który zajmuje łącznie cz.as O(m 2) przy prostej implementacji operacji
UNIONw listowej reprezentacji zbioru. W przykładzie tym n= rm/11 + l, a q = m - n
,- '
L ;- ®(ą'l
i"" 1
Całkowity czas wykonania ciągu operacji wynosi zatem 0(n czyli + q 2),
0(m 2 ), ponieważ n= E>(m), a q = 0(m). Średnio na każdą operację przypada
więc czas E>(m). Oznacza to, że zamortyzowany czas operacji wynosi 0(m).
TwIERDZENIE 22.1.
W listowej reprezentacji zbiorów rozłącznych przy zastosowaniu heurystyki
łączenia z wyważaniem wykonanie ciągu m operacji MAKE-SET, UNION i FIND-
-SET, spośród których n to operacje MAKE-SET, zajmuje czas O(m + nlgn).
503
ROZDZIAŁ 22. STRUKTURY DANYCH DLA ZBIORÓW ROZŁĄCZNYCH
DOWÓD
Zaczniemy od obliczenia dla każdego obiektu w zbiorze rozmiaru n górnego
ograniczenia na liczbę uaktualnień wskaźnika od tego obiektu do reprezentan-
ta. Ustalmy obiekt x. Wiemy, że za każdym razem, kiedy był uaktualniany
wskaźnik od x do reprezentanta, x musiał znajdować się w mniejszym zbiorze.
Zatem po pierwszym uaktualnieniu tego wskaźnika otrzymany zbiór musiał
zawierać przynajmniej 2 elementy. Podobnie po kolejnym uaktualnieniu
wskaźnika powstały zbiór musiał być przynajmniej 4-elementowy. Kontynu-
ując to rozumowanie, widzimy, że dla dowolnego k ~ n po uaktualnieniu
wskaźnika od x do reprezentanta fig kl razy otrzymany zbiór liczy przynaj-
mniej k elementów. Ponieważ największy zbiór zawiera co najwyżej n elemen-
tów, wskaźnik do reprezentanta każdego obiektu był uaktualniany co najwy-
żej flgnl razy we wszystkich operacjach UNION. Łączny czas uaktualniania
n obiektów wynosi zatem O(nlgn).
Stąd łatwo już oszacować czas wykonywania całego ciągu m operacji. Każ
da operacja MAKE-SET i FIND-SET zajmuje czas 0(1), co w sumie daje O(m).
Łączny czas wykonania całego ciągu operacji wynosi zatem O(m + nlgn) .
ZADANIA
•
22.2-1. Napisz pseudokod operacji MAKE-SET, FINO-SET i UNION z wykorzy-
staniem reprezentacji listowej i heurystyki łączenia z wyważaniem. Przyj-
mij, że każdy obiekt x ma atrybuty: rep[x] wskazujący na reprezentanta
zbioru zawierającego x, last [x] wskazujący na ostatni obiekt na liście za-
wierającej x oraz size [x] podający rozmiar zbioru zawierającego x. Załóż,
że sięgnięcie do last [x] i size [x] jest dozwolone tylko wtedy, kiedy x jest
reprezentantem.
22.2-2. Przedstaw otrzymaną strukturę danych i odpowiedzi udzielone przez
operacje FINO-SET w poniższym programie. Użyj repre;rentacji listowej
z heurystyką łączenia z wyważaniem.
1 fori+-ltol6
2 do MAKE-SET(x1)
3 fori+-1 to 15by2
4 do UNION(x,, X;+1)
5 for i+- 1 to 13 by 4
6 do UNION(x,, X1+2)
7 UNJON(x1 , x 5 )
8 UNION(x11 , X13)
9 UNION(X1, X10)
10 FIND-SET(x2)
11 FIND-SET(x9)
504
22.3. LASY ZBIORÓW ROZŁĄCZNYCH
22.3. Lasyzbiorówrozłącznych
W efektywniejszej niż poprzednia implementacji zbiorów rozłącznych repre-
zentujemy zbiory za pomocą drzew ukorzenionych, przy czym każdy węzeł
odpowiada jednemu elementowi zbioru, a każde drzewo reprezentuje jeden
zbiór. W lesie zbiorów rozłącznych, zilustrowanym na rys. 22.4a, każdy element
zawiera jedynie wskaźnik do swojego ojca w drzewie. Korzeń każdego drzewa
zawiera reprezentanta, a jego wskaźnik do ojca wskazuje na niego samego. Jak
się przekonamy, chociaż najprostsze algorytmy korzystające z tej reprezentacji
nie są szybsze niż używające reprezentacji listowej, dzięki zastosowaniu dwóch
heurystyk - ,,łączenia według rangi" i „kompresji ścieżki" - możemy osiągnąć
asymptotycznie najefektywniejszą ze znanych strukturę danych dla zbiorów
rozłącznych.
Trzy operacje na zbiorach rozłącznych wykonujemy w sposób następują
cy. Operacja MAKE-SET polega na utworzeniu drzewa składającego się zjed-
nego węzła. Operację FIND-SET wykonujemy, przechodząc po wskaźnikach do
ojca, dopóki nie dotrzemy do korzenia drzewa. Węzły odwiedzone na tej dro-
dze do korzenia tworzą ścieżkę do reprezentanta. Operacja UNION, przedsta-
wiona na rys. 22.4b, polega na zmianie wskaźnika w korzeniu jednego z drzew,
tak aby wskazywał na korzeń drugiego drzewa.
' 'j'
' ,,
' '
h j'
., ,,
' '
h /i
'' '
Rys. 22.4. Las rozłącznych drzew. (1) Dwa drzewa reprezentujące dwa zbiory z rys. 22.2. Drzewo po
lewej stronie odpowiada zbiorowi {b, c, e, h}, którego reprezentantem jest c; drzewo po prawej
odpol'riada zbiorowi {d,f, g}, którego reprezentantem jest[ (b) Rezultat wykonania UNION(e,g)
505
ROZDZIAŁ 22. STRUKTURY DANYCH DLA ZBIORÓW ROZŁĄCZNYCH
(•l (b)
Rys. 22.5. Kompresja ścieżki podcrn operacji FlND-SET.Na rysunku nie zaznaczono strzałek ani
pętli w korz.eni.ach. (a) Drzewo reprezentują.ce zbiór przed wykonaniem FlND-SET(a). Trójkąty
symbolizują poddrzewa, których korzeniami są narysowane węzły. Każdy węzeł zawiera wskaźnik
do swojego ojca. (b) Ten sam zbiór po wykonaniu FIND-SET(a).Wskaźnik w każdym wężle na
ścieżce do reprezentanta wskazuje teraz bezpośrednio na korzeń
506
22.3. LASY ZBIORÓW ROZŁĄCZNYCH
MAKE-SET(x)
1 p[x]-x
2 rank[x] ._..O
UNION(x, y)
I LINK(F!ND-SET(x),FIND-SET(y))
LINK(x,y)
1 if rank [xJ > rank[y]
2 thenp[y] - x
3 else p[x] ._..y
4 if rank[x] - rank[y]
5 tben rank[y] ._.,rank[y] +1
Procedura PIND-SET z kompresją ścieżki jest całkiem prosta.
FIND-SET(x)
I if x ,' p[x]
2 thenp[x] - FIND-SET(p[x])
3 returnp[x]
----------------"""""' __________ _
,,
507
ROZDZIAŁ 22. STRUKTURY DANYCH DLA ZBIORÓW ROZŁĄCZNYCH
ZADANIA
22.3-1. Wykonaj zadanie 22.2-2 z użyciem reprezentacji drzewiastej z łącze
niem według rangi i kompresją ścieżki.
22.3-2. Napisz nierekurencyjną wersję procedury FINO-SET z kompresją ścieżki.
22.3-3. Podaj ciąg m operacji MAKE-SET, UNION i FINO-SET, spośród których
n to operacje MAKE-SET, wykonujący się w czasie O(mlgn), pod warun-
kiem zastosowania tylko samej heurystyki łączenia według rangi.
* 22.3-4. Wykaż, że dowolny ciąg m operacji MAKE-SET, FINO-SET i UNION,
w którym wszystkie operacje UNION poprzedzają każdą operację PIND-
-SET, wykonuje się w czasie O(m), jeśli zastosujemy kompresję ścieżki i łą-
508
* 22.4. ANALIZA METODY ŁĄCZENIA WEDŁUG RANGI Z KOMPRESJĄ $CIEżKI
czenie według
rangi. Co by się działo w takiej samej sytuacji, jeśli zastoso-
walibyśmy jedynie kompresję ścieżki?
22···2}1
'. ') 4 22
22· = 22 2 = 265536
n, jeśli i= o
lg(lg(i- 11n, jeśli i> O oraz lgU- 1 >n> O
lg(l>n=
nieokreślone, jeśli i> O oraz Igli- 1ln ~ O lub wartość
Jg<i-lJn jest nieokreślona
lg•2 2 ·· ·'}n=n+l
,, ,,
i= 2 2' 2•' 2' 2•'
22··-2}16 22·
_.2} .•
l
"')16 l
2·.. }2·
•• 2)2···2)16
j =3 2'' 2
Kolumna
~;
1
~
2 •
'
I, '
;; ~
4 '
•
•.
•
'
Rys. 22.7. Gwałtowny wzrost funktji Ackermanna. Linie między wierszem i - 1 a i oznaczają warto-
ści z wiersza i - I występują.ce w wierszu i. Ze względu na szybkoSCwzrostu skala w poziomie nie
jest za.chowana. Odstępy między wartościami z wiersza i - 1 pojawiają.cym.i się w wierszu i rosną
błyskawic.mie wraz ze wzrostem numeru kolumny i wiersza. Jeśli prześledzimy drogę elementów
w wierszu i do ich pierwotnej pozycji w wierszu l, to szybkość wzrostu staje się jeszcze lepiej
widoczna
510
* 22.4. ANALIZA METODY ŁĄCZENIA WEDŁUG RANGI Z KOMPRESJĄ SCIEŻKI
ll Chociaż
funkcja ta nie jest odwrotnością funkcji Ackermanna w ścisłym matematycznym
sensie, zachowuje się jak odwrotność w tym znaczeniu, że rośnie tak. wolno, jak szybko rośnie
funkcja Ackermanna. Pojawienie się w definicji tajemniczej granicznej wartości lgn wynika z do-
wodu (który wykracza poza zakres tej książki), że c,..a.swykonywania ciągu operacji wynosi
O(m~(m, n)).
511
ROZDZIAŁ 22. STRUKTURY DANYCH DLA ZBIORÓW ROZŁĄCZNYCH
A(4, 1) = A(3, 2)
Własności rang
W końcowej części tego podrozdziału udowodnimy górne ograniczenie
O(m lg• n) na czas wykonywania ciągu operacji na zbiorach rozłącznych z łą
czeniem według rangi i kompresją ścieżki. W tym celu wykażemy najpierw
kilka własności rang.
LEMAT 22.2.
Dla każdego węzła x zachodzi rank[x] .::;;;
rank[p[x] ], przy czym nierówność jest
ostra, jeśli x #:-p[x]. Wartość rank[x] jest początkowo równa O i rośnie do
chwili, kiedy x "Fp[x]; od tego momentu rank[x] się już nie zmienia. Wartość
rank[p[x]] jest monotonicznie rosnącą funkcją czasu.
DOWÓD
Dowód przebiega przez prostą indukcję względem. liczby operacji z wykorzys-
taniem implementacji MAKE-SET, UNION i FINO-SET przedstawionej w pod-
rozdz. 22.3. Pozostawiamy go jako zad. 22.4-1.
•
Definiujemy size(x) jako liczbę węzłów w drzewie o korzeniu x, włącznie
z samym węzłem x.
LEMAT 22.3.
Dla dowolnego korzenia x zachodzi zależność size(x) ~ 2nnk1:cJ.
DOWÓD
Dowód przebiega przez indukcję względem liczby operacji LINK.. Zauważmy,
że operacje FIND-SET nie zmieniają ani rangi korzenia drzewa, ani rozmiaru
jego poddrzewa.
512
* 22.4. ANALIZA METODY ŁĄCZENIA WEDŁUG RANGI Z KOMPRESJĄ $CIEżKI
Jeśli
rank[x] i:- rank[y], to bez straty ogólności możemy założyć, że
rank[x] < rankfy]. Węzeł y zostaje korzeniem drzewa utworzonego przez ope-
rację LINK i mamy
= 2nmk'IYJ
Nie zmieniają się przy tym rangi ani rozmiary poddrzew żadnych innych węz
łów oprócz y.
Jeśli rank[x] = rank[y), to węzeł y znowu jest korzeniem nowego drzewa
•
imamy
DOWÓD
Ustalmy konkretną wartość r. Wyobraźmy sobie, że przypisując węzłowi x
rangę r (w wierszu 2 procedury MAKE-SET lub w wierszu 5 procedury LINK),
dołączamy etykietę x do każdego węzła w drzewie o korzeniu x. Na mocy
lematu 22.3 za każdym razem etykietę otrzymuje co najmniej 2' węzłów. Przy-
puśćmy, że zmienia się korzeń drzewa zawierającego węzeł x. Z lematu 22.2
wynika, ze
ranga nowego korzenia (a tak naprawdę to dowolnego przodka x
513
ROZDZIAŁ 22. STRUKTURY DANYCH DLA ZBIORÓW ROZŁĄCZNYCH
WNIOSEK 22.5.
•
Ranga żadnego węzła nie przekracza llg nJ .
DOWÓD
Jeśli weźmiemy r > lg n, to istnieje co najwyżej n/2' < 1 węzłów rangi r, a rangi
muszą być liczbami naturalnymi.
•
Dowód górnego oszacowania
Do wykazania górnego ograniczenia czasu wykonywania ciągu operacji
O(mtg·n) użyjemy metody kosztu sumaryC"ZDegow analizie zamortyzowanej
(patrz pod.rozdz. 18.1). W analizie kosztu zamortyzowanego wygodnie jest za-
kładać, że wykonujemy bezpośrednio operacje LINK, a nie UNION. A więc
ponieważ parametry procedury LINK muszą być wskaźnikami do dwóch ko-
rzeni, zakładamy, że Geśli trzeba) są wykonywane odpowiednie operacje
FINO-SET. Z następującego lematu wynika, że nawet jeśli policzymy osobno
dodatkowe operacje FI ND-SET, asymptotyczny czas wykonywania ciągu ope-
racji się nie zmieni.
LEMAT 22.6.
Dany ciąg S' złożony z m' operacji MAKE-SET, UNION i FIND-SET przekształ
camy na ciąg S złożony z m operacji MAKE-SET, LINK i FIND-SET, zamienia-
jąc każdą operację UNION na dwie operacje FIND-SET i jedną operację LINK.
Wówczas jeśli ciąg S wykonywał się w czasie O(m lg• n), to ciąg S' wykonuje się
w czasie O(m'lg·n).
DOWÓD
Ponieważ każda operacja UNION w ciągu S' zostaje zastąpiona przez trzy
operacje w S, mamy m' ~ m ~ 3m'. Ponieważ m = O(m'), z górnego ograni-
czenia O(m lg• n) na czas wykonywania ciągu po zamianie S wynika ogranicze..
nie O(m'tg·n) na czas wykonywania ciągu operacji w pierwotnej wersji S' .
•
514
* 22.4. ANALIZA METODY ŁĄCZENIA WEDŁUG RANGI Z KOMPRESJĄ $CIEŻKI
W pozostałej części
tego podrozdziału będziemy zakładać, że początkowy
ciąg m' operacji MAKE-SET,UNION i PIND-SETzostał przekształcony w ciąg
m operacji MAKE-SET,LINK i PIND-SET. Udowodnimy górne ograniczenie
O(mlg•n) dla ciągu po przekształceniu, a z niego po odwołaniu się do lema-
tu 22.6 wywnioskujemy, że czas wykonywania oryginalnego ciągu m' operacji
wynosi O(m'lg.n).
TwlEIIDZENIE22.7.
Ciąg m operacji MAKE-SET,LINK i PIND-SET,spośród których n to operacje
MAKE-SET,w reprezentacji drzewiastej zbiorów rozłącznych z łączeniem we-
dług rangi i kompresją ścieżki w najgorszym przypadku można wykonać
0
w czasie O(mlg n).
Dowón
PosłuZymy się pojęciem opiaty odpowiadającej faktycznemu kosztowi kazdej
operacji na zbiorach i obliczymy sumę wszystkich opłat po wykonaniu całego
ciągu operacji. Suma ta da nam łączny koszt wszystkich operacji.
Kwestia opłaty związanej z operacjami MAKE-SETi LINKjest prosta: na
każdą operację przypada jednostkowa opłata. Ponieważ faktyczny czas wyko-
nywania tych operacji jest równy 0(1), wniesione opłaty są równe faktycznym
kosztom operacji.
Zanim poruszymy sprawę opłat odpowiadających operacjom FIND-SET,
podzielimy zbiór rang węzłów na bloki, umieszczając rangę r w bloku lg ·r dla
r - O,I, ..., LignJ.(Przypomnijmy, ż, LlgnJ jest maksymalną wartością rangi).
Najwy:iszym numerem bloku jest zatem lg•Ogn) = lg•n-1. Dla wygody ozna-
czeń zdefmiujmy dla liczb całkowitych j ;a: - 1 zależność
-1 , jeślij=-1
jeśli j - O
jeśli j =1
jeśli j ;a:2
515
ROZDZIAŁ 22. STRUKTURY DANYCH DLA ZBIORÓW ROZŁĄCZNYCH
wnioskujemy, że węzłowi,
którego ranga należy do blokuj opłatę za ścieżkę
możemy przypisać co najwyżej B(J) - BU- I) - 1 razy.
Naszym następnym krokiem w oszacowaniu sumy opłat za ścieżki będzie
wyznaczenie ograniczenia na liczbę węzłów o rangach należących do bloku
j dla liczb całkowitych j ~ O. (Przypomnijmy, że na mocy lematu 22.2 ranga
węzła przestaje się zmieniać z chwilą, gdy staje się on synem innego węzła).
Liczbę węzłów o rangach należących do blokuj oznaczmy przez N(j). Na
mocy lematu 22.4 mamy
BU) n
NU).; L ·;
r=BU-1)+1 2
Dla j = O wartością tej sumy jest
N(O) - n/2° + n/2'
- 3n/2
- 3n/2B(O)
Dlaj~ 1 mamy
n BU)-<BU-1)+1) 1
N(j) :::;_;
2BU-l)+l ,LO 2'
n w I
< 2 su-1)+1,L 2 ,
0
n
2BU-1)
n
B(J)
Jg•n-1 3n
,;; ,I, 2B(j) . B(j)
517
ROZDZIAŁ 22. STRUKTURY DANYCH DLA ZBIORÓW ROZŁĄCZNYCH
= .~..nlg 0
n
2
•
WNIOSEK22,8,
Ciąg m operacji MAKE-SET, UNION i FINO-SET, spośród których n to operacje
MAKE-SET, w implementacji drzewiastej z łączeniem według rangi i kompresją
ścieżki można wykonać w najgorszym przypadku w czasie O(mlg"n).
DOWÓD
Natychmiastowy na mocy twierdzenia 22.7 i lematu 22.6.
ZADANIA
•
22.4-1. Udowodnij lemat 22.2.
22.4-2. Ile bitów potrzeba do zapamiętania wartości size(x) dla dowolnego
węzła rl Ile do zapamiętania rank[x]?
22.4-3. Wykorzystując lemat 22.2 i wniosek 22.5, przedstaw prosty dowód, że
ciąg operacji w implementacji drzewiastej z łączeniem. według rangi, ale bez
kompresji ścieżki wykonuje się w czasie O(mlgn).
* 22.4-4. Przypuśćmy, że zmienimy zasadę przypisywania opłat, przypisując jed-
nostkową opłatę za blok ostatniemu węzłowi na ścieź.ce do reprezentanta,
którego ranga należy do bloku j dla j = O, 1, ... , lg• n - 1. Pozostałym
węzłom przypisujemy po jednej opłacie za ścieżkę. Jeśli zatem węzeł jest
synem korzenia i nie jest ostatnim węzłem o randze z danego bloku, to
przypisujemy mu opłatę za ścieżkę, a nie za blok. Wykaż, że węzłowi,
którego ranga pozostaje w danym blokuj, możemy przypisać Cl(m) opłat
za ścieżki.
Problemy
22-1. Minim1DD„off-line"
„off-line" dotyczy zarządzania dynamicznym zbiorem T ele-
Problem mi11inu1D1
mentów z dziedziny {1, 2, ... , n}, na którym są wykonywane operacje INSERT
i EXTRACT-MIN. Mamy dany ciąg S składający się z n operacji INSERT oraz
m operacji EXTRACT~MIN,przy czym każdy element zbioru {l, 2, ... , n} jest
518
PROBLEMY
4, 8, E, 3, E, 9, 2, 6, E, E, E, 1, 7, E, 5
0FF-LINE-MINIMUM(m, n)
I fori+-1 ton
2 do wyznacz j takie, że i E K1
3 ifj=l=m+l
4 then extracted[j] +- i
5 niech / będzie najmniejszą wartością większ.ą niż j,
dla której zbiór K, istnieje
6 Ki +- K1u Ki, przy czym K1 zostaje zniszczone
7 return extracted
519
ROZDZIAŁ 22. STRUKTURY DANYCH DLA ZBIORÓW ROZŁĄCZNYCH
22.2. Wyznaczaniegłębokości
Problemwyznaczaniagłębokości dotyczy lasu § = {T1} ukorzenionych drzew
z trzema operacjami:
MAKE-TREE(v}tworzy drzewo, którego jedynym węzłem jest v.
FIND-DEPTH(v}zwraca głębokość węzła v w jego drzewie.
GRAFI'(r, v) czyni węzeł r, o którym zakładamy, że jest korzeniem drzewa,
synem węzła v, o którym zakładamy, że jest w innym drzewie niż r, ale nie musi
być jego korzeniem.
520
PROBLEMY
LCA(u)
I MAKE·SET(u)
2 ancestor[FIND-SET(u)]._ u
3 for każdy syn v węzła u w T
4 do LCA(v)
5 UN!ON(u, v)
6 ancestor[FIND-SET(u)]- u
1 color[u]._ CZARNY
8 for każdy węzeł v taki, że {u, v}eP
9 do if co/or{v] = CZARNY
10 tb.en wypisz „Najniższym wspólnym przodkiem"
u „i" v ,Jest" ancestor[FIND-SET(v)]
(a) Uzasadnij, że instrukcja w wierszu 10 wykona się dokładnie jeden raz dla
każdej pary {u, v) eP.
(b) Uzasadnij, że w chwili wywołania LCA(u) liczba zbiorów w strukturze
danych dla zbiorów rozłącznych jest równa głębokości u w drzewie T.
(c) Udowodnij, że procedura LCA poprawnie wypisuje najniższego wspólnego
przodka węzłów u i v dla każdej pary {u, v} e P.
(d) Dokonaj analizy czasu działania procedury LCA, zakładając użycie im-
plementacji struktury danych dla zbiorów rozłącznych z pod.rozdz. 22.3.
521
ROZDZIAŁ 22. STRUKTURY DANYCH DLA ZBIORÓW ROZŁĄCZNYCH
Uwagido rozdziału
Algorytmygrafowe
Wprowadzenie
Grafy są powszechniestosowane w informatyce, a algorytmy grafowe zaliczają
się do podstawowych w tej dziedzinie. Istnieją setki interesujących problemów
obliczeniowych, które wyraża się w ,języku" grafów. W tej części przedstawi-
my kilka najważniejszych z tych problemów.
W rozdziale 23 pokażemy, jak można reprezentować graf w komputerze
i omówimy dwie metody przeszukiwania grafów: w głąb i wszerz. Następnie
podamy dwa zastosowania przeszukiwania w głąb: do sortowania topologicznego
acyklicznego grafu skierowanego i do podziału grafu na silnie spójne składowe.
W rozdziale 24 opiszemy, jak obliC'lać minimalne drzewo rozpinające da-
nego grafu. Takie drzewo określa najmniejszy wagowo sposób połączenia
wszystkich wierzchołków grafu, w którym z każdą krawędzią jest związana
pewna waga. Algorytmy obliczania minimalnych drzew rozpinających są dob-
rymi przykładami algorytmów zachłannych.
Rozdziały 25 i 26 poświęcimy problemowi obliczania najkrótszych ścieżek
między wierzchołkami, gdy każda krawędź ma określoną długość lub wagę.
W rozdziale 25 zajmiemy się obliczaniem najkrótszych ścieżek z danego wierz-
chołka (źródła) do wszystkich pozostałych wierzchołków w grafie, a w roz-
dziale 26 pokażemy, jak obliczać najkrótsze ścieżki między wszystkimi parami
wierzchołków.
Na koniec, w rozdziale 27, opiszemy, jak obliczyć maksymalny przepływ
w sieci (grafie skierowanym) z ustalonego źródła do ustalonego ujścia, przy
ustalonej przepustowości ograniczającej przepływ przez każdą krawędź. Ogól-
ny problem maksymalnego przepływu pojawia się w wielu zagadnieniach i do-
bre algorytmy służące do rozwiązywania tego problemu mogą być użyte do
efektywnego rozwiązania wielu problemów pokrewnych.
Czas działania algorytmów grafowych dla danego grafu G= (V, E) będzie
my mierzyli w zależności od liczby wierzchołków ]VI i liczby krawędzi IE!. Tak
524
WPROWADZENIE
Podstawowealgorytmygrafowe
526
23.1. REPREZENTACJE GRAFÓW
wejściowy graf jest reprezentowany przez listy sąsiedztwa. Kiedy graf jest gęsty
- IE! jest bliskie IVl2 - lub gdy istnieje potrzeba szybkiego stwierdzania, czy
istnieje krawędź łącząca dwa dane wierzchołki, wtedy może być korzystniejsza
reprezentacja macierzowa. Dla przykładu, w dwóch algorytmach znajdowania
najkrótszych ścieżek, opisanych w ro7.dz. 26, zakłada się, że grafy wejściowe są
reprezentowane przez macierze sąsiedztwa.
I 2 3 4 5
I I o I o o I
2 2 I o I I I
3 3 o I o I o
4 4 o I I o I
5 5 I I o I o
(,) (b) (c)
Rys. lll. Dwie reprezentacje grafu nieskierowanego. (a) Graf nieskierowany G z pięcioma wierz-
chołkami i siedmioma krawędziami (b) Listy sąsiedztwa grafu G. (c) Macierz sąsiedztwa grafu G
123456
4 1010100
2000010
Rys. 23.2. Dwie reprezentacje grafu skierowanego. (a) Graf skierowany G z sześcioma wierzchołkami
i ośmioma krawędziami. (b) Listy sąsiedztwa grafu G. (c) Macierz sąsiedztwa grafu G
Jeśli G jest
grafem skierowanym, to suma długości wszystkich list sąsiedz
twa wynosi !El, ponieważ krawędź postaci (u, v) jest reprezentowana przez
wystąpienie v na liście Aąj[u]. Jeśli G jest grafem nieskierowanym, to suma
527
ROZDZIAŁ 23. PODSTAWOWE ALGORYTMY GRAFOWE
528
23.1. REPREZENTACJEGRAFOW
529
ROZDZIAŁ 23. PODSTAWOWE ALGORYTMY GRAFOWE
23.2. Przeszukiwanie
wszerz
Przeszukiwanie wszerz jest jednym z najprostszych algorytmów przeszukiwania
grafu i pierwowzorem wielu innych algorytmów grafowych. Algorytm Dijkstry
dla problemu najkrótszych ścieżek z jednym źródłem (rozdz. 25) oraz algorytm
Prima dla problemu minimalnego drzewa rozpinającego (podrozdz. 24.2) dzia-
łają z wykorzystaniem idei podobnych do tych z przeszukiwania wszerz.
Dane są graf G = (V, E) i wyróżniony wierzchołek początkowy s (nazywa-
ny dalej źródłem). W przeszukiwaniu grafu wszerz są systematycznie badane
krawędzie G w celu odwiedzenia każdego wierzchołka, który jest osiągalny z s.
Jednocześnie są obliczane odległości (najmniejsza liczba krawędzi) od źródła
s do wszystkich osiągalnych wierzchołków. Wynikiem działania algorytmu jest
też drzewo przeszukiwania wszerz o korzeniu w s, które zawiera wszystkie
osiągalne wierzchołki. Dla każdego wierzchołka v osiągalnego z s ścieżka
w drzewie przeszukiwania wszerz od s do v odpowiada najkrótszej ścieżce od
s do v w G, tzn. ścieżce zawierającej najmniejszą możliwą liczbę krawędzi.
Algorytm przeszukiwania wszerz działa zarówno dla grafów skierowanych, jak
i nieskierowanych.
Nazwa przeszukiwanie wszerz bierze się stąd, że w tym algorytmie granica
między wierzchołkami odwiedzonymi i nie odwiedzonymi jest przekraczana
jednocześnie na całej jej szerokości. To znaczy, wierzchołki w odległości k od
źródła są odwiedzane przed wierzchołkami w odległości k + 1.
Podczas przeszukiwania wszerz każdy wierzchołek jest kolorowany na bia-
ło, szaro lub czarno. Początkowo wszystkie wierzchołki są białe i mogą potem
zmienić kolor na szary lub czarny. Podczas przeszukiwania każdy nowo napot-
kany wierzchołek staje się odwiedzony, a jego kolor zmienia się na inny niż
biały. Zatem wierzchołki szare i czarne są już odwiedzone, ale rozróżnia się je
w celu zapewnienia poprawności wykonywania przeszukiwania. Jeśli (u, v)e E
i wierzch olek u jest czarny, to wierzchołek v jest albo s2ary albo czarny; tzn.
wszystkie wierzchołki sąsiadujące z v są już odwiedzone. Wierzchołki szare
mogą mieć białych sąsiadów; tworzą one granicę między odwiedzonymi i nie
odwiedzonymi wierzchołkami.
Algorytm przeszukiwania wszerz buduje drzewo przeszukiwania wszerz,
początkowo zawierające tylko korzeń, który jest wierzchołkiem źródłowym s.
Gdy podczas przeglądania listy sąsiedztwa odwiedzonego wierzchołka u napo-
tykany jest nie odwiedzony wierzchołek v, krawędź (u, v) i wierzchołek v są
dodawane do drzewa. Mówimy, że u jest popnednikiem lub ojcem v w drzewie
przeszukiwania wszerz. Ponieważ wierzchołek jest odwiedzany co najwyżej raz,
530
23.2. PRZESZUKIWANIE WSZERZ
BFS(G, s)
1 for każdy wierzchołek ue V[GJ- {s}
2 do color[u]+- BIAŁY
3 d[u]- oo
4 n:[u]- NIL
5 color[s]+- SZARY
6 d[s]-0
7 n(s]- NIL
8 Q- {s)
9 whileQ,'0
10 do u - head[Q]
11 for każdy veAdj(u]
12 do if color[v]= BIAŁY
13 then color[v]+- SZARY
14 d[v] - d[u] + 1
15 n[v]-u
16 ENQUEUE(Q, v)
17 DEQUEUE(Q)
18 color[u]+- CZARNY
531
ROZDZIAŁ 23. PODSTAWOWEALGORYTMY GRAFOWE
--
' o' '- '- "
- "
Q ~ (b)
-
Q GEJ
-' - - -
w X y
o
' w
- -
X y
I I
' X
'
.,
' ' ' " ' ' "
Q 1,1,1,1 (0 Q l•l•ltl
2 2 3 2 3 3
w y w X y
' X
'
' ' "
(g) Q [iliJ (h)
3 3
(i) Q 0
Rys, 23.3. Działanie procedury BFS na grafie nieskierowanym. Krawędzie drzewowe tworzone przez
BFS są :zacieniowane. W kafflym wierzchołku u jest podana wartość d[u]. Stan kolejki Q jest
przedstawiony na początku każdej iteracji instrukcji fflllle (wiersze 9-18). Poniiej wierzchołków
w kolejce :znajdują się ich odległości od źródła
Główna pętla programu jest zapisana w wierszach 9-18. Pętla jest wykony-
wana tak długo, jak długo istnieją szare wierzchołki. Szare wierzchołki są wie-
rzchołkami odwiedzonymi, których listy sąsiedztwa nie zostały jeszcze w całości
przejrzane. W wierszu 1Ojest pobierany szary wierzchołek u z poc7.ątku kolejki
Q. Każdy wierzchołek v na liście sąsiedztwa u jest rozważany w pętli for w wier-
szach 11-16. Jeśli v jest biały, to nie był dotychcms odwiedzony. Wierzchołek
v jest odwiedzany w wierszach 13-16. Najpierw v jest kolorowany na sza.ro,
a d[v] przyjmuje wartość d[u] + 1. Następnie wierzchołek u jest zapamiętywany
jako ojciec wierzchołka v. Na koniec v jest umiesz.czanyjako ostatni element
w kolejce Q. Kiedy wszystkie wierzchołki z listy sąsiedztwa wierz.cbolkau są już
zbadane, u jest usuwany z Q i kolorowany na czarno (wiersze 17-18).
532
23.2. PRZESZUKIWANIE WSZERZ
Analiza
Zanim udowodnimy własności przeszukiwania wszerz, podejmiemy się trochę
prostszego zadania - analizy czasu działania przeszukiwania wszerz dla danego
grafu G = (V, E). Po zainicjowaniu żaden wierzchołek nie jest nigdy kolorowa-
ny na biało. Dlatego test z wiersza 12 gwarantuje, że każdy wierzchołek jest
wstawiany do kolejki co najwyżej raz i co najwyżej raz jest z niej usuwany.
Operacje wstawiania do kolejki i usuwania z kolejki mjmują czas 0(1). Stąd
łączny czas wykonywania operacji na kolejce wynosi O(V). Ponieważ lista są
siedztwa każdego wierzchołka jest przeglądana tylko wtedy, gdy wierzchołek
zostanie usunięty z kolejki, lista sąsiedztwa każdego wierzchołka jest przeglą
dana co najwyżej raz. Ponieważ suma długości wszystkich list sąsiedztwa wy-
nosi @(E), łączny czas spędzany na przeglądaniu list sąsiedztwa wynosi O(E).
Inicjowanie zabiera czas O(V) i dlatego łączny czas działania procedury BFS
wynosi O(V + E). Tak więc przeszukiwanie wszerz jest wykonywane w czasie
liniowo zależnym od rozmiaru reprezentacji listowej grafu G.
Najkrótsześcieżki
Na początku tego rozdziału stwierdziliśmy, że przy przeszukiwaniu wszerz są
obliczane odległości od danego źródła s E V do każdego osiągalnego z s wierz-
chołka w grafie G = (V, E). Zdefiniujmy odległość t:5(s,v) od źródła s do wierz-
chołka v jak.o minimalną liczbę krawędzi na ścieżce od wierzchołka s do v lub
oo, gdy takiej ścieżki nie ma. O każdej ścieżce między wierzchołkami si v o dłu
gości ó(s, v) powiemy, że jest najkrótszą ścleżk.ą 1 l łączącą s z v. Zanim pokaże
my, że w przeszukiwaniu wszerz rzeczywiście są obliczane najkrótsze odległo
ści, omówimy ich pewną ważną własność.
LEMAT23.1.
Niech G = (V, E) będzie grafem skierowanym lub nieskierowanym i niech se V
będzie dowolnym wierzchołkiem. Dla każdej krawędzi (u, v)E E zachodzi wów-
czas zależność
Dowoo
Jeśli wierzchołek
u jest osiągalny z s, to także wierzchołek v jest osiągalny z s.
W tym przypadku najkrótsza ścieżka z s do v nie może być dłuższa od najkrót-
1
> W rozdziałach 25 i 26 uogólnimy nas1.e rozważania dotyczące najkrótszych ścieżek na grafy
z wagami, w których każda krawędź ma wagę o wartości rzeczywistej, a wagą. ścieżki jest !inma wag
jej krawędzi składowych. Krawędzie w grafach rozważanych w tym rozdziale nie mają. wag.
533
ROZDZIAŁ 23. PODSTAWOWE ALGORYTMY GRAFOWE
LEMAT 23.2.
Niech G = (V, E) będzie grafem skierowanym lub nieskierowanym. Załóżmy,
że procedura BFS zostaje wywołana dla G i danego wierzchołka źródłowego
se V. Wtedy, po zakończeniu działania BFS, d[v] ~ ó(s, v) dla każdego wierz-
chołka v e V.
DOWÓD
Wykażemy przez indukcję, że po każdym wstawieniu wierzchołka do kolejki
zachodzi d[v] ~ ó(s, v) dla każdego ve V.
Warunkiem początkowym indukcji jest sytuacja bezpośrednio po umiesz-
czeniu s w kolejce Q w wierszu 8 procedury BFS. Teza indukcyjna jest w tym
miejscu prawdziwa, ponieważ d[s] = O = ó(s, s) i d[v] = oo ~ ó(s, v) dla wszyst-
kich ve V - {s).
W celu przeprowadzenia kroku indukcyjnego rozważmy biały wierzchołek
v, który jest odwiedzany w cmsie przeglądania listy sąsiedztwa u. Z założenia
indukcyjnego wynika, że d[u] ;;i, ó(s, u). Z przypisania wykonywanego w wier-
szu 14 oraz z lematu 23.1 otrzymujemy
d[v] = d[u] + I
~ ó(s, u) +I
~ ó(s, v)
534
23.2. PRZESZUKIWANIE WSZERZ
LEMAT23.3.
Załóżmy, że podczas wykonywania procedury BFS dla grafu G = (V, E) kolej-
ka Q zawiera wierzchołki (v 1, v2, ••• , v,), gdzie v1 znajduje się na pocz.ątku Q,
a v, znajduje się na jej końcu. Wtedy d[v,] ~ d[v 1] + 1 oraz d[v;] ~ d[v 1+ 1 ] dla
i=l,2, ...,r-1.
DOWÓD
Dowód przeprowadzamy przez indukcję względem liczby operacji na kolejce.
Początkowo, gdy kolejka zawiera tylko s, lemat jest oczywiście prawdziwy.
Żeby przeprowadzić krok indukcyjny, musimy udowodnić, że lemat pozo-
staje prawdziwy zarówno po wstawieniu do kolejki nowego wierzchołka, jak
i po usunięciu z niej wierzchołka. Jeśli z początku kolejki jest usuwany wierz-
chołek v1, nowym początkiem kolejki zostaje v2 • (Jeśli kolejka staje się pusta, to
lemat jest oczywiście prawdziwy). Ale wtedy mamy d[v.] is;;d[v 1] + 1 ~
~ d[v:J + I, a pozostałe nierówności nie ulegają zmianie. Stąd wynika, że le-
mat zachodzi dla kolejki z wierzchołkiem v2 na początku. Wstawianie wierz-
chołka do kolejki wymaga bliższego przyjrzenia się procedurze BFS. Kiedy
wierzchołek v jest wstawiany do kolejki (wiersz 16), stając się w ten sposób
wierzchołkiem v,+i• wierzchołek v1 z początku kolejki Q jest w rzeczywistości
wierzchołkiem u, którego lista sąsiedztwa jest właśnie przeglądana. Stąd
d[v,+,l - d[v] - d[u] + I - d[v,] + I. Mamy także d[v,] <; d[v,] + I - d[u] +
+ 1 = d[v] = d[v,+ 1], a pozostałe nierówności nie ulegają zmianie. A zatem
lemat pozostaje prawdziwy po wstawieniu v do kolejki.
•
Możemy teraz udowodnić, że w przeszukiwaniu wszerz najkrótsze odległości
są obliczane poprawnie.
DOWÓD
Rozpoczniemy od przypadku, w którym wierzchołek v nie jest osiągalny re
źródła s. Z lematu 23.2 mamy: d[v] ~ ó(s, v) = co, a zatem zmienna d[v] nie
może w wierszu 14 przyjąć skończonej wartości. Można udowodnić przez in-
dukcję, że dla każdego wierzchołka w Q wartość d jest skończona. Dlatego
535
ROZDZIAŁ 23. PODSTAWOWE ALGORYTMY GRAFOWE
536
23.2. PRZESZUKIWANIEWSZERZ
•
Drzewo przeszukiwaniawszerz
Jak widać na rys. 23.3, podczas przeszukiwania grafu za pomocą procedury
BFS jest budowane drzewo przeszukiwania wszerz. Drzewo to jest reprezen-
towane przez pola n: związane z wierzchołkami grafu, Bardziej formalnie, dla
każdego grafu G = (V, E) z wyróżnionym źródłem s defm.iujemypodgraf po-
przednikówgrafu G jako graf G. = (V., EJ, gdzie
oraz
LEMAT23.5.
Procedura BFS wykonywana dla skierowanego lub nieskierowanego grafu
G = (V, E) oblicza 1t w taki sposób, i.e graf poprzedników G,.= (G,., E,.) jest
drzewem przeszukiwania wszerz.
DOWÓD
W wierszu 15 procedury BFS m1iennej 1t[v]zostaje nadana wartość u tylko
wtedy, gdy (u, v) EE i i5(s, v) < oo (tzn. gdy v jest osiągalne z s). Dlatego V"
składa się z tych wierzchołków ze zbioru V, które są osiągalne z s. Ponieważ G"
jest drzewem, zawiera dokładnie jedną ścieżkę z s do każdego wierzchołka z V,...
Stosując indukcyjnie twierdzenie 23.4, otrzymujemy, że każda taka ścieżka jest
najkrótszą ścieżką.
•
537
ROZDZIAŁ 23. PODSTAWOWE ALGORYTMY GRAFOWE
PRINT-PATH(G,s, v)
I ifv=s
2 then wypisz s
3 else if 1t[v]~ NIL
4 tb.enwypisz „nie ma ścieżki z" s „do" v
5 else PRINT-PATH(G,s, x[v])
6 wypisz v
ZADANIA
23.2-1. Podaj wynik działania przeszukiwania wszerz dla grafu skierowanego
z rys. 23.2a, przyjmując za źródło wierzchołek 3.
23,2-2. Podaj wynik działania przeszukiwania wszerz dla grafu nieskierowa-
nego z rys. 23.2, przyjmując za źródło wierzchołek u.
23.2-3. Jaki będzie czas dzlałania procedury BFS, jeśli graf wejściowy jest re-
prezentowany przez macierz sąsiedztwa, a algorytm jest zmodyftlcowany
w taki sposób, żeby działał poprawnie dla tej reprezentacji?
23,2-4. Uzasadnij, że w przeszukiwaniu wszerz wartość d[u] związana z wierz-
chołkiem u jest niezależna od porządku, w którym wierzchołki występują
na listach sąsiedztwa.
23.2-S. Podaj przykład grafu skierowanego G = ( V, E), wierzchołka źródło
wego SE V i zbioru krawędzi drzewowych E„ c E takich, że dla każdego
v e V jedyna ścieżka w E„ z s do v jest naJ'krótszą ścieżką z s do v w grafie
G, ale zbiór krawędzi E„ nie może zostać utworzony w wyniku wykonania
procedury BFS dla G, bez względu na to,jak wierzchołki są uporządkowa
ne na każdej liście sąsiedztwa.
23.2-6. Podaj efektywny algorytm sprawdzający, czy dany graf jest dwudzielny.
* 23.2-7. Swlnicę drzewa T= (V, E) definiujemy jako
max ó (u, v)
u,1:tEY
538
23,3. PRZESZUKIWANIE W GŁĄB
w głąb
23.3. Przeszukiwanie
Jak sama nazwa wskazuje, przeszukiwanie w głąb polega na sięganiu „głębiej"
w graf, jeżeli jest to tylko możliwe. Przy przeszukiwaniu w głąb są badane
krawędzie ostatnio odwiedzonego wierzchołka v, z którego jeszcze wychodzą
nie zbadane krawędzie. Gdy wszystkie krawędzie opuszczające wierzchołek
v są zbadane, przeszukiwanie „wraca" do wierzchołka, z którego v został od-
wiedzony. Proces ten jest kontynuowany dopóty, dopóki wszystkie wierzchołki
osiągalne z początkowego wierzchołka źródłowego nie zostaną odwiedzone.
Jeśli pozostanie jakikolwiek nie odwiedzony wierzchołek, to jeden z takich
wierzchołków wybiera się jako nowe źródło i przeszukiwanie jest powtarzane
z tego źródła. Cały proces powtarza się, a.zwszystkie wierzchołki w grafie
zostaną odwiedzone.
Jeżeli przy przeszukiwaniu w głąb, podobnie jak przy przeszukiwaniu
wszerz, w trakcie przeglądania listy sąsiedztwa już odwiedzonego wierzchołka
u jest wykrywany nie odwiedzony wierzchołek v, to zdarzenie takie jest rejest-
rowane przez zapamiętanie w zmiennej n[v] wierzchołka u - poprzednik.a v.
W przeciwieństwie do przeszukiwania wszerz, gdzie podgraf poprzedników
jest drzewem, podgraf poprzedników tworzony w przeszukiwaniu w głąb
może składać się z kilku drzew, ponieważ przeszukiwanie może być wykony-
wane z wielu źródeł. Dlatego właśnie podgraf poprzedników w przeszukiwaniu
w głąb definiujemy trochę inaczej niż drzewo przeszukiwania wszerz: teraz
G, - (V, E,), gdzie
539
ROZDZIAŁ 23. PODSTAWOWE ALGORYTMY GRAFOWE
DFS(G)
1 for każdy wierzchołek uE V[G]
2 do color[u]+- BIAŁY
3 n[u] +- NIL
4 time+-0
5 for każdy wierzchołek uE V{G]
6 do if color[u]= BIAŁY
7 thenDFS-VISIT(u)
DFS-VISIT(u)
1 color[u]+- SZARY [> Biały wierzchołek. u właśnie został odwiedzony.
2 d[u] +- time+- time + 1
3 for każdy veAdj[u] I> Zbadaj krawędź (u, v)
4 do if color[v]= BIALY
5 !ben it[v]- u
6 DFS-VISIT(v)
1 co/or[u]+- CZARNY [> Pokoloruj u na czarno - został przetworzony
8 f(uJ+-time+- time+ l
Rysunek 23.4 ilustruje działanie procedury DFS dla grafu z rys. 23.2.
540
23.3. PRZESZUKIWANIE W GŁĄB
,,
" " )
"
,,,---,
_)
"
I/ I/"
" "
-
"
- ''
)
,
;:,
" '
- ,/ '
"
(
.J-.....
, ,,
'"'
{a,
' ' '
(,I I
" /
""
_.1. . ..,..
C_~) (
·--
'
.J__./
·-'
(,)
' ' ' '
10
'" '"'
"
I/
w
'
,," ®
w
(...I.~")
' ·--~' -
,ID
-- ,-
'' --
- ,,
.--"--·'
, (-1~~-
- ~
541
ROZDZIAŁ 23. PODSTAWOWE ALGORYTMY GRAFOWE
L JAdj[v]I - 0(E)
•• v
542
23.3. PRZESZUKIWANIEW Gł.ĄB
(,)
...
(b)
'
''
' '
'' ''
' '
' ' '' ' ''
' '
2 3 4 5 6 7 8 9 IO 11 12 13 14 IS 16
(, (, (y (x x) y) (w w) ,) .,) (I (v v) (u u) ,)
(,)
'
Rys. 23.S. Włamości przeszukiwania w głąb. (a) Wynik przeszukiwania w głąb dla grafu skierowa-
nego. Wierzchołki są poctykietowane w ten sam spos6b, jak na rys. 23.4. Podobnie są zamaczone
typy krawędzi (b) Przedziały wyznaczone przez cmsy odwiedzania i czasy przetworzenia wicrz-
chołk6w odpowiadają wyrażeniu nawiasowemu poniżej. Kaidy prostokąt rozpina przedział wy.
znaczony przez czas odwiedzenia i czas przetworzenia odpowiadającego mu wierzchołka. Zostały
zamaczone krawędzie drzewowe. Jeśli dwa przedziały zachodzą na siebie, to jeden z nich jest
zawarty wewnątrz drugiego, a wierzchołek odpowiadający mniejszemu przedziałowi jest potom-
k:icm wierzchołka odpowiadającego przedziałowi większemu. (c) Graf z części (a) narysowany
w ta.kispos6b, że wszystkie krawędzie drzcwowe i w przód prowadzą w dół drzewa przeszukiwania
w głąb, a wszystkie krawędzie powrotne prowadzą od potomka do przodka
543
ROZDZIAŁ 23. PODSTAWOWE ALGORYTMY GRAFOWE
DOWÓD
Rozpacz.niemy od przypadku, w którym d[u] < d[v]. Do rozpatrzenia są dwa
podprzypadki w zależności od tego, czy d[v] <J[u], czy nie. W pierwszym
podprzypadku d[v] </[u], wierzeholek v został więc odwiedzony wtedy, kiedy
wierzchołek u byłjeszc:ze szary. Stąd wynika, że v jest potomkiem u. Co więcej,
ponieważ wierzchołek v jest odwiedzany później niż wierzchołek u, wszystkie
krawędzie wychodzące z v zostaną zbadane i v zostanie przetworzony, zanim
przeszukiwanie powróci do u i wierzchołek u zostanie przetworzony. Dlatego
w tym przypadku przedział [d[v], /[v]] jest całkowicie zawarty w przedziale
[d[u], /[ull, W drugim podprzypadku /[u] < d[v]; z nierówności 23.1 wynika
więc, że przedziały [d[u], /[uil i [d[v], /[•Il są rozłączne.
DowOD
Natychmiastowy wniosek z twierdzenia o nawiasach.
•
W-następnym twierdzeniu jest podana inna ważna cecha wierzchołk.a-po
tomka w lesie przeszukiwania w głąb.
DOWÓD
=> Załóżmy, że wierzchołek v jest potomkiem wierzchołka u. Niech w będzie
dowolnym wierzchołkiem na ścieżce w drzewie przeszukiwania w głąb leżącym
544
23.3. PRZESZUKIWANIE W GŁĄB
między u i v. Z wniosku 23.7 wynika, że d[u] < d[w] i stąd w jest biały
w kroku d[u].
..;;:,Przypuśćmy, że wierzchołek v w kroku d{u] jest osiągalny z wierzchołka
u ścieżką złożoną z białych wierzchołków, ale v nie zostaje potomkiem
u w drzewie przeszukiwania w głąb. Bez straty ogólności załóżmy, że każdy
inny wierzchołek z tej ścieżki zostaje potomkiem u. (W przeciwnym rarie niech
v będzie najbliżej położonym od u wierzchołkiem na ścieżce, który nie zostaje
potomkiem u). Niech w będzie poprzednikiem v na tej ścieżce. Zatem w jest
potomkiem u (faktycznie w i u mogą być tym samym wierzchołkiem), a z wnio-
sku 23.7 wynika, 7.e/[w] ~f[u]. Zauważmy, że wierzchołek v musi zostać od-
wiedzony po odwiedzeniu u, ale zanim wierzchołek w wstanie przetworzony.
Dlatego d[u] < d[v] <f[w] .:;;;/[u). Z twierdzenia 23.6 wynika wtedy, że prze-
dział [d[v],f[vTI jest całkowicie zawarty w przedziale [d[uJ, f[uTI. Z wnios-
ku 23.7 dostajemy, że wierzchołek v musi ostatecznie zostać potomkiem u .
•
Klasyfikacjakrawędzi
Inną interesującą własnością przeszukiwania w głąb
jest to, że można je za-
stosować do sklasyfikowania krawędzi wejściowego grafu G = (V, E). Taka
klasyfikacja może być używana do zbierania ważnych informacji o grafie. Dla
przykładu, w następnym podrozdziale zobaczymy, że graf skierowany jest acy-
kliczny wtedy i tylko wtedy, gdy przy przeszukiwaniu w głąb nie pojawiają się
krawędzie powrotne (lemat 23.10).
Możemy zdefiniować cztery typy krawędzi w odniesieniu do lasu przeszu-
kiwania w głąb G„ otrzymywanego w wyniku przeszukiwania w głąb grafu G.
1. Krawędziami drzcwowymi są krawędzie w lesie przeszukiwania w głąb G,,.
Krawędź (u, v) jest krawędzią drzewową, jeśli wierzchołek v został odwie-
dzony w wyniku zbadania krawędzi (u, v).
2. Krawędziami powrotnymi są krawędzie (u, v) łączące wierzchołek u z jego
przodkiem v w drzewie przeszukiwania w głąb. Pętle są traktowane jako
krawędzie powrotne.
3. Krawędziami w przód są te krawędzie niedrzewowe (u, v), które łączą wierz-
chołek u z jego potomkiem v w drzewie przeszukiwania w głąb.
4. Krawędziami poprzecznymi są wszystkie inne krawędzie. Krawędzie poprze-
czne łączą wierzchołki z tego samego drzewa przeszukiwania w głąb, jeżeli
tylko jeden z wierzchołków nie jest przodkiem drugiego, lub łączą wierz-
chołki z różnych drzew przeszukiwania w głąb.
Krawędzie na rys. 23.4 i 23.5 mają etykiety określające ich typy (F - kra-
wędź w przód (ang.forward), B -krawędź powrotna (ang. back), C - krawędź
poprzeczna (ang. cross)). Na rysunku 23.5c jest pokazane, w jaki sposób nary-
545
ROZDZIAŁ 23. PODSTAWOWEALGORYTMYGRAFOWE
sować graf z rys. 23.5a, żeby wszystkie krawędzie drzewowe i w przód były
skierowane w dól drzewa, a wszystkie krawędzie powrotne były skierowane
w górę drzewa. Każdy graf można rysować w ten sposób.
Algorytm DFS moi..na zmodyfikować w taki sposób, żeby napotykane
krawędzie były odpowiednio klasyfikowane. Zasadnicza obserwacja polega na
tym, że każda krawędź (u, v), gdy jest badana po raz pierwszy, może zostać
sklasyfikowana za pomocą koloru wierzchołka v, do którego prowadzi (w ten
sposób nie można rozróżnić krawędzi w przód od poprzecznych):
TwIERDZENIE 23.9.
W przeszukiwaniu w głąb grafu nieskierowanego G każda krawędź jest albo
krawędzią drzewową, albo krawędzią powrotną.
DOWÓD
Niech (u, v) będzie dowolną krawędzią z G. Załóżmy bez straty ogólności, że
d[u] < d[v]. Ponieważ wierzchołek v znajduje się na liście sąsiedztwa wierzchoł
ka u, to musi on zostać odwiedzony i przetworzony, zanim zostanie przetwo~
rzony wierzchołek u. Jeśli krawędź (u, v) jest badana po raz pierwszy w kierun-
ku od u do v, to (u, v) zostaje krawędzią drzewową. Jeśli (u, v) jest badana po
546
23.3. PRZESZUKIWANIE W GŁĄB
•
W następnych podrozdziałach pokażemy wiele zastosowań udowodnio-
nych tu twierdzeń.
ZADANIA
(a) krawędzią drzewową lub krawędzią w przód wtedy i tylko wtedy, gdy
d[u] < d[v] <f[v] <f[u];
(b) krawędzią powrotną wtedy i tylko wtedy, gdy d[v] < d[u] <f[u] <
<f[v];
(c) krawędzią poprzeczną wtedy i tylko wtedy, gdy d[v] <f[v] < d[u] <
<f[u].
547
ROZDZIAŁ 23. PODSTAWOWE ALGORYTMY GRAFOWE
----------
23.4. Sortowanietopologiczne
W tym podrozdziale pokażemy, w jaki sposób przeszukiwanie w głąb moźe być
użyte do wykonania sortowania topologicznego acyklicznych grafów skiero~
wanych, zwanych z angielskiego dagamit. Sortowanie topologiczne dagu
G = (V, E) polega na uporządkowaniu wszystkich jego wierzchołków w taki
sposób, że jeśli graf G zawiera krawędź (u, v), to w tym porządku wierz.eholek u
-~~-~·
1 Dag jest słowem powstałym z pierwszych liter słów directed acyclic graph; tym zwięzłym
określeniem będziemy się odtąd często posługiwać (przyp. tłum.).
548
23.4. SORTOWANIETOPOLOGICZNE
występuje przed wierzchołkiem v. (Jeśli graf nie jest acykliczny, to takie uporząd
kowanie nie jest możliwe). Na sortowanie topologiczne grafu można spojrzeć jak
na umieszczanie jego wierzchołków na linii poziomej w taki sposób, żeby wszyst-
kie krawędzie były skierowane od strony lewej do prawej. Sortowanie topolo-
giczne różni się zatem od zwyczajnego sortowania omawianego w części II.
Skierowane grafy acykliczne stosuje się często do określania kolejności
wykonywania czynności. Na rysunku 23. 7 widać przykładowy graf kolejności
wykonywania czynności związanych z porannym ubieraniem się profesora Bu-
msteada. Profesor musi zakładać pewne części garderoby przed innymi (np.
skarpetki przed butami). Inne części garderoby mogą być zakładane w dowol-
nej kolejności (np. skarpetki i spodnie). W dagu z rys. 23.7a krawędź skierowa-
na (u, v) oznacza, że część garderoby u musi zostać założona przed częścią v.
Dowolne uporządkowanie topologiczne tego grafu podaje zatem kolejność za-
kładania składowych ubioru. Na rysunku 23.7b widać posortowany topolo-
gicznie dag z wierzchołkami uporządkowanymi na linii poziomej w taki spo-
sób, że wszystkie krawędzie są skierowane od strony lewej do prawej.
Następujący prosty algorytm służy do sortowania topologicznego danego
dagu G.
TOPOLOGICAL-SORT(G)
I wykonaj DFS(G) w celu obliczenia czasów przetworzenia/[v] dla wszystkich
wierzchołków v
2 wstaw każdy wierzchołek v na początek listy, kiedy tylko zostanie przetwo-
rzony
3 return lista wierzchołków
LEMAT 23.10.
Graf skierowany G jest grafem acyklicznym wtedy i tylko wtedy, gdy przy
przeszukiwaniu w głąb grafu G nie pojawiają się krawędzie powrotne.
DOWÓD
=> Załóżmy, że istnieje krawędź powrotna (u, v). Wtedy wierzchołek v jest
przodkiem wierzchołka u w lesie przeszukiwania w głąb. Zatem w grafie G ist~
nieje ścieżka od v do u, która uzupełniona krawędzią (u, v) daje cykl.
549
ROZDZIAŁ 23. PODSTAWOWE ALGORYTMY GRAFOWE
,)
9/JO
b)
·----
11/1b ,n 3/4
Rys. 23.7. (a) Kiedy profesor Bumstead ma zamiar się ubrać, sortuje topologicznie części swojej
garderoby. Ka7da skierowana krawędź (u, v) oznacza część garderoby u, która musi zostać zało.żo~
na przed częścią 11.Obok każdego wierzchołka są pokazane czasy jego odwiedzenia i przetworzenia
w przeszukiwaniu w głąb. (b) Ten sam graf posortowany topologicznie. Jego wierzchołki są upo-
rządkowane malejąco względem czasów przetworzenia. 2.auważmy, że wszystkie krawędzie skiero-
wane prowadzą od strony lewej do prawej
DOWÓD
Załóżmy, że algorytm DFS jest wykonywany dla danego dagu G = (V, E)
w celu policzenia czasów przetworzenia jego wierzchołków. Wystarczy poka·
zać, że dla każdej pary różnych wierzchołków u, v E V, jeśli w grafie G istnieje
krawędź (u, v), to/[v] <f[u]. Rozważmy krawędź (u, v) badaną w procedurze
DFS(G). Kiedy ta krawędź jest badana, wierzchołek v nie może być szary
ponieważ wtedy v byłby przodkiem u i krawędź (u, v) byłaby krawędzią poM
550
23.4. SORTOWANIE TOPOLOGICZNE
wrotną, wbrew lematowi 23.10. Dlatego wierzchołek v musi być albo biały,
albo czarny. Jeśli wierzchołek v jest biały, to zostaje potomkiem wierzchołka u
if[v] <f[u]. Jeśli wierzchołek v jest czarny, to również/(v] </[u]. Stąd dla
każdej krawędzi (u, v) w dagu mamy /[v] <f[u], co kończy dowód twierdzenia .
•
ZADANIA
X
'
Rys. 23.8. Dag do ilustracji sortowania topologici:nego
23.5. Silniespójneskładowe
Rozważymy teraz klasyczne zastosowanie przeszukiwania w głąb: podział gra-
fu skierowanego na silnie spójne składowe. W tym podrozdziale pokażemy,jak
dokonać takiego podziału za pomocą dwóch przeszukań w głąb. Wiele algoryt-
mów dla grafów skierowanych rozpoczyna się od takiego podziału; przy takim
podejściu istnieje często możliwość podzielenia wyjściowego problemu na pod-
problemy, po jednym dla każdej składowej. Łączenie rozwiązań dla tych pod-
problemów jest wykonywane zazwyczaj zgodnie ze strukturą połączeń między
silnie spójnymi składowymi. Taka struktura może być reprezentowana przez
graf znany jako graf „składowych", który definiujemy w zad. 23.54.
Przypomnijmy (patrz rozdz. 5), ze silnie spójną składową skierowanego
grafu G = (V, EJjest maksymalny zbiór wierzchołków Uf; V taki, że dla każ
dej pary wierzchołków u i v z U istnieją ścieżki u..-. v oraz v,....u; tzn. wierz-
chołki u i v są osiągalne jeden z drugiego. Na rysunku 23.9 jest poka:rany
stosowny przykład.
W naszym algorytmie znajdowania silnie spójnych składowych grafu
G = (V, EJużywamy transpozycji grafu G, która została zdefiniowana w zad.
23.1-3 jako graf(,~ -(V, I!!), gdzie I!!- {(u, v):(v, u)eE}. To znaczy, J!!
składa się z krawędzi grafu G ze zwrotami zamienionymi na przeciwne. Dla
danej reprezentacji listowej grafu G czas potrzeby na skonstruowanie (ff wy-
nosi O(V +EJ.Warto zauważyć, że grafy G i armają dokładnie te same silnie
spójne składowe: wierzchołki u i v są osiągalne jeden z drugiego w grafie G wte-
dy i tylko wtedy, gdy są osiągalne jeden z drugiego w grafie (ff. Na rysun-
ku 23.9b jest pokazana transpozycja grafu z rys. 23.9a z zacieniowanymi silnie
spójnymi składowymi.
W algorytmie STRONGLY-CONNECTED-COMPONENTS, działającym w cza-
sie liniowym (tzn. w czasie @(V+ E)), obliczamy silnie spójne składowe grafu
skierowanego G = (V, E), stosując dwa razy przeszukiwanie w głąb - raz dla
grafu G i raz dla grafu (ff.
STRONGLY-CONNECTED-COMPONENTS(G)
I wykonaj DFS(G) w celu obliczenia czasu przetworzenia f[u] dla każdego
wierzchołka u
2 oblicz G'
3 wykonaj DFS(cP), ale w głównej pętli procedury DFS rozwaZaj wierzchołki
w kolejności malejących wartości/[uJ (obliczonych w wierszu I)
--------·-·-------------------
552
23.5. SILNIE SPÓJNE SKŁADOWE
(,)
• '
(b)
• g h
(c)
h
Rys. 23.9. (a) Graf skierowany G. Silnie spójne składowe grafu G znajdują się w zacieniowanych
obszarach. Każdy wierzchołek ma przypisane c-zasy odwiedzenia i przetworzenia. Krawędzie drze-
wowe są zaznac-zone ciemnoszarym kolorem. (b) Graf <.P,transpozytja grafu G. Pokazano drzewo
przeszukiwania w głąb obliczane w wierszu 3 algorytmu STRONGLY"CONNECTED-COMPONllNTS.
Krawędzie drzewa są zaznaczone ciemnoszarym kolorem. Każda silnie spójna składowa odpowia-
da jednemu drzewu przeszukiwania w głąb. Wierzchołki b, c, g oraz h, które są zaznaczone naj-
ciemniejszym kolorem, są praprzodkami każdego wierz.chołka w ich silnie spójnych składowych; te
wierzchołki są takie korzeniami drzew przeszukiwania w głąb obliczanymi w przeszukiwaniu
w głąb dla grafu GT. (c) Acykliczny graf składowych G!ICC
otrzymany przez ściągnięcie każdej silnie
spójnej składowej grafu G do pojedynczego wierzchołka.
Ten prosto wyglądający algorytm wydaje się nie mieć nic wspólnego z sil-
nie spójnymi składowymi. Resztę tego podrozdziału poświęcimy wyjaśnieniu
tajemnic algorytmu STRONGLY-CONNECTED-COMPONENTS i udowodnieniu
jego poprawności. Rozpoczniemy od dwóch pożytecznych obserwacji.
LEMAT 23.12.
Jeśli dwa wierzchołki należą do tej samej silnie spójnej składowej, to żadna
ścieżka między nimi nie zawiera wierzchołków spoza tej silnie spójnej skła
dowej.
________ ________________________ _
,,, "
553
ROZDZIAŁ 23. PODSTAWOWE ALGORYTMY GRAFOWE
DOWÓD
Niech u i v będą wierzchołkami z tej samej silnie spójnej składowej, Z definicji
silnie spójnej składowej wynika, że istnieją ścieżki z u do v oraz z v do u. Niech
w będzie wierzchołkiem na pewnej ścieżce u.,...w.,...v. Tak więc wierzchołek
w jest osiągalny z wierzchołka u. Ponadto, ponieważ istnieje ścieżka v--+ u,
wiemy, że wierzchołek u jest osiągalny z wierzchołka w ścieżką w .,...v --+ u.
Dlatego u i w znajdują się w tej samej silnie spójnej składowej. Ponieważ wierz-
chołek w został wybrany dowolnie, twierdzenie jest dowiedzione.
•
TWIERDZENIE23.13.
W dowolnym przeszukiwaniu w głąb wszystkie wierzchołki z tej samej silnie
spójnej składowej są umieszczane w tym samym drzewie przeszukiwania
w głąb.
DOWÓD
Niech r będzie
pierwszym odwiedzanym wierzchołkiem spośród wszystkich
wierzchołków z ustalonej silnie spójnej składowej. Ponieważ r jest pierwszym
odwiedzanym wierzchołkiem, pozostałe wierzchołki w tej silnie spójnej składo
wej są białe w chwili odwiedzania r. Do każdego wierzchotka z rozważanej
silnie spójnej składowej prowadzi ścieżka o początku w r. Ponieważ takie ścież
ki zawierają tylko wierzchołki z tej składowej (lemat 23.12), wszystkie wierz-
chotki na tych ścieżkach są białe. Stąd i z twierdzenia o białej ścieżce wynika,
że każdy wierzchołek rozważanej silnie spójnej składowej staje się potomkiem
wierzchotka r w drzewie przeszukiwania w głąb.
•
W pozostałej części
tego podrozdziału oznaczenia d[u] i f[u] odnoszą się
do czasów odwiedzenia i przetworzenia, obliczanych w pierwszym przeszuki-
waniu w głąb (wiersz 1 procedury STRONGLY-CONNECTED-CoMPONEN
Podobnie oznaczenie u.,...v odnosi się do ścieżki w grafie G, a nie w if.
Żeby udowodnić, że algorytm STRONGLY-CONNECTED-COMPONENT
poprawny, wprowadzimy pojęcie praprzodka. Praprzodkiem tj,(u) wierzchołka
u nazywamy wierzchołek w osiągalny z u o największym czasie przetworzenia
w przeszukiwaniu w głąb z wiersza I. Innymi słowy
554
23.5. SILNIE SPÓJNE SKŁADOWE
TwIERDZENIE 23.14.
Niech G = (V, E) będzie grafem skierowanym. Wówczas w każdym przeszuki-
waniu w głąb grafu G praprzodek tp(u) dowolnego wierzchołka ue V jest przo-
dkiem wierzchołka u.
DOWÓD
Jeśli tp(u) = u, to twierdzenie jest oczywiście prawdziwe. Dla tp(u) ~ u rozważ
my kolory wierzchołków w kroku d[u]. Jeśli <J,(u)jest czarny, to /[<J,(u)]<f[u]
- otrzymujemy sprzeczność z nierównością (23.2). Jeśli cJ,(u)jest szary, to jest
on przodkiem wierzchołka u i twierdzenie jest udowodnione.
Pozostaje więc udowodnić, że tp(u) nie jest biały. W zależności od kolorów
pośrednich wierzchołków na ścieżce z u do cj,(u) (jeśli takie są) zachodzą dwa
przypadki.
555
ROZDZIAŁ 23. PODSTAWOWE ALGORYTMY GRAFOWE
WNIOSEK23.15.
•
W każ.dym przeszukiwaniu w głąb grafu skierowanego G = (V, E) wierzchołki
u i tp(u) leżą w tej samej silnie spójnej składowej dla każdego uE V.
DOWÓD
Z definicji praprzodka mamy u,... c/>(u),a ponieważ c/>(u)
jest przodkiem u,
więc i:j,(u),...u.
TWIERDZENIE 23.16.
W grafie skierowanym G = (V, E) dwa wierzchołki leżą w tej samej silnie
spójnej składowej wtedy i tylko wtedy, gdy mają tego samego praprzodka
w przeszukiwaniu w głąb grafu G.
DOWÓD
-=> Załóżmy, że wierzchołki u i v są w tej samej silnie spójnej składowej. Ponie-
waż istnieją ścieżki między wierzchołkami u i v w obu kierunkach, więc każdy
wierzchołek osiągalny z v jest osiągalny z u i odwrotnie. Zatem z defrnicji
praprzodka wnioskujemy, że c/>(u) = rj,(v).
= Załóżmy, że cJ>(u)= tp(v). Z wniosku 23.15 mamy, że wierzchołek u jest
w tej samej silnie spójnej składowej co cJ>(u),a wierzchołek v jest w tej samej
silnie spójnej składowej co cJ>(v).
Dlatego wierzchołki u i v są w tej samej silnie
spójnej składowej.
•
Twierdzenie 23.16, pozwala lepiej zrozumieć algorytm STRONGLY-CONNE-
CTED-COMPONENTS.Silnie spójne składowe są zbiorami wierzchołków o tym
samym praprzodku. Ponadto z twierdzenia 23.14 i twierdzenia o nawiasach
(tw. 23.6) wynika, że podczas przeszukiwania w głąb, w wierszu 1 procedury
STRONGLY-CONNECTEO-COMPONENTS, praprzodek jest zarówno pierwszym
odwiedzonym, jak i ostatnim przetworzonym w silnie spójnej składowej, do
której należy.
Żeby zrozumieć, dlaczego w wierszu 3 procedury STRONGLY-CONNECT-
ED-COMPONENTSjest wykonywane przeszukiwanie w głąb dla grafu <P,roz-
ważmy wierzchołek r z największym czasem przetworzenia obliczonym w prze-
szukiwaniu w głąb w wierszu 1. Z definicji praprzodka wynika, że wierzcho-
556
23.5. SILNIE SPÓJNE SKŁADOWE
łek r musi byćpraprzodkiem. Jest tak dlatego, gdyż r jest sam swoim pra-
przodkiem (jest sam z siebie osiągalny) i żaden inny wierzchołek w grafie nie
ma większego czasu przetworLenia. Jakie są inne wierzchołki w silnie spójnej
składowej zawierającej wierzchołek r? Są nimi wierzchołki, dla których r jest
praprzodkiem. - tzn. takie, dla których r jest osiągalny, ale nie jest osiągalny
żaden inny wierzchołek z czasem przetworzenia większym od f[r]. Ale ponie-
waż wierzchołek r ma największy czas przetworzenia ze wszystkich wierzchoł
ków w grafie G, silnie spójna składowa zawierająca r składa się po prostu
z tych wierzchołków, z których można osiągnąć r. Równoważnie, silnie spójna
składowa zawierająca wierzchołek r składa się z tych wierzchołków, które są
osiągalne z r w grafie (łf. Wobec tego podczas przeszukiwania w głąb w wier-
szu 3 są znajdowane wszystkie wierzchołki w silnie spójnej składowej zawiera-
jącej r i są kolorowane na czarno. (Zbiór ten można by znaleźć równie łatwo
za pomocą pr7A!Szukiwaniawszerz lub jakiegokolwiek przeszukiwania zastoso-
wanego do znajdowania osiągalnych wierzchołków).
Po zakończeniu przeszukiwania w głąb w wierszu 3, identyfikującego silnie
spójną składową zawierającą wierzchołek r, przeszukiwanie w głąb jest kon-
tynuowane z wierzchołka r' z największym c:zasem przetworzenia spośród
wszystkich wierzchołków spoza silnie spójnej składowej, do której należy r.
Wierzchołek r' musi być swoim praprzodkiem, ponieważ żadnego wierzchołka
z większym czasem przetworzenia nie można z niego osiągnąć (w przeciwnym
razie r' zostałby włączony do silnie spójnej składowej wierzchołka r). Rozumu-
jąc podobnie, każdy wierzchołek, z którego jest osiągalny r', który nie jest już
czarny, musi należeć do tej samej silnie spójnej składowej co r'. Zatem, jeśli
przeszukiwanie w głąb w wierszu 3 jest kontynuowane, to każdy wierzchołek
z silnie spójnej składowej zawierającej r' zostaje zidentyfikowany i pokoloro-
wany na czarno w wyniku przeszukania z wierzchołka r' w grafie (łf.
W ten sposób przy przeszukiwaniu w głąb w wierszu 3 silnie spójne skła
dowe są „wyłuskiwane" jedna po drugiej. Każda składowa jest identyfikowana
w wlierszu 7 procedury DFS, w wyniku wywołania DFS-VISIT, z praprzod-
kiem tej składowej jako argumentem. W wyniku wywołań rekurencyjnych we-
wnątrz DFS-VISIT każdy wierzchołek składowej jest na koniec kolorowany na
c:zarno. Gdy DFS-V1SIT powraca do DFS, cała składowa jest pokolorowana
na czarno i w ten sposób „wyłuskana". Następnie DFS znajduje wierzchołek
o największym czasie przetworzenia spośród wszystkich wierzchołków, które
nie są pokolorowane na czarno. Ten wierzchołek jest praprzodkiem innej skła
dowej i proces jest kontynuowany.
Następujące twierdzenie formalizuje powyższe rozważania.
TwlERDZENIE 23.17.
Algorytm STRONGLY-CONNECTED-COMPONENTS(G)
poprawnie oblicza silnie
spójne składowe grafu skierowanego G.
557
ROZDZIAŁ 23, PODSTAWOWE ALGORYTMY GRAFOWE
DOWÓD
Udowodnimy przez indukcję względem liczby drzew przeszukiwania w głąb
znajdowanych w przeszukiwaniu grafu cP, że wierzchołki każdego drzewa
tworzą silnie spójną składową. W kroku indukcyjnym wykażemy, że drzewo
formowane w przeszukiwaniu w głąb grafu (1f wyznacza silnie spójną składo
wą przy założeniu, że wszystkie poprzednie uformowane drzewa wyznaczały
silnie spójne składowe. Krok podstawowy indukcji jest oczywisty, ponieważ
pierwsze formowane drzewo nie ma poprzedników i jego wierzchołki tworzą
silnie spójną składową.
Rozważmy drzewo przeszukiwania w głąb To korzeniu w r obliczane przy
przeszukiwaniu grafu cP.Niech C(r) oznacza zbiór wierzchołków, dla których
praprzodkiem jest wierzchołek r:
ZADANIA
•
23.S-1. O ile może zmienić się liczba silnie spójnych składowych w grafie w wy-
niku dodania nowej krawędzi?
23.S-2. Przedstaw działanie procedury STRONGLY-CONNECTED-COMPO-
NENTS dla grafu z rys. 23 .6. W szczególności pokaż czasy przetworzenia
obliczane w wierszu 1 oraz las formowany w wierszu 3. Załóż, że w pętli
z wierszach 5-7 procedury DFS wierzchołki są rozważane w porządku
alfabetycznym i że listy sąsiedztwa są uporządkowane alfabetycznie,
558
PROBLEMY
Problemy
~1. Klasyfikowanie krawędzi za pomocą przeszukiwania wszerz
Przy przeszukiwaniu w głąb krawędzie grafu są dzielone na drzewowe, powrot-
ne, w przód i poprzeczne. Przeszukiwanie wszerz może też zostać użyte do
podziału krawędzi osiągalnych ze źródła przeszukiwania na te cztery kategorie.
559
ROZDZIAŁ 23. PODSTAWOWE ALGORYTMY GRAFOWE
Rys. 23.10. Punkly artykulacji, mosly i dwuspójne &k.lerlowew spójnym grafie nieskierowanym uży·
wanym do ilustracji problemu 23-2. Punkly artykulacji i mosty są ciemnoszare. Dwu&pójnymi
&kład owymi są zbiory krawędzi w jasnoszarych obszarach. Wewnątrz jasnoszarych obszarów znaj-
dują się numery bee
d[v],
low[v] = min {
{d[w]: (u, w) jest krawędzią powrotną dla pewnego
potomka u wierzchołka v}
560
UWAGI DO ROZDZIAŁU
(e) Udowodnij, że krawędź z grafu G jest mostem wtedy i tylko wtedy, gdy nie
leży na żadnym cyklu prostym w grafie G.
(f) Pokaż, jak obliczyć wszystkie mosty w grafie G w czasie O(E).
(g) Udowodnij, że dwuspójne składowe grafu G tworzą podział zbioru tych
krawędzi, które nie są mostami w grafie G.
(h) Podaj algorytm działający w _czasie O(E), który służy do etykietowania
każdej krawędzi e grafu G dodatnią liczbą całkowitą bcc[e] tak, że
bcc[e]= bcc[e1 wtedy i tylko wtedy, gdy e i e' są w tej samej dwuspójnej
składowej.
in-degree(v) = out-degree(v)
dla każdego wierzchołka v E V.
(b) Opisz algorytm, który w czasie O(E} znajduje w grafie G cykl Eulera, o ile
taki cykl istnieje. (Wskazówka: Łącz cykle rozłączne krawędziowa).
Uwagido rozdziału
Minimalnedrzewarozpinające
w(T) - L w(u, v)
(11,v)eT
jest najmniejsza.
Ponieważ T jest acykliczny i łączy wszystkie wierzchołki, więc jest drze~
wem. Drzewo T „rozpina" graf G, dlatego jest nazywane dnewem. rozpinają
cym. Problem wyznaczania drzewa T nazywamy problemem minimalnego drze-
wa rozpinającego 11, Na rysunku 24.1 widać przykładowy graf spójny i jego
minimalne drzewo rozpinające.
11 Zwrot „minimalne drzewo rozpinające" jest skróconą wersją zwrotu „drzewo rozpinające
o minimalnej wadze". Naszym celem nie jest minimalizacja liczby krawędzi w T, ponieważ na
podstawie tw. 5.2, każde drzewo rozpinające ma dokładnie !VI- I krawędzi.
562
24.1. ROZRASTANIE SIĘ MINIMALNEGO DRZEWA ROZPINAJĄCEGO
Rys. 24.1. Minimalne drzewo rozpinające w grafie spójnym. Obok krawędzi znajdują się ich wagi.
Krawędzie minimalnego drzewa rozpinającego są zacieniowane. Lą.cma waga przedstawionego
drzewa wynosi 37. To drzewo nie jest jedynym minimalnym drzewem rozpinającym: w wyniku
zastąpienia krawędzi (b, c) przez krawędź (a, h) otrzymujemy inne drzewo o wadze 37
563
•
ROZDZIAŁ 24. MINIMALNE DRZEWA ROZPINAJĄCE
GENERIC-M!IT(G, w)
1 A+--0
2 wbile A nie tworzy drzewa rozpinającego
3 do znajdź krawędź (u, v), która jest bezpieczna dla A
4 A-Au{(u,v))
5 return A
564
24.1. ROZRASTANIE SIĘ MINIMALNEGO DRZEWA ROZPINAJĄCEGO
2
st Is
V-Sj jV-S
(•)
--
S V-S
(b)
Rys. 24.2. Dwa sposoby spojrzenia na przekrój (S, Jl - S) grafu z rys. 24.1. (a) Wierzchołki ze zbioru
Ssą cza.me, a te ze zbioru Jl - Sbiałe. Krawędziami krzyżującymi się z przekrojem są te, które łączą
wierzchołki białe z wierzchołkami czarnymi. Krawędź (d, c) jest jedyną krawędzią lekką krzyżującą
się z przekrojem. Podzbiór krawędzi A jest zacieniowany; zauważmy, że przekrój (S, Y - S)
uwzględnia A, ponieważ żadna krawędź z A. nie krzyżuje się z tym przekrojem. (b) Ten sam graf
z wierzchołkami ze zbioru S na lewo, a z wierzchołkami ze zbioru Jl - S na prawo. Krawędź
krzyżuje się z przekrojem, jeśli łączy wierzchołek z lewej strony z wierzchołkiem z prawej strony
TwIERDZENIE 24.1.
Niech G = (V, E) będzie spójnym grafem nieskierowanym z funkcją wagową
w o wartościach rzeczywistych określoną na E. Niech A będzie podzbiorem
E zawartym w pewnym minimalnym drzewie rozpinającym grafu G, niech
(S, V - S) będzie dowolnym przekrojem G uwzględniającym A i niech (u, v)
będzie krawędzią lekką krzyżującą się z (S, V - S). Wtedy krawędź (u, v) jest
bezpieczna dla A.
Dowon
Niech T będzie dowolnym minimalnym drzewem rozpinającym zawierającym
A i załóżmy, że Tnie zawiera krawędzi lekkiej (u, v). (Jeśli T zawiera (u, v), to
dowód jest zakończony). Stosując metodę „wycinania i wklejania", zbudujemy
inne minimalne drzewo rozpinające T' zawierające zbiór A u {(u, v)}. Tym
samym pokażemy, że (u, v) jest krawędzią bezpieczną dla A.
Jak widać na rys. 24.3, krawędź (u, v) oraz krawędzie ze ścieżki p z u do
v w drzewie T tworzą cykl. Ponieważ u i v znajdują się po przeciwnych stro-
nach przekroju (S, V - S), istnieje co najmniej jedna krawędź w T ze ścieżki p
krzyżująca się z tym przekrojem. Niech (x, y) będzie dowolną z tak.ich kra-
565
ROZDZIAŁ 24. MINIMALNE DRZEWA ROZPINAJĄCE
''
'
'
'
'
Rys. 24.3. Dowód twierdzenia 24.L Wierzchołki w zbiorze Ssą czarne, a wierwholki w V-Ssą
białe. Pokazane są krawędzie minimalnego drzewa rozpinającego T, ale nie ma pozostałych krawę
dzi z grafu G. Kra.wędzie z.e zbioru A są zacieniowane. Krawędź (u, v) jest krawędzią lekką
krzyżującą się z pnekrojem (S, V- S). Krawędź (x, y) jest krawędzią na jedynej ścieżcep z u do
v w drzewie T. Minimalne drz.ewo rozpinają.ce T' zawierające (u, v) powstaje z T w wyniku
usunięcia krawędzi (x, y) i dodania krawędzi (u, v)
566
24.1. ROZRASTANIE SIĘ MINIMALNEGO DRZEWA ROZPINAJĄCEGO
WNIOSEK 24.2.
Niech G = (V, E) będzie spójnym grafem nieskierowanym z funkcją wagową w
o wartościach rzeczywistych określoną na E. Niech A będzie podzbiorem E
zawartym w pewnym minimalnym drzewie rozpinającym grafu G i niech C
będzie spójną składową (drzewem) w lesie GA = (V, A). Jeśli (u, v) jest krawę
dzią lekką łączącą C z pewną inną składową w GA• to krawędź (u, v) jest
bezpieczna dla A.
DOWÓD
Przekrój (C, V - C) uwzględnia A i dlatego (u, v) jest krawędzią lekką dla tego
przekroju. +
ZADANIA
24.1-1. Niech (u, v) będzie krawędzią o najmniejszej wadze w grafie G. Pokaż,
że krawędź (u, v) należy do pewnego minimalnego drzewa rozpinającego
grafu G.
24.1-2. Profesor Sabatier przypuszcza, że następujące twierdzenie - odwrotne
do twierdzenia 24.1 -jest prawdziwe. Niech G = (V, E) będzie spójnym
grafem nieskierowanym z funkcją wagową w o wartościach rzeczywistych
określoną na E. Niech A będzie podzbiorem E zawartym. w pewnym mini-
malnym drzewie rozpinającym grafu G, niech (S, V - S) będzie dowolnym
przekrojem. G uwzględniającym A i niech (u, v) będzie krawędzią bezpiecz-
ną dla A, krzyżującą się z (S, V - S). Wtedy krawędź (u, v) jest krawędzią
lekką dla przekroju (S, V - S). Podaj kontrprzykład świadczący o tym, że
profesor Sabatier się myli.
24.1-3. Pokaż, że jeżeli krawędź (u, v) należy do pewnego minimalnego drzewa
rozpinającego, to jest ona krawędzią lekką krzyżującą się z pewnym prze-
krojem grafu.
567
ROZDZIAŁ 24. MINIMALNE DRZEWA ROZPINAJĄCE
Algorytm Kruskala
Algorytm Kruskala jest bezpośrednio oparty na schemacie obliczania minimal~
nego drzewa rozpinającego z pod.rozdz. 24.1. W tym algorytmie krawędzią
568
24.2. ALGORYTMY KAUSKALA J PRIMA
MST-KRUSKAL(G, w)
1 A+-0
2 for każdy wierzchołek ve flGJ
3 do MAKE-SET(v)
4 posortuj krawędzie z E niemalejąco względem wag w
5 for każda krawędź (u, v)eE, w kolejności niemalejących wag
6 do if F!ND-SET(u) # FIND-SET(v)
7 tben A-Au{(u, v)}
8 UN!ON(u, v)
9 return A
569
ROZDZIAŁ 24. MINIMALNE DRZEWA ROZPINAJĄCE
,;•v-~'-;:;,>;:-, d
(a) o
'
(c) o
(e) a (fJ a 11
(g} a li (h}
7
8
• •
Rys. 24.4. Driałarue
algorytmu K.ruskaJa na grafie z rys. 24.l. Krawędzie zacieniowane nalezą do
rozrastającego się lasu A. Krawędzie są rozpatrywane w porządku niemalejll,(:ych wag. Strzałlr:a
wskazuje krawędź rozpatrywaną w danym kroku algorytmu. Jeśli krawędź łączy dwa różne drzewa
w lesie, to jest dodawana do lasu, powodując tym samym scalenie tych drzew w jedno drzewo
Algorytm Prima
Podobnie jak algorytm Kruskala, algorytm Prima jest szczególnym przypad-
kiem schematu obliczania mJnimalnego drzewa rozpinającego z pod-
rozdz. 24.1. Algorytm Prima jest podobny do algorytmu Dijkstry dla probie-
570
24.2. ALGORYTMY KRUSICALA I PRIMA
~ l) , ul
r (I)
'
571
ROZDZIAŁ 24. MINłMALNE DRZEWA ROZPINAJĄCE
b
' 9 '
,,, 14
' (b)
'
o
b g h f
I 2 I
' 2
8
d
(C) 14 e (d)
'
(,b'-,1 O
_::\,v--,,-{,ct[)
(g) e {h)
'
(i)
Rys. 14.5. Dziełsnie algorytmu Prima na grafie z rys. 24.L Wierzchołkiem-korzeniem jest a. Krawę
dzie rozrastającego się drzewa są, zacieniowane, a wierzchołki w drzewie są pokolorowane na
czarno. W każdym kroku algorytmu wierzchołki z drzewa wyznaczają pr.zekrój grafu, a krawędż
lekka krzyżująca się z pr.zekrojem jest dodawana do drzewa. Dla przykłedu, w kroku drugim
ke:ide z dwóch krawędzi (b, c) i (a, h) może zostać dodana do drzewa,ponieważ obie są krawędzia
mi lekkimi krzyżującymi się z przekrojem
572
24.2. ALGORYTMY KRUSKALA I PRIMA
MST-PRIM(G, w, r)
1 Q~V[G]
2 for każdy uEQ
3 do key[u] +- oo
4 key[rJ~ o
5 n(rJ +- NIL
6 while Q ;" 0
7 do u+- EXTRACT-MIN(Q)
8 for każdy vEAdj[u]
9 do if VEQ i w(u, v) < key[v]
10 then n[v] +- u
11 key[v] ~ w(u, v)
Działanie algorytmu Prima ilustruje rys. 24.5. W wierszach 1-4 jest inicjo-
wana kolejka priorytetowa Q. Początkowo są w niej zawarte wszystkie wierz-
chołki, a kluc7.em każdego wierzchołka, poza korzeniem r, jest oo. Kluczem
korzenia r jest O. W wierszu 5 pole n:[r]jest inicjowane na NIL, ponieważ korzeń
r nie ma ojca. W trakcie wykonywania algorytmu zbiór V - Q zawiera wierz-
chołki budowanego drzewa. Wierzchołek u E Q incydentny z krawędzią lekką
krzyżującą się z przekrojem (V - Q, Q) jest wyznaczany w wierszu 7 (z wyjąt
kiem pierwszej iteracji, w której u = r w wyniku wykonania wiersza 4 ). Wierz-
chołek u usuwany z Q jest jednocześnie dodawany do zbioru V - Q wierzchoł
ków drzewa. W wierszach 1-8 są aktualizowane wartości pól key i n dla każ
dego wierzchołka v spoza drzewa, który sąsiaduje z u. Podczas aktualizacji jest
zachowany niezmiennik: key[v] = w(v, x[v]) i (v, n:[v])jest krawędzią lekką łą
czącą v z pewnym wierzchołkiem w drzewie.
Szybkość działania algorytmu Prima zależy od tego, jak jest zaimplemen-
towana kolejka priorytetowa Q. Jeśli Q jest zaimplementowana jako kopiec
binarny (patrz rozdz. 7), to możemy zastosować procedurę BUILD-HEAP do
inicjacji w wierszach 1-4 w czasie O(V). Pętla główna jest wykonywana IVI
razy. Ponieważ każda operacja EXTRACT-MIN zabiera czas O(lg V), łączny
czas wszystkich wywołań EXTRACT~MIN wynosi O(Vlg V). Ponieważ suma
573
ROZDZIAŁ 24. MINIMALNE DRZEWA ROZPINAJĄCE
długości wszystkich list sąsiedztwa jest równa 21EI, czas wykonania pętli for
w wierszach 8-11 wynosi ogółem O(E). Test przynależności do Q w wierszu
9 wewnątrz pętli for może zostać zaimplementowany w czasie stałym przez
związanie z każdym wierzchołkiem jednego bitu informującego o tym, czy
wierzchołek należy do Q, i aktualizowanie tej informacji przy usuwania wierz-
chołka z kolejki. Przypisanie w wierszu 11 pociąga za sobą ukryte wykonanie
na kopcu operacji DECREASE-KEY,która moze być zaitnplementowana w cza-
sie O(lgV). A zatem całkowity czas wykonania algorytmu Prima wynosi
O(Vlg V+ Elg V) = O(Elg V). Czas ten jest asymptotycznie taki sam, jak
czas wykonania algorytmu Kruskala.
Asymptotyczny czas działania algorytmu Prima można jednakże popra-
wić, stosując kopce Fibonacciego. W ro2.dziaie 21 pokazaliśmy, że jeśli IVl
elementów zorganizujemy w kopiec Fibonacciego, to możemy operację
EXTRACT-MIN wykonać w czasie zamortyzowanym O(ig V), a operację DE-
CREASB-KEY(do implementacji wiersza 11) w czasie zamortyzowanym 0(1).
Dlatego, jeśli do implementacji kolejki priorytetowej Q użyjemy kopca Fibo-
nacciego, to czas działania algorytmu Prima zmaleje do O(E + Vlg V).
ZADANIA
24.2-1. W wyniku wykonania algorytmu Kruskala możemy otrzymać różne
drzewa rozpinające dla tego samego grafu G zależnie od tego, w jakiej
kolejności są przetwarzane krawędzie o tych samych wagach. Pokaż, że
dla każdego minimalnego drzewa rozpinającego T grafu G można w al-
gorytmie Kruskala tak uporządkować krawędzie, żeby w wyniku jego wy-
konania otrzymać drzewo T.
24.2-2. Przypuśćmy, że graf G = (V, E) jest reprezentowany przez macierz
sąsiedztwa. Podaj prostą implementację algorytmu Prima działającą w tym
wypadku w czasie O(V 2).
24.2-3. Czy dla grafu rzadkiego G = (V, E), w którym IEI = 0(V), implemen-
tacja algorytmu Prima z użyciem kopca Fibonacciego jest asymptotycznie
szybsza od implementacji z użyciem kopca binarnego? A jak rzecz się ma
w przypadku grafu gęstego, w którym IEI = 0(V 2)? Jaki związek musi
zachodzić między JEI i ]VI, żeby implementacja z użyciem kopca Fibonac-
ciego była szybsza od implementacji z użyciem kopca binarnego?
14.2-4. Załóżmy, że wagi wszystkich krawędzi w grafie są liczbami całkowity~
mi z zakresu od 1 do ]VI. Jak szybkim można uczynić algorytm Kruskala
w tym wypadku? Jak szybkim można uczynić ten algorytm, gdy wagi kra-
wędzi są liczbami całkowitymi z zakresu od 1 do W, dla pewnej stałej W?
24.2-5. Załóżmy, że wagi wszystkich krawędzi w grafie są liczbami całkowity~
mi z zakresu od 1 do ]VI. Jak szybkim można uczynić algorytm Pritna
w tym wypadku? Jak szybkim można uczynić ten algorytm, gdy wagi kra-
wędzi są liczbami całkowitymi z zakresu od 1 do W, dla pewnej stałej W?
574
PROBLEMY
Problemy
24--1.Drugie w kolejności minimalne drzewo rozpinające
Niech G = (V, E) będzie spójnym grafem nieskierowanym z funkcją wagową
w:E-+R i załóżmy, że ]El~ JVI.
(a) Niech T będzie minimalnym drzewem rozpinającym grafu G. Udowodnij,
że istnieją krawędzie (u, v)ETi (x, y)łTtakie, że T-{(u, v)}u{(x, y))
jest drugim w kolejności minimalnym drzewem rozpinającym G.
(b) Niech T będzie minimalnym drzewem rozpinającym G. Dla każdych
dwóch wierzchołków u, ve V niech max(u, v] będzie krawędzią o naj-
większej wadze na jedynej ścieżce między u i v w drzewie T. Opisz al-
gorytm, który dla danego drzewa T oblicza max[u, v] w czasie O(V 2)
dla wszystkich u, v e V.
(c) Podaj efektywny algorytm obliczania w grafie G drugiego w kolejności
minimalnego drzewa rozpinającego.
MST-REDUCE(G, 7)
I for każdy vE V(GJ
2 do mark[v] - FALSE
575
3 MAKB-SET(v)
4 for każdy uc V[G]
5 do if mark[u] = FALSE
6 tben wybierz veAdj[u] taki, że w[u, v] jest najmniejsze
7 UNION(u, v)
8 T- Tu {orig[u, v]}
9 mark[u] +- mark[v] +- TRUE
10 V[G']- {FINO-SET(v): VE V[G])
Il E[G']-0
12 for każda krawędź (x, y)cE[G]
13 do u+-FIND-SET(x)
14 v +- FINO-SET(y)
15 if (u, v}EE[G']
16 thenE[G'] -E[G'] u {(u, v)}
17 orig[u, v]+- orig[x, y]
18 w[u, v] - w[x, y]
19 else if w[x, y] < w[u, v]
20 then orig{u, v] +- orig[x, y]
21 w[u, v]-w[x, y]
22 zbuduj listy sąsiedztwa Adj dla G'
23 return G' i T
576
UWAGI DO ROZDZIAŁU
Uwagido rozdziału
ścieżki
Najkrótsze
z jednymźródłem
578
ROZDZIAŁ 25. NAJKRÓTSZE $CJE2KI Z JEDNYM 2RóDŁEM
Warianty
W tym rozdziale skupimy się na problemie najkrótuycb ścieżek z jednym źród
łem, w którym: dany jest graf G = (V, E) i wyróżniony wierzchołek se V nazy-
wany źródłem; dla każdego wierzchołka v e V należy znaleźć najkrótszą. ścieżkę
z s do v. Wiele innych problemów można rozwiązać, wykorzystując algorytmy
dla problemu z jednym źródłem. Należą do nich następujące warianty omawia-
nego problemu.
579
ROZDZIAŁ 25. NAJKRÓTSZE SC!EiK1 Z JEDNYM 2R0DŁEM
I,
" -4
3
I,
2 '
«=~_"@
1· 6 ,/
' 5 .l
.l
Rys. 25.1. Graf skierowany z ujemnymi wagami na krawędziach. Liczba wewnątrz ka:ż.dego wierz-
chołka jest wagą. najkrótszej ścieżki ze źródła s do tego wierzchołka. Ponieważ wierzchołki e oraz
/tworzą. cykl o ujemnej wadze i jest on osiągalny ze środka s, wagi najkrótszych ścieżek prowadzą
cych do tych wierzchołków wynoszą - ro. Ponieważ wierzchołek g jest osiągalny z wierzchołka,
którego waga najkrótszej ścieżki jest - ro, waga najkrótszej ścieżki do g wynosi taki.e - ro. Wierz-
chołki h, i oraz j nie są osiągalne ze źródła s i dlatego wagi ich najkrótszych ścieżek wynoszą ro,
chociai: wierzchołki te leżą. na cyklu o ujemnej wadze
580
ROZDZIAŁ 25. N.AJKROTSZE ŚCIEżKI Z JEDNYM 1:RóDŁEM
Ponieważ jednak cykl (e,f, e) ma wagę 3 + (-6) = -3 < O, nie istnieje naj-
krótsza ścieżka z wierzchołka s do e. Przechodząc cykl (e, f, e) (o ujemnej
wadze) dowolnie wiele razy, możemy znajdować ścieżki z s do e o dowolnie
małych wagach i stąd ó(s, e) = -oo. Podobnie ó(s,j) = -oo. Ponieważ wierz-
chołek g jest osiągalny z wierzchołka/, możemy także znajdować ścieżki o do-
wolnie małych ujemnych wagach z wierzchołka s dog, stąd ó(s, g) = -oo.
Wierzchołki h, i oraz.j tworzą takż.e cykl o ujemnej wadze. Jednakż.e te wierz-
chołki nie są osiągalne z si dlatego ó(s, h) = ó(s, i) = ó(s, 1) = oo.
W pewnych algorytmach dla problemu najkrótszych ścieżek, na przykład
w algorytmie Dijkstry, zakłada się, że wszystkie wagi na krawędziach w grafie
wejściowym są nieujemne (tak jak: w przykładzie z mapą samochodową). W in-
nych rozwiązaniach, na przykład w algorytmie Bellmana-Forda, dopuszcza się
ujemne wagi na krawędziach i otrzymuje się poprawne wyniki, jeżeli tylko
żaden cykl o ujemnej wadze nie jest osiągalny ze źródła. Zazwyczaj, jeśli cykl
o ujemnej wadze istnieje, to algorytm wykrywa go i informuje o jego istnieniu.
Reprezentacja ścieżek
najkrótszych
Często chcemy nie tylko obliczyć wagi najkrótszych ścieżek, ale także wyzna-
czyć należące do nich wierzchołki. Najkrótsze ścieżki reprezentujemy podobnie
jak drzewa przeszukiwania wszerz w podrozdz. 23.2. Dla danego grafu
G = (V, E), dla każ.dego wierzchołka VE V pamiętamy poprzednikn:[v],który
jest albo innym wierzchołkiem albo równy NIL. Algorytmy służące do oblicza-
nia najkrótszej ścieżki, które omawiamy w tym rozdziale, nadają atrybutom
n takie wartości, że ciąg poprzedników zaczynający się od wierzchołka v, czyta-
ny w odwrotnym porządku, jest najkrótszą ścieżką u źródła s do wierzchołka
v. Dlatego do wypisania najkrótszej ścieżki ze źródła s do wierzchołka v, dla
którego n[v] =I=NIL, można zastosować procedurę PRINT-PATH(G, s, v) z pod-
rozdz. 23.2.
Jednakże w trakcie wykonywania algorytmu obliczania najkrótszej ścieżki
wartości n nie muszą określać najkrótszych ścieżek. Podobnie jak w algorytmie
przeszukiwania wszerz, będziemy badali JM)dgrafpoprzednikówG,.= (VI<,E,.)
indukowany przez wartości n:.Także tutaj definiujemy zbiór wierzchołków V„
jako zbiór tych wierzchołków grafu G, których poprzedniki są różne od NIL,
plus wierzchołek s:
581
ROZDZIAŁ 25. NAJKRÓTSZE $CIEżKI Z JEDNYM ŻRÓDŁEM
' o
X y X y
(,) (b) (c)
Rys. 25.2. (a) Ważony graf skierowany. W wierzchołklli:h znajdują się wagi najkrótszych ścieżek z s.
(b) Krawędzie zacieniowane tworzą drzewo najkrótszych ścieżek z.e źródła s. (c) Jeszcz.e jedno
drzewo najkrótszych ścieżek o tym samym korzeniu
Zawartość rozdziału
582
25.1. NAJKRÓTSZE $CIE2KI I RELAKSACJA
583
ROZDZIAŁ 25. NAJKRÓTSZE $CIEżKI Z JEDNYM ŻRÓDŁEM
DoWOD
Jeśli rozłoiyroy ścieżkę p na v1 4 v, 4 v1 4 vk>to w(p) = w(p11) + w(py) +
+ w(pJJ. Załóżmy teraz, że istnieje ścieżka pj 1 z wierzchołka v1 do v1 o wadze
w(p[1) < w(pi). Wtedy v1 4 v, 4 v1 4 v..,jest ścieżką z wierzchołka v1 do v..,,
której waga w(p11) + w(plj) + w(p_.J jest mniejsza od w(p), co przeczy założeniu,
że p jest najkrótszą. ścieżką z v1 do vk.
•
Przy okazji omawiania przeszukiwania wszerz (podrozdz. 23.2) pokazali-
śmy prostą. własność najkrótszych odległości w grafach bez wag (lemat 23.1).
Następujący wniosek z lematu 25.1 uogólnia tę własność na grafy z wagami.
WNIOSEK25.2.
Niech G = (V, E) będzie ważonym grafem skierowanym z f1mkcją wagową
w: E-+ R. Przypuśćmy, że najkrótszą ścieżkę p ze źródła s do wierzchołka
v można rozłożyć nas Ęu-+ v dla pewnego wierzchołka u i pewnej ścieżki p'.
Wtedy waga najkrótszej ścieżki z s do v wynosi 6(s, v) = 6(s, u) + w(u, v).
DoWOD
Z lematu 25.1 wynika, że podścieżka p' jest najkrótszą. ścieżką ze źródła s do
wierzchołka u. Stąd
ó(s, v) - w(p)
- w(p') + w(u, v)
- ó(s, u)+ w(u, v)
•
W następnym lemacie jest podana prosta, ale użyteczna własność wag
najkrótszych ścieżek.
584
25.1. NAJKRÓTSZE $CIEżKl l RELAKSACJA
LEMAT 25.3.
Niech G = (V, E) będzie ważonym grafem skierowanym z funkcją wagową
w:E-+ R i źródłem s. Wtedy dla każdej krawędzi (u, v)eE zachodzi zależność
ó(s, v),; ó(s, u) + w(u, v).
DOWÓD
Najkrótsza ścieżka p ze źródła s do wierzchołka v nie może mieć większej wagi
niż waga każdej innej ścieżki z s do v. W szczególności ścieżka p nie może mieć
wagi większej niż waga ścieżki składającej się z najkrótszej ścieżki ze źródła
s do wierzchołka u i krawędzi (u, v).
•
Relaksacja
W algorytmach z tego rozdziału jest zastosowana metoda relaksacji (lub osła
biania ograniczeń). Dla każdego wierzchołka ve V utrzymujemy atrybut d[v],
którego wartość jest zawsze górnym ograniczeniem wagi najkrótszej ścieżki
ze źródła s do wierzchołka v. Wielkość d[v] nazywamy oszacowaniem wagi
najkrótszej ścieżki. Następująca procedura nadaje wartości początkowe atry-
butom n: id.
INITIALIZE-SINGLE-S0URCE{G, s)
1 for każdy wierzchołek ve V[G]
2 do d[v]+- oo
3 x[v]+- NIL
4 d[s]-o
ii Może wydawać się dziwne, że termin reJaksacja jest używany do okreśJenia operacji pole-
gającej na uściśJeniu górnego ograniczenia na wagę ścieżki Użycie tego terminu jest historyczne.
Na wynik wykonania reJaksacji można spojrzeć, jak na osłabienie żądania d[u] ,;,"d[u] + w(u, v),
które Uak wynika z lematu 2S.3) musi być spełnione, jeśli d[u] = ~s, u) i d[u] = i5(s,11).Oznaczato,
że jeśli d[v] ,;,"d[u] + w(u, v), to żadna akcja nie musi być już podjęta, żeby spełnić to żądanie
i w tym sensie nastąpiło jego osłabienie.
585
ROZDZIAŁ 25. NAJKRÓTSZE $CIE.ŻKI Z JEDNYM 1:R0DŁEM
llELAX(u, V, w)
I if d[v] > d[u] + w(u, v)
2 thend[v] -d[u] + w(u, v)
3 11:[v]+-u
u 2 ' 2 '
9 •O •O
R.El..AX(u,v) RELAX(u,v)
u '
'
o 2 ·•
2
(b)
(a)
Rys. 25.3. Relaksacja krawędzi (u, 11).Osmcowanie najkrótsztj ścieżki każdego wierzchołka jest
pokazane wewnątrz tego wierzchołka. (•) Ponieważ tuż prz.ed wykonaniem relaksacji d[v] >
> d[u] + w(u, v). wartość d[v] mmiejsza. się. (b) Tutaj przed relaksacją d[v] .:s;d[u] + w(u, v). zatem
w wyniku działania procedury Rm.Axnie zmienia się wartość d[v]
Własności relaksacji
Poprawność algorytmów z tego rozdziału wynika z ważnych własności relak-
sacji, które zebraliśmy w następnych kilku lematach. Większość z tych lema-
tów opisuje wynik wykonania ciągu relaksacji krawędzi ważonego grafu skie-
rowanego przy założeniu, że została wykonana procedura inicjująca INITIALI·
ZE-SINGLE-SOURCE. Z wyjątkiem lematu 25.9 wszystkie pozostałe lematy mają
zastosowanie do dowolnego ciągu kroków relaksacji, a nie tylko takiego,
w wyniku którego otrzymuje się najkrótsze ścieżki.
586
25.1, NAJKRÓTSZESCIE2Kł ł RELAKSACJA
LEMAT 25.4.
Niech G = (V, E) będzie ważonym grafem skierowanym z funkcją wagową
w:E-+ R i niech (u, v) EE. Wtedy bezpośrednio po wykonaniu RELAX(u, v, w)
zachodzi zależność d[v] ~ d[u] + w(u, v).
DOWÓD
Jeśli tuż przed wykonaniem procedury RELAX(u, v, w) zachodzi nierówność
d[vJ > d[uJ + w(u. v), to po jej wykonaniu mamy d[vJ = d[uJ + w(u, v).
Jeśli natomiast przed relaksacją było d[v] ~ d[u) + w(u, v), to ani d[u], ani d[v]
nie zmieniają się i dlatego po wykonaniu relaksacji nadal zachodzi
d[vJ ,;; d[uJ + w(u, v).
•
LEMAT25.5.
Niech G = (V, E) będzie ważonym grafem skierowanym z funkcją wagową
w:E-+ R. Niech sE V będzie wierzchołkiem źródłowym i załóżmy, że została
wykonana procedura inicjująca INITIALIZE-SINGLE-SoURCE(G,s). Wtedy dla
każdego wierzchołka v EV zachodzi zależność d[v] ;i:, ó(s, v) i warunek ten
jest niezmiennikiem dowolnego ciągu relaksacji krawędzi grafu G. Ponadto,
kiedy tylko d[v] osiągnie swoje dolne ograniczenie ó(s, v), nigdy więcej nie
ulega zmianie.
DOWÓD
Niezmiennik d[v] ;i:, ó(s, v) jest oczywiście prawdziwy bezpośrednio po fazie
inicjowania, ponieważ d[s] = O ;i:: ó(s, s) (zauważmy, że ó(s, s) jest równe - oo,
jeśli s należy do cyklu o ujemnej wadze, lub jest równe O w przeciwnym razie),
a d[v] = oo implikuje d[vJ;,, ó(s, v) dla karoego ve V- {s). Pokażemy przez
doprowadzenie do sprzeczności, że warunek d[v] ;i:: ó(s, v) jest nie201iennikiem
dla dowolnego ciągu kroków relaksacji. Niech v będzie pierwszym wierzchoł
kiem, dla którego w wyniku wykonania relaksacji krawędzi (u, v) otrzymujemy
d[v] < ó(s, v). Wtedy tuż po relaksacji krawędzi (u, v) mamy
co pociąga za sobą d[u] < ó(s, u). Ale ponieważ relaksacja krawędzi (u, v) nie
zmienia wartości d[u], więc ta nierówność musiała być prawdziwa tuż przed
relaksacją (u, v), co przeczy naszemu wyborowi v jako pierwszego wierzchołka,
dla którego d[v] < ó(s, v). Wnioskujemy stąd, że niezmiennik d[v] ;i:: ó(s, v) jest
utrzymany dla wszystkich v E V.
587
ROZDZIAŁ 25. NAJKRÓTSZE $CIEżKI Z JEDNYM l:RÓOŁEM
żeby się przekonać, że wartość d[v] nigdy się nie zmienia, jeżeli tylko
d[v] = J;(s,v), zauważmy, iż po osiągnięciu wartości swojego dolnego ogranicze-
nia d[v] nie może już zmaleć, ponieważ właśnie udowodniliśmy, że d[v] ~ J;(s,v).
Nie może też wzrosnąć, ponieważ relaksacja nie zwiększa wartości d.
•
WNIOSEK25.6.
Załóżmy, że w ważonym grafie skierowanym G = (V, E) z funkcją wagową
w:E - R nie istnieje ścieżka ze źródła se V do danego wierzchołka v e V.
Wtedy po fazie inicjowania za pomocą procedury INITIALIZB-SINGLE-SOUR
CE(G,s) mamy d[v] = J;(s,v) i równość ta jest niezmiennikiem dowolnego ciągu
relaksacji krawędzi grafu G.
Dowon
Z lematu 25.5 wynika, że zawsze zachodzą zależności oo = ó(s, v) .,e::;d[v]. Tak
więc d[v] = co=/i(s, v).
•
Następujący lemat jest podstawowy w dowodzeniu poprawności algoryt-
mów dla problemu najkrótszych ścieżek omawianych dalej w tym rozdziale.
Podaje on warunki wystarczające dla relaksacji, które gwarantują, że oszaco-
wania wag najkrótszych ścieżek dążą do ich rzeczywistych wag.
LEMAT25.7.
Niech G = (V, E) będzie ważonym grafem skierowanym z funkcją wagową
w:E - R, niech se V będzie wierzchołkiem źródłowym i niech s ~ u - v będzie
najkrótszą ścieżką w grafie G dla pewnych wierzchołków u, ve V. Przypuśćmy,
że została wykonana procedura inicjująca INITIALIZE-SINGLE-SOURCE(G, s),
a następnie został wykonany ciąg kroków relaksacji zawierający wywołanie
procedury RELAX(u,v, w). Jeśli w dowolnej chwili przed wywołaniem procedu-
ry RELAX(u, v, w) zachodzi d[u] = D(s, u), to po wykonaniu tej procedury
zawsze zachodzi d[v] = J;(s,v).
DoWOD
Z lematu 25.5 wynika, że jeśli d[u] = D(s,u) w pewnym punk.cie przed wykona-
niem relaksacji krawędzi (u, v), to ta równość pozostaje prawdziwa po wykona-
niu tego kroku. W szczególności, po wykonaniu relaksacji krawędzi (u, v) mamy
588
25.1. NAJKRÓTSZE ŚClEżKI I RELAKSACJA
LEMAT 25.8.
Niech G = (V, E) będzie ważonym grafem skierowanym z funkcją wagową
w:E-+ R i wierzchołkiem źródłowym se V. Załóżmy, że graf G nie ma cykli
o ujemnych wagach, które są osiągalne ze źródła s. Wtedy po fazie inicjowania
za pomocą procedury lNITIALIZE-SINGLE-SoURCE(G,s) graf poprzedników G„
jest drzewem z korzeniem ws, a własność ta jest niezmiennikiem każdego ciągu
kroków relaksacji wykonywanych na krawędziach grafu G.
DOWÓD
Początkowo jedynym wierzchołkiem w grafie G„ jest źródło si lemat jest oczy-
wiście prawdziwy. Rozważmy graf poprzedników powstający w wyniku wyko-
nania pewnego ciągu kroków relaksacji. Udowodnimy najpierw, że graf G„jest
acykliczny. Załóżmy przeciwnie, że pewien krok relaksacji powoduje utworze-
nie cyklu w grafie G,.. Niech tym cyklem będzie c = (v 0 , v1, ••• , vk), gdzie
vk = v0 • Wówczas x[v;] = v,_1, dla i= I, 2, ... , k, i możemy założyć (bez straty
ogólności), że krawędzią, dla której wykonanie relaksacji spowodowało po-
wstanie cyklu w grafie G1r,jest (vk_1, vJ.
Zauważmy, że wszystkie wierzchołki na cyklu c są osiągalne ze źródła s.
Dlaczego? Poprzednik każdego wierzchołka na cyklu c jest różny od NIL. Dla-
tego z każdym wierzchołkiem na cyklu c zostało związane pewne skończone
oszacowanie najkrótszej ścieżki właśnie wtedy, kiedy została mu przypisana
wartość n: różna od NIL. Z lematu 25.5 wynika, że każdy wierzchołek na cyklu
c ma skończoną wagę najkrótszej ścieżki, co implikuje, że wierzchołki na cyklu
c są osiągalne ze źródła s.
Zbadamy oszacowania wag najkrótszych ścieżek dla wierzchołków z cy-
klu c tuż przed wywołaniem RELAX(vk_1, vk, w) i pokażemy, że c jest
cyklem o ujemnej wadze. Otrzymamy w ten sposób sprzeczność z założeniem,
że graf G nie ma cykli o ujemnych wagach, osiągalnych ze źródła. Tuż przed
wywołaniem RELAX mamy n:[vJ = v1_ 1 dla i= 1, 2, ... , k- 1. Stąd dla
589
ROZDZIAŁ 25. NAJKRÓTSZE $CIEżKI Z JEDNYM ŻRĆDŁEM
• •
- I d[v,_,J+ I w(v,_,,v,)
J=l l=l
Ale
•L d[v,J- I• d[v,_,J
i=l i=l
ponieważ każdy wierzchołek z cyklu c pojawia się tylko raz w każdej sumie.
Stąd otrzymujemy
•
O> I w(v,_,, v,)
I= l
590
25.1. NAJKRÓTSZE $CIEŻKI I RELAKSACJA
Rys. 25.4. Ilustracja tego, że w Gwjesl dokładnie jedna ścieżka z J do v. Je&lisą dwie ścieżki, p 1
(s .....u .....x .....z--+ v) i p 2 (s .....u .....y .....z .....v), gdzie x #- y, to n[z} = x i n(z] = y - sprzeczność
LEMAT 25.9.
Niech G = (V, E) będzie ważonym grafem skierowanym z funkcją wagową
w:E-+ R i wierzchołkiem źródłowym sE V. Załóżmy, że graf G nie zawiera
cykli o ujemnych wagach, które są osiągalne ze źródła s. Jeśli po wykonaniu
procedury inicjującej INITIALIZE-SINGLE-SOURCE(G, s), a następnie po wyko-
naniu dowolnego ciągu kroków relaksacji na krawędziach grafu G zachodzi
d[v] = ó(s, v) dla wszystkich vE V, to podgraf poprzedników G,..jest drzewem
najkrótszych ścieżek o korzeniu w s.
DOWÓD
Musimy udowodnić, że graf G„ ma wszystkie trzy własności drzewa najkrót-
szych ścieżek. Aby udowodnić pierwszą własność, musimy wykazać, że V„ jest
zbiorem wszystkich wierzchołków osiągalnych ze źródła s. Z definicji waga
najkrótszej ścieżki ó(s, v) jest skończona wtedy i tylko wtedy, gdy wierzchołek
v jest osiągalny ze źródła s. Dlatego wierzchołki osiągalne z ssą dokładnie tymi
ze skończonymi wartościami d. Ale z wierzchołkiem vE V-{s} została związa
na skończona wartość d[v] wtedy i tylko wtedy, gdy x[v] "FNIL.Dlatego wierz-
chołki z V„ są dokładnie tymi, które są osiągalne ze źródła s.
Druga własność wynika bezpośrednio z lematu 25.8.
Pozostaje do udowodnienia ostatnia własność drzewa najkrótszych ście
żek: dla każdego v E V,rjedyna ścieżka s .!,.v w grafie G„jest najkrótszą ścieżką
591
ROZDZIAŁ 25. NAJKRÓTSZE $CIE2KI Z JEDNYM 2:RODŁEM
•
w(p) = L w(v,_,, vj
!ce t
•
,; L (o(s, vJ - o(s, v,_,))
J= 1
592
25.2. ALGORYTM DIJKSTRY
25.2. AlgorytmDijkstry
DIJKSTRA(G, w, s)
1 INITIALIZE-SINGLE-SOURCE(G, s)
2 S+-0
3 Q - J,'[G]
4 whileQ,'0
5 do u -EXTRACT-MIN(Q)
593
ROZDZIAŁ 25. NAJKRÓTSZE $CIEżKI Z JEDNYM lRĆOŁEM
6 s-su{u}
7 for każdy wierzchołek veAdj[u]
8 do RELAX(u, v, w}
' o
X X y
(•) ' (b) (c)
X y
(d) (o) (0
Rys. 25.5. Ilustracja działania algorytmu Dijkstry. źródłem jest wierzchołek po lewej stronie. Osza-
cowania najkrótszych ścieżek znajdują się wewnątrz wierzchołków. Krawędzie mcieniowane wy-
znaczają poprndniki w drzewie G.: jeśli krawędź (u, v) jest zacieniowana, to n [vJ= u. Czarne
wierzchołki są elementami zbioru S, a białe znajdują się w kolejce priorytetowej Q = V- S. (a)
Sytuacja tuż przed wykonaniem pierwszej iteracji pętli whlle w wierszach 4-8. Wierzchołek 1.acie-
niowany ma najmniejszą wartość di jest wybierany w wierszu S jak.o wierzchołek u. (bKf) Sytuacja
po każdej kolejnej iteracji pętli wllile. Zacieniowany wierzchołek w każdej części jest wybierany
w wierszu S następnej iteracji jak.o wierzchołek: u. Wartości di n pokazane w części (f) są warto-
ściami końcowymi
594
25.2. ALGORYTM OIJKSTRY
usuwany z kolejki Q i wstawiany do zbioru S, tak więc liczba iteracji pętli while
(wiersze 4-8) wynosi IVI.
Ponieważ w algorytmie Dijkstry do zbioru S jest dodawany „najlżejszy"
lub „najbliższy" wierzchołek z V - S, mówimy, że w tym algorytmie jest za-
stosowana strategia zachłanna. Strategie zachłanne zostały szczegółowo omó-
wione w rozdz. 17, ale znajomość materiału z tamtego rozdziału nie jest po-
trzebna do zrozumienia algorytmu Dijkstry. W ogólności, stosując strategie
zachłanne, nie zawsze otrzymamy optymalne rozwiązania, ale algorytm Dijkst-
ry rzeczywiście oblicza najkrótsze ścieżki. Przekonamy się o tym, udowadnia-
jąc twierdzenie 25.10 i wniosek 25.11. Najważniejsze w dowodzie poprawności
algorytmu Dijkstry jest pokazanie, że dla każdego wierzchołka u dodawanego
do S mamy d[uJ - ó(s, u).
DOWÓD
Udowodnimy, że d[uJ = ó(s, u) w chwili wstawiania wierzchołka u do zbioru S,
dla każdego u E V, i że ta równość nie zmienia się do końca działania al-
gorytmu.
Załóżmy przeciwnie. Niech u będzie pierwszym wierzchołkiem, dla którego
d[u] 'F-ó(s, u), gdy jest on wstawiany do S. Skoncentrujemy uwagę na sytuacji
na początku iteracji pętli while, w której wierzchołek u jest wstawiany do S;
uzyskamy sprzeczność z przyjętym założeniem, rozpatrując najkrótszą ścieżkę
z s do u. Ponieważ s jest pierwszym wierzchołkiem wstawianym do zbioru S
i d[sJ= ó(s, s), więc u 'F-s. Skoro u 'F s, to zbiór S nie jest pusty tuż przed
wstawieniem do niego wierzchołka u. W grafie G musi istnieć ścieżka ze źród
ła s do u, w przeciwnym razie d[u] = ó(s, u) = oo (patrz wniosek 25.6), wbrew
założeniu, że d[u] 'F-ó(s, u). Ponieważ ze źródła s do u prowadzi co najmniej
jedna ścieżka, istnieje zatem najkrótsza ścieżka p z s do u. Ścieżka p łączy
wierzchołek. z S, mianowicie źródło s z wierzchołkiem u z V - S. Rozważmy
pierwszy wierzchołek y na ścieżce p, taki że yE V - S, i niech xe V będzie
poprzednikiem y na ścieżce p. Wtedy, jak widać na rys. 25.6, ścieżkę p można
rozłożyć na s !!; x -+ y !?.:;
u.
Pokażemy, że gdy wierzchołek. u jest dodawany do S, .zachodzi d[y] =
= ó(s, y). żeby udowodnić ten fakt, zauważmy, że xeS. Ponieważ u jest
pierwszym wierzchołkiem, dla którego d[u] =f. i5(s, u) przy wstawianiu do S,
więc w chwili wstawiania wierzchołka x do zbioru S, zachodziło d[x] = ó(s, x).
W tym samym czasie nastąpiła relaksacja krawędzi (x, y). Prawdziwość faktu
595
ROZDZIAŁ 25. NAJKRÓTSZE ŚCIE2KI Z JEDNYM lR0DŁEM
Rys. 25.6. Dowód twierdzenia 25.10. Tuż przed wstawieniem wierzchołka u do S zbiór Sjest niepu-
sty. Najkrótszą. ścieżkę p :re źródła s do wierzchołka u można podzielić nas 4x-+ y,... 4 u, gdzie
y jest pierwszym wierzchołkiem na ścieżce nie należącym do V-Si wierzchołek. xeS bezpośred
nio poprzedza y. Wierzcholk::ix i y są różnymi wierzchołkami, ale może być s = x lub y = u.
Ścieżka p 2 może, ale nie musi, zawierać wierzchołków ze zbioru S
•
WNIOSEK.25.11.
Jeśli wykonamy algorytm Dijkstry dla ważonego grafu skierowanego G =
= (V, E) z nieujemną funkcją wagową w i źródłem s, to po zakończeniu
jego działania graf poprzednik.ów G'II:jest drzewem najkrótszych ścieżek. z ko-
•
rzen1em ws.
DOWÓD
Bezpośredni wniosek z twierdzenia 25.1 i lematu 25.9,
•
596
25.2. ALGORYTM DIJKSTRY
Analiza
Jak szybki jest algorytm Dijkstry? Rozważmy najpierw przypadek, w którym
kolejka priorytetowa Q = V - Sjest zaimplementowana za pomocą tablicy
liniowej. W tej implementacji każda operacja EXTRACT-MIN zabiera czas
O(V). Ponieważ wykonywanych jest IV I takich operacji, łączny czas ich wyko-
nania wynosi O( V2).Każdy wierzchołek jest wstawiany do zbioru S dokładnie
raz, każda krawędź z listy sąsiedztwa Aąj[v] jest więc badana w pętli for
w wierszach 4-8 dokładnie raz w trakcie działania algorytmu. Łączna liczba
krawędzi na listach sąsiedztwa wynosi IE].Stąd wynika, że łączna liczba itera-
cji pętli for wynosi IEI.Każda pojedyncza iteracja jest wykonywana w czasie
stałym. Czas działania całego algorytmu wynosi zatem O(V2 + E) = O(Y1).
Dla grafów rzadkich lepiej implementować kolejkę priorytetową za po-
mocą kopca binarnego. Otrzymany w ten sposób algorytm jest cza.sami na-
zywany zmodyfikowanymalgorytm.emDijkstry. Każda operacja ExrRACT-
-MIN zabiera wtedy czas O(lg V). Jak poprzednio, jest wykonywanych IVI
takich operacji. Czas budowy kopca wynosi O(V). Przypisanie d[v] +- d[u] +
+w(u, v) w procedurze RELAX jest realizowane przez wywołanie DECREASE-
·KEY(Q, v, d[u] + w(u, v)), co zabiera czas O(Jg V) (patrz zad. 7.5-4). Takich
operacji jest co najwyżej IEI.Łączny czas wykonania tych operacji wynosi
zatem O((V + E)lgV), co jest równe O(Elg V), jeśli wszystkie wierzchołki są
osiągalne ze źródła.
W rzeczywistości możemy osiągnąć czas O(Vlg V+ E), implementując
kolejkę priorytetową za pomocą kopca Fibonacciego (patrz rozdz. 21). Zamor-
tyzowany koszt każdej z IVI operacji EXTRACT-MIN wynosi O(lg V), a każda
z ]Ej operacji DECREASE-KEYjest wykonywana w zamortyzowanym czasie
0(1 ). Historycznie rzecz biorąc, rozwój kopców Fibonacciego był motywowa-
ny obserwacją, że w zmodyfikowanym algorytmie Dijkstry potencjalnie wielo-
krotnie częściej wywołuje się DECREASE-KEY niż EXTRACT-MIN. Tak więc
każda metoda redukcji cza.su zamortyzowanego operacji DECREASE-KEYdo
o(lg V), bez wzrostu czasu zamortyzowanego operacji EXTRACT-MIN, prowa-
dziłaby do asymptotycznie szybszej implementacji algorytmu Dijkstry.
Algorytm Dijkstry wykazuje pewne podobieństwa zarówno do przeszu-
kiwania wszerz (patrz podrozdz. 23.2), jak i do algorytmu Prima obliczania
minimalnych drzew rozpinających (patrz podrozdz. 24.2). W przypadku prze-
szukiwania wszerz zbiór S odpowiada zbiorowi czarnych wierzchołków; po-
dobnie jak wierzchołki z S, które mają już obliczone swoje końcowe wagi
najkrótszych ścieżek, czarne wierzchołki w przeszukiwaniu wszerz mają ob-
liczone swoje najkrótsze odległości od źródła. W przypadku algorytmu Prima
podobieństwo polega na użyciu w obu algorytmach kolejki priorytetowej do
znajdowania „najlżejszego" wierzchołka spoza danego zbioru (zbioru S w al-
gorytmie Dijkstry i rozrastającego się drzewa w algorytmie Prima), dodawaniu
597
ROZDZIAŁ 25. NAJKRÓTSZE $CJEŻKI Z JEDNYM lRÓOŁEM
ZADANIA
25.:2-.1.Wykonaj algorytm Dijkstry dla grafu z rys. 25.2, najpierw przyjmując
za źródło wierzchołek s, a następnie wierzchołek y. W ten sam sposób jak
na rys. 25.5 pokaż po każdej iteracji pętli wbile wartości di 1t oraz wierz-
chołki zbioru S.
25.2-2. Podaj przykład prostego grafu skierowanego z ujemnymi wagami
na krawędziach, dla którego algorytm Dijkstry daje niepoprawne roz-
wiązanie. Dlaczego dla wag ujemnych dowód twierdzenia 25.10 nie jest
poprawny?
25.2-3, Przypuśćmy, że wiersz 4 w algorytmie Dijkstry został zmieniony na-
stępująco:
4 wbile IQI> I
25.3. AlgorytmBellmana-Forda
Algorytm Bellmaoa-Forda służy do rozwiązywania problemu najkrótszych ście
żek z jednego źródła w ogólniejszym przypadku, w którym wagi na krawę
dziach mogą być ujemne. Dla danego ważonego grafu skierowanego G =
= (V, E) ze źródłem s i funkcją wagową w:E - R algorytm Bellmana-Forda
598
25.3. ALGORYTM BELLMANA-FOADA
zwraca wartość logiczną wskazującą, czy istnieje lub nie cykl o ujemnej wadze
osiągalny ze źródła. Jeśli taki cykl istnieje, to algorytm informuje, że najkrót-
szych ścieżek w grafie G nie można obliczyć. Jeśli takiego cyklu nie ma, ta
algorytm oblicza najkrótsze ścieżki i ich wagi.
Podobnie jak w algorytmie Dijkstry, w algorytmie Bellmana-Forda wyko-
rzystuje się metodę relaksacji, zmniejszając stopniowo oszacowanie d[v] na
wagę najkrótszej ścieżki ze źródła s do każdego wierzchołka v e V, aż zostanie
osiągnięta rzeczywista waga najkrótszej ścieżki łi(s, v). Algorytm zwraca war-
tość logiczną TRUE wtedy i tylko wtedy, gdy graf nie zawiera cykli o ujemnych
wagach osiągalnych ze źródła.
BELLMAN-FORD(G,w, s)
1 INJTIALIZE-SINGLB-SoURCE(G, s)
2 for;- I to IV[G]l-1
3 do for każda krawędź (u, v)eE[G]
4 do RBLAX(u,v, w)
5 for każda krawędź (u, v) e E[G]
6 do if d[v] > d[u] + w(u, v)
7 then return F ALSE
8 return TRUE
LEMAT25.12.
Niech G = ( V, E) będzie ważonym grafem skierowanym ze źródłem s i funkcją
wagową w: E ~ R. Zalóimy, że G niema cykli o ujemnych wagach osiągalnych
ze źródła s. Wtedy po zakończeniu działania algorytmu Bellmana-Forda za-
chodzi równość d[v] = ó(s, v) dla wszystkich wierzchołków v osiągalnych
ze źródła s.
599
ROZDZIAŁ 25. NAJKROTSZE $ClEŻKI Z JEDNYM 2:R0DŁEM
(d) (o)
Rys. 25.7. Działanie algorytmu Bellmana-Forda. Żrodłem.jest wienchołek z. Wartości dznajdują się
wewnątrz wierzchołków, a krawędzie zacieniowlllle wymaczają wartości n. W tym szczególnym
przykładzie w każdym przebiegu relaksacja krawędzi odbywa się w porządku leksykograficznym:
(u, 11),(11,x), (u, y), (11,u), (x, 11),(x, y), (Y, 11),(y, z), (z, u), (z, x). (a) Sytuacja tuż przed pierwszym
przebiegiem. (b)-<e)Sytuacja po ka:alym kolejnym przebiegu. Wartości di n w części (e) są war-
tościami końcowymi. W tym przykładzie algorytm Bellmana-Forda zwraca wartość TRUE
Dowóo
Niech v będzie wierzchołkiem osiągalnym ze źródła si niech p = (v 0 , v1, •••• V1c
będzie najkrótszą ścieżką z s do v, gdzie v0 =si v1c = v. Ścieżka p jest ścieżką
prostą, i dlatego k ~ IVI- 1. Udowodnimy przez indukcję, że po i-tym przebie-
gu zachodzi d[vJ = ó(s, vJ dla każdego i= O, I, ... ,ki równość ta pozostaje od
tej chwili niezmienna. Ponieważ jest co najwyżej IVI- 1 przebiegów, wystarcza
to do dowodu lematu.
Po fazie inicjowania d[vJ = ó(s, vJ = O. Z lematu 25.5 wynika, że równość
ta jest utrzymywana do końc.a działania algorytmu. W kroku indukcyjnym
załóżmy, że d[v 1_ 1] = ó(s, v1_ 1) po (i - 1)-szym przebiegu. W i-tym przebiegu
następuje relaksacja krawędzi (v1_ 1, vJ. Na podstawie lematu 25.7 wnioskuje-
my, że d[vJ = ó(s, vJ po i-tym przebiegu i we wszystkich kolejnych krokach
algorytmu, co kończy dowód lematu.
•
WNIOSEK
25.13.
Niech G = (V, E) będzie ważonym grafem skierowanym ze źródłem si funkcją
wagową w:E-t R. WówCLas dla każdego wierzchołka ve V istnieje ścieżka ze
onn
25.3_ ALGORYTM BELLMANA-FORDA
źródła
s do v wtedy i tylko wtedy, gdy po zakończeniu wykonywania algoryt-
mu Bellmana-Forda dla grafu G zachodzi zależność d[v] < oo.
DOWÓD
Dowód jest podobny do dowodu lematu 25.12 i pozostawiamy jego przepro-
wadzenie jako zadanie dla czytelnika (zob. zad. 25.3-2).
DOWÓD
Załóżmy, że graf Gnie zawiera cykli o ujemnych wagach, które są osiągalne ze
źródła s. Najpierw udowodnimy, że po zakończeniu działania algorytmu
d[v] = ó(s, v) dla wszystkich wierzchołków vE V. Jeśli wierzchołek v jest osią
galny ze źródła s, to powyższe stwierdzenie natychmiast wynika z lematu
25.12. Jeśli wierzchołek v nie jest osiągalny z s, to nasze stwierdzenie wynika
z wniosku 25.6. Z powyższego faktu i lematu 25.9 wynika, że graf poprzed-
ników Gn jest drzewem najkrótszych ścieżek. Teraz pokażemy, że algorytm
Bellmana-Forda zwraca wartość TRUE. Po zakończeniu działania algorytmu
dla każdej krawędzi (u, v)E E zachodzi
d[v] - J(s, v)
~ ó(s, u) + w(u, v) (z lematu 25.3)
- d[u] + w(u, v)
601
ROZDZIAŁ 25. NAJKRÓTSZE $CIEŻKI Z JEDNYM 2R0DŁEM
Podobnie jak w dowodzie lematu 25.8, każdy wierzchołek z cyklu c pojawia się
dokładnie raz w każdej z dwóch pierwszych sum. Zatem
•L d[vJ - L• d[v,_,]
J=,1 1""1
•
O~ L w(v,_ 1, vJ
I= 1
602
25.4. NAJKRÓTSZE $CIE2KI Z JEDNYM 2R0DŁEM W ACYKLICZNYCH GRAFACH ...
DAG-SHORTEST-PATHS(G,w, s)
1 uporządkuj topologicz.nie wierzchołki G
2 INITIALIZE-SINGLE-SOURCE(G,s)
3 for każdy wierzchołek u, w porządku topologicznym
4 do for każ<ly wierzchołek vEAdj[u]
5 do RELAX(u, V, w)
TwIERDZENIE 25.15.
Niech G = (V, E) będzie ważonym grafem skierowanym i niech s będzie źród
łem w grafie G. Jeśli graf Gnie ma cykli, to po zakończeniu działania procedu-
ry DAG-SHORTEST-PATH dla grafu G zachodzi d[v] = ó(s, v) dla wszystkich
wierzchołków vE V i graf poprzedników G„jest drzewem najkrótszych ścieżek.
603
ROZDZIAŁ 25. NAJKRÓTSZE ŚCłE2KI Z JEDNYM :ŻR0DŁEM
6 I 6 I
(•) (b)
(c)
6 I
(0
(g)
Rys. 25.8. Ilustracja działania algorytmu obliczania najkrótszych ścieżek w acyklicznym grafie skie-
rowanym. Wierzchołki są uporządkowane topologicznie od strony lewej do prawej. h6dłem jest
wierzchołek s. Wartości d są pokanne wewnątrz wierzchołków, a zacieniowane krawędzie wy-
znacza.ją wartości n. (a) Sytuacja przed pierwszą iteracją pęili for w wierszach 3-5. (b}(g) Sytuacja
po kaid ej iteracji pętli (or w wierszach 3-5. W każdej iteracji wierzchołek pomalowany w tej iteracji
na czarno pełni rolę wierzchołka v. Wartości pokazane w cz.ęści (g) są wartościami końcowymi
Dowón
Pokażemy najpierw, że po zakończeniu działania procedury d[v] = b(s, v) dla
wszystkich v e V. Jeśli wierzchołek v nie jest osiągalny ze źródła s, to z wniosku
25.6 wynika, że d[v] = b(s, v) = oo. Załóimy zatem, że wierzchołek v jest osią
galny ze źródła si że p = (v 0, v1, ••• , vk) jest najkrótsr.ą ścieżką, gdzie v0 = s
i V.1:= v. Ponieważ wierzchołki są przetwarzane w porządku topologicznym,
relaksacje krawędzi ze ścieżki p są wykonywane w kolejności (v0 , v1), (vi, vJ, ...,
(v.t-i• v.1:).Korzystając z lematu 25.7, można pokazać indukcyjnie (jak wdowo-
dzie lematu 25.12), że po zakończeniu działania procedury d[vJ = ó(s, vJ dla
i= 1, 2, ... , k. Na koniec z lematu 25.9 otrzymujemy, że G.,_jest drzewem
najkrótszych ścieżek. •
604
25.4. NAJKRÓTSZE SCIE2KI Z JEDNYM ŻR0DŁEM W ACYKLICZNYCH GRAFACH ...
Interesujące
jest zastosowanie omówionego algorytmu do wyznaczania
ścieżek krytycznych w analizie sieci PERTt. Krawędzie reprezentują prace do
wykonania, a wagi reprezentują czasy wykonania poszczególnych prac. Jeśli
krawędź (u, v) wchodzi do wierzchołka v, a krawędź (v, x) wychodzi z wierz-
chołka v, to praca (u, v) musi zostać zakończona przed rozpoczęciem pracy (v,
x). Ścieżka w takim dagu reprezentuje ciąg prac, które muszą być wykonane
właśnie w tej kolejności. Ścieżką krytyczną nazywamy najdłuższą ścieżkę w da-
gu. Taka ścieżka odpowiada najdłuższemu przedziałowi czasu potrzebnemu do
wykonania uporządkowanego ciągu zależnych od siebie prac. Waga ścieżki
krytycznej jest ograniczeniem dolnym na łączny czas potrzebny do wykonania
wszystkich prac. Ścieżkę krytyczną można znaleźć w jeden z następujących
sposobów:
• zamieniając
wagi na krawędziach na ujemne i wykonując procedurę DAG-
-SHORTEST-PATH, lub
• wykonując procedurę DAG-SHORTEST-PATHS, zamieniając w wierszu 2 pro-
cedury INITIALIZE-SINGLE-SOURCE 00 na - 00 i zamieniając ,,>" na ,, <"
w procedurze RELAX.
ZADANIA
Wykaż, że
algorytm jest nadal poprawny.
25,4-3. Defmicja sieci PERT podana uprzednio jest trochę nienaturalna. Natu-
ralniej byłoby reprezentować prace przez wierzchołki, a zależności między
pracami przez krawędzie; tzn. krawędź (u, v) oznaczałaby, że praca u musi
zostać wykonana przed pracą v. Wagi byłyby wtedy przypisane do wierz-
chołków, a nie do krawędzi. Zmodyfikuj procedurę DAG-SHORTEST-PAT
w taki sposób, żeby w czasie liniowym znajdowała najdłuższą ścieżkę w acy-
klicznym grafie skierowanym z wagami przypisanymi do wierzchołków.
25.4-4. Podaj efektywny algorytm, który znajduje liczbę wszystkich ścieżek
w acyklicznym grafie skierowanym. Przeanalizuj swój algorytm i skomen-
tuj jego praktyczne zastosowanie.
605
ROZDZIAŁ 25. NAJKRÓTSZE $CIEżKI Z JEDNYM 2RóDŁEM
różnicowe i najkrótsze
25.5. Ograniczenia ścieżki
Ogólne zadanie programowania liniowego polega na optymalizacji funkcji li~
niowej z uwzględnieniem pewnego zbioru nierówności liniowych. W tym roz-
dziale zbadamy specjalny przypadek programowania liniowego, który można
sprowadzić do znajdowania najkrótszych ścieżek z jednym źródłem. Otrzyma-
ny w rezultacie problem najkrótszych ścieżek można następnie rozwiązać za
pomocą algorytmu Bellmana-Forda i tym samym otrzymać rozwiązanie wyjś
ciowego zadania programowania liniowego.
Programowanie liniowe
W ogólnym sformułowaniu zadania programowania liniowego dane są: macierz
A wymiaru m x n, m-elementowy wektor b oraz n-elementowy wektor c. Nale-
ży znaleźć n-elementowy wektor x, który maksymalizuje fimkcję celu L' c,x1,
1=1
przy m ograniczeniach danych jako Ax ~ b.
Wiele problemów można wyrazić jako programy liniowe i dlatego dużo
wysiłku poświęcono algorytmom do rozwiązywania problemu programowania
liniowego. W praktycznych zastosowaniach zadanie programowania liniowego
rozwiązuje się bardzo szybko za pomocą algorytmu sympleks 1l. Jednak dla
pewnych, wymyślnie skonstruowanych danych wejściowych metoda sympleks
może wymagać czasu wykładniczego. Ogólne zadanie programowania liniowe-
go można rozwiązać w czasie wielomianowym, stosując algorytm. elipsoidalny,
który w praktyce zachowuje się bardzo wolno, lub algorytm Karmarkara, któ-
ry w praktyce często jest konkurencyjny dla algorytmu sympleks.
Ponieważ aparat matematyczny potrzebny do zrozumienia i analizy al-
gorytmów dla ogólnego zadania programowania liniowego wybiega poza ramy
tej książki, pomijamy ogólny przypadek w naszych rozważaniach. Z kilku
powodów jest ważne, żeby rozumieć strukturę zadań programowania linio-
606
25.5. OGRANICZENIA RÓŻNICOWE I NAJKRÓTSZE $CIEŻKI
wego. Po pierwsze, jeśli dany problem może być sformułowany jako zadanie
programowania liniowego o ro2JI1iarze wielomianowym, oznacza to, że istnieje
wielomianowy algorytm dla tego problemu. Po drugie, istnieje wiele specjal-
nych przypadków programowania liniowego, dla których istnieją szybsze al-
gorytmy. Na przykład, jak pokazujemy w tym podrozdziale, problem najkrót-
szych ścieżek z jednym źródłem jest specjalnym przypadkiem programowania
liniowego. Do innych problemów, które można sformułować jako zadanie
programowania liniowego, należą: problem najkrótszej ścieżki między poje-
dynczą parą wierzchołków (zad. 25.5-4) oraz problem maksymalnego prze-
pływu (zad. 27.1-8).
Czasami tak naprawdę nie dbamy o funkcję celu; chcemy tylko znaleźć
rozwią:ianie dopuszczalne, tzn. jakikolwiek wektor x, który spełnia nierówność
b, lub stwierdzić, że nie ma rozwiązań dopuszczalnych. Skoncentrujemy
Ax ,:;;;;
się na takim właśnie problemie istnienia rozwiązań dopuszczalnych.
i, j :t;, n i 1 ,:;;;;
gdzie 1 ,:;;;; m.
k ,:;;;;
RozwaZTIJydla przykładu problem znalezienia 5-elementowego wektora
x = (x), który spełnia nierówność
l -l o o o o
l o o o -1
x,
-l
o l o o -l l
o o x,
-1 l o x, <;
5
-l o o l o 4
o o -l l o x,
-l
o o -l o 1
x,
-3
o o o -1 l -3
607
ROZDZIAŁ 25. NAJKRÓTSZE SCIE2Kt Z JEDNYM ŻRÓDŁEM
X 1 -X ~0
2
Xi -x 5 :E;-l
Xi-Xs1'l
x 3 -x 1 :E;5 (25.4)
X4 -X 1 :E;4
X4-x 3 :s,;-l
x 5 -x 3 :E; -3
x 5 -x 4 :E; -3
LEMAT 25.16,
Niech x = (x 1, x 2 , ... , xJ będzie rozwiązaniem układu ograniczeń różnicowych
Ax ~ b i niech d będzie dowolną. stałą. Wtedy x + d = (x 1 + d, x 2 + d, ...,
x~ + d) jest także rozwiązaniem układu Ax ~ b.
DOWÓD
Dla kaulych x 1 i xJ mamy (xJ + d) - (x 1 + d) = xJ - x,. Dlatego jeśli x spełnia
Ax .:is;b, to także x + d spełnia Ax ~ b.
•
Układy ograniczeń różnicowych pojawiają się w wielu różnych zastosowa-
niach. Na przykład niewiadome x 1 mogą odpowiadać czasom pojawiania się
pewnych zdarzeń. Każdy warunek może być rozumiany jako stwierdzenie, że
jedno zdarzenie nie może pojawiać się dużo później niż drugie zdarzenie. Zda-
rzenia mogą być na przykład pracami, które należy wykonać podczas budowy
domu. Jeśli kopanie fundamentów rozpoczyna się w chwili x 1 i zabiera 3 dni,
a zalewanie fundamentów betonem rozpoczyna się w chwili x 2, to wymagamy,
żeby x 2 ~ x 1 + 3 lub, równoważnie, żeby x 1 - x 2 .:is;- 3. Tak więc zależności
czasowe mogą być wyrażone jako ograniczenia różnicowe.
Grafy ograniczeń
Korzystnie jest interpretować układ ograniczeń różnicowych z punktu widze-
nia teorii grafów, Pomysł polega na tym, żeby macierz A wymiaru n x m,
z układu ograniczeń różnicowych Ax ~ b, interpretować jako macierz incy-
dencji (patrz zad. 23.1-7) grafu o n wierzchołkach i m krawędziach. Kaidy
608
25.5. OGRANICZENIA R0ŻN1COWE I NAJKRÓTSZE ŚCIEŻKI
•
I
TwlERDZENIE 25.17.
Dla danego układu ograniczeń różnicowych Ax" b niech G (V, E) będzie =
odpowiadającym mu grafem ograniczeń. Jeśli graf Gnie zawiera cyk.li o ujem-
nych wagach, to
(25.5)
jest rozwiązaniem dopuszczalnym dla tego układu. Jeśli graf G zawiera cykl
o ujemnej wadze, to układ ograniczeń różnicowych Ax " b nie ma rozwiązania
dopuszczalnego.
DOWÓD
Najpierw pokażemy, że jeśli graf ograniczeń nie zawiera cykli o ujemnych
wagach, to wektor x z równania (25.5) jest rozwiązaniem dopuszczalnym. Roz-
ważmy dowolną krawędź (v1, v)eE. Z lematu 25.3 wynika, że ó(v0 , v) ~
" ó(v0, vJ + w(vi, v1) lub, równoważnie, ó(v0, vj) - ó(v0, vJ " w(vi, v). Zatem
x 1 = ó(v0 , V;) i x1 = ó(v0, v1) spełniają ograniczenie x1 - x 1 .!f w(v1, v1), które od-
powiada krawędzi (v1, v1).
609
ROZDZIAŁ 25. NAJKRÓTSZE SCIEżKl Z JEDNYM 2R0DŁEM
-3
o
Rys. 25.9. Graf ograniczeń odpowiadający układowi ograniczeń różnicowych vJ
(25.4). Wartość !S(vo,
jest pokazana w ka:idym wiem::hołku v„ Rozwiąuniem dopuszczalnym dla tego układu jest
x=(-5
. '.
-3 O -1 -4)
'
X2 - X1 :i;,;;w(v1, vJ
X3 - X2 ,1' w(v2,V3}
•
•
•
xk - xk-i ,1' w{v.1,:-_i,
v,J
x 1 - xk ,1' w(v,t, v1}
610
25.5. OGRANICZENIA RÓŻNICOWE I NAJKRÓTSZE ŚCIEŻKI
ZADANIA
25.5-1. Znajdź rozwiązanie dopuszczalne lub ustal, że takiego rozwiązania nie
ma dla następującego układu ograniczeń różnicowych:
X1 -x 2 :;:,;; 1
X1- X 4 :;:,;; -4
X2 - x 3 :;:,;; 2
Xz - X5 :;:,;; 7
.x,;- Xi; :;:,;; 5
X3 - Xi;:;:,;; 10
X4 - x 2 :;:,;; 2
Xs - Xi :;:,;; -1
Xj - X~ :;:,;; 3
X6 - X 3 :;:,;; - 8
X1 - X2 :;:,;; 4
Xi - X5 :;:,;; 5
x2 - X 4 :;:,;; -6
X3 - X2 :;:,;; }
X4 - Xi :;:,;; 3
X4 - X 3 :;:,;; 5
X4-x 5 :;:,;; 10
X5 - X3 :;:,;;-4
X5 - X 4 :;:,;;- 8
611
ROZDZIAŁ 25. NAJKRÓTSZE $CtE2KI Z JEDNYM 2R0DŁEM
Problemy
25-1. Poprawka Yena do algory1mu Belhnana-Forda
Załóżmy, że relaksacje krawędzi w algorytmie Bellmana-Forda odbywają się
w następującym porządku. Przed wykonaniem pierwszego przebiegu ustalamy
612
PROBLEMY
„
dowolny porządek v1, v2, ... , v1 na wierzchołkach wejściowego grafu G =
= (V, E). Następnie dzielimy zbiór krawędzi E na E1uE&, gdzie E,=
={(v,v 1)EE:i<j) i E,={(v„ v)EE:i>j}. Zdefmiujmy G1 =(V, E1)
i G, = (V, E,).
25-3. Arbitraż
Arbitrażem nazywamy wykorzystanie różnic w kursach walut do zamiany jed-
nej jednostki danej waluty na więcej niż jedną jednostkę tej samej waluty. Dla
przykładu przyjmijmy, że za 1 dolara amerykańskiego można kupić 0,7 funta
brytyjskiego, za 1 funta brytyjskiego można kupić 9,5 franka francuskiego,
613
ROZDZIAŁ 25. NAJKROTSZE ŚCIE2KI Z JEDNYM 1:R0DŁEM
(a) Podaj efektywny algorytm ustalania, czy istnieje ciąg walut (c 1,, c,,,..., c4 )
taki, że
R[i 1, i2] • R[i.i, i3 ] ••• R[ik-t• ik] · R[ik1i1] > 1
Przeanalizuj czas działania algorytmu.
(b) Podaj efektywny algorytm wypisywania takiego ciągu Geśli tylko istnieje).
Przeanalizuj czas działania swojego algorytmu.
614
PROBLEMY
(c) Udowodnij, że dla i= 2, 3, ... , k albo wf..u, v) = 2w1_ 1(u, v), albo
w,{u,v) = 2w1_ 1(u, v) + 1. Następnie udowodnij, że
v) + JVJ-
2b,_,(s, v),; b,(s, v),; 2<1,_,(s, I
dla wszystkich v e V.
(d) Dla i= 2, 3, ... , ki wszystkich (u, v)e E definiujemy
I •
µ(c) = k ~ w(e,)
1 1
615
ROZDZ!AŁ 25. NAJKROTSZE SCIEżKI Z JEDNYM tR0DŁEM
•.(s, v) - o,(s, v)
max ~---~-- ;,, 0
O<k<N-1 n- k
dla wszystkich wierzchołków ve V(Wskazówka: Wykorzystaj obie własno
ści z cz.ęści (a)).
(c) Niech c będzie cyklem o wadze zerowej, a u i v niech będą dowolnymi
dwoma wierzchołkami z cyklu c. Przypuśćmy, że waga ścieżki z u do
v wzdłuż cyklu wynosi x. Udowodnij, że 6(s, v) = tS(s,u)+ x (Wskazówka:
Waga ścieżki z wierzchołka v do u wł.dłuż cyk.lu wynosi -x).
(d) Pokaż, że jeśli µ•=O, to istnieje wierzchołek v na cyk.lu o minimalnej
średniej wadze taki, że
o.(s, v) - o,(s, v) __
max 0
O<k<N-1 n- k
• . •.(s, v) - o,(s, v)
µ = min max
... v D<k<n-1 n- k
616
UWAGI DO ROZDZIAŁU
Uwagido rozdziału
Algorytm Dijkstry [55} był opublikowany w 1959 r., ale w tej wersji nie była
używana kolejka priorytetowa. Algorytm Belhnana-Forda jest oparty na
dwóch oddzielnych algorytmach podanych przez Bellmana [22] i Forda [71].
Bellman opisał związek najkrótszych ścieżek z ograniczeniami różnicowymi.
Lawler [132] opisał liniowy algorytm dla problemu najkrótszych ścieżek w da-
gach i uważał to rozwiązanie za część środowiskowego folkloru. Gdy wagi
krawędzi są stosunkowo małe, można zastosować efektywniejszy algorytm
do rozwiązania problemu najkrótszych ścieżek z jednym źródłem. Ahuja,
Mehlhorn, Orlin i Tarjan [6] opisali algorytm, który działa w czasie
O(E + VJig W) dla grafów z nieujemnymi wagami na krawędziach, w któ-
rych W jest największą wagą krawędzi w grafie. Podali tak.że łatwy do zaprog-
ramowania algorytm działający w czasie O(E + Vlg W). Dla grafów z ujem-
nymi wagami na krawędziach algorytm pochodzący od Gabowa i Tarjana [77)
działa w czasie O(JVElg(VW)), gdzie W jest największą spośród wartości
bezwzględnych wszystkich wag krawędzi w grafie.
Papadimitriou i Steiglitz [l 54] omówili metodę sympleksów i algorytm
elipsoidalny, jak również inne algorytmy odnoszące się do programowania
liniowego. Algorytm sympleks dla programowania liniowego został odkryty
przez G. Danz.iga w 1947 r. Różne wersje metody sympleks pozostają najbar-
dziej popularnymi metodami rozwiązywania zadań programowania liniowego.
Autorem algorytmu elipsoidalnego jest L.G. Khachian. Ten algorytm pocho-
dzi z 1979 r.; powstał na podstawie wcześniejszej pracy N.Z. Shora, D.B. Jud.i-
na i A.S. Nemirovskiego. Karmarkar opisał swój algorytm w pracy [115].
Rozdział 26
Najkrótsześcieżki między
wszystkimiparamiwierzchołków
618
ROZDZIAŁ 26. NAJKRÓTSZE ŚCIEżKI MIĘD2Y WS2YSTKIMI PARAMI ...
o, jeśli i= j
wy= waga krawędzi (i, j), jeśli i :I=j i (i, J)E E (26.1)
oo, jeśli i#j i (i,J)jE
PRINT-ALL-PAIRS-SHORTEST-PATH(Il, i, j)
1 ifi=j
2 then wypisz i
619
ROZDZIAŁ 26. NAJKROTSZE $CIE2KI MIĘDZV W5ZYSTKIMI PARAMI. ..
Żeby uwypuklić tylko istotne cechy algorytmów z tego ro7.działu, nie będziemy
omawiali ani sposobu tworzenia, ani własności macierzy popr:redników tak
obszernie, jak omawialiśmy podgrafy poprzedników w rozdz. 25. Zasadnicze
problemy z tym związane są poruszone w zadaniach.
Zawartość rozdziału
620
26.1. NAJKRÓTSZE ŚCIEżKI I MNOŻENIE MACIERZY
Struktura najkrótszejścieżki
Rozpoczniemy od scharakteryzowania optymalnego rozwiązania. Udowodni-
liśmy już (lemat 25.1), że wszystkie podścieżki każdej najkrótszej ścieżki są
najkrótszymi ścieżkami. Załóżmy, że graf jest reprezentowany przez macierz
sąsiedztwa W= (wlf). Rozważmy najkrótszą ścieżkę p z wierzchołka i do wie-
rzchołka} i przypuśćmy, że ścieżka p składa się z co najwyżej m krawędzi. Przy
założeniu, że w grafie nie ma cykli o ujemnych wagach, m jest skończone. Jeśli
i= j, to waga ścieżki p wynosi O i ścieżka nie zawiera żadnej krawędzi. Jeśli
wierzchołki i oraz} są różne, top można rozłożyć na i .!;k .-.+ j, gdzie p' zawiera
teraz co najwyżej m - I krawędzi. Ponadto z lematu 25.1 wynik.a, że p' jest
najkrótszą ścieżką z i do k. Dlatego, korzystając z wniosku 25.2, otrzymujemy
/J(i,1) - /J(i, k) + w,r
d (O) -
,) - {Q, jeśli i= j
00, jeśli i;#; j
621
ROZDZIAŁ 26. NAJKRÓTSZE $CIE2KI MIĘDZY W5ZYSTKIMI PARAMI. ..
Dla m;;, 1 obliczamy dljl jako minimum z djj- 1> (wagi najkrótszej ścieżki
z i do j składającej się z co najwyżej m - 1 krawędzi) i najmniejszej wagi
spośród wag ścieżek z i do j składających się z co najwyżej m krawędzi, którą
otrzymuje się, przeglądając wszystkie możliwe poprzedniki k wierzchołka j.
A zatem rekurencyjnie defmiujemy
(26.3)
Mając na wejściu macierz W= (wu), obliczamy ciąg macierzy Jj 1l, Dl 2l, ...,
=
1)(11- 11, w którym D("') (dljl) dla m = 1, 2, ..., n - 1. Ostatnia macierz D(n- l)
z.awiera rzeczywiste wagi najkrótszych ścieżek.. Zauważmy, że ponieważ
dj}l = wu dla wszystkich i, je V, mamy D11l = W.
Sercem omawianego algorytmu jest procedura EXTBND-SHORTBST~
-PATHS(D, W), która dla danych macierzy d"'- 11 i W oblicz.a macierz Dt'"l.
Innymi słowy, procedura EXTBND-SHORTEST-PATHS rozszerza o jedną kra-
wędź najkrótsze ścieżki policzone dotychczas.
EXTBND-SHORTBST-PATHS(D, W)
I n +- rows[D]
2 niech D' = (d;J) będzie macierzą wymiaru n x n
3 fori+-lton
4 doforjrl ton
5 dod; 1 +-oo
6 forkrl ton
7 + W.1,t)
do dij r min(d;J, d;.1;
8 return D'
622
26.1. NAJKRÓTSZE ŚCIEżKI I MNOŻENIE MACIERZY
Powyższa procedura oblicza macierz D' = (d; 1), którą na końcu zwraca jako
wynik. Macierz D' jest obliczana zgodnie z równaniem (26.2) dla wszystkich
i oraz j, przyjmując D za 1)1111-ll oraz D' za n<111>.(W tekście procedury są
pominięte górne indeksy, żeby macierze wejściową i wynikową uczynić nieza-
leżnymi odm). Z powodu trzech zagnieżdżonych pętli for czas działania proce-
dury wynosi 9(n 3).
Teraz możemy dostrzec związek z mnożeniem macierzy. Przypuśćmy, że
chcemy policzyć iloczyn C =A· B dwóch macierzy A i B wymiaru n x n. Wte-
dy, dla i, j = 1, 2, ... , n, liczymy
•
cy= L alk· bkJ (26.4)
k"' l
d(m-1)--+ a
w~b
d(m)--+ C
min-+ +
+ ~-
w równaniu (26.2), to otrzymamy równanie (26.4). A zatem, jeśli wykonamy
te zmiany w procedurze EXTENDED-SHORTEST-PATHS, a także zamienimy
oo (jedność w operacji min) na O Gedność w operacji + ), otrzymamy zwykły
algorytm mnożenia macierzy, zajmujący czas 9(n 3 ).
MATRIX-MULTIPLY(A,
B)
1 n--+ rows[A]
2 niech C będzie macierzą wymiaru n x n
3 fori+-lton
4 doforj+-lton
5 do Cy+-0
6 fork+-1 ton
7 do cy--+ cu + aik • bkJ
8 return C
623
ROZDZIAŁ 26. NAJKRÓTSZE $CIEżKI M1ĘD2Y WSZVSTKIMI PARAMI...
J>'łl = JjO). W =W
D(ll = I>'''·W = W'
Dl3J =D'''·W = W'
•
•
•
nn-1) = nn-l). W= Jf"-1
SLOW-ALL-PAIRS-SHORTBST-PATHS(W)
1 n+- rows[W]
2 n<1 >..-W
3 form+-2ton-l
4 111
do nt 111l +- EXTBND-SHORTBST-PATHs(D<-
1
>,W)
5 return nn- l)
-4 -5
7
o 3 8 -4 o 3 8 2 -4
o
""
1 7 3 o -4 1 7
Jj-1) = "" 4
""
o u,11"" o 5 11
4
""
2 -5
""
o ""
""
2 -1 -5 o -2
"" ""
"" "" "" 6 o 8
"" 1 6 o
o 3 -3 2 -4 o 1 -3 2 -4
3 o -4 I -) 3 o -4 1 -1
D',3) = 7 4 o 5 11 D',4) = 7 4 o 5 3
2 -I -5 o -2 2 -1 -5 o -2
8 5 1 6 o 8 5 1 6 o
624
26.1. NAJKRÓTSZE $CIEŻKI I MNOŻENIE MACIERZV
Na rysunku 26.l jest pokazany graf i macierze D(ml obliczane przez procedurę
SLOW-ALL-PAIRS-SHOR TEST-PATHS.
Polepszenieczasudziałania
Naszym celem jednak nie jest policzenie wszystkich macierzy n<m): jesteśmy
tylko zainteresowani macierzą nc"- 1 ). Przypomnijmy, że przy braku cykli
o ujemnych wagach z równości (26.3) wynika, że J)(ml = D( 11- 1l dla wszystkich
m ~ n- 1. Macierz n<11- 1 > możemy otrzymać, wykonując tylko ng(n- 1)1
mnożeń macierzy, obliczając ciąg
n<l) -w
nc2) -W' -W·W
n(4> -W' - W'· W'
D(s>
-• W' - W'· W'
Ponieważ 2f11!(n
- 1ll ~ n - 1, wynik ostatniego iloczynu D(2fll(n- llł) jest rów-
ny D(11-1>.
F ASTER-ALL-PAIRS-SHORTEST-PATHs(W)
1 n +- rows[W]
2 n<1>+- W
3 m+-1
4 whilen-l>m
5 do D<2m)
+- EXfEND-SHORTEST-PATHS(DCl, D(ml)
111
6 m+-2m
7 return nem)
625
ROZDZIAŁ 26. NAJKRÓTSZE$CJEŻKI MIĘDZV W5ZYSTKIMI PARAMI...
ZADANIA
26.1-1. Wykonaj procedurę SLOW-ALL-PAIRS-SHORTEST-PATHS dla ważone
go grafu skierowanego z rys. 262, wypisując odpowiednią macierz po każ
dej iteracji pętli for. Następnie zrób to samo dla procedury FASTER-ALL-
·PAIRS-SHORTEST-PATHS.
1 2
-4 -8
o 00 00 ••• 00
00 o 00... 00
D(O) = 00 00 o ... 00
• • • •
• • •
• •
00 00 00 ... o
która jest używana w algorytmach najkrótszych ścieżek?
26.1-4. Pokaż, jak wyrazić problem najkrótszych ścieżek z jednym źródłem
jako mnożenie macierzy przez wektor. Opisz związki między takim mnoże
niem a algorytmem podobnym do algorytmu Bellmana-Forda (patrz pod-
rozdz. 25.3).
26.1-S. Załóżm.y, że za pomocą algorytmów z tego rozdziału cbre:roy także
znaleźć wierzchołki na najkrótszych ścieżkach. Pokaż, w jaki sposób z ma-
cierzy D obliczyć w czasie O(n3 ) macierz poprzedników TI .
26.1-6. Wierzchołki na najkrótszych ścieżkach można także obliczać w tym
samym czasie co wagi najkrótszych ścieżek. Zdefiniujmy njjl jako poprze-
dnik wierzchołka j na jakiejkolwiek ścieżce o minimalnej wadze z i do j,
zawierającej co najwyżej m krawędzi. Zmodyfikuj procedury ExTENDED-
·SHORTEST-PATHS oraz SLOW-ALL-PAIRS-SHORTEST-PATHS w taki spo-
626
262. ALGORYTM FLOYDA-WARSHALLA
sób, żeby oblic.zalymacierze n<1>,II( 2l, ..., nt11- 1>,tak samo jak są oblicza-
11- 1>.
ne macierze D 11l, D 12>,... , JJ1
26.1-7. Procedura FASTER-ALL-PAIRS-SHORTEST-PATHS w zaprezentowanej
implementacji wymaga zapamiętania flg(n - 1J1macierzy, każda o n2 ele-
mentach. Zatem łącznie rozmiar potrzebnej pamięci wynosi 8(n 2 lg n). Zmo-
dyfikuj tę procedurę w taki sposób, żeby rozmiar potrzebnej pamięci wyno-
sił tylko 0(n 2 ). W tym celu użyj tylko dwóch macierzy wymiaru n x n.
26.1-8. Zmodyfikuj procedurę FASTER-ALL-PAIRS-SHORTEST-PATHS w taki
sposób, żeby wykrywała istnienie cykli o ujemnych wagach.
26.1-9. Podaj efektywny algorytm znajdowania minimalnej długości cyklu
(liczonej w liczbie krawędzi) o ujemnej wadze.
26.2. AlgorytmFloyda-Warshalla
W tym podro7.dziale zastosujemy metodę programowania dynamicznego do
rozwiązania problemu najkrótszych ścieżek między wszystkimi parami wierz-
chołków w grafie skierowanym G = (V, E). Otrzymany algorytm, znany jako
algorytm Floyda-Warsballa, działa w czasie 0(V 3 ). Tak jak poprzednio, dopu-
szczamy występowanie krawędzi z ujemnymi wagami, ale zakładamy, że w gra-
fie nie ma cykli o wagach ujemnych. Podobnie jak w pod.rozdz. 26.1, algorytm
otrzymamy, stosując się do reguł programowania dynamicznego. Po zbadaniu
własności otrzymanego algorytmu przedstawimy podobną metodę obliczania
domknięcia przechodniego grafu skierowanego.
Strukturanajkrótszejścieżki
W algorytmie Floyda-Warshalla wykorzystujemy inną cechę struktury naj-
krótszej ścieżki niż ta, która znalazła zastosowanie w algorytmach najkrót-
szych ścieżek z mnożeniem macierzy. W prezentowanym algorytmie bierze się
pod uwagę wewnętrzne wierzchołki najkrótszej ścieżki. Wewnętrznym wierz-
chołkiem najkrótszej ścieżki p = (v 1, v2, ... , v1) jest każ.dy wierzchołek ze ścież
kip różny od v1 i v„tzn. każdy wier7.Chołek ze zbioru {v2, v3, ... , v1_ 1}.
Algorytm Floyda-Warshalla opiera się na następującej obserwacji. Niech
zbiorem wier7.Chołków grafu G będzie V= {l, 2, ..., n}. Dla pewnego k rozważ
my podzbiór {1, 2, ..., k}, a dla kam.ej pary wierzchołków i, JE V rozważmy
wszystkie ścieżki z wierzchołka i do j, których wewnętrzne wierzchołki należą
do zbioru {1, 2, ..., k}. Niech p będzie taką ścieżką spośród nich, której waga
jest najmniejsza. (Ścieżka p jest prosta, ponieważ założyliśmy, że graf G nie
zawiera cykli o ujemnych wagach). W algorytmie Floyda-Warshallajest wyko-
rzystywany pewien związek między ścieżką p a najkrótszymi ścieżkami z i do j,
których wszystkie wewnętrzne wier7.Cholkinależą do zbioru {I, 2, ..., k- I}.
627
ROZDZIAŁ 26. NAJKRÓTSZE $CIEżKI M1ĘOZY WS2YSTKIMI PARAMI ...
Związek ten zależy od tego, czy k jest lub nie jest, wewnętrznym wierzchołkiem
' . .
na sc1ezcep.
~-~---··---~
p: wszystkie wierzchołki pośrednie
należą do {l, 2, ... , k}
Rys. 26.3. Ścieżka p jest najkrótszą ścieżką z wierzchola i do wierzchołka j, a k jest wewnętrznym
wierzchołkiem ścieżki p o największym numerze. Ścieżkap 1 , fragment ścieżki pod wierzchołka i do
wierzchołka k, ma wszystkie wewnętrzne wierzchołki w zbiorze{I , 2, ... , k - 1}.To samo zachodzi
dla ścieżki p 2 prowadząc,;::j z wierzchołka k do wierzchołka j
628
26.2. ALGORYTM FLOYDA-WARSHALLA
FLOYD-W ARSHALL( W)
1 n+- rows[JV]
2 n<0J +- W
3 for k +- 1 to n
4 do for i +- I to n
5 doforj+-1 ton
6 ..1łk) +-mm
uii • (d'-'
ii , d'-'
11 + d'-
1J ')
7 return n<n)
Na rysunku 26.4 widać pewien graf skierowany oraz macierze D(1l obliczane
w algorytmie Floyda-Warshalla.
Na czas działania algorytmu Floyda-Warshalla decydujący wpływ ma czas
wykonania potrójnie zagnieżdżonej pętli for w wierszach 3-6. Każde wykona-
nie wiersza 6 zabiera czas 0(1 ). Cały algorytm działa zatem w czasie 0(n 3 ).
Zapis algorytmu Floyda-Warshalla, tak jak ostatniego algorytmu z podrozdz.
26.1, jest bardzo zwięzły. Żadne skomplikowane struktury danych nie są wyko-
rzystywane. Dlatego stała ukryta w notacji 0 jest mała. Algorytm Floyda-
-Warshalla zachowuje się bardzo dobrze w praktyce dla grafów o umiarkowa-
nych rozmiarach.
Konstruowanienajkrótszejścieżki
Istnieje wiele różnych metod konstruowania najkrótszych ścieżek w algorytmie
Floyda-Warshalla. Jedną z nich jest obliczenie macierzy wag najkrótszych
·------------------;6°"29
ROZDZIAŁ 26. NAJKRÓTSZE $CIE2K1MIĘDZY W5ZYSTKIMI PARAMI...
o 3 8
"'I -4 NIL I I Nil, I
o 7 Nil, Nil, Nil, 2 2
= "' "'o n(OJ = NIL 3
D(l)1
"'2 _, "'o "'
4
4
NIL
4
Nil, NIL
"' 6
"'
o NIL
Nil,
NIL >«L
,
NIL NIL
ML
"' "' "'
o 3 8
"'I -4 ML I I Nil, I
I
'
"' "' 6 o
4
Nil, mL >aL
NIL
, NIL
"'
o 3 8 4 -4 NIL I I 2 I
o
"' "' "' 6 NIL mL NIL
' ,UL
o 3 8 4 -4 >«L I I 2 I
o I 7 NIL Nil, >«L 2 2
,Dfll = "' "' o II(3l "" >«L 2
"'2 4
_, o' li
-2
3 >«L 2
-I
6 o
4
>«L NIL
3
>«L
4 NIL
, NIL
I
o
3
I
o -4 I -I
-3 2 -4
=
Nil,
4
3
NIL
4
4 '
2
I
I
o [F5) 2 I
D(5l "" 7
2 -I
4
o -2
3
_, ' 4
4
3
3
>«L
4 ML I
o
Rys. 26.4.
8
'I 6
Ciąg
4 3 4
' NIL
630
26.2. ALGORYTM FLOYDA,WARSHALLA
l, gdzie Il = nt11
IJ11l, ..., rrt11 > i n-\'ljest poprzednikiem wierzchołka} na najkrót-
szej ścieżce z wierzchołka i, której wszystkie wewnętrzne wierzchołki należą do
zbioru {l, 2, ..., k).
Poprzednik n-!}> można określić rekurencyjnie. Gdy k = O,najkrótsza ścież
ka z wierzchołka i do j nie ma w ogóle wewnętrznych wierzchołków. Stąd
631
ROZDZIAŁ 26. NAJKRÓTSZE SCIEżKI MIĘDZY W5ZYSTKIMI PARAMI. ..
,,I -
o,
- {O,
jeśli i i=j i (i, 1)łE
I, jeśli i= j lub (i, J)EE
i dla k ~ 1 zachodzi
TRANSITJVE-0..0SURE(G)
I n - IV[GJI
2 fori+-lton
3 dofor}+-1 don
4 dolfi=jlub(i,J)eE[G]
5 then tlJ> +-1
6 else tlJ1+- O
7 fork+-lton
8 dofori+-1 ton
9 doforj+-lton
1>v(t~- 1
10 dotl,l+-tt- >A(tk~-1 l)
I I return 7"''
632
26.2. ALGORYTM FLOYDA-WARSHALLA
I 2
l ooo
J(4).., l l l l
l l l I
l I I l
Rys. 26.5. Graf skierowany i macierze ~> oblic=e w algorytmie domknięcia przechodniego
FLOYD-WARSHALL'(W)
1 n+-- rows[W]
2 D+--W
3 fork+--1 ton
4 dofori+--1 ton
5 doforj+--lton
6 dii +--min(dii' dlk + d„j)
7 return D
634
26.3. ALGORYTM JOHNSONA DLA GRAFÓW RZADKICH
Niech p = <v0 , v1, ••• , v") będzie ścieżką z wierzchołka v0 do wierzchołka v".
-
Wówczas w(p) = O(v0, v") wtedy i tylko wtedy, gdy W(p)= O(v0, v,:). Ponadto
graf G ma cykl o ujemnej wadze przy funkcji wagowej w wtedy i tylko wtedy,
gdy ma on cykl o ujemnej wadze przy funkcji wagowej W.
Dowoo
Rozpoczniemy od wykazania, że
w(p) -
•L w(v,_,, vj
i"' 1
635
ROZDZIAŁ 26. NAJKRÓTSZE SCIEżKI MIĘDZY WSZVSTKIMI PARAMI. ..
•
= L (w(v,_,, v;J+ h(v,_,) - h(v;J)
I"' 1
=
•L w(v,_,, v;J+ h(v,) - h(v,)
! "' 1
= w(c)
i stąd cykl c ma ujemną wagę przy funkcji wagowej w wtedy i tylko wtedy, gdy
jego waga jest ujemna przy funkcji wagowej W.
•
Otrzymywanie nieujemnych wag
Naszym następnym celem jest zapewnienie drugiej własności: chcemy, żeby
waga W(u, v) była nieujemna dla wszystkich (u, v)EE. Dla ważonego grafu
skierowanego G = (V, E) z funkcją wagową w: E-+ R tworzymy nowy graf
G' = (V', E'), w którym V'= Vu {s} dla pewnego nowego wierzchołka sf V
i E' = Eu {(s, v): vE V}. Rozszerzamy funkcję wagową w tak, że w(s, v) = O
dla wszystkich vE V. Zauważmy, że ponieważ do wierzchołka s nie dochodzi
ani jedna krawędź, żadna najkrótsza ścieżka, oprócz tych o początku ws, nie
636
26,3. ALGORYTM JOHNSONA DLA GRAFOW RZADKICH
zawiera s. Ponadto graf G' nie ma cyk.li o ujemnych wagach wtedy i tylko
wtedy, gdy Gnie ma cykli o ujemnych wagach. Na rysunku 26.6a jest przed-
stawiony graf G' odpowiadający grafowi G z rys. 26.1.
[)
2
5 - 2
o l
l l
o o -5 3
2 2 13
-4 -5 [)
o
7 ,o o
2
o
(a) (h)
5
2
4
(c) (d) (e)
2 2
4
10 (gl
Rys. 26.6. Ilustracja działania algorytmu Johnsona dla grafu z rys. 26.1. (a) Graf G z początkową
funkcją wagową 111. Nowy wierzchołek sjest czarny. Wewnątrz kaxdego wierzchołka v mamy
h(v) = ó(s, v). (b) Waga każdej krawędzi (u, v) została zmieniona na w(u, v) = w(u, v) + h(u)- h(v).
(c){g} Wynik działania algorytmu Dijk:stry dla każdego wierzchołka z G jako źródła przy funkcji
wagowej W. W kai.dej części wierzchołek źródłowy u jest czarny. Wewnątrz każdego wierzchołka
v znajdują się wartości S(u, v) i ó(u, v), oddzielone ukośną kreską. Wartość d.., = ó(u, v)jest równa
-
ó(u, v) + h(v) - h(u)
637
ROZDZIAŁ 26. NAJKRÓTSZE $CIEżKI MIĘDZY WSZVSTKIMI PARAMI...
Przypuśćmy teraz, że
grafy G i G' nie mają cykli o ujemnych wagach.
Zdefiniujmy h(v) = t5(s,v) dla wszystkich ve V'. Z lematu 25.3 otrzymujemy, że
h(v).; h(u) + w(u, v) dla wszystkich krawędzi (u, v)e E'. Dlatego, jeśli zdeftniu-
jemy nowe wagi W zgodnie z równaniem (26.3), to otrzymamy w(u, v) =
= w(u, v) + h(u) - h(v) ~ O;zachodzi więc druga własność. Na rysunku 26.6b
jest pokazany graf G' z rys. 26.6a ze z.mienionymi wagami.
lOHNSON(G)
1 oblicz G', gdzie V[G1 = V[G] u {s} i E[G1 = E[G] u {(s, v): ve V[G]}
2 if BELLMAN-FORD(G', W, s) = FALSE
3 then wypisz „graf wejściowy zawiera cykl o ujemnej wadze"
4 else for każdy wierzchołek ve V[G1
5 do przypisz h(v) wartość ó(s, v) obliczoną.
w algorytmie Bellmana-F orda
6 for każda krawędź (u, v)eE[G1
7 do w(u, v) - w(u, v) + h(u) - h(v)
8 for każdy wierzchołek ue V[G]
9
-
do wywołaj DIJKSTRA(G,W, u), aby obliczyć t5(u,v)
dla każdego ve V[G]
10 for każdy wierzchołek ve V[G)
Il do dw -i(u, v) + h(v) - h(u)
12 return D
638
* 26.4. OGÓLNY SCHEMAT ROZWIĄZYWANIA PROBLEMÓW $CIEŻKOWYCH ...
ZADANIA
26.3-1. Zastosuj algorytm Johnsona do znalezienia najkrótszych ścieżek mię
dzy wszystkimi parami wierzchołków w grafie z rys. 26.2. Wypisz wartoś
ci h i W obliczane w tym algorytmie.
26.3-2. W jakim celu jest dodawany nowy wierzchołek s do V, w wyniku czego
otrzymujemy V'?
26.3-3. Załóżmy, że w(u, v) ~ O dla wszystkich krawędzi (u, v)eE. Jaki jest
związek między funkcjami wagowymi w i W?
639
ROZDZIAŁ 26. NAJKRÓTSZE $CIEżKI MIĘDZY WSZVSTKIMI PARAMI. ..
640
* 26.4. OGÓLNY SCHEMAT ROZWIĄZYWANIA PROBLEMÓW $CIEŻKOWYCH ...
ciziach. Przeciwdziedziną Sjest R> 0 u {oo}, gdzie R>0 jest zbiorem nieujem-
nych liczb rzeczywistych, a A(i, J) = Wg dla wszystkich i, je V. Operator roz-
szerzania 0 odpowiada operatorowi arytmetycznemu + i dlatego etykietą
ścieżki p = (v 0 , v1, ••• , vk) jest
1,-$l(p)
;.!.j
(26.11)
641
ROZDZIAŁ 26. NAJKRÓTSZE SClfŻKI MIĘDZY WSZVSTKIMI PARAMI ...
występujące krawędzie mają wagę oo, a jeśli jakakolwiek ścieżka zawiera kra-
wędź z wagą oo, to wagą całej ścieżki jest też oo.
Dodatkowo chcemy, żeby operacja sumowania była idempotentna, ponie-
waż na podstawie równości (26.11) widzimy, że operacja EBpowinna wyzna-
czać etykietę całego zbioru ścieżek. Jeśli p jest ścieżką, to {p}u {p}= {p};jeśli
sumujemy ścieżkę p z samą sobą, to wynikową etykietą powinna być etykieta
p: ,\(p}EB2(p) = .l(p).
Rozpatrujemy ścieżki, które nie muszą być ścieżkami prostymi. Tak.ich
ścieżek w grafie może być nieskończenie, ale przeliczalnie wiele. (Każda ścież
ka, zarówno prosta, jak i nie, skJada się ze skończonej liczby krawędzi). Dlate-
go operacja EBpowinna stosować się do przeliczalnej liczby etykiet ścieżk.o
wych. Oznacza to, że jeśli a1, a2, a3, ... jest przeliczalnym ciągiem elementów
z przeciwdziedziny S, to etykieta a 1 EBDi EBa3 EB... powinna być jednoznacznie
określona i należeć do zbioru S. Nie powinno mieć znaczenia, w jakiej kolejno-
ści etykiety ścieżk.owe są sumowane i dlatego łączność i przemienność powinny
zachodzić dla sum nieskończonych. Ponadto, jeśli sumujemy tę samą etykietę
ścieżk.ową a przeliczalnie wiele razy, powinniśmy w wyniku zawsze dostać
a i dlatego idempotentność powinna zachodzić dla sum nieskończonych.
Wracając do naszego przykładu najkrótszych ścieżek, sprawdźmy,
czy operacja min jest stosowalna do nieskończonego ciągu wartości
•
z R~ u {oo}. Na
0 przykład, czy wartość min {1/k} jest dobrze zdefiniowana?
A:"'1
Odpowiedź btzmi „tak.", jeśli przyjmiemy, że operacja min zwraca w rzeczy-
wistości kres dolny zbioru jej argumentów. W takim przypadku otrzymujemy
•
min{l/k} = O.
A:""1
Żeby policzyć etykiety rozgałęziających się ścieżek, potrzebujemy rozdziel-
ności operacji rozszerzania 0 względem operacji sumowania EB.Załóżmy, że
mamy ścieżki u Ą.v, v Ą.x i v 4y, jak na rys. 26.7. Z rozdzielności wynika, że
możemy zsumować etykiety ścieżek p 1 o p 2 i Pi o p 3, obliC"lając albo (A{p
1) 0
0 .l(p,)}al (.l(p,) 0 ,l{p,)), albo ,l{p,) 0 (.l(p,) EB2(p,)).
Pz
P,
642
* 26.4. OGÓLNY SCHEMAT ROZWIĄZYWANIA PROBLEMÓW SCIEŻ'.KOWYCH ...
(l(p,) O l(p,)) <'Il(l(p,) O l(c) O l(p,)) <'Il(l(p,) O l(c) 0 ,l(c) O l(p,)) <'Il...
- l(p,) 0 (l(p,) <'Il(l(c) O l(p,)) <'Il(l(c) O l(c) O l(p,)) al ...)
- l(p,) O (I <'Ilc <'Il(c 0 c) <'Il(c O c O c) al ...) O l(p,)
Do oznaczenia etykiety cyklu, po którym możemy przechodzić dowolną
liczbę razy, wprowadzimy specjalny symbol. Załóżmy, że mamy cykl c o ety-
kiecie ,l.(c)= a. Cykl c możemy przejść zero razy -dostając etykietę l(t:) = I,
jeden raz - dostając etykietę l(c) = a, dwa razy - dostając etykietę
J.(c)0 J.(c) = a 0 a itd. Etykieta, którą otrzymujemy, przechodząc cykl c nie-
skończenie wiele razy, jest domknięciem a zdefmiowanym tak:
-o
Powyższą własność można zinterpretować następująco. Ponieważ wszystkie cy-
kle mają nieujemne wagi, żadna najkrótsza ścieżka nie musi zawierać w całości
jakiegokolwiek cyklu.
643
ROZDZIAŁ 28. NAJKRÓTSZE $CIEżKI MIĘDZY WSZVSTKIMI PARAMI. ..
644
* 26.4. OGÓLNY SCHEMAT ROZWIĄZYWANIA PROBLEMÓW $CIEŻKOWYCH ...
l!l'- EB,(pl
,•O!'
Zauważmy analogię z defmicją d~) w algorytmie Floyda-Warshalla i z definicją
tjJ>w algorytmie obliczania domknięcia przechodniego. Wartości /~l możemy
zdefiniować rekurencyjnie:
(26.12)
COMPUTE-SUMMARIES(J\., V)
I n~ IVI
2 fori,.__l ton
3 doforj,.__1 ton
4 doifi=j
5 thenIJY'~ T Elll(i, j)
6 else !jJ1- A(i,;)
7 fork,.__1 ton
8 dofori,.__lton
645
ROZDZIAŁ 26. NAJKROTSZE $C1E2KI MIĘDZY WSZVSTKtMI PARAMI. ..
9 doforjrlton
10 do I!j>~ ilJ-1>Ell(ill-1>0 (/~- 1>)•O i(\-1>)
11 retun1 Lin>
ZADANIA
26.4-1. Sprawdź,żeS1 =(R:i- 0 u{oo},min, +,oo,O)iS 3 =({0, l}, v, A,0,
l) są półpierścieniami domkniętymi.
26,4-2. Sprawdź, że S2 = (Ru { - oo, + oo}, min, +, + oo, O) jest półpierś
cieniem domkniętym. Co jest wartością wyrażenia a + ( - oo) dla a e R,
a co wartością wyrażenia ( - co) + ( + oo)?
26.4-3. Napisz procedurę COMPUTE-SUMMARIES w taki sposób, żeby operacje
były wykonywane w półpierścieniu S2, otrzymując w ten sposób imple-
mentację algorytmu Floyda-Warshalla. Co powinno być wartością wyra-
żenia - co + oo?
26.4-4. Czy system S4 = (R, +,·,O, 1) jest półpierścieniem domkniętym?
26.4-5. Czy w algorytmie Dijkstry może zostać użyty dowolny półpierścień
domknięty? Jaka jest odpowiedź na powyższe pytanie w przypadku algo-
rytmów Bellmana-Forda i FASTBR-ALL-PAIRS-SHORTEST-PATHS?
26.4-6. Firma przewozowa z USA chce wysiać z Castroville do Bostonu samo-
chód ciężarowy z ładunkiem karczochów obciążony tak mocno, jak to jest
tylko możliwe. Na każdej drodze w USA istnieje ograniczenie na maksy-
malną wagę samochodów ciężarowych, które mogą się po niej poruszać.
Należy wyznaczyć najkrótszą dopus.zczalną drogę przeja.7.duciężarówki.
Wyraź powyższy problem za pomocą grafu skierowanego i odpowiedniego
półpierścienia domkniętego, a następnie podaj efektywny algorytm obli-
czania najkrótszej możliwej drogi.
Problemy
26-1. Domknięcie
przechodnie grafu dynamicznego
Załóżmy, że chcemy utrzymywać domknięcie przechodnie grafu skierowanego
G = (V, E), kiedy do zbioru E są dodawane nowe krawędzie. Oznacza to, że
po dodaniu każdej krawędzi do zbioru E należy zaktualizować bieżące do-
mknięcie przechodnie tak:, żeby została uwzględniona nowo dodana krawędź.
Załóżmy, że początkowo graf G nie ma żadnych krawędzi i że domknięcie
przechodnie reprezentujemy za pomocą macierzy logicznej.
646
PROBLEMY
647
ROZDZIAŁ 26. NAJKROTSZE SCIEżKI MIĘDZY WS2YSTKłMI PARAMI ...
mk.nięty.
Omawiane rozwiązanie pochodzi od B.M. Maggsa i S.A. Plotkina.
Określmy najpierw dla kaid.ej pary wierzchołków i,je V wagę minimaksową
(a) Uzasadnij krótko, że S =(Ru { - oo, oo}, min, max, oo, - oo) jest półpier
ścieniem domkniętym.
Uwagido rozdziału
Książka Lawlera [132] zawiera sporo materiału dotyczącego problemu najkrót-
szych ścieżek. między wszystkimi parami wierzchołków, chociaż nie ma tam
analizy rozwiązań problemu dla grafów rzadkich. Lawler podaje, że algorytm
wykorzystujący mnożenie macierzy należy do folkloru w tej dziedzinie. Algo-
rytm Floyda-Warsballa pochodzi od Floyda [68], który w swoim rozwiązaniu
wykorzystał twierdu:nie Warshalla [198], określające sposób obliczania do-
mknięcia przechodniego macierzy logicznych. Półpierścień domknięty jest
omówiony w książce Abo, Hopcrofta, Ullmana [4]. Algorytm Johnsona został
zaczerpnięty z pracy [114].
Rozdział 27
Maksymalnyprzepływ
649
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
650
27.1. SIECI PRZEPŁYWOWE
Edmonton Saskatoon
12
Vancouver \b Winnipeg
>
Calgary Regina
(,)
\ \\\b
., . 12/12
1
·½0
"
--
S •;
•
V
o ,t
"' ,1•
~
:f.-.,
C:•."-
~.l '
•• l I/ 14
y
~.
(b)
'f,f(u, v) ~ O
,,v
Wielkośćf(u, v), która może być dodatnia lub ujemna, nazywamy pneplywem
netto z wierzchołka u do wierzchołka v. Wartość przepływu/ definiuje się jako
651
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
L f(u, v) (27.2)
••Y
/l:M0P)> 0
Przykład sieci
Za pomocą sieci przepływowej można modelować problem transportowy
przedstawiony na rys. 27.1. Fabryka Spółki Szczęśliwy Krążek (źródło s) mieś
ci się w Vancouver. Są tam wytwarzane krążki hokejowe. Magazyn Spółki
(ujście t) znajduje się w Winnipeg - tam krążki są składowane. Firma Szczęś
liwy Krążek wydzierżawiła od firmy przewozowej ciężarówki do przewozu krą
żków z fabryki do magazynu. Krążki są przewożone w kontenerach. Ponieważ
ciężarówki jeżdżą po z góry ustalonych trasach między miastami i mają ograni-
652
27.1. SJECIPRZEPŁYWOWE
653
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
., ' '
"l' : ~l t,.' ""l
""'
-
o ~ --
o
~
-- "
o
00 M
--
o
~
~
-
o ;';
..
00
'
,' :v,. •
. I .
Przypuśćmy że
ekspediujemy także 3 kontenery z v2 do v1 . Ta do-
teraz,
datkowa wysyłka została zaznaczona na rys. 27 .2c. Mamy sytuację, w której
towar jest ekspediowany w obu kientnkach między v1 i v2 • Każdego dnia
8 kontenerów jest przesyłanych z v1 do v2 , a 3 kontenery z v2 do v 1 . Jakie są
wartości przepływów netto między tymi wierzchołkami? Przepływ netto z v1 do
v2 wynosi 8 - 3 = 5 kontenerów na dzień, natomiast przepływ netto z v2 do v1
wynosi 3 - 8 = - 5 na dzień.
Przedstawiona sytuacja jest w rezultacie równoważna z sytuacją
z rys. 27.2d, w której 5 kontenerów jest ekspediowanych z v1 do v2 , a żaden
kontener nie jest wysyłany z v2 do v1 • Wysyłka 3 kontenerów z v2 do v1 została
,,skasowana" przez 3 z 8 kontenerów wysyłanych z v1 do v2 • W obu przypad-
kach przepływ netto z v1 do v2 wynosi 5 kontenerów na dzień, ale w (d)
rzeczywiste wysyłki są dokonywane tylko w jednym kierunku.
W ogólności, stosując kasowanie można reprezentować wysyłkę towaru
między dwoma miastami przez dodatni przepływ netto dla co najwyżej jednej
z dwóch krawędzi między odpowiednimi wierzchołkami. Jeśli przepływ netto
z jednego miasta do drugiego jest nie większy niż O, to żadna wysyłka towaru
w tym kierunku nie ma miejsca. Oznacza to, że każdą sytuację, w której krążki
są ekspediowane w obu kien1nkacb między dwoma miastami, można prze-
kształcić za pomocą kasowania w sytuację równoważną, w której krążki węd
rują tylko w jednym kierunku: w kierunku, w którym przepływ netto jest do-
datni. Przy takiej transformacji warunek przepustowości nie jest naruszany,
ponieważ redukcja ilości ekspediowanego towaru następuje w obu kierunkach.
Podobnie nie jest naruszona własność zachowania przepływu, ponieważ prze-
pływ netto między dwoma wierzchołkami pozostaje taki sam.
Kontynuując rozważania dotyczą.ce naszego przykładu, zobacł.l11y, jak.i
jest wynik przesłania dodatkowych 7 kontenerów dziennie z v2 do v1 • Nary-
sunku 27 .2e jest przedstawiona ta sytuacja zgodnie z umową, że prezentujemy
654
27.1. SIECI PRZEPŁYWOWE
Notacja
W naszych rozważaniach będziemy mieli do czynienia z kilkoma funkcjami
(takimi jak/), których argumentami są dwa wierzchołki sieci. W tym rozdziale
będziemy się posługiwać niejawną notacją swnowania, w której jeden z argu-
mentów lub oba mogą być zbiorami wierzchołków. W takim przypadku warto-
ścią wyrażenia jest suma wszystkich wartości, jakie otrzymujemy, zastępując
argumenty (zbiory) przez zawarte w nich elementy. Jeśli na przykład X i Y są
zbiorami wierzchołków, to
f(X, Y) - L Z:f(x, y)
:u;XyEY
655
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
,, .,,,:
,,.
O,.' '
Jo Jo
,, I ,, "'i:;,,,
,.,.,
.
•
,, ,,
3
,,":( ' J
,, ;I
~
s s .
•
r I ">?·
•z,,;
,, ' 6 ' 6
:t1,'
,',, (
,o );_',,
,, ,, 1ll
1 1 o
/3 /3
'• ,, [~
,, ,, 'it
' /J·,
1,
,, ' . JIA:·
'
.
(a) (b)
Rys. 27,3. Sprowadzanie problemu maksymalnego przepływu z wieloma źródłami i wieloma ujściami
do problemu z jednym źródłem i jednym ujściem. (a) Sieć przepływu z pięcioma źródłami S = {su
s2 , s 3 , s4 , s~} i trz.ema ujściami T= {ti, t 1 , t 3 }. (b) Siecrównoważna z jednym źródłem i z jednym
ujściem. Dodajemy super.źródło s' i krawędzie o nieograniczonych przepustowościach z s' do
wszystkich rzeczywistych żródeł. Dodajemy także superujście t' i krawędzie o nieograniczonych
przepustowościach z t' do wszystkich rzeczywistych ujść
LEMAT27.1.
Niech G = (V, E) będzie siecią i niech/ będzie pr1.epływem. w sieci G. Wówczas
są prawdziwe następujące równości:
656
27.1. SIECI PRZEPŁYWOWE
Dla X, Y, Z c: V takich, że X n Y = 0,
657
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
27.1-S, Dla sieci G = (V, E) i przepływu/z rys. 27.lb znajdź parę podzbiorów
X, Ys; V, dla których f(X, Y) = -f(V- X, Y). Następnie znajdź parę
zbiorów X, Y c V, dla którycbf(X, Y) ;,6 -f(V - X, Y).
27.1-6. Dla danej sieci G = (V, E) niech/ 1 i / 1 będą funkcjami z V x V w R.
Sumą przepływów / 1 + / 1 nazywamy funkcję z V x V w R zdefiniowaną
następująco:
(•fXu, v) = • ·f(u, v)
658
272. METODA FOADA-FULKERSONA
27.2. MetodaForda-Fulkersona
fORD-fULKERSON-METHOD(G, s, t)
1 inicjowanie/na O
2 whileistnieje ścieżka powiększająca p
3 do powiększ prupływ f wzdłuż p
4 return/
Sieci residualne
Intuicyjnie, dla danej sieci przepływowej i pewnego przepływu sieć residualna
składa się z krawędzi, które dopuszczają większy przepływ netto. Bardziej
formalnie, załóimy, że dana jest sieć G = (V, E) ze źródłem s i ujściem t.
Niech/ będzie pewnym przepływem w sieci G. Rozważmy parę wierzchołków
u, v E V. Dodatkowy przepływ z u do v, nie przekraczający przepustowości
c(u, v), nazywamy pnepustowością residualną dla (u, v), którą defmiujemy na-
stępująco:
659
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
\E~,;,2\E\
Zauważmy, że sieć residualna G1 jest siecią przepływową o przepustowo-
ściach danych przez c . Z następującego lematu wynika związek między prze-
1
pływem w sieci residualnej a przepływem w sieci pierwotnej.
LEMAT27.2.
Niech G = (V, E) będzie siecią przepływową ze źródłem si ujściem t,f -prze-
pływem w sieci G, G1 - siecią residualną dla sieci G indukowaną przez/, a/'
-przepływem w sieci G1 . Wówczas suma przepływów f + f' zdefiniowana rów-
nością (27.4) jest przepływem w sieci Go wartości I/+ /'I= lfl + if'I.
660
27.2. METODA FORDA"FULKERSONA
DOWÓD
Musimy sprawdzić, cr.yf + f' spełnia warunki skośnej symetryczności, przepu-
stowości oraz zachowania przepływu. Żeby wykazać, że zachodzi warunek
skośnej symetryczności, zauważmy, że dla wszystkich u, vE V mamy
= -/(v, u) - /'(v, u)
= -(f(v, u) + /'(v, u))
= -(f + /')(v, u)
=0+0
=0
Ostatecznie mamy
=I /(s, v) + I f'(s, v)
v,;;Y uc,Y
= 1/1+ 1/'I
661
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
$cieżki powiększające
12/12 12
V Ari,
..
\_\.\\Ó ' ls-'.<o
' ,, -
--
o et
" ~
,1•
s -
~ ~
8/13
11/14
_.v4:
3
ll
'
(a) (b)
12 : )13;,.
12/12 . ' -- I
\\\\Ó
'.\'l
/9.-'.<o
.v..,,·-"
' ,, - /9
:·t._-
'" '
~\,-.- ;'-_tf
·-,. I
~ ~
\_! ,. '
1
-</13
"
~
,1• 1, 3 y:·'
11/14
II . ·-·
(d)
(c)
662
27.2. METODA FORDA-FULKERSONA
LEMAT27.3.
Niech G = (V, E) będzie siecią przepływową, f - przepływem w sieci G,
ap - ścieżką powiększającą w sieci G!' Zdefiniujmy funkcję / 11: V x V-+ R
jak następuje:
WNIOSEK27.4.
Niech G = (V, E) będzie siecią przepływową, f - przepływem w sieci G,
a p - ścieżką powiększającą w sieci G1. Niech J,,będzie funkcją zdefm.iowaną
równaniem (27.6). Zdefiniujmy funkcję/': V x V-+ R taką, że f' =f +/ 11•
Wówczas/' jest przepływem w sieci G o wartości 1/'I= 1/1+ 1/,1> 1/1.
DOWÓD
Natychmiastowy z lematów 27.2 i 27.3.
•
Przekrojew sieciach
W metodzie F orda-Fulkersona przepływ jest wielokrotnie powiększany wzdłuż
ścieżek powiększających, aż zostanie osiągnięty maksymalny przepływ. Twier·
dzenie o maksymalnym przepływie i minimalnym przekroju, które wkrótce
udowodnimy, mówi, że przepływ jest maksymalny wtedy i tylko wtedy, gdy
sieć residualna indukowana przez ten przepływ nie zawiera ścieżki powiększa.
jącej. Żeby udowodnić to twierdzenie, musimy najpierw t.definiować przekrój
w sieci i zbadać jego własności.
Niech G = ( V, E) będzie siecią. Każdy podział zbioru V na S i T = V - S
taki, że se Si teT, nazywamy przekrojem (S, T) w sieci G. (fa definicja jest
podobna do definicji „przekroju", której używaliśmy w rozdz. 24 poświęca·
nym minimalnym drzewom rozpinającym. Różnice polegają na tym, że tutaj
rozważamy przekrój w grafie skierowanym oraz żądamy, żeby seS oraz te T).
Jeśli f jest przepływem, to przepływ netto przez przekrój (S, T) definiujemy
jako /(S, T). Przepustowością przekroju (S, T) jest c(S, T).
663
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
12
ts:9o
~ t
,fy3 .i•
11/14
'
'
-s:r_,.
Rys. 27.5. Pnekrój (S, T) w sieci z rys. 27.l(b), gdzie S"" {s, Vu v2} i T = {vs,v„ 1}. Wierzchołki
należącedo Ssą czarne, a wierzchołki należące do Tsą białe. Przepływ netto pr:rezprzekrój (S, T)
wynosif(S, T) = 19, ajego p:tzepustowość wynosi c(S, T) = 26
c(v1 , v 3) + c(v2 , v4 ) = 12 + 14
=26
Zauważmy, że do przepływu przez przekrój mogą zostać włączone ujemne
przepływy krawędziowe między wierzchołkami, ale na przepustowość przekro-
ju składają się
tylko wartości nieujemne.
Z następnego lematu wynika, że wartość przepływu w sieci jest równa
przepływowi przez dowolny przekrój w sieci.
LEMAT27.5.
Niechf będzie przepływem w
sieci G ze źródłem si ujściem t, a (S, T) niech
będzie przekrojem w sieci G. Przepływem netto przez (S, T) jest wówczas
f(S, T) = 1/1,
nowoo
Korzystając z lematu 27.1, otrzymujemy
664
27.2. METODA FORDA-FULKERS0NA
-f(s, V)
- Ili
•
Bezpośrednim wnioskiem z lematu 27.5 jest równość (27.3}, którą już
udowodniliśmy wcześniej, mówiąca, że wartością przepływu jest przepływ net-
to wpływający
do ujścia.
Z lematu 27 .5 otrzymamy również wniosek o sposobie wykorzystania
przepustowości do otrzymania górnego ograniczenia na wartość dowolnego
przepływu.
WNIOSEK27.6.
Wartość dowolnego przepływu/w sieci G jest nie większa niż przepustowość
dowolnego przekroju w sieci G.
DOWÓD
Niech (S, T} będzie dowolnym przekrojem w sieci G i niech/ będzie dowol-
nym przepływem. Z lematu 27.5 i warunku przepustowości mamy
lfl -f(S, T)
- L L f(u, v)
-~,
<; I I c(u, v)
IRlS veT
- c(S, T)
•
Możemy już przeprowadzić dowód ważnego twierdzenia o maksymalnym
przepływie i minimalnym przekroju.
DOWÓD
(l} => (2): Załóżmy przeciwnie, że f jest przepływem maksymalnym w sieci G,
ale G1 ma ścieżkę powiększającą. Wówczas z wniosku 27.4 otrzymujemy, że
665
ROZDZIAŁ 27, MAKSYMALNY PRZEPŁYW
suma przepływów f + / 11, gdzie / 11jest zdefiniowane równaniem (27 .6), jest prze-
pływem w sieci G o wartości większej n.iż 1/1,co przeczy założeniu, że f jest
maksymalny.
(2)=- (3): Załóżmy, że sieć residualna GI nie zawiera żadnej ścieżki powięk
szającej, tzn. G1 nie zawiera żadnej ścieżki z s dot. Niech
•
Podstawowyalgorytm Forda-Fulkersona
W metodzie Forda-Fulkersona w każdej iteracji znajdujemy dowolną ścieżkę
powiększającą p i zwiększamy przepływ/ wzdłuż p o przepustowość residual-
ną cJp). W następującej implementacji tej metody obliC7ATDymaksymalny
przepływ w grafie G = (V, E), aktualizując przepływ netto J1u,v] między każdą
parą wierzchołków u, v połączonych krawędzią w G 1l, Jeśli wierzchołki u i v nie
są połączone krawędzią w żadnym kien,nku, to przyjmujemy niejawnie, że
f[u, v] = O. W przedstawionej poniżej procedurze FORD-FULKERSON zakłada
my, że przepustowość z u do v dana jest jako funkcja c(u, v), którą oblicza się
=
w czasie stałym. Przyjmujemy, że c(u, v) O, jeśli (u, v)łE, (:N typowych
implementacjach c(u, v) można otrzymać z informacji pamiętanych w wierz-
chołkach i na ich listach sąsiedztwa). Przepustowość residualna cf.u, v) jest
obliczana zgodnie ze wzorem (27.5). Wyrażenie c1 (p) w zapisie procedury jest
w rzeczywistości :zmienną pomocniczą, w której pamiętamy przepustowość re~
sidualną ścieżki p.
FORD-FULKERSON(G, s, t)
I for każda krawędź (u, v)eE[G]
2 dof1u,v]+-0
3 J1v,u]~ O
666
27.2. METODA FOROA-FULKERSONA
667
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
4/12
(a)
<o
•
I
,, ,,
14 4/14 •
--.ji:
8 4/12
(b)
4
' I
,, ' ,,
IO
4
11/14 ·~··
-+
•
·,·"f,-
(c)
8 12/12
' 4
.
'. .l,'o· ł. '..
3 ' '
11/14
II
(d) 12/12
z
--
o I
3
II
' 11/14
(c)
,, /9
J
J
J;,
'
Rys. 27.6. Ilustracja działania podstawowego algorytmu Forda-Fulkenona. (a)-{d) Kolejne iteracje
pętli wllile. Z lewej strony każdego fragmentu rysunku jest pokazane sieć residualn.a G1 z wiersza
4 z mcicniowaną ścieżką powiększają.cąp. Po prawej stronie pokazany jest nowy przepływ/ otrzy-
many w wyniku dodania/, do j. Siecią residualną na rysunl:u (a) jest wejściowa sieć G. (e) Sieć
residualna bedana w ostalnim teście w pętli wblle. Nie zawiera ona ścieżek. powiększają.cych,
i d1etego przepływ /pokazany ne.rysunku (d) jest pnepływem maksymalnym
668
27.2. METODA FORDA·FULKERSONA
t I
' '
(,) (b)
• t
\
y
(c)
Rys. 27.7. (a) Sieć przepływowa, dla której procedura FORD·FUUU!lł.SON może działać w czasie
0(El/"I ), gdzie/' jest maksymalnym przepływem, którego wartością jest tutaj 2000000. Zazna-
czono ścieżkę powiększającą o przepustowości residualnej L (b) Sieć residualna otrzymana w wy-
niku powiększenia przepływu wzdłuż ścieżki z (a) . .zaznaczono kolejną ścieżkę powiększającą
o przepustowości residualnej I. (c) Wynikowa sieć residualna
Na rysunku 27.7a widać, co może się zdarzyć w prostej sieci, dla której lf'I
jest duże. Maksymalny przepływ w tej sieci ma wartość 2 OOOOOO:1 OOO OOO
jednostek przepływa ścieżką S-* u"'"* t, a następne 1 000000 -ścieżką S-* v "'"*t.
Jeśli pierwszą ścieżką powiększającą znajdowaną w tym algorytmie jest
S-* u-* v "'"*t (patrz rys. 27 .7a), to po pierwszej iteracji wartość przepływu
wynosi 1. Na rysunku 27.7b jest przedstawiona sieć residualna indukowana
przez ten przepływ. Jeśli w drugiej iteracji znalezioną ścieżką powiększającą
jest S-* V-* U-* t (rys. 27.7b), to wówczas wartość przepływu wzrośnie do 2.
Na rysunku 27.7c widać sieć residualną indukowaną przez ten przepływ. Mo-
żemy teraz kontynuować ten proces, wybierając ścieżkę powiększającą
669
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
LEMAT 27.8.
Jeślialgorytm Edmondsa-Karpa jest wykonywany dla sieci przepływowej
G = (V, E) o źródle si ujściu t, to dla każdego wierzchołka ve V - {s, t} po
każdym powiększeniu wartości przepływu odległość ó1 (s, v) w sieci residualnej
GI nie maleje.
DOWÓD
Załóżmy przeciwnie, że dla pewnego wierzchołka ve V - {s, t} istnieje taltie
powiększenie wartości przepływu, które powoduje, że ó1 (s, v) maleje. Niech
J będzie przepływem akurat przed tym powiększeniem i niech/' będzie prze-
pływem zaraz po wykonaniu powiększenia. WówC'las
(27.7)
670
27.2. METODA FORDA-FULKERSONA
ó/s, v) - ó/s, u) - I
~ o1,(s, u) - 1
- o,,(s,v) - 2
< o,.(s, v)
co przeczy naszemu początkowemu założeniu.
•
W następnym twierdzeniu jest podane ograniczenie na liczbę iteracji w al-
gorytmie Edmondsa-Karpa.
TwlERDZENIE27.9.
Jeśli algorytm Edmondsa-Karpa jest wykonywany dla sieci G = (V, E) o źród
le si ujściu t, to łączna liczba powiększeń przepływu w tym algorytmie wynosi
co najwy7.ej O(VE).
DOWÓD
Powiemy, że krawędź (u, v) w sieci residualnej GI jest krytyczna na ścieżce
powiększającej p, jeśli przepustowość residualna p jest równa przepustowości
residualnej (u, v), tzn. jeśli c1 (p) = c1 (u, v). Po powiększeniu przepływu wzdłuż
ścieżki powiększającej każda krawędź krytyczna na tej ścieżce znika z sieci
residualnej. Co najmniej jedna krawędź na każdej ścieżce powiększającej musi
więc być krytyczna.
671
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
b1 (s, v) - b1 (s, u) + l
Po powiększeniu przepływu krawędź (u, v) znika z sieci residualnej i nie
może pojawić się na innej ścieżce powiększającej, aż do cza.su, w którym prze-
pływ netto między wierzchołkami u i v zostanie zmniejszony. To może zdarzyć
się tylko wtedy, kiedy (v, u) znajdzie się na ścieżce powiększającej. Jeśli/' jest
przepływem w sieci G w chwili, gdy tak się dzieje, to
ó1.(s, u) - J1 .(s, v) + l
Z lematu 27.8 wynika, że b (s, v) ~ ()1 ,(s, v). Stąd otrzymujemy
1
J1 .(s, u) - J1 .(s, v) + l
~ a,(s, v) + 1
- ó1(s, u) + 2
W konsekwencji od chwili, w której krawędź (u, v) była krytyczna, do
chwili, kiedy ponownie staje się krytyczna, odległość wierzchołka u od źródła
rośnie co najmniej o 2. Początkowa odległość wierzchołka u od źródła s wynosi
co najmniej I i zanim stanie się on nieosiągalny ze źródła s (jeśli to w ogóle
nastąpi), jego odległość od s może wzrosnąć co najwyżej do IVI- 2. Zatem
krawędź (u, v) może stawać się krytyczna co najwyżej O( V) razy. Ponieważ jest
co najwyżej O(E) par wierzchołków, dla których istnieje krawędź między nimi
w grafie residualnym, łączna liczba krawędzi krytycznych pojawiających się
w czasie całego wykonania algorytmu Edmondsa-Karpa wynosi O(VE). Każ
da ścieżka powiększająca ma co najmniej jedną kawędż krytyczną, co wystar-
cza do zakończenia dowodu twierdzenia.
•
Ponieważ każda iteracja algorytmu Forda-Fulkersona może zostać zaim-
plementowana w czasie O(E), kiedy ścieżka powiększająca jest znajdowana za
pomocą przeszukiwania wszerz, łączny czas wykonania algorytmu Edmond-
sa-Karpa wynosi O(VE 2 ). W podrozdziale 27.4 opiszemy pewną metodę umoż
liwiającą osiągnięcie czasu O(V2E), która jest podstawą algorytmu z pod.rozdz.
27.5 działającego w czasie O(V3).
ZADANIA
27.2--1. Podaj przepływ przez przekrój ({s, v2 , v4 }, {v1 , v3 , t}) w sieci z rys.
27 .1b. Jaka jest przepustowość tego przekroju?
672
27.3. MAKSYMALNE SKOJARZENIA W GRAFACH DWUDZIELNYCH
27.3. Maksymalne
skojarzenia
w grafachdwudzielnych
Pewne problemy kombinatoryczne można łatwo przedstawić jako problemy
maksymalnego przepływu. Przykładem jest tu problem maksymalnego prze-
pływu z wieloma źródłami i ujściami z podrozdz. 27 .1. Istnieją także problemy,
673
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
l R l R
(•) (b)
Rys, 27.8. Graf dwudzielny G = (V, E), w którym V= L v R. (•) Skojarzenie o liczności 2. (b) Ma-
ksymalne skojattenie o liczności 3
674
27.3. MAKSYMALNE SKOJARZENIA W GRAFACH DWUDZIELNYCH
o
l R L R
(,) (b)
RyL 27.9. SillCprzepływowa odpowiadająca grafowi dwudzielnemu. (•) Graf dwudzielny G = (V, E)
z rys. 27.8, w którym V,.. Lu R. Do mak~ymalnego skojarzenia należą krawędzie z.a.cieniowane.
(b) Odpowiadająca grafowi G sieć prmpływowa G', w której jest zaznaczony maksymalny
przepływ. Przepustowośc każdej krawędzi. jest jednostkowa. Prrepływ na krawędziach 2'Jlcienio-
wanych wynosi I, natomiast na pozostałych krawędzi.ach przepływ jest zerowy. Za.cieniowane
krawędzie prowadzące od L do R odpowiadają krawędziom z maksymalnego skojarzenia w grafie
dwudzielnym
675
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
LEMAT27.10.
Niech G = (V, E) będzie grafem dwudzielnym, w którym V= Lu R, i niech
G' = (V', E') będzie odpowiadającą mu siecią przepływową. Jeśli M jest skoja-
rzeniem w G, to istnieje całkowitoliczbowy przepływ/ w sieci G' o wartości
lfl = IMJ.Odwrotnie, jeśli/jest przepływem całkowitoliczbowym w sieci G', to
istnieje skojarzenie M w grafie Go mocy I.Ml= 1/1.
DOWÓD
Udowodnimy najpierw, że skojarzeniu M w grafie G odpowiada pewien cał
kowitoliczbowy przepływ w sieci G'. Z.definiujmy / następująco. Jeśli
(u, v)c M, to /(s, u)= f(u, v) = f(v, t) = l i f(u, s) = f(v, u)= f(t, v) = -1.
Dla wszystkich pozostałych krawędzi (u, v)eE' definiujemy /(u, v) = O.
Intuicyjnie, każdej krawędzi (u, v)eM odpowiada 1 jednostka przepływu
w sieci G', która wędruje ścieżką s-+ u-+ v-+ t. Ponadto ścieżki indukowane
przez krawędzie z M są wierzchołkowo rozłączne, z wyjątkiem s i t. żeby
wykazać, że/ rzeczywiście spełnia warunki skośnej symetryczności, przepus-
towości i zachowania przepływu, wystarczy tylko zauważyć, że/można otrzy-
mać w wyniku powiększania przepływu wzdłuż każdej z tych ścieżek. Przepływ
netto przez przekrój (Lu {s}, Ru {t}) jest równy IMJ.Z lematu 27.5 otrzymu-
jemy więc, że wartość przepływu wynosi 1/1= IMJ.
Aby udowodnić odwrotną implikację, załóżmy, że/jest przepływem cał
kowitoliczbowym w sieci G' i niech
M = {(u, v):ucL, vcR if(u, v) > O}
Ka:idy wierzchołek u e L ma tylko jedną krawędź wchodzącą, mianowicie (s, u),
a jej przepustowość wynosi I. Tak więc do każdego ueL wchodzi co najwyżej
1 jednostka dodatniego przepływu. Ponieważ dla każdego u e L przepływ/ jest
calkowitoliczbowy, 1 jednostka dodatniego przepływu wchodzi do u wtedy
i tylko wtedy, gdy istnieje dokładnie jeden wierzchołek veR taki, że/(u, v) = 1.
Tak więc co najwyżej jedna krawędź wychodząca z każdego wierzchołka ueL
przenosi dodatni przepływ. Symetryczne rozumowanie można przeprowadzić
dla każdego v e R. Dlatego zbiór M zdefmiowany powyżej jest skojarzeniem.
Pozostaje pokazać, że !Ml= l/J. W tym celu zauważmy, że dla każdego
skojarzonego wierzchołka ueL mamy f(s, u)= 1, a dla każdej kra-
wędzi (u, v)e E - M zachodzi/(u, v) = O. W konsekwencji z lematu 27 .1, włas
ności skośnej symetryczności i z braku istnienia krawędzi re zbioru L do ujś
cia t otrzymujemy
676
27.3. MAKSYMALNE SKOJARZENIA W GRAFACH DWUDZIELNYCH
IMI-f(L, R)
- f(L, V') - f(L, L) - f(L, s) - f(L, t)
- O - O + f(s, L) - O
-f(s, V1
- Iii
Jest zatem naturalne, że maksymalnemu skojarzeniu w grafie dwudzielnym
•
G odpowiada pewien maksymalny przepływ w sieci przepływowej G'. Maksy-
malne skojarzenie w grafie G można więc obliczyć, wykonując dowolny al-
gorytm obliczania maksymalnego przepływu w sieci G'. Jedynym słabym pun-
ktem tego rozumowania jest to, że użyty przez nas algorytm obliczania ma-
ksymalnego przepływu mógłby wyznaczyć przepływ, który nie jest całkowito
liczbowy. Z następującego twierdzenia wynika, że jeśli zastosujemy metodę
Forda-Fulk:ersona, taki problem nie może się pojawić.
DOWÓD
Dowód przebiega przez indukcję względem liczby iteracji. Jego przeprowadze-
nie pozostawiamy czytelnikowi jako zad. 27.3-2.
DOWÓD
Posłużymy się terminologią z lematu 27.10. Załóżmy, że M jest maksymalnym
skojarzeniem w grafie G i że odpowiadający mu przepływ /w sieci G' nie jest
maksymalny. Wówczas istnieje maksymalny przepływ /' w sieci G' taki, że
I/' I > )/1.Ponieważ przepustowości w G' są całkowitoliczbowe, z twierdzenia
27.11 wynika, że przepływ/' jest taicie calkowitoliczbowy. Tak więc przepływ
/' odpowiada skojarzeniu M' w grafie G o liczności IM'] = I/' I > 1/1= IM],
przecząc maksymalności M. W podobny sposób możemy pokazać, że jeśli
/jest przepływem maksymalnym w sieci G', to odpowiadające mu skojarzenie
jest maksymalnym skojarzeniem w grafie G.
•
677
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
*27.4. Algorytmyprzedprzeplywowe
W tym podrox.dzialeprzedstawimy metodę przedprzepływową obliczania ma-
ksymalnego przepływu. Najszybsze znane obecnie algorytmy obliczania ma~
678
* 27.4. ALGORYTMY PRZEDPRZEPŁYWOWE
Rozważania intuicyjne
Metodę przed.przepływową można prawdopodobnie najlepiej zrozumieć, roz-
ważając przepływ cieczy w sieci G = (V, E) połączonych ze sobą rur o danych
przepustowościach. Stosując tę analogię do metody Forda-Fulkersona, mog-
libyśmy powiedzieć, że każda ścieżka powiększająca w sieci umożliwia przesia-
nie ze źródła do ujścia dodatkowego strumienia cieczy, który w żadnym punk-
cie się nie rozgałęzia. W metodzie Forda-Fulk:ersona kolejno, jeden po drugim,
są dodawane nowe strumienie aż do chwili, w której już żaden nowy strumień
nie może być dodany.
679
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
680
* 27.4. ALGORYTMY PRZEDPRZEPŁYWOWE
Podstawoweoperacje
Z przeprowadzonej dyskusji wynika, że w metodzie przedprzepływowej wy-
konywane są dwie podstawowe operacje: przesyłanie nadmiaru przepływu
z wierzchołka do jednego z jego sąsiadów (operacja PusH) i podnoszenie
wierzchołka (operacja LIFT). Stosowalność tych operacji zależy od wysokości
wierzchołków. To pojęcie zdefiniujemy teraz formalnie.
Niech G = (V, E) będzie siecią przepływową o źródle w s i ujściu w t,
a/ niech będzie przedprzepływem w sieci G. Funkcję h: V__.N nazywamy
funkcją wysokości, jeśli h(s) = IVI, h(t) = Oi
h(u),; h(v) + 1
LEMAT27.13.
Niech G = ( V, E) będzie siecią przepływową, niech f będzie przed przepływem
w sieci G, a h - funkcją wysokości na zbiorze V. Dla ka7..dych dwóch wierz-
chołków u, ve V, jeśli h(u) > h(v) + 1, to (u, v) nie jest krawędzią w grafie
residualnym.
•
Operację podstawową PUSH(u, v) można stosować tylko wtedy, gdy wierz-
chołek u jest wierzchołkiem nadmiarowym, c1(u, v) > Oi h(u) = h(v) + I. Ope-
racja ta zmienia przed.przepływ f w rozważanej sieci G = (V, E). Pseudokod
dla tej operacji jest zapisany poniżej. Zakładamy, że przepustowości są dane
przez obliczaną w stałym czasie funkcję c. Przepustowości residualne mogą być
wówczas obliczone w stałym czasie z c i f Nadmiar przepływu w wierzchoł
ku u jest pamiętany w zmiennej e[u], a wysokość u w zmiennej h[u]. Wyrażenie
d1 (u, v) oznacza zmienną tymczasową służącą do pamiętania wielkości prze-
pływu, który można przesiać z u do v.
PUSH(u, v)
1 t> Stosujemy, gdy: u jest nadmiarowy, cr(u, v) > O i h[u] = h[v] + I
2 t> Działanie: Przesianie d1 (u, v) = min(e[u], c1 (u, v)) jednostek przepływu
zudov.
3 d1(u, v) - min(e[u], c1 (u, v))
4 /[u, v]- /[u, v] + d1 (u, v)
5 f[v, u] - -/[u, v]
6 e[u] - e[u] - dr(u, v)
7 e[v] - e[v] + d1 (u, v)
681
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
L!Fr(u)
1 C> Stosujemy, gdy: u jest nadmiarowy i dla wszystkich ve V
(u, v) E E1 implikuje h[u] ,;; h[v]
2 t> Działanie: Zwiększenie wysokości u
3 h[u] +-1 + min{h[v]: (u, v)eE 1}
682
* 27.4. ALGORYTMY PRZEDPRZEPŁYWQWE
INITIALIZE-PREFLOW(G, s)
1 for każdy wierzchołek ue V[G]
2 do h[u] -o
3 e[uJ-o
4 for każda krawędź (u, v)e E[G]
5 do/[u,v]-O
6 f[v, u]- O
7 h[sJ - IV[GJI
8 for każdy wierzchołek u e Adj[s]
9 do /[s, u] - c(s, u)
10 /[u, s] - - c(s, u)
li e[u]-c(s,u)
jeśli u= s
h[uJ = {~I, . .
w przeciwnym razie
Jest to rzeczywiście funkcja wysokości, ponieważ jedynymi krawędziami (u, v),
dla których h[u] > h[v] + 1, są te, dla których u= s. Krawędzie te są nasycone,
co oznacza, że nie mogą występować w sieci residualnej.
683
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
DOW0D
Ponieważ h jest funkcją wysokości, dla każdej krawędzi residualnej (u, v) ma-
+
my h(u) ~ h(v) 1. Jeśli operacja PUSH nie stosuje się do u, to dla każdej
krawędzi residualnej (u, v) musi zachodzić h(u) < h(v) + I, z czego wynik.a, ie
h(u) :i::;h(v). Tak więc do u można zastosować operację LIFT.
•
Poprawność metody przedprzeplywów
Żeby udowodnić, że za pomocą algorytmu GENERIC-PREFLOW-PUSH
można
poprawnie rozwiązać problem maksymalnego przepływu, pokażemy najpierw,
że po zakończeniu działania algorytmu/jest przepływem maksymalnym. Na-
stępnie udowodnimy, że omawiany algorytm zawsze kończy swoje działanie.
Rozpoczniemy od pewnych obserwacji dotyczących funkcji wysokości h.
DOWÓD
Ponieważ wysokości wierzchołków zmieniają się tylko w wyniku wykonywania
operacji LIFT, wystarczy udowodnić drugą część twierdzenia. Jeśli wierzchołek
684
* 27.4. ALGORYTMY PAZEOPRZEPŁYWOWE
•
LEMAT27.16.
Niech G = (V, E) będzie siecią przepływową ze źródłem s i ujściem t. Podczas
wykonywania algorytmu GENERIC-PREFLOW-PUSH dla sieci G atrybut h za-
chowuje własności funkcji wysokości.
DOWÓD
Dowód przebiega przez indukcję względem liczby wykonywanych operacji
PUSH i LIFT. Po fazie inicjowania, jak już wcześniej zauważyliśmy, h jest
funkcją wysokości.
Udowodnimy, że jeśli h jest funkcją wysokości, to operacja LIFT pozo-
stawia hjako funkcję wysokości. Jeśli (u, v)EE 1 jest krawędzią residualną wy-
chodzącą z u, to po wykonaniu LIFT(u) mamy h[u] ~ h[v] + 1. Jeśli krawędź
residualna (w, u) wchodzi do u, to z lematu 27 .15 wynika, że jeśli przed wyko-
naniem operacji LIFT(u) było h{w] ~ h[u] + 1, to po jej wykonaniu zachodzi
h[w] < h[u] + 1. Tak więc po wykonaniu LIFT h nadal jest funkcją wysokości.
Rozważmy teraz operację PUSH(u, v). Za pomocą tej operacji możemy
dodać krawędź (v, u) do E1 i możemy usunąć krawędź (u, v) z E_rW pierwszym.
przypadku mamy h[v] = h[u] - 1 i dlatego h pozostaje funkcją wysokości.
W drugim przypadku usunięcie krawędzi (u, v) z sieci residualnej powoduje,
że ta krawędź nie wpływa już na h i dlatego funkcja ta jest nadal funkcją
wysokości.
•
W następującym. lemacie jest podana pewna ważna własność funkcji wy-
sokości.
LEMAT27.17.
Niech G = (V, E) będzie siecią przepływową ze źródłem si ujściem t,f- przed-
przepływem w sieci G, a h-funkcją wysokości na V. Wówczas w sieci residual-
nej G1 nie istnieje ścieżka ze źródła .vdo ujścia t.
DOWÓD
Załóżmy przeciwnie i niech p = (v 0 , v1, vk) będzie ścieżką z s do t w sieci G1,
••• ,
na której v0 =si vt = t. Bez straty ogólności możemy przyjąć, że p jest ścieżką
prostą i stąd k < IVI.Dla i= O, 1, ... , k - l krawędź (v;, v1 + 1)E E1 . Ponieważ
h jest funkcją wysokości, h(v 1) ~ h(v 1 + 1) + I dla i= O, 1, ... , k - I. Łącząc te
nierówności wzdłuż ścieżki p, otrzymujemy h(s) .::;,;; h(t) + k. Ale ponieważ
685
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
h(t) = O, otrzymujemy h(s) ,;; k < IVI,czyli sprzeczność, bo h jest funkcją wy-
sokości, stąd = IYI,
a
Możemy
h(s)
Dowón
Jeśli algorytm kończy swoje działanie, to nadmiar w każdym wierzchołku
z V·- {s, t} musi wynosić O, ponieważ z lematów 27.14 i 27.16 oraz z tego, że
f jest zawsze przed.przepływem wynik.a, że nie ma wierzchołków nadmiaro-
wych. Dlatego f jest przepływem. Ponieważ h jest funkcją wysokości, z lematu
27.17 otrzymujemy, że w sieci residualnej nie istnieje żadna ścieżka z s do t.
Zatem z twierdzenia o maksymalnym przepływie i minimalnym przekroju
otrzymujemy, że/jest przepływem maksymalnym.
•
Analiza metody przedprzepływów
żeby udowodnić, że algorytm przedprzepływów rzeczywiście kończy swoje
działanie, podamy ograniczenia na liczbę operacji wykonywanych w tym al-
gorytmie. Oddzielnie policzymy ograniczenia na liczbę operacji dla każdego
z trzech typów operacji - podnoszenia, przesłania nasycającego i przesłania
nienasycającego. Znając te ograniczenia, nie napotkamy już trudności przy
konstruowaniu algorytmu działającego w cz.asieO(V 2 E). Przed rozpoczęciem.
analizy liczby operacji udowodnimy jeden ważny lemat.
LEMAT27.19.
Niech G = (V, E) będzie siecią przepływową ze źródłem s i ujściem t i niech
f będzie przedprzepływem w G. Wówczas dla każdego nadmiarowego wierz-
chołka u istnieje ścieżka prosta z u do s w sieci residualnej G1 .
Dowoo
Niech U= {v: istnieje prosta ścieżka z u do v w sieci G1} i załóżmy przeciwnie,
że sf U. Niech U =
V - U.
Pokażemy, że dla każdej pary wierzchołków v e U i we "tł zachodzi zależ
ność /(w, v),;; O.Dlac,.ego? Jeśli/(w, v) > O,to f(v, w) < O,z czego wynika, że
cf..v, w)= c(v, w) -f(v, w)> O i istnieje krawędź (u, v)eE 1 . Dlatego także
686
* 27.4. ALGORYTMY PRZEDPRZEPŁYWOWE
istnieje ścieżka prosta u -to v-. w w sieci Gf' co jest sprzecme z naszym wy-
borem w.
Musi zatem zachodzić /(U-, U)~ O, ponieważ każdy składnik w niejaw-
nym sumowaniu jest niedodatni. Dlatego z równości (27.8) i lematu 27.1 wnio-
skujemy, że
e(U) = f(V, U)
=f(U, U)+ f(U, U)
=f(U, U)
"o
We wszystkich wierzchołkach z V - {s} nadmiary przepływu są nieujemne.
Ponieważ założyliśmy, że U c V - {s},dla każdego wierzchołka ve U musimy
więc mieć e(v) = O. W szczególności e(u) = O, co przeczy naszemu założeniu
o tym, że wierzchołek u jest nadmiarowy.
LEMAT 27,20.
=
Niech G (V, E) będzie siecią przepływową ze źródłem si ujściem t. W każdej
chwili podczas wykonywania algorytmu GENERIC-PREFLOW-PUSHdla sieci
Gdla każdego wierzchołka ueVzachodzi h[u] ~ 21Vl-1.
DoWóD
Wysokości źródła s i ujścia t nigdy się nie zmieniają, ponieważ zgodnie z de-
finicją wierzchołki te nie mogą być nadmiarowe. Tak więc zawsze h[s] = ]VI
ih[t]=O.
Ponieważ tylko wierzchołki nadmiarowe są podnoszone, rozważmy do-
wolny nadmiarowy wierzchołek ueV-{s, t}. Z lematu 27.19 wiemy, że ist-
nieje ścieżka prosta p z u do s w sieci Gr Niechp = (v 0, v1, ••• , v1;),gdzie v0 = u,
v.,=s i k~ IVl-1, ponieważ p jest prosta. Dla i= O, 1, ..., k-1 mamy
(v;, v1+ 1)eE 1 i dlatego (z lematu 27.16) zachodzi h{v,]~ h[v;+il + 1. Łącząc
te nierówności wzdłuż ścieżki p, otrzymujemy h[u] = h[vcJ~ h[v1;]+ k.:;;;
,;; h[s] + (IVI- I)= 21VI-1.
•
WNIOSEK27 .21. (Ograniczenie na liczbę operacji podnoszenia)
Niech G = (V, E) będzie siecią przepływową ze źródłem s i ujściem t. Liczba
operacji podnoszenia wykonywanych dla jednego wierzchołka podczas wyko-
687
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
DOWÓD
Tylko wierzchołki z V - {s, t}, których jest IV! - 2 mogą być podnoszone.
Niech uE V - {s, t}. Operacja LIFT(u) zwiększa h[u]. Początkową wartością
h[u] jest O, a z lematu 27.20 wynika, że może ona wzrosnąć do co najwyżej
21VI- 1. Tak. więc każdy wierzchołek uE V - {s, t} jest podnoszony co naj-
wyżej 21VI - 1 razy, a łączna liczba wykonywanych operacji podnoszenia jest
nie większa niż (21VI- 1x1v1- 2) < 21v12 •
•
Lemat 27.20 zastosujemy także do znalezienia ograniczenia na liczbę prze-
słań nasycających.
DOWÓD
Dla każdej pary wierzchołków u, vE V rozważmy nasycające przesłania
z u do v i z v do u. Jeśli jest wykonywane co najmniej jedno takie przesłanie, to
co najmniej jedna z krawędzi (u, v) i (v, u) jest rzeczywistą krawędzią z E.
Załóżmy teraz, że wystąpiło przesłanie z wierzchołka u do v. Żeby można
wykonać na tej krawędzi operację PUSH w przyszłości, wcześniej tak.a operacja
musi zostać wykonana z wierzchołka v do u, co nie może się zdarzyć, zanim
h[v] nie wzrośnie co najmniej o 2. Podobnie h[u] musi wzrosnąć co najmniej
o 2 między kolejnym.i nasycającym.i operacjami PuSH z v do u.
Rozważmy ciąg A liczb całkowitych postaci h[u] + h[v], odpowiadający
ciągowi operacji PUSH między u i v. Jaka jest długość tego ciągu? Kiedy jest
wykonywana pierwsza operacja PuSH, w dowolnym. z kierunków między u i v,
musi zachodzić h[u] + h[v] ~ 1. Wynika stąd, że pierwszy element ciągu A jest
nie mniejszy niż 1. Z lematu 27.20 otrzymujemy, że gdy jest wykonywana
ostatnia operacja PUSH, zachodzi h[u] + h[v] <a:(21VI-1) + (21VI- 2)-
= 41V1- 3. Ostatnia liczba w ciągu A jest zatem nie większa niż 41VI- 3.
Używając argumentu z poprzedniego podrozdziału, widzimy, że w ciągu A mo-
że występować co najwyżej co druga liczba całkowita z przedziału [1, 41VI - 3].
Tak więc w A występuje co najwyżej ((41VI- 3) - 1)/2 + 1 - 2IVI - 1 liczb
całkowitych. (Dodajemy 1, żeby mieć pewność policzenia elementów z obu
końców ciągu A). Łączna liczba nasycających operacji PUSH między wierz-
688
* 27.4. ALGORYTMY PRZEDPRZEPŁYWOWE
TwIERDZENIE27.24.
Liczba podniesień (operacji LIFT) i przesłań (operacji PUSH)w schemacie GE-
NERIC-PREFLOW-PUSH wykonywanym dla dowolnej sieci G = (V, E) jest nie
większa niż O( V 2 E).
Dowoo
Natychmiastowy z wniosku 27.21 oraz lematów 27.22 i 27.23.
•
689
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
WNIOSEK27.25.
Schemat GENERIC-PREFLOW-PUSHmożna zaimplementować w taki sposób,
żeby działał w czasie O(V 2E) dla każdej sieci G = (V, E).
DOWÓD
Celem zadania 27.4-1 jest podanie implementacji algorytmu GENERIC-PREF-
LOW-PUSH,w której wykonanie operacji LIFT zabiera czas O(V), a wykonanie
operacji PUSH zabiera czas 0(1). Stąd natychmiast otrzymujemy nasz wniosek .
•
ZADANIA
27.4-1. Podaj implementację algorytmu GENERIC-PREFLOW-PUSHdziałającą
w czasie O(V 2E), w której wykonanie operacji LIFT zabiera czas O(V),
a wykonanie operacji PUSH zabiera czas 0(1).
27.4-2. Udowodnij, że w algorytm.ie GENERIC-PREFLOW-PUSH łączny czas
spędzany na wykonywaniu wszystkich O(V 2) operacji podnoszenia wynosi
tylko O( VE).
27.4-3. Załóżmy, że w sieci przepływowej G = (V, E) został znaleziony ma-
ksymalny przepływ za pomocą algorytmu GENERIC-PREFLOW-PUSH.Za-
proponuj szybki algorytm znajdowania minimalnego przekroju w sieci G.
27.4-4. Podaj efektywny algorytm przed.przepływów służą.cy do znajdowania
maksymalnego skojarzenia w grafach dwudzielnych. Przeanalizuj swój
algorytm.
27.4-5. Przypuśćmy, że przepustowości wszystkich krawędzi w sieci przepły
wowej należą do zbioru {l, 2, ..., k}. Przeanalizuj czas działania algoryt-
mu GENERIC-PREFLOW-PUSHw zależności od V, E oraz k. (Wskazówka:
Ile razy nienasycająca operacja PUSH może być wykonywana na tej samej
krawędzi, zanim krawędź ta zostanie nasycona?)
27.4-6. Pokaż, że jeśli wiersz 7 w procedurze INJTIALIZE-PREFLOWzamieni-
my na
h[s1~ IV[GJI - 2
to algorytm GENERIC-PREFLOW-PUSHpozostaje poprawny, a jego asymp-
totyczny czas działania się nie zmieni.
27.4-7. Niech ó1 (u, v) będzie odległością (liczbą krawędzi) z wierzchołka u do
v w sieci residualnej Gf· Pokaż, że algorytm GENERIC-.PREFLOW-PUSH
zachowuje następujące własności: jeśli h[u] < IVI, to h[u].::;,;;ó1(u, t), i jeśli
h[u];. IVI, to h[u] - IVI <; b1 (u, s).
* 27.4-8. Podobnie jak w zadaniu poprzednim, niech ó1 (u, v) będzie odległością
między wierzchołkami u i v w sieci residualnej Gp Pokaż, w jaki sposób
można zmodyfikować algorytm GENERIC-PREFLOW-PUSH,żeby była za-
* 27.5. ALGORYTM „PODNIES I PRZESU/\1NA POCZĄTEK'"
chowywana następująca własność: jeśli h[u] < IVI,to h[u] = ó1 (u, t), i jeśli
h[u] ~ IVI, to h[u] - IVI = D1(u, s). W Twojej implementacji łączny czas
potrzebny do zachowania tej własności powinien wynosić O(VE).
27.4-9. Pokaż, że liczba nienasycających przesłań wykonywanych przez GE-
NERIC-PREFLOW-PUSHna sieci G = (V, E) wynosi co najwyżej 41Vl2 IEI
dla ]V] ;,4.
691
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
DOWÓD
Załóżmy przeciwnie i niech p = (v 6 , v1, ••• , v,1;),gdzie v0 = V,1; i k > O, będzie
cyklem w sieci G1, h· Ponieważ każda krawędź z p jest dopuszczalna, mamy
h(v 1~ 1} = h(v 1) + 1 dla i= 1, 2, ... , k. Sumując po cyklu, dostajemy
•Lh(v,_,)- •
L(h(v,) + I)
jo,1 /;1
-
•L h(v.l + k
i"' 1
LEMAT27.27.
Niech G = (V, E) będzie siecią przepływową,/- przed.przepływem w sieci G,
a h - funkcją wysokości. Jeśli wiem:holek u jest nadmiarowy, a (u, v) jest
krawędzią dopuszczalną, to do (u, v) stosuje się operacja PUSH. Operacja
PUSH(u, v) nie tworzy żadnej nowej krawędzi dopuszczalnej, ale może spowo-
dować, że (u, v) przestanie być dopuszczalna.
DOWÓD
Zgodnie z definicją krawędzi dopuszczalnej jest możliwe przesłanie przepływu
z u do v. Ponieważ u jest nadmiarowy, stosuje się do niego operacja PUSH(u, v).
Jedyną nową krawędzią residualną, która może powstać w wyniku przesłania
przepływu z u do v, jest krawędź (v, u). Ponieważ h(v) = h(u) - 1, kra-
wędź (v, u) nie może zostać krawędzią dopuszczalną. Jeśli operacja PUSH jest
nasycająca, to po jej wykonaniu c1 (u, v) = Oi (u, v) przestaje być dopuszczalna .
•
LEMAT27.28.
Niech G = (V, E) będzie siecią przepływową, f - przed.przepływem w sieci G,
a h - funkcją wysokości. Jeśli wierzchołek u jest nadmiarowy i żadna z krawę
dzi wychodzących z u nie jest dopuszczalna, to do wierzchołka u stosuje się
operacja LIFT(u). Po wykonaniu operacji podniesienia LIFT co najmniej jedna
692
* 27.5. ALGORYTM „PODNIEŚ I PRZESUŃ NA POCZĄTEK"
DOWÓD
Jeśli wierzchołek u jest nadmiarowy, to na mocy lematu 27.14 albo operacja
PUSH, albo operacja LIFT stosuje się do u. Jeśli wśród krawędzi wychodzących
z u nie ma krawędzi dopuszczalnych, to żaden przepływ nie może opuścić u,
a więc do u stosuje się operacja LIFI(u). Po wykonaniu tej operacji zachodzi
h[u]= 1 + min{h[vJ: (u, v)EE1}. A zatem, jeśli v jest wierzchołkiem, dla które-
go jest osiągane minimum w powyższym wyrażeniu, to krawędź (u, v} staje się
dopuszczalna. Stąd, po wykonaniu podniesienia, co najmniej jedna krawędź
wychodząca z u jest dopuszczalna.
Pokażemy teraz, że po wykonaniu podniesienia żadna z krawędzi wcho-
dzących do u nie może być dopuszczalna. Załóżmy przeciwnie, niech v będzie
wierzchołkiem, dla którego krawędź (v, u) jest dopuszczalna po podniesieniu.
Wtedy h[v] - h[u] + l i dlatego zachodzi h[v] > h[u] + l tuż przed wykona-
niem podniesienia. Ale z lematu 27 .13 wynika, że między wierzchołkami, któ-
rych wysokości różnią się o więcej niż 1, nie istnieją krawędzie residualne.
Ponadto podnoszenie wierzchołka nie zmienia sieci residualnej. Tak więc (v, u)
nie występuje w sieci residualnej i dlatego nie może występować w sieci dopusz-
czalnej - sprzeczność z założeniem.
•
Listy sąsiadów
W algorytmie „podnieś i przesuń na początek" są wykorLystywane listy sąsia
dów. Dla danej sieci przepływowej G = (V, E} listą sąsiadów N[uJ, dla wierz-
chołka u E V, nazywamy jednokierunkową listę sąsiadów u w sieci G. Wierz-
chołek v występuje więc na liście N[u], jeśli (u, v)EE lub (v, u)EE. Pierwszy
wierzchołek na liście N[uJ jest wskazywany przez head[N[u]]. Wierzchołek z li-
sty występujący po v jest wskazywany przez next-neighbor[v].Jeśli v jest ostat-
nim wierzchołkiem na liście, to wskaźnik ten ma wartość NIL.
W algorytmie „podnieś i przesuń na początek" po każdej liście krążymy
cyklicznie. Porządek wierzchołków na liście jest dowolny, ale pozostaje jednak
niezmienny w trakcie działania algorytmu. Dla każdego wierzchołka u pole
current[u]wskazuje na aktualnie rozważany wierzchołek z listy N[u]. Począt
kową wartością current[u]jest head[N[uJJ.
--------------------------~
693
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
DISCHARGE(u)
1 while e[u] > O
2 do v +- current[u]
3 ifv=NIL
4 then LIIT(u)
5 current[u]+-head[N[u]]
6 elseif c1(u, v) > O i h[u] = h[v] + 1
7 then PUSH(u, v)
8 else current[u]+- next-neighbor[v]
Na rysunku 27.10 jest pokazanych kilka iteracji pętli while z wierszy 1-8,
która jest wykonywana dopóty, dopóki nadmiar przepływu w u jest dodatni.
W każdej iteracji jest wykonywana dokładnie jedna z trzech operacji, zależna
od aktualnie rozważanego wierzchołka v z listy sąsiadów N[u].
1. Jeśli v jest równe NIL, to została wyczerpana lista N[u]. W wierszu 4 wierz-
chołek u jest podnoszony, a potem w wierszu 5 wskaźnik current[u]jest
przesuwany na początek listy N[u]. (Lemat 27.29 mówi, że w tej sytuacji
operacja podniesienia LIFf stosuje się do u).
2. Je.śli v jest różny od NIL i (u, v) jest krawędzią dopuszczalną (co sprawdza się
w wierszu 6), to w wierszu 7 zostaje przesłany pewien (a być może cały)
nadmiar z u do v.
3. Jeśli v jest różny od NIL, ale krawędź (u, v) nie jest dopuszczalna, to w wier-
szu 8 wskaźnik current[u]jest przesuwany do następnego elementu na liś
cie N[u].
Zauważmy, że jeżeli procedura DISCHARGE jest wywoływana dla nadmia-
rowego wierzchołka u, to ostatnią operacją wykonywaną przez DISCHARGE
musi być przesłanie przepływu z wierzchołka u. Dlaczego? Procedura kończy
swoje działanie tylko wtedy, gdy e{u] przyjmuje wartość O. Z drugiej strony, ani
operacja podnoszenia, ani przesuwanie wskaźnika current[u],nie wpływa na
wartość e[u].
Musimy być pewni, że kiedy w procedurze DISCHARGE jest wywoływana
procedura PUSH lub procedura LIFT, operacja ta jest stosowalna. W następ
nym lemacie udowodnimy ten fakt.
LEMAT 27.29.
Jeśli w wierszu 7 procedury DISCHARGE jest wywoływana procedura PUSH, to
jest ona stosowalna do krawędzi (u, v). Jeśli w wierszu 4 procedury DISCHAR-
694
* 27.5. ALGORYTM „PODNIEŚ l PRZESUŃ NA POCZĄTEK"
DOWÓD
Testy w wierszach 1 i 6 zapewniają, że operacja PUSl'I jest wykonywana tylko
wtedy, gdy jest stosowalna. To dowodzi pierwszej części lematu.
Żeby udowodnić drugą część lematu, wystarczy tylko pokazać, stosownie
do testu z wiersza I i lematu 27.28, że żadna z krawędzi wychodzących z u nie
jest dopuszczalna. Podczas kolejnych wywołań procedury D1SCHARGE(u)
wskaźnik current[u]przebiega po liście N[u]. Każde przeglądanie listy rozpo-
czyna się od jej pierwszego elementu i kończy, gdy current[u]= NIL. W tym
ostatnim wypadku wierzchołek u jest podnoszony, a wskaźnik current[u]zo-
staje przesunięty na początek listy i rozpoczyna się nowe przeglądanie listy.
Rozważmy jeden taki przebieg. żeby wskaźnik current[u]mógł przesunąć się
po liście do następnego wierzchołka po v, krawędź (u, v) musi zostać uznana za
niedopuszczalną w teście w wierszu 6. Tak więc po przejściu listy każda kra-
wędź wychodząca z u musiała być w tym przejściu uznana za niedopuszczalną.
Dlaczego? Z lematu 27.27 wiemy, że w wyniku wykonania operacji PUSH nie
może zostać utworzona krawędź dopuszczalna. Zatem jakakolwiek krawędź
dopuszczalna może zostać utworzona jedynie w wyniku wykonania operacji
podnoszenia. Ale wierzchołek u nie jest podnoszony podczas przechodzenia
listy N[u], a zgodnie z lematem 27.28 krawędzie wchodzące do ka7.dego innego
wierzchołka v podnoszonego w tym przejściu nie są dopuszczalne. Tak więc po
zakończeniu przebiegu wszystkie krawędzie wychodzące z wierzchołka u są
niedopuszczalne, co kończy dowód lematu.
•
Algorytm „podnieś i przesuń na początek"
Omawiany przez nas algorytm operuje na liście L zawierającej wszystkie wierz-
chołki z V - {s, t}. Wierzchołki na liście są uporządkowane topologicznie,
stosownie do bieżącej sieci dopuszczalnej. (Z lematu 27.26 wiemy, że sieć dopu-
szczalna jest dagiem).
W przedstawionym poniżej formalnym zapisie algorytmu „podnieś i prze-
suń na początek" (procedura LIFT-TO-FRONT) zakładamy, że dla wszystkich
wierzchołków u listy sąsiadów zostały już utworzone. Przyjmujemy także, że
next[u] wskazuje na wierzchołek występujący po u na liście [.,, Je7.eli u jest
ostatnim elementem na liście, to - jak zazwyczaj - next[u] = NIL.
LIFr-TO-FRONT(G, s, I)
1 INITIALIZE-PREFLOW(G,s)
2 L +- V[G] - {s, t}, w dowolnym porządku
------------------------"""
695
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
6
5 I 2 3 4
..
, ~.-- ..-·-··",.,....................
4 <ł'
(a) 3 X
'
X
'
X X
'
2 •
I
•
' ' '
o
6
5 5 6 7
4
."" '
•
'
(b) 3
2
X
• X
•
I
' '
o •."z·~
·.Q.
6
5 8 9
4
(c) 3 X
' '
X
2 :'t' •
I 8,i,
'
.z
o ił
Rys. 17.10. Rozładowywanie wierzchołka. Wysłanie całego nadmiaru przepływu z wierzchołka y jest
wykonywane w 15 iteracjach pętli wbile w procedurn: DISCHARGE.Na rysunku widać tylko sąsia
dów y oraz krawędzie wychodzące i wchodzące do y. Liczba wewnątrz wierzchołka jesl jego
nadmiarem na początku pierwsn:j iteracji ilustrowanej w tym fragmencie, a każdy wierzchołek
majduje się na poziomie odpowiadającym jego wysokości w tej fazie algorytmu. Z prawej strony
mamy listy są.siadów N(y) pokazane na początku każdej iteracji. Numer danej iteracji majduje się
u góry. Zmienna current[y]wskazuje sąsiada y, który jest zacieniowany.(•) Początkowo wy znaj-
duje się 19 jednostek nedmiaru przepływu, które należy wyslaC z y, a cwrent[y] = s. Ponieważ
żadna z krawędzi wychodzących z y nie jest dopuszczalna, w iteracjach I, 2 i 3 wskażnik. c1,1rrent[y
tylko przesuwa się po liście i żadna inna akcja nie jest podejmowana. W iteracji 4 C11Trmt[y] = NlL
(co jest zaznaczone zacieniowanym kółkiem występującym za ostatnim elementem listy). Teraz
y zostaje podniesiony, a currenl[y]przesuwa się na początek listy. (h) Po podniesieniu wierzchołek
y ma wysokość l. W iteracjach 5 i 6 napotykamy krawędzie (y, s) i (y, x), które nie są dopuszcza].
ne, ale w kolejnej iteracji, 8 jednostek przepływu zostaje przesłanych z y do z. Ponieważ wstała
wykonana operacja Pum, wskażnik. CllrTenify]nie prn:suwa się po liście. (c) Ponieważ w iteracji
7 krawędź (y, z) została nasycona, w iteracji 8 zostaje wykryte, ie nie jest ona dłużej dopuszczalna.
W iteracji 9 cun-ent[y]= NIL i dlatego wierzchołek y jest ponownie podnoszony, a CllrT.tnt[y]prze.
suwa się na początek listy. (d) W iteracji 10 krawędź (y, s) nie jest dopuszczalna, ale za to 5 jedno-
stek przepływu zostaje prz.esłanych z y do x w iteracji 11. (e) Ponieważ current{y]nie został przem-
696
* 27.5. ALGORYTM „POONIES I PRZESUl'il NA POCZĄTEK"·
6
5
4
GR. IO
-----
II
_,
"!.v~ '
(d / J -, X
•
-
C
- la-_, - -
o
I CD''
• •
a;.
12 13 14
( C)
'
'
-
6
5
@ ------- )4)\'!.--·· {)
15
4
26
\,,-· '
(f) J
? '"' "
'I G) \ I
'
\)
~ •
6
5 @--___! l!,"14
4
(g)
-'
- l
I G)
u '
8
nięty w iteratji Il, w iteracji 12 zoslaje stwierdzone, ;i:eta krawędź nie jest dłużej dopuszczalna.
Podobnie w iteracji 13 stwierdza się, t.e (y, z) jest niedopuszczalna. W iteracji 14 y jest podnoszony,
a curre11t(y]przesuwa się na początek listy.(() W iteracji 15, 6 jednostek przepływu jest przesyła
nych z y do s. (g) W wierzchołku y nie ma ju;i:nadmiaru przepływu i procedura DISCHAROE kończy
działanie. W tym przypadku zarówno na początku, jak i na końcu działanią procedury DISCHAROE
wskaźnik current wskazuje na początek listy. Tak nie musi być jednak w każdym przypadku
697
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
698
* 27.5. ALGORYTM „POONIE$ I PRZESUN NA POCZĄTEK"
albo do t). Dlatego, jeśli wskaźnik do wierzchołka u osiąga koniec listy, nad-
miar w każdym wierzchołku wynosi O i żadna operacja podstawowa nie jest
stosowalna.
LEMAT 27.30.
Niech G = (V, E) będzie siecią przepływową ze źródłem s i ujściem t. Na-
stępujący warunek jest niezmiennikiem pętli wbile w algorytmie LIFT-TO-
-FRONT wykonywanym dla sieci G: porządek wierzchołków na liście L jest
porządkiem topologicznym dla sieci dopuszczalnej Gr,;,= (V, Er,;,).
DOWÓD
Bezpośrednio po fazie inicjowania w wierszu 1 mamy h[s] = \VI i
h[v} = O
dla wszystkich vE V - {s}. Ponieważ IV]~ 2 (V zawiera co najmniej 2 wierz-
chołki: s i t), i.adna krawędź nie może być dopuszczalna. Tak więc Er,;,= 0
i każdy porządek wierzchołków z V - {s, t} jest porządkiem topologicznym
w sieci Gf,h·
Pokażemy teraz, że niezmiennik z lematu jest zachowywany w każdej itera-
cji pętli while. Z lematu 27.27 wiemy, że operacje PUSH mogą tylko spowodo-
wać, iż niektóre krawędzie przestaną być dopuszczalne. Nowe krawędzie dopu-
szczalne mogą powstać tylko w wyniku wykonania operacji podnoszenia. Z le-
matu 27.28 mamy, że po podniesieniu dowolnego wierzchołka u nie istnieją
krawędzie dopuszczalne wchodzące do u, ale mogą istnieć krawędzie dopusz-
czalne wychodzące z u. Tak. więc, przesuwając wierzchołek u na początek li-
sty L, mamy pewność, że każda krawędź wychodząca z wierzchołka u zacho-
wuje porządek topologiczny.
•
Analiza
Pokażemy teraz, że algorytm Livr-To--FRONT działa w czasie O(V ) dla każdej
3
TwIERDZENIE 27 .31.
Dla każdej sieci przepływowej G = (V, E) czas działania algorytmu LIFT-TO·
·FRONT wynosi O(V 3 ).
699
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
DOWÓD
Fazą w algorytmie LIFI'-TO-FRONT nazwijmy czas między kolejnymi dwiema
operacjami podnoszenia. Ponieważ może być co najwyżej O( V 2) operacji
podnoszenia, liczba faz wynosi co najwyżej O(V 2 }. W każdej fazie procedura
DISCHARGBjest wywoływana co najwyżej IV] razy. Uzasadnienie tego faktu
jest następujące. Jeśli w procedurze DISCHARGEnie wykonujemy podnoszenia,
to kolejne wywołanie tej procedury zachodzi dla wierzchołka bliższego końca
listy, a długość listy jest mniejsza od IVI.Jeśli w DISCHARGEjest wykonywane
podnoszenie, to następne wywołanie DISCHARGE odbywa się już w innej
fazie. Ponieważ w każdej fazie mamy co najwyżej !VI wywołań DISCHARGE,
a liczba faz wynosi co najwyżej IV]2 , łączna liczba wywołań DISCHARGE
w wierszu 8 algorytmu LIFT-TO-FRONT wynosi O(V 3 ). Tak więc łączna praca
wykonywana w pętli wbile w algorytmie LIFT-TO-FRONT, oprócz pracy wy-
konywanej we wszystkich wywołaniach procedury DISCHARGE, wynosi co
najwyżej O( V 3 ).
Pozostaje do oszacowania łączna praca wykonywana we wszystkich wy-
wołaniach DISCHARGE. W każdej iteracji pętli whilew procedurze DISCHARGE
wykonywana jest jedna z trzech operacji. Przeanalizujemy ilość pracy wykony-
waną przez każdą z tych operacji. Rozpoczynamy od operacji podnoszenia
(wiersze 4-5). Pozostawiamy jak.o zad. 27.4-2 pokazanie, że łączny czas wyko-
nania wszystkich O(V 2 ) operacji podnoszenia jest nie większy niż O(VE).
Rozważmy teraz operację z wiersza 8, polegającą na przesunięciu wskaź
nika cu"ent[u]. Tę operację wykonujemy O(degree(u))razy między kolejnymi
podnoszeniami kłlmego wierzchołka u (gdzie degree(u) jest stopniem wierz-
chołka u). Wobec tego łączna liczba przesunięć wskaźnika cu"ent[u} wynosi
O(V·degree(u)). Z lematu o uściskach dłoni (zad. 5.4-1) wynika, że łączna
liczba przesunięć wskaźników na wszystkich listach sąsiadów wynosi O( VE).
Trzecim typem operacji wykonywanym przez DISCHARGBjest operacja
PUSH (wiersz 7). Wiemy już, że łączna liczba nasycających operacji PUSH wy-
nosi O(VE). Zauważmy, że ponieważ w wyniku wykonania nienasycającej ope~
racji PUSH nadmiar zostaje zredukowany do O, DISCHARGEkończy swoje dzia-
łanie bezpośrednio po wykonaniu nienasycającej operacji PUSH. Tak więc
w jednym wywołaniu DISCHARGE może zostać wykonana co najwyżej jedna
nienasycająca operacja PUSH. Jak. już zaobserwowaliśmy, DISCHARGEjest wy-
woływana O(V 3 ) razy i stąd łączny czas wykonywania nienasycających opera-
cji PUSH wynosi O( V3 ).
Czas działania algorytmu l.JFf-TO-FRONT wynosi zatem O(V 3 + VE), co
daje ograniczenie O(V 3). +
ZADANIA
27.S-1. Przedstaw działanie algorytmu LIFf~TO-FRONT dla sieci przepływowej
z rys. 27.la w taki sam sposób, jak to zrobiono na rys. 27.11. Przyjmij, że
700
PROBLEMY
Problemy
27-1. Problem ucieczki
Kratownicą n x n nazywamy graf nieskierowany składający się z n wierszy
i n kolumn wierzchołków, jak pokazano na rys. 27.12. Wierzchołek w i-tym
wierszu ij-tej kolumnie oznaczamy przez (i,J). Każdy wierzchołek kratownicy
ma czterech sąsiadów, z wyjątkiem wierzchołków brzegowych (i, J), dla któ-
rych i= 1, i= n,j= l lubj= n.
Problem ucieczki dla kratownicy definiuje się jak następuje: Na kratownicy
n x n danych jest m ~ n2 punktów początkowych. Należy stwierdzić, czy ist-
nieje m wierzchołkowo rozłącznych ścieżek prowadzących z punktów począt
kowych do dowolnych m różnych punktów brzegowych. Na przykład dla kra-
townicy z rys. 27.12a problem ucieczki ma rozwiązanie, natomiast dla kratow~
nicy z rys. 27.12b rozwiązania nie ma.
701
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
6
L, y
5 X
'X
4 N,
• '
y X y
(,) 3
I
2
'I '
l
o
16
6
L, y
5
N,
X
'
(b)
4
3
I
y
'
X
X
y
1 16 I
2
z 'I '
I . g.. 10 t
o '7
6 S/\4
5
'
-N
L,
N,
y X
'
' X
4 I
(c) 3 "" X y y
7/16 I
2
' 'I
l 1
10
o
Rys. 27.11. Ilustracja działania LIFT-TO-FRONT. (a) Przepływ w sieci przed wykonaniem pierwszej
iteracji pętli wblle.Na początku 26 jednostek przepływu opuszcza żródlo s. Po prawej stronie jest
pokazana początkowa lista L = (x, y, z). Na poez\tkU u= x. Pod każdym wierzchołkiem z listy
L :znajduje się jego lista sąsiadów. Rozładowywany jest wier7.Chołek x. Wierzchołek x jest pod-
noszony na wysokość I; 5 jOOnostek nadmiaru przepływu jest przesyłanych do y, a 7 pozostałych
jednostek nadmiaru przepływu jest przesyłanych do ujścia. Ponieważ x został podniesiony jest więc
przesuwany na początek listy L, co w tym przypadku nie zmienia struktury listy. (b) Następnym
rozładowywanym wierzchołkiem z listy L jest y. Sposób rozładowywania y w takiej sytuatji jest
zilustrowany na rysunku 27.10. Wierzch.olek y, po podniesieniu, zostaje przesunięty na początek
listy L. (c) Następnym wierzchołkiem na liście L po y jest teraz x. Ponownie jest on rozłado
wywany i 5 jednostek przepływu jest przesyłanych do 1. W tym wypadku x nie jest podnoszony,
nie zmienia on więc swojej pozycji na liście L. (d) Następnym wierzchołkiem po x na liście L jest
wierzchołek z; teraz on jest rozładowywany. Zostaje podniesiony na wysokość l i wszystkie 8 jed-
nostek nadmiaru zostaje przesianych dot. Wierzchołek z został podniesiony, jest on więc przesu-
702
PROBLEMY
6 ?,/\4
5 '
-20 L, y X
'
4 N,
• X ·x·
(d) J X y y
2 , 12/16
' '~ '
I o 7
IO t
o 8 12
6
, ~/\4
(<)
5
4
3
-00 L:
N· X
y
' "'
j
X
X
y
2 (
I
7 ' ',
12/16
o 8~
wany na początek listy L. (e) Teraz y występuje po z na liście L i jest rozładowywany. Ale
ponieważ y nie jest nadmiarowy, następuje natychmiastowy powrót z D1sCHARGE, a y nie zmienia
swojej pozycji na L. Następnie jest rozładowywany x. Ponieważ także nie ma nadmiaru, pozostaje
na tym samym miejscu na liście L. W ten sposób zostaje osiągnięty koniec listy i algorytm LIFT·
-To-FRONT kończy działanie. Nie ma już wierzchołków nadmiarowych i przedprrepływ _jestprze-
pływem maksymalnym
703
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
(•) (b)
Rys. 27.12. Kratownice w problemie ucieczki. Czarne punkty są punk1ami początkowymi, pozostałe
wierzchołki kratownicy są białe. (•) Kratownica, dla któraj problem ucieczki ma rozwiązanie.
Zacieniowane ścieżki prowadzą z wierzchołków początkowych do brzegu kratownicy. (b) Kratow-
nica, dla której problem ucieczki nie ma rozwiązania
704
PROBLEMY
lotu w kosmos (zysk ten jest różnicą między łącznymi wpływami za przeprowa-
dzenie eksperymentów, a łącznym kosztem umieszczenia i transportowania
wszystkich potrzebnych urządzeń).
Rozważmy następującą sieć G. Sieć ta zawiera wierzchołek źródłowy s,
wierzchołki / 1, / 2, ••• , In, wierzchołki Ei, Ei, ..., Em oraz wierzchołek-ujście t.
Dla k = 1, 2, ... , n istnieje krawędź (s, lk) o przepustowości c1c,a dla j =
= 1, 2, ... , m istnieje krawędź (E.J,t) o przepustowości Pp Jeśli dla k =
= 1, 2, ... , n i j = 1, 2, ... , m zachodzi /kE Rp to istnieje krawędź (lk, E) o nie-
skończonej przepustowości.
705
ROZDZIAŁ 27. MAKSYMALNY PRZEPŁYW
MAX-FLOW-BY-SCALING(G, s, t)
l C +- max(u,tt)eE c(u, v)
2 zainicjuj przepływ f na O
3 K<+-2 L!11Cj
4 while K~ I
5 do while istnieje ścieżka powiększająca p o przepustowości co najmniej K
6 do powiększ przepływ f wzdłuż p
7 K-K/2
8 return/
(c) Uzasadnij, że MAx-FLOW-BY-SCALING zwraca maksymalny przepływ.
(d) Pokaż, że przepustowość residualna dowolnego minimalnego przekroju
w sieci G wynosi co najwyżej 2KIE! za każdym razem, kiedy jest wykony-
wany wiersz 4.
(e) Uzasadnij, że wewnętrzna pętla while w wierszach 5-6 jest wykonywana
O(E} razy dla każdej wartości K.
(f) Pokaż, że algorytm MAX-FLOW-BY-SCALING może zostać zaimplemento-
wany tak, żeby działał w czasie O(E 2 lg C).
706
PROBLEMY
ka ue V przyjmujemy c'(s', u)= b(V, u) i c'(u, t') = b(u, V). Przyjmujemy także
c'(s, t) = c'(t, s) = oo.
Uwagi do rozdziału
Książki Evena [65], Lawlera (132], Papadimitriou i Steiglitza [154] oraz Tarja-
na [188] są dobrym źródłem informacji na temat przepływów w sieciach i po-
krewnych algorytmów. Praca Goldberga, Tardos i Tarjana [83] zawiera szeroki
przegląd algorytmów dla problemów dotyczących przepływów w sieciach.
Metoda Forda-Fulkersona pochodzi od Forda i Fulkersona [71], którzy
jako pierwsi zbadali wiele problemów dotyczących przepływów sieciowych,
włączając w to problemy maksymalnego przepływu i skojarzenia w grafach
dwudzielnych. W wielu wczesnych implementacjach tej metody ścieżki powięk
szające były znajdowane za pomocą przeszukiwania wszerz. Edmonds i Karp
udowodnili [63], że taka strategia znajdowania ścieżek prowadzi do algoryt-
mów wielomianowych. Pomysł przedprzeplywów pochodzi od Karzanova
[119]. Metoda przedprzeplywów opisana w tym rozdziale pochodzi od Gold-
berga [82]. Najszybszy obecnie algorytm działający z wykorzystaniem tej me-
tody pochodzi od Goldberga i Tarjana [85]. Jego czas działania wynosi
O(VElg(V 2/E)). Najlepszy znany teraz algorytm dla problemu maksymalnego
skojarzenia w grafach dwudzielnych został odkryty przez Hopcrofta i Karpa.
Jego czas działania wynosi O(J V E).
_______ Część VII
Wybrane
zagadnieni
----------------------------
Wprowadzenie
Część ta stanowi wybór zagadnień algorytmicznych, będący rozszerzeniem
i uzupełnieniem materiału przedstawionego wcześniej w tej książce. Wprowa-
dzimy tu nowe modele obliczeń, jak układy kombinacyjne czy obliczenia
równoległe. Zajmiemy się też wyspecjalizowanymi działami, takimi jak geo-
metria obliczeniowa lub teoria liczb. W dwóch ostatnich rozdziałach poruszy-
my kwestię niektórych ze znanych ograniczeń w projektowaniu efektywnych
algorytmów i wprowadzimy metody umożliwiające częściowe przezwyciężanie
tych ograniczeń.
W rozdziale 28 przedstawimy nasz pierwszy model obliczeń równoległych:
sieci porównujące. Z grubsza rzecz biorąc, sieć porównująca to algorytm,
w którym można wykonywać wiele porównań jednocześnie. W rozdziale tym
pokażemy, jak zbudować sieć porównującą sortującą n liczb w czasie O(lg 2 n).
W rozdziale 29 opiszemy inny model obliczeń równoległych: układy kom-
binacyjne. Pokażemy tam, że dwie n-hitowe liczby można dodać w czasie
O(lgn) za pomocą układu kombinacyjnego zwanego sumatorem równoległym.
Wyjaśnijmy także, jak pomnoiyć dwie n-bitowe liczby w czasie O(lg n).
W rozdziale 30 wprowadzimy ogólny model obliczeń równoległych, znany
pod nazwą PRAM. W rozdziale tym przedstawiamy podstawowe metody sto-
sowane przy konstruowaniu algorytmów równoległych, między innymi metodę
przeskakiwania, obliczenia prefiksowe i metodę cykli Eulera. Większość opisy-
wanych metod wyjaśniamy na przykładach prostych struktur danych, w tym
list i drzew. W rozdziale tym omówimy także ogólne zagadnienia związane
z obliczeniami równoległymi, takie jak pojęcie sekwencyjnej efektywności al-
gorytmu równoległego czy kwestię jednoczesnego dostępu do wspólnej pamię
ci. Udowodnimy twierdzenie Brenta o efektywnym symulowaniu układu kom-
binacyjnego na maszynie równoległej. Rozdział zamkniemy opisem sekwencyj-
nie efektywnego algorytmu probabilistycznego dla problemu ustalania kolej-
----------
710
WPROWADZENIE
711
CZĘ$C VII. WYBRANEZAGADNIENIA
Siecisortujące
713
ROZDZIAŁ 28. SIECI SORTUJĄCE
28.1. Sieciporównujące
Sieci sortujące są sieciami porównującymi, które zawsze sortują wartości na
wejściu. Rozpoczniemy więc naszą prezentację od sieci porównujących i ich
własności. Sieć porównująca składa się tylko z przewodów i komparatorów.
Komparator, pokazany na rys. 28.la, jest urządzeniem z dwoma wejściami
x i y oraz dwoma wyjściami x' i y', ,,obliczającym" następującą funkcję:
x' = min(x, y)
y' = max(x, y)
x -'---~1•--~
7
3
3
'- x'
7
=min(x,y)
y - '-----~-'--~~ y' = max(x,y)
(,) (b)
Rys. 28.1. {a) Komparator z wejściami x i y oraz wyjściami x' i y'. (b) Ten sam komparator
przedstawiony jako pionowy odcinek. Na wejściu komparatora znajdują. się wartości x = 1, y = 3,
a na wyjściu x' = 3, y' = 1
714
28.1. SIECI PORÓWNUJĄCE
,, 9 ,, 9
'
5 A C 5 9
2 E 2 2
6 B D
,, 6 6
Głębokość l 1
(a) (b)
,, 9 5 2 ,, ,, 9
' 2 2
2
9
2
6
5
5
2
9
2
6
5
'
6
,, 6 6 9 ,, 6 6 9 9
Głębokość I I 2 2 Głębokość I 1 2 2 3
(cl (d)
Rys. 28.2. (a) Sieć porównująca o 4 wajściach i 4 w}'jściach, która jest jednocześnie siecią sortują.cą.
W chwili O wypisane wartości znajdują się na wejściach. (b) W chwili I przetworzone dane wejś
ciowe znajdują się na w}'jściach komparatorów A i B, które mają głębokość l w sieci. (c) W chwili
2 wartości majdują się na wyjściach bramek Ci D, mających glebokość 2 w sieci. Na wyjściach b 1
i b„ znajdują się już końcowe wartości, lecz na wyjściach b1 i b 3 jeszcze nic. (d) W chwili 3 wypisane
wartości znajdują się na wyjściu komparatora E. Teraz już i na wyjściach b1 i b 3 znajdują się
ostateczne wartości
715
ROZDZIAŁ 28. SIECI SORTUJĄCE
716
28.1. SIECI PORÓWNUJĄCE
ZADANlA
a,--~~---~-~------
a,
b,
b,
a, b,
---h,
a, ----h,
a, _____ b,
a, ------h,
°'-------- -------- b,
717
ROZDZIAŁ 28. SIECI SORTUJĄCE
28.2. Zasadazero-jedynkowa
Zasada :zero-jedynkowa mówi, że jeśli sieć sortująca działa poprawnie dla wszy-
stkich ciągów składających się tylko z zer i jedynek, to poprawnie sortuje
wszystkie ciągi wartości. (W art ości mogą być liczbami całkowitymi, rzeczywi-
stymi lub należeć do dowolnego zbioru liniowo uporządkowanego), Dzięki
zasadzie zero-jedynkowej, konstruując sieci sortujące i inne sieci porównujące,
będziemy mogli się skupić na funkcjonowaniu tych sieci dla ciągów składają
cych się tylko z wartości O albo 1. Jeśli skonstruujemy sieć sortującą i udowod-
nimy, że poprawnie sortuje wszystkie ciągi zero-jedynkowe, to wystarczy od-
wołać się do zasady zero-jedynkowej, aby ustalić poprawność tej sieci dla do-
wolnych ciągów.
Dowód zasady zero-jedynkowej opiera się na pojęciu funkcji niemalejącej
(monotonicznie rosnącej; patrz podrozdz. 2.2).
LEMAT28.1.
Jeśli sieć porównująca dla ciągu wejściowego a= (a 1, a 2 ,a,,) wyznacza ciąg
.•. ,
wyjściowy b = (b 1 , b 2 , ... , b,.), to dla dowolnej funkcji niemalejącej/ta sama
sieć z ciągiem f(a) = (f(a 1), f(a 2 ), ••• , f(a,J) na wejściu wyznacza ciąg wyjś
ciowy f(b) - <f(b,), f(b,), ..., f(b.))
DOWÓD
Udowodnimy najpierw, że jeśli/jest funkcją niemalejącą, to dla wartościf(x)
i f(y) na wejściu pojedynczy komparator wyznacza na wyjściu wartości
f(min(x, y)) if(max(x, y)). Następnie posłużymy się indukcją w celu udowod-
nienia lematu.
Załóżmy, że na wejściu komparatora są liczby x i y. Na górnym wyjściu
komparatora pojawia się wartość min(x, y), a na dolnym -wartość max(x, y).
Niech teraz na wejściu komparatora będą liczby f(x) i f(y), tak jak na
718
28.2. ZASADA ZERO-JEDYNKOWA
rys, 28,4. Na górnym wyjściu pojawia się wówczas wartość min(f(x), f(y)),
a na dolnym - wartość max(f(x), f(y)). Funkcja f jest niemalejąca, więc
x ~ y pociąga za sobą f(x) ~f(y). W rezultacie prawdziwe są następujące
tożsamości:
Rys. 28.4. W)'tlik działania komparatora z dowodu lematu 28.L Funkcjajjest niemalej:µ:a
719
ROZDZIAŁ 28. S1ECJSORTUJĄCE
3 I I
"1
9
' 2 2
bi "1
' bi
., ' 9 6
' b, ., 3
' 3 3 b,
6 I I 3 3
a, 2 2
' b, a, b,
a, 6 6
(•)
9 9 b, a, 3 3
(b)
' ' b,
Rys. 28.5. (a) Sieć sortująca z rys. 28.2 z ciągiem (9, S, 2, 6) na wejściu.. (b) Ta sama sieć po
r
zastosowaniu funkcji niemalejącej /(x) = x/11do liczb na wejściu. Wartość na kairlym wejściu
jest wynik.iem mstosowania funkcji f do wartości na odpowiednim wejściu w części (a)
DOWÓD
Załóżmy przeciwnie, że sieć sortuje poprawnie wszystkie ciągi zero-jedynkowe,
ale istnieje pewien ciąg liczb, dla którego nie działa właściwie. Mówiąc inaczej,
istnieje ciąg wejściowy (a 1 , a2 , ••• , an) zawierający elementy a1 oraz aj takie, że
a; < aj, ale w ciągu wyjściowym sieci a1 znajduje się przed a1• Zdefiniujmy
niemalejącą funkcję/ następująco:
o, jeśli x ~ a;
f(x) ={
1, jeśli x > a1
Jeśli ciągiem wejściowym sieci jest (a 1 , a2 , ... , an), to aJ znajduje się w ciągu
wyjściowym przed a1, z lematu 28.1 wynika więc, że jeśli na wejściu sieci znaj-
duje się ciąg (f(a 1),f(a 2), ... ,f(a,;J), to wtedy w ciągu wyjściowymf(a1 ) będzie
przed/(a 1
). Stanowi to jednak sprzeczność z faktem, że sieć poprawnie sortuje
ciąg zero-jedyokowy (f(a 1),f(a 2 ), •••,f(a,)), ponieważf(a1) = I, af(a 1) = O.
•
ZADANIA
28.2-1. Udowodnij, że w wyniku zastosowania funkcji niemalejącej do ciągu
posortowanego otrzymamy ciąg posortowany.
28.2-2, Udowodnij, że sieć porównująca poprawnie sortuje n-elementowy ciąg
(n, n - 1, ... , 1) wtedy i tylko wtedy, gdy poprawnie sortuje wszystkie
n - 1 ciągów zero-jedynkowych (1, O, O, ..., O, O), (I, I, O, ... , O, O), ...,
(I, 1, I, ... , I, O).
28.2-3. Użyj zasady zero-jedynkowej do wykazania, że sieć porównująca
przedstawiona na rys. 28.6 jest siecią sortującą.
720
28.3. BITONICZNA SIEĆ SORTUJĄCA
Sieć pó/czyszcząca
Na sieć sortującą ciągi bitoniczne składa się wiele połączonych szeregowo sieci
pólczyszczącycb. Każda sieć półczyszcząca ma głębokość 1; i-te wejście jest
połączone za pomocą komparatora z wejściem i+ n/2 dla i= l, 2, ... , n/2
(zakładamy, i.e n jest parzyste). Na rysunku 28.7 widać sieć pólczyszczącą
HALF-CLEANER[8] o 8 wejściach i 8 wyjściach.
Jeśli bitoniczny ciąg zer i jedynek jest podawany na wejście sieci półczysz
czącej, to na jej wyjściu w górnej połowie znajdują się mniejsze wartości, w dol-
nej większe, a obie połowy są bitoniczne. W istocie jedna z nich jest wtedy
oczyszczona - czyli składa się z samych tylko zer lub samych jedynek - stąd
nazwa sieć półczyszcząca. (Pamiętajmy, że ciągi oczyszczone są bitoniczne).
Powyższe własności sieci pólczyszczących zostały sformułowane w następują
cym lemacie.
______ ________________________
,,,_, _
721
ROZDZIAŁ 28. SIECI SORTUJĄCE
~
o
o
o
o
o Jl o-
o
o ig
I o Jl ;;, I I
i
I
!
o iil 8 [ I o
I
I I
I ~ I I ~s ~
I~
~
I
o o ~ iil I I
o I
·a
o I I ~ ;;,
o I ·"
"' o I
iil 8
Rys. 28.7. Sieć porównująca HALF-C.EANER{S]. Są tu pokazane dwa różne ciągi wejściowe i wyjś
ciowe. Zakładamy, że na wejściu sieci jest ciąg bitonicmy. Wtedy na wyjściu sieci półczyszczącej
każdy element w górnej połowie jest nie większy ni:!:każdy element w dolnej połowie. Co więcej,
obie polowy są bi toniczne i co najmniej jedna z nich jest oczyszczona
LEMAT28.3.
Jeśli na wejście sieci półczyszczącej jest podany bitoniczny ciąg zer i jedynek, to
ciąg wyjściowy ma następujące własności: obie połowy - górna i dolna - są
bitoniczne, każdy element w górnej połowie jest nie większy niż dowolny ele-
ment w dolnej połowie oraz co najmniej jedna połowa jest oczyszczona.
DOWÓD
W sieci porównującej HALF-CLEANER[n] są porównywane wartości na wej-
ściach o numerach i oraz i+ n/2 dla i = 1, 2, ... , n/2. Bez straty ogólności
możemy założyć, że ciąg wejściowy jest postaci 00 ... 011 ... 100 ... O. (Sytuacja,
w której ciąg wejściowy jest postaci 11 ... 100 ... 011 ... 1 jest symetryczna).
Możliwe są trzy przypadki, w zależności od tego, w który ciąg zer lub jedynek
„trafia" punkt n/2, a jeden z nich (ten, w którym punkt środkowy przypada
w bloku jedynek) rozbija się na dwa kolejne osobne przypadki. Wszystkie
cztery sytuacje są pokazane na rys. 28.8. W każdej z nich są spełnione tezy
lematu.
•
Bitoniczna sieć sortująca
Składając sieci półczyszczące rekurencyjnie, tak jak na rys. 28.9, otrzymujemy
sieć sortującą ciągi bitoniczne. Najpierw w skład sieci BITONIC-SORTER{n]
wchodzi sieć HALF-CLEANER [n], na której wyjściu, zgodnie z lematem 28.2,
pojawiają się dwa ciągi bitoniczne o dwukrotnie mniejszej długości, takie że
każdy element w górnej połowie sieci jest nie większy niż dowolny element w jej
dolnej połowie (patrz rys. 28.9). Wystarczy więc użyć dwóch kopii sieci BITO-
NIC-SORTER [n/2], aby rekurencyjnie posortować obie połowy ciągu wejścio
wego. Na rysunku 28.9a rekurencja została ukazana w sposób jawny, a na
722
28.3. BITONICZNA SIEĆ SORTUJĄCA
1
-,, -
fil? o r
\ Bitoniczny
oczysx.czony
Bitoniczny ~ ., "m".. o """'""'li•• I o I o ...........11,,- '
o
'~ lJ Dół
Dół
\ l.~~j {a)
' ·1
~
,,
,. ' ..........
.,1,,,. )
Bitonicmy ' .. ..,••""•li"'
..v•~•· I ,,......,..,11,,-
;
"
1
o
I ;1 ( Bitoniczny
Dół Dół oczyszcmny
\ L()! (b) '
r-i Góra
·-11
0
: ;, Bitonicmy
I j
o
Bitonicmy .) ....
1
II
......,...11,,
..
o Li~ ol
LoJ ~I
,,,,
.....,...... '
I
mmmmjl•••
__ J'
1011
I oczy&zczony
(::-)
Dół
Lo.J)
--, \
(i ~j Góra I I;, s· .
1tomczny
I
' '
,--~ ,--1
I P.'a °
,_,
·1 1 oczyu.czony
W
' '
Bitoniczny \ ·· ""'"'.. .,......,.!I"" ' m '"' "' ul!1>• o' "'"'"'"''li••· ' )
o 1
' o LoJ 1 ! Bitonicmy
Dół Dól
\ __J .."1)
(d)
Rys. 28.8. Możliwe porównania w sieci HALF-CLEANER[n].O ciągu wejściowym zakładamy, że jest
bitonicznym ciągiem zer i jedynek. Bez straty ogólności możemy założyć, że jest on postaci 00 ...
011 ... 100 ... O.Podciągi zer są białe, a podciągi składające się z jedynek szare. Wejścia są pcxlzielo-
ne na polowy, tak że dla i= I, 2, ... , n/2 wejścia o numerze i oraz i+ n/2 zostają porównane.
(a)-{b) Przypadki, w których połowa przypada w ciągu jedynek. (c)-(tl) Przypadki, w których
połowa przypada w ciągu zer. We wszystkich przypadkach każdy element w górnej połowie jest nie
większy niż każdy element w dolnej połowie, obie polowy są bitonicme oraz co najmniej jedna
połowa jest oczyszczona
723
ROZDZIAŁ 28. SIECI SORTUJĄCE
dla n=l
D(n) - {~(n/2) +l dla n=21; oraz k~ 1
- o o o o
-
-
' " '
-· .
' S0,,'${"'2]
·~
~ ~
au
o
I
o
o
o
o
o
o ~
~
ffALp.
' ' ,; '
·-o I
o o o •
o
-
'
ĆJJWa{A]
'
''
'
' '
' ,,.,
'
' ..'
d
-- o
·.. 1
I
o
o
I
"..
~
o
·~~
- '
'' ·'"
' ,,<~,·,,, I
- ' ' " ' I -
0/.IJ o .t ... ' I
- ..,, ,' ' f ,, '
' '
o "'' I
-
' I
(,) (b)
724
28.4. SIEĆ SCALAJĄCA
Nasza sieć sortująca będzie się składać z siecisclllających, które służą do scalania
dwóch posortowanych ciągów w jeden posortowany ciąg wyjściowy. Sieć MER"
GER [n] uzyskamy jak.o modyfikację sieci BITONIC-SORTER[n]. Podobnie jak
w przypadku bi tonicznej sieci sortującej, udowodnimy poprawność sieci scalają
cej tylko dla ciągów zero-jedynkowych. W zadaniu 28.4-1 należy pokazać, jak
można rozszerzyć ten dowód na przypadek ciągów dowolnych wartości.
Konstrukcja sieci scalającej jest oparta na następującym intuicyjnym rozu-
mowaniu. Jeśli dla danych dwóch posortowanych ciągów odwrócimy porządek
w drugim ciągu, a następnie połączymy oba ciągi, to w wyniku otrzymamy ciąg
bitoniczny. Na przykład dla danych posortowanych ciągów zero-jedynkowych
X= 00000111 oraz Y = 00001111, po odwróceniu Y (YR = 11I 10000) łączymy
X z yx, otrzymując ciąg bitoniczny 0000011111110000. Aby scalić ciągi wej-
ściowe X i Y, wystarczy teraz wykonać sortowanie bitoniczne na połączonych
ciągach X i yR.
SiećMERGER[n] można skonstruować, modyfikując pierwszą sieć półczy
szczącą w sieci BITONIC-SORTER[nlPomysł polega na niejawnym odwróceniu
drugiej polowy ciągu wejściowego. Dla danych posortowanych ciągów (a 1 , a2 ,
..., a„12) oraz (a„12+ 1 , a„12 + 2 , .•• , a,.), które chcemy scalić, wystarczy nam
wynik bitonicznego posortowania ciągu (a 1 , a2 , .•• , a„12, a,., a,,_ 1 , ••• , a„12 + 1 ).
a, o
o
o
o
,,
,,
>, a, o -
_j)
o b,
o ,, ·a~ >,
I
I
o
o
,,
b,
I iil
>,
.~
a,
a,
a,...l
I o
o
,,
b, -"'
o
••
,,
a,
o
o
I
I
'• I -g a, ...l
iil a, o o
I
'•
,,
,, -
>,
ij
••o
o o b, a, o I o
o
I I ·"
'• "' a, o I ,, iil
(,) (b)
Rys. 28.10. Porównanie pierwszego poziomu sieci MERGER[n]oraz sieci HALl'-CLEANERfnJ. (a) Na
pierwszym poziomie w sieci MERGER[n]z dwóch monotonicznych ciągów (a 1 , a2 , ... , a. 12 ) oraz
(a. 12+ 1, a012 + 2 , •.. , a.) powstają dwa ciągi bitoniczne (bi, h 2 , •••, h. 12) oraz (h. 12 + 1, h.12 + 2, ••. , h~>·
(b) Równoważna operacja w sieci HALf-Cl.EANER[n]. Z ciągu bitonicznego (a 1, a,, ..., a011 , a,,,
a._ 1, •.• , a. 12 + 1) powstają dwa ciągi bitoniczne (b 1, b 2 , •••, b012 ) oraz (b., h._ 1, ••• , h. 12+ 1)
725
ROZDZIAŁ 28. SIECI SORTUJĄCE
~ o o o
·~ •o
t:
o o
I
o
-#121
.. ~ I > "'
o
>
>
h'" ••
> > '"·
> > > . '
o
o. I o
~ I
',',!{,;;' ,, ,.•,• >
~ o
. ; ·;
•
> > >
>
' '' I
·Bm\)Nr(;.i.
'. I
.,
'
·~
o
t:o I I
I I
> •o I
>
I I
I
o.
1,1 (b)
Rys. 28.11. Sieć scalająca dwa posortowane ciągi wejściowe w jeden posortowany ciąg wyjściowy.
Sieć MEROEll[n]różni się od sieci BITONIC-SoRTBR[n] tylko tym, że zamiast pierwszego fragmentu
HALF·CLEAN'ER[n] porównuje wejścia i z n - i+ I dla i= I, 2, ... , n/2. Tutaj n= 8. (a) Sieć roz.
łożona na pierwszy poziomporównań, po którejnastępują dwie równoległe kopie sieci BrroNic-
[n/2]. (b) Ta samasieć z rozwiniętą
-SoRTER rekurencją.Kolejnepoziomy zostały za.cieniowane
Przy połączeniach znapują się przykładowe wartości liczbowe
ZADANIA
28.4-1. Udowodnij odpowiednik zasady zero~jedynkowej dla sieci scalających.
Wykaż w szczególności, że jeśli sieć porównująca poprawnie scala dowolne
dwa niemalejące ciągi zero-jedynkowe, to działa poprawnie dla ciągów
niemalejących o dowolnych wartościach.
28.4-2. Ile różnych wejściowych ciągów zero-jedynkowych trzeba użyć, aby
sprawdzić, czy sieć porównująca jest siecią scalającą.
28.4-3. Wykaż, że każda sieć scalająca jeden element z ciągiem n - 1 elemen~
to wym musi mieć głębokość co najmniej lg n.
* 28.4-4. Rozważ sieć scalającą z wejściami a 1 , a2 , ••• , am gdzie n jest dokładną
potęgą 2, w której dwa ciągi rosnące przeznaczone do scalenia to (a 1 , a 3 ,
726
28.5. SIEĆ SORTUJĄCA
..
• MBR0BR[2J
- ~ -- ~
SORTBR{n/2] MERGER(4J
. .. ~
. ..
-jMERoP.R[2Jl.
- ~
MBlOBR{11] MERGf!R[8]
. .
_,,,.,]
~ ~
Ml!RQER.{21
- ~ . ~
MERGER(41
- ~ ~
I a,
""""""' (hl
o [I
o
Io
)
o I o o
I I
o
I I
o o
I
o ,__p
.. [I
o I - o
[I
o _o I
o I I I
o --. . . . I .• .. I
Głębokość I 2 2 3 4444556
(<}
Rys. 28.12, Sieć SoRTER[n] złożona rekurencyjnie z sieci scalających. (a) Konstrukcja rekurencyjna.
(b) Rozwinięcie rekurencji. (c) Sytuacja po zastąpieDlu pudelek scalających odpowiednimi sieciami
scalającymi. Zamaczana jest głębokość każdego komparatora oraz przykładowe wartości
727
ROZDZIAŁ 28. SIECI SORTUJĄCE
o dla n= 1
D(n)-
{ D(n/2) + lgn dla n=2" oraz k;;,:1
której rozwiązaniem jest D(n) = E>(lg2n). W ten sposób pokazaliśmy, jak sor-
tować n liczb równolegle w czasie O(lg 2 n).
ZADANIA
28.5-1. Ile jest komparatorów w sieci SORTER[n]?
28.S-2. Wykaż, że głębokość sieci SORTER[n] jest równa dokładnie (lgn)
Ogn + I)/2.
28.S-3. Załóżmy, że mamy do dyspozycji zmodyfikowany komparator, na któ-
rego wejście są podawane dwa posortowane ciągi o długości k. Zostają one
scalone, po czym większe k elementów zostaje skierowane do wyjścia
,,max", a pozostałe do wyjścia „min" zmodyfikowanego komparatora.
Wykaż, że każda sieć sortująca o n wejściach, w której zastąpiono zwykłe
komparatory powyższymi 2JDodyfikowanymi komparatorami, poprawnie
sortuje ciągi nk liczb, jeśli składają się one z posortowanych podciągów
o długości k.
28.5-4. Chcemy podzielić 2n elementów (a 1 , a2 , a 2 ,,) na dwie równe części
.•• ,
tak, aby największe z nich znalazły się w jednej, a pozostałe w drugiej.
7~2
8 ______________________
7
_
PROBLEMY
Problemy
28-1. Sieci sortujące przez transpozycje
Sieć porównująca jest siecią transpozycyjną, jeśli każdy komparator łączy są
siednie linie, tak jak na rys. 28.3.
(a) Wykaż, że każda sortująca sieć transpozycyjna o n wejściach ma O(n 2 )
komparatorów.
(b) Udowodnij, że sieć transpozycyjna o n wejściach jest siecią sortującą wtedy
i tylko wtedy, gdy poprawnie sortuje ciąg (n, n - 1, ... , 1). (Wskazówka:
Użyj indukcji, podobnie jak w dowodzie lematu 28.l).
(c) Udowodnij, że rodzina sieci typu odd-even składa się rzeczywiście z sieci
sortujących.
b,
b,
- --
~ ~
b,
-
-- ---
-- - - b,
b,
- b,
b,
b,
730
PROBLEMY
P,
7r(l)=4 r, I
7r(2);7 2
n(3)"'3 3
7r(4)"'5 4
r,
n(5)= I s
7r(6)=6 6
7r(7)=8 7
7r(8)=2 8
(,) (b)
Rys. 28.14. Sieci permutacyjne. (a) Sieć permutacyjna P2 składająca się z jednego przełącznika, który
może znajdować się w jednym z pokazanych stanów. (b) Rekurencyjna konstrukcja Pa z 8 prze-
łącZDlków oraz dwóch kopii P4 • Pokazane przełączniki oraz sieci P„ są. w ustawieniu wyznaczają
cym permutację n= (4, 7, 3, 5, 1, 6, 8, 2)
(c) Zaprojektuj algorytm (na zwykłą maszynę RAM) działający w czasie O(n),
który ustawia n przełączników podłączonych do wejść i wyjść sieci Pn oraz
wyznacza permutacje, które muszą realizować obie kopie sieci P"12, aby
całość realizowała zadaną permutację n elementów. lJdowodnij popraw·
ność swojego algorytmu.
(d) Jaka jest głębokość i rozmiar sieci P"? Ile czasu zajmuje obliczenie na
maszynie RAM ustawień wszystkich przełączników wraz z przełącznikami
znajdującymi się wewnątrz obu egzemplarzy sieci Pn/Z?
(e) Wykaż, że dla n> 2 każda sieć permutacyjna o n wejściach - nie tylko
P, - realizuje pewną permutację za pomocą dwóch różnych ustawień prze·
łączników.
731
ROZDZIAŁ 28. SIECI SORTUJĄCE
Uwagido rozdziału
Układy arytmetyczne
733
ROZDZIAŁ 29. UKŁADY ARYTMETYCZNE
734
29.1. UKŁADY KOMBINACYJNE
X ~x X y X< X y xvy
o I o o o o o o
I o o I o o I I
I o o I o I
I I I I I I
X X
y ' y
Układy kombinacyjne
Układ składa się z jednej lub wielu bramek połączonych acyklicznie. Wyjścia
jednej bramki są połączone przewodami z wejściami innej bramki w taki spo-
sób, że wartość wyjściowa pierwszej bramki jest wartością wejściową drugiej.
Wyjście jednej bramki może zostać połączone z wieloma wejściami innych bra-
mek. Liczbę wejść, z którymi jest połączone dane wyjście, nazywamy jego
stopniem rozgałęzienia. Układy kombinacyjne nie zawierają żadnych cykli oraz
nie mają pamięci (takiej jak rejestry opisane w podrozdz. 29.4).
Sumator pe/ny
Naszym pierwszym przykładem układu kombinacyjnego jest sumator pełny,
przedstawiony na rys. 29.2. Sumator pełny ma 3 wejścia x, y i z oraz
2 wyjścia c i s. Działanie tego układu można opisać za pomocą następującej
tabelki.
735
ROZDZIAŁ 29. UKŁADY ARYTMETYCZNE
xyz xyz
JOi - JOi
(J
'
Głębokosć J
00 00
o
o
d, I
''"""" C
Głębokość I 2 Głębokość I 2 3
(c) (d)
Rys. 29.2. Sumator pełny. (a) W chwili O wartości początkowe pojawiaJą się na wejściach.
(b) W chwili l pojawiają się wartości na wyjściach bramek A-0, czyli tych które mają głębokość l.
(e) W chwili 2 pojawiają się wartości na wyjściach bramek Ei F, czyli tych, które mają głębo
kość 2. (d) W chwili 3 pojawia się wartość na wyjściu bramki O
y
X
o o
'o 'o 'o
o o I o I
o I o o I
o I I I o
I o o o I
I o I I o
I I o I o
I I I I I
736
29.1. UKŁADY KOMBINACYJNE
(Ogólnie funkcje parity i majority można określić dla dowolnej liczby bitów
wejściowych. Wartość funkcji parity wynosi 1 wtedy i tylko wtedy, gdy na
nieparzystej liczbie wejść znajduje się 1. Funkcja majority przyjmuje wartość
1 wtedy i tylko wtedy, gdy na ponad połowie wejść znajduje się 1). Zauważmy,
że zestawiając bity cis, otrzymujemy sumę bitów wejściowych w zapisie binar-
nym. Na przykład, jeśli x = l, y = O i z = 1, to (c, s) = (10) 1>, co stanowi
dwójkowy zapis liczby 2, tj. sumy x, y i z.
Każde z wejść x, y i z sumatora ma stopień wejściowy 3. Jeżeli operacja
realizowana przez bramkę jest przemienna i łączna (jak np. AND, OR lub
XOR), to liczbę jej wejść nazywamy stopniem wejściowym. Na rysunku 29.2
stopień wejściowy każdej bramki wynosi 2, lecz można na przykład zastąpić
bramki XOR oznaczone A i E za pomocą jednej bramki XOR o 3 wejściach,
a bramki OR oznaczone F i G za pomocą jednej bramki OR o 3 wejściach.
Przeanalizujemy teraz działanie sumatora pełnego. Przyjmijmy, że każda
bramka ma jednostkowy czas propagacji. Na rysunku 29.2a widzimy wartości
wejściowe pojawiające się na wejściach w chwili O. Wszystkie wejścia bramek
A-D (i żadnych innych) mają w tej chwili ustalone wartości, więc w chwili I
pojawiają się na ich wyjściach wartości przedstawione na rys. 29.2b. Zauważmy,
że bramki A-D działają równolegle. Wejścia na bramkach Ei F (lecz jeszcze nie
na G) mają ustalone wartości w chwili 1, a w chwili 2 na ich wyjściach pojawia-
ją się wartości przedstawione na rys. 29.2c. Wartość s (na wyjściu bramki E)
można odczytać w chwili 2. Jednak wartość c nie jest jeszcze wtedy ustalona.
Wartości na wejściach bramki G ustalają się w chwili 2, więc w chwili 3 na jej
wyjściu pojawia się wreszcie poprawna wartość c przedstawiona na rys. 29.2d.
Głębokość układu
1
i Aby poprawić czytelność, pomijamy tut.aj przecinki między eJementami ciagu bitowego.
737
ROZDZIAŁ 29. UKŁADY ARYTMETYCZNE
Rozmiarukładu
Projektując układy logiczne, staramy się zwykle minimalizować nie tylko ich
głębokość, ale także rozmiar, czyli liczbę użytych bramek. Rozmiar układu
odpowiada w pewnym sensie złożoności pamięciowej algorytmu. Na przykład
sumator na rys. 29.2 ma rozmiar 7, ponieważ składa się z 7 bramek.
Ta definicja rozmiaru nie jest szczególnie przydatna w przypadku małych
układów o stałym rozmiarze. Nasz sumator ma na przykład stałą liczbę wejść
i wyjść i realizuje pewną ustaloną funkcję, spełnia więc warunki, jakich wyma-
galiśmy od bramki logicznej. Zgodnie z powyższą defmicją ma on zatem roz-
miar I, ponieważ przyjmujemy, że każda bramka ma rozmiar 1.
Pojęcie rozmiaru uldadu stosuje się głównie w odniesieniu do rodzin ukła
dów obliczających podobne funkcje. Opiszemy dalej dla przykładu sumator,
na którego wejście są podawane dwie n-bitowe liczby. Chodzi tutaj oczywiście
nie o jeden układ, lecz raczej o całą rodzinę układów - po jednym dla każdej
długości danych wejściowych. Definicja ronniaru układu, jaką przyjęliśmy po-
wyżej, pozwala w tym kontekście na pewną swobodę w doborze wygodnego
zestawu bramek, który może zmienić rozmiar realizacji układu co najwyżej
7'.łR
29.2. UKŁADY SUMUJĄCE
ZADANIA
29.1-1. Na układzie
z rys. 29.2 zamień wartość na wejściu y na I. Określ, jakie
wartości pojawią się na wyjściach poszczególnych bramek.
29.1-2. Zaprojektuj układ o n wejściach obliczający funkcję parity, składający
się z n - 1 bramek XOR i mający głębokość r1gnl.
29.1-3. Wykaż, że dowolną bramkę logiczną można skonstruować ze stałej
liczby bramek AND, OR oraz NOT. (Wskazówka: Wyznacz tablicę warto-
ści funkcji obliczanej przez tę bramkę).
29.1-4. Wykaż, że każdą funkcję logiczną można zrealizować za pomocą sa-
mych tylko bramek NAND.
29.1-5. Skonstruuj układ realizujący funkcję obliczaną przez bramkę XOR,
wykorzystujący tylko cztery 2-wejściowe bramki NAND.
29.1-6. Niech C będzie układem logicznym o n wejściach, n wyjściach i głębo
kości d. Połączmy dwie kopie układu C w ten sposób, że wyjścia pierwszej
kopii są połączone bezpośrednio z wejściami drugiej. Ile wynosi największa
możliwa głębokość powstałego w ten sposób układu, a ile najmniejsza
możliwa głębokość?
29.2.1. Sumatorszeregowy
Rozpoczniemy od zwyczajnej metody dodawania liczb binarnych. Załóżmy, że
binarną reprezentacją nieujemnej liczby całkowitej a jest ciąg n hitów (an_ 1 ,
an-2• ... , ao), gdzie n~ r1g(a + l)l oraz
·-' 1
a- L a,2
J=O
739
ROZDZIAŁ 29. UKŁADY ARYTMETYCZNE
Dla danych n-bitowych liczb a= (a 11_ 1, a,._1, •.• , au> oraz b = (b 11_ 1, b,._1, •.. ,
b0 ) chcemy uzyskać (n+ 1)-bitową liczbę s =a+ b = (s,,, s,,_1, ••• , s0). Na
rysunku 29.3 widać przykład dodawania dwóch liczb 8-bitowych. Dodajemy
liczby w kolumnach od prawej do lewej, propagując ewentualne przeniesienie
z kolumny i do kolumny i+ I, dla i= O, 1, ..., n - I. Na i-tej pozycji danymi
wejściowymi są bity a;, b; oraz bit przeniesienia c1; wyznaczamy bit sumy s1 oraz
nowy bit przeniesienia c;+ 1• Bit przeniesięnia c1+ 1 jest przeniesieniem z kolum-
ny i-tej do kolumny (i+ 1)-szej. Nie ma żadnego przeniesienia do kolumny O,
przyjmujemy więc, że c0 = O. Bit przeniesienia c„jest bitem sumy s,,.
8 7 6 5 4 3 2 I o ;
I I
o
o
I
I
o
I
I
I
I
o
I
o
I
o
o
-- '
a
I I o I o I o I ~ b
I o o I I o o I I
'
Rys. 29.3. Dodawanie dwóch liczb 8-bitowych o = (100110011) i h = (11010101 ); ich suma wynosi
s = (100110011). Bity Ci są bitami przeniesienia. W każdej kolumnie znajdują się (od góry do
dołu) ci, "" h, oraz Ji dla pewnego i. Bit c0 jest zawsze równy O.
Zauważmy, że kai.dy bit sumy s1 jest równy wartości funkcji parity (,,pa-
rzystość") bitów a1, b1 oraz c1 (por. równanie (29.1)). Co więcej, bit przeniesie-
nia c1+ 1 jest z kolei wartością funkcji majority (,,większość") bitów a1, b1 oraz c1
(por. równanie (29.2)). Dzięki temu kai.dy krok dodawania może zostać za-
implementowany za pomocą jednego sumatora pełnego.
Sumator szeregowy n-bitowy (ang. ripple-carry adder) składa się z n połą
czonych szeregowo sumatorów pełnych FA0 , FA 1, ••• , FA,._1, tak że wyjście c1+ 1
sumatora FA1 jest połączone bezpośrednio z wejściem sumatora FA 1+ 1• Na
rysunku 29.4 jest pokazany 8-bitowy sumator szeregowy. Bity przeniesienia
,,przepływają" z prawej do lewej strony. Wejściowy bit przeniesienia c0 suma·
tora FA I został na stałe przyłączony do O, niezależnie od wartości wejściowych
całego układu. Na wyjściu układu jest (n+ l)·bitowa liczba s = (sn, sn-i, ... ,
s0 ), gdzie s„jest równe c~, wyjściowemu bitowi przeniesienia z sumatora FA,..
,, '• ,, ,,
I o o I I o o I I
I
,,
o I I I O O I I I O I I I o o I
Rys. 29.4. Sumator si.eregowy 8-bitowy wykonujący dodawanie 1 rys. 29.3. Bit c0 ma stale wartość O,
co zostało oznaczone przez romb, a bity przeniesienia przepływają przez układ od prawej do lewej
740
29.2. UKŁADY SUMUJĄCE
29.2.2. Sumatorrównoległy
Sumator szeregowy wymaga czasu @(n), ponieważ bity przeniesień muszą
przepływać przez cały układ. W sumatorze równoległym propagacja przenie-
sień jest szybsza dzięki specjalnej drzewiastej strukturze układu. Dzięki temu
dodawanie dwóch liczb n-bitowych odbywa się w czasie O(lgn).
Zasadniczy pomysł opiera się na spostrzeżeniu, że w sumatorze szerego-
wym każdy sumator pełny FA 1 „zna" wartości a, oraz b1 znacznie wcześniej
niż c,. W układzie sumatora równoległego ta częściowa informacja jest wy-
korzystana.
Załóżmy na przykład, że a 1_ 1 = b,_ 1• Wartość przeniesienia c, jest warto-
ścią funkcji majority (,,większość"), mamy więc c; = a1_ 1 = b1_ 1 niezależnie od
wartości c;_ 1• Jeśli a 1_ 1 = b 1_ 1 = O,to możemy anulować przeniesienie c1, wymu-
szając dla niego wartość O, nie czekając na wyznaczenie wartości c1_ 1• Podob-
nie, jeżeli a1_ 1 = b1_ 1 = 1, to możemy wygenerować przeniesienie c1 = I nieza-
leżnie od wartości c1_ 1 •
Jeżeli jednak a1_ 1 i,: b1_1> to wartość c, zależy od wartości c1_ 1• Wiadomo
w szczególności, że c1 = c1_ 1, bo c1_ 1 ma decydujący „głos" w wyborze większo
ściowej wartości, która wyznacza c;. W tej sytuacji propagujemyprzeniesienie,
bo przeniesienia wejściowe i wyjściowe są sobie równe.
Tabelka na rys. 29.5 zawiera klasyfikację możliwych przypadków w zależ
ności od stanu przeniesienia, gdzie k oznacza „anulowanie przeniesienia",
g - ,,generowanie przeniesienia", a p - ,,propagowanie przeniesienia".
Rozważmy dwa kolejne sumatory pełne FA 1_ 1 oraz FA 1 jako jedną
całość. Przeniesieniem wejściowym tego układu jest c1_ 1, a wyjściowym C;+i·
Podobnie jak w przypadku pojedynczego sumatora, powyższy układ dwóch
kolejnych sumatorów może anulować, generować lub propagować przeniesienia.
a,_i bi-!
,, stan przenies.ienia
o o o k
o I c,_1 p
I o c,_1 p
I I I g
Rys. 29.S. Bit c, oraz bit stanu przenies.ienia sumatora pełnego FA,_1, odpowiarlające wejściom a,_ 1,
b,_ 1 oraz c,_,w sumatorze szeregowym
741
ROZDZIAŁ 29. UKŁADY ARYTMETYCZNE
FA,
® k p g
k k k g
p k p g
k g g
'
Rys. 29.6. Stan przeniesienia dla szeregowego połączenia dwóch sumatorów pełnych FA 1_ 1 i FAJ
wyrażony za pomocą ich stanów przeniesienia, jako operator statnu przeniesienia ® określony na
zbiorze {k, p., g}
Y1=Y1-1®X1 (29.4)
=x 0 ®x 1 @ ... ®x;
742
29.2. UKŁADY SUMUJĄCE
8 7 6 5 4 3 2 I o
'
a o I o I I I I o
'
h. I I o I o I o I
'
X
'
Y,
p
g
•
g
k 9 p
k g g
•
g
p p
k k
k
I I o I I I o o o
''
Rys. 29.7. Wartości x, i y, dla i= O, I, ..., 8, które odpowiadają wartościom a„ b, oraz c1 z rys. 29.3.
Każda wartość x, została zacieniowana razem z wartościami a,_ 1 i b1_ 1 od których jest zależna
LEMAT29.1.
Niech x 0 , x 1, ••• , xn oraz Yo,y 1, ••• , Yn będą zdefiniowane za pomocą równań
(29.3) i (29.4). Dla i= O, 1, ... , n zachodzą następujące warunki:
{l) jeśli y 1 = k, to c1 = O,
(2) jeśli y, = g, to c1 = I, oraz
(3) Y; = p nie występuje.
DOWÓD
Dowód przebiega przez indukcję względem i. Krok podstawowy indukcji:
i= O, wynika z definicji y 0 = x 0 = k oraz c0 = O. Załóżmy teraz, aby wykonać
krok indukcyjny, że teza lematu zachodzi dla i - l. W zależności od wartości
Y; są możliwe trzy przypadki.
1. y 1 = k, to z yj = Y;-i ® x 1 oraz definicji operatora stanu przeniesienia
Jeśli
® z rys. 29.6 wynika, że x 1 = k albo Xi = p i Y;-i = k. Jeżeli x 1 = k, to
z równania (29.3) mamy, że a;_ 1 = h;_ 1 = O, więc c1 = majority(a 1_ 1, b1_ 1,
c;_1) = O, Jeśli z kolei x 1 =pi y1_ 1 = k, to a;_ 1 "Fh1_ 1 oraz, przez indukcję,
c;_1 = O. Stąd majority(a;_ 1, h1_ 1, c,_ 1) = O, więc c1 = O.
2. Jeśli y 1 = g, to albo x 1 = g, albo x 1 = p i y 1_ 1 = g. Jeśli x 1 = g, to
a;_ 1 = b 1_ 1 = I, skąd wynika, że C; = I. Jeśli x 1 = p oraz Yi-i = g, to
a;_ 1 "Fb1.• i, więc z założenia indukcyjnego c;_1 = 1, z czego wynika c1 = 1.
3. Jeśli y 1 = p, to z rys. 29.6 wynika, że y 1_ 1 = p, co jest sprzeczne z założeniem
indukcyjnym.
•
Z lematu 29.l wynika, że każdy bit c1 można wyznaczyć na podstawie
stanu przeniesienia y 1• Gdy już będziemy mieli wartości wszyskich bitów prze-
niesienia, całą sumę możemy obliczyć w czasie 9(1), obliczając równolegle bity
s1 = parity(a;, b1, c;) dla i= O, I, ... , n (przyjmując, że an= hn = O). Problem
743
ROZDZIAŁ 29. UKŁADY ARYTMETYCZNE
[/,kJ [O,i-1]
x, x.,_'' x.' X. ,
J-,
X.
j
Rya. 29.8. Element konstrukcyjny układu równolegle obliczającego prefiksy. Pokauny węzeł jest
korz.eniem poddrzewa, którego wartości na liściach są z przedriału od x, do x 1 • Lewe poddrzewo
obejmuje wejścia od x, do x1_ 1, a prawe wejścia od x1 do x 1• W skład węzła wchodzą dwie bramki
®, driałające w różnych chwilach obliczenia przebiegającego w całym układzie. Jedna z bramek
oblicza [i, kJ .... [i, j - IJ ® U,kJ,a druga oblicm [O,j - I] -[O, i - l] ® [i, j - I]. Obliczane war~
tości są podane przy połączeniach
744
29.2. UKŁADY SUMUJĄCE
Z tej definicji wynika, że dla i= O, 1, ... , n mamy [i, 11= x„ Oprócz tego dla i,
j oraz k takich, że O ::::;;i < j ,e;;k ::;;;;
n, spełniona jest tożsamość
ponieważ operator stanu przeniesienia jest łączny. Przy zastosowaniu tej no-
tacji obliczanie prefiksów polega na wyznaczeniu wartości Y; = [O,i] dla i= O,
1, ..., n.
Jedyną bramką, której będziemy używać w układzie równolegle obliczają
cym prefiksy, będzie bramka operatora ®· Rysunek 29.8 jest ilustracją meto-
dy łączenia par bramek tego typu tak, aby stanowiły wewnętrzne węzły drzewa
binarnego, a na rys. 29.9 widać układ równolegle obliczający prefiksy dla
n= 8. Zauważmy, że chOCpołączenia w tym układzie tworzą strukturę drzewa
binarnego, jednak układ ten nie jest drzewem. Wejścia układu Xi, x 1 , ... , xn
znajdują się w liściach, a wejście x 0 w korzeniu. Podobnie wyjścia y0 , y 1, ... , Yn-i
f0,8]
,,
[0,0] [0,4]
[1,4] [5.8]
[0.2] [0,4] (0.6]
[1,2] (3,4] [5,6] (7,8J
[0,1] [0.2] (0,3] [0,4] [0,6] [0,11
[1,1] [2.21 [3,3] 14,4] [5,5] (7 ,71 (8,8]
Yo XI .X2 yI Y2 X3 x, Y1 Y4 X5 x6 Ys y6 x, Xg y1
(•)
'•
(b)
Rys. 29.9. Układ równolegle obliczający prefiksy dla n = 8. (a) Ogólna struktura układu oraz wartoś
ci przenoszone każdym połączeniem. (b) Ten sam obwód z zaznaczonymi wartościami odpowiada-
jącymi rys. 29.3 i rys. '29.7
745
ROZDZIAŁ 29. UKŁADY ARYTMETYCZNE
Sumator równoległy
746
29.2. UKŁADY SUMUJĄCE
KPG0
9 p
KPG,
9 9
XPG0
'
' XPG,
~· 9
<PG,
g p
xro,
9 g
XPG,
' p
XPG,
' p
xro,
o '
h,
I
loa.,oh1", h,
I I
al I\
li
JI ~4I h,
I
~
I li
h,
I
il;: 1,,'
I
al hl
11
,,,,
:o I
,, 11
,, ,, I11 li I I
,,
', '' ', '' ''
Rys. 29,10. Konstrukcja n-biiowego sumatora równoległego dla n= 8. Sumator składa się z n+ I
układów KPGh dla i= O, l, ..., n. Kazdy układ KPG, oblicza stan przeniesienia x,+i na podstawie
wartości wejściowych a1 oraz b~ (Wejścia a. i h. mają stale wartość O, co zostało ukazane na
rysunku za pomocą rombu). Te wartości są następnie przekazywane do układu obliczającego
prefiksy, których wartości są oznaczone na rysunku jako y,. Na koniec każdy układ KPG 1 bierze
wartość y,, interpretuje ją jako bit przeniesienia c 1 i wyznacza bit s 1 = parity(a 1, b~ c1). Na rysunku
są też pokazane przykładowe wartości, odpowiadające tym z rys. 29.3 i 29.9
u+v=x+y+z
Jak widać na rys. 29.Ila, polega to na obliczeniu
747
ROZDZIAŁ 29. UKŁADY ARYTMETYCZNE
u1 = parity(x,., y 1, zJ
v1+ 1 = majority(x 1, y,.,zJ
dla i= O, 1, ..., n - 1. Bit v0 jest zawsze równy O.
o o o l l l o l •
l o o o l
l o l •
'
l o o l o l l o • ' '
o l o o I I l o • "
I o o I o I o I o • '
,.,
'•
l o o l o l o l o
FA,
(b)
748
29.2. UKŁADY SUMUJĄCE
ZADANIA
29.2--1.Przyjmijmy a- (01111111), b - (00000001) oraz n- 8. Wyznacz bi-
ty sumy oraz przeniesienia dla tych ciągów, obliczane przez sumatory pełne
w sumatorze szeregowym. Wyznacz stany przeniesień x 0, x 1, ••• , x 3 odpo-
wiadające a i b; opisz każde połączenie w układzie obliczającym prefiksy
z rys. 29.9 wartością przez nie przenoszoną, jeśli na wejściu znajdują się
powyższe wartości X;; wyznacz końcowe wartości wyjściowe y0, Yi, ..., y 8•
29.2-2. Wykaż, że operator stanu przeniesienia ®, określony w tabeli
z rys. 29.5 jest łączny.
29.2-3. Pokaż na przykładzie, jak zbudować układ równolegle obliczający pre-
fiksy w czasie O(lgn), jeśli n nie jest dokładną potęgą 2; narysuj taki układ
dla n = 11. Scharakteryzuj czas działania i rozmiar układów o strukturze
dowolnego drzewa binarnego równolegle obliczających prefiksy.
29.24. Zaprojektuj układ pełniący funkcję układu KPG;. Przyjmij założenie,
że na wyjściu x 1 pojawia się: (00), jeśli x 1 = k; (11), jeśli x 1 = g; oraz
(10), jeśli X;= p. Podobnie wartość O na wejściu y„ jest interpretowana
jako y 1 = k, a wartość I jako y 1 = g.
29.2-5. Zaznacz przy każdym połączeniu w układzie równolegle obliczającym
prefiksy na rys. 29.9a jego głębokość. Scieżka krytyczna w układzie to
ścieżka prowadząca od wejścia do wyjścia układu, na której jest maksy-
malna liczba bramek. Wy1-nacz ścieżkę krytyczną na rys. 29.9a oraz wy-
każ, że jej długość wynosi O(lg n}. Wskaż węzeł, którego bramki ® działa
ją w odstępie czasu 0(1gn}. Czy jest taki węzeł, którego obie bramki
® działają jednocześnie?
29.2-6. Przedstaw rekurencyjny „schemat blokowy" układu z rys. 29.12, dla
dowolnego n będącego dokładną potęgą 2. Na podstawie tego schematu
udowodnij, że układ ten oblicza prefiksy. Wykaż, że ma on głębokość
0(1gn} i rozmiar 0(nlgn}.
29.2-7. Jaki jest maksymalny stopień rozgałęzienia dowolnego wyjścia w su-
matorze równoległym? Wykaż, że dodawanie daje się wykonywać w cza-
sie O(lgn} za pomocą układu o rozmiarze 0(n}, nawet jeśli ograniczy-
my się do bramek o ograniczonym przez Stałą wyjściowym stopniu roz-
gałęzienia.
29.2-8. Układkontrolny ma n wejść oraz m = flg(n + l}l wyjść. Jeśli inter-
pretować wyjścia jako liczbę binarną, to układ kontrolny wyznacza liczbę
jedynek na wejściach. Na przykład dla ciągu (10011110) na wejściu na
wyjściu pojawia się ciąg (101), co oznacza, zew ciągu wejściowym jest
pięć jedynek. Zaprojektuj układ kontrolny o rozmiarze @(n) i głębokości
O(lgn).
749
ROZDZIAŁ 29. UKŁADY ARYTMETYCZNE
,, ,, ,, ,,
x, x, x,
Rys. 29.12. Układ równolegle obliczający prefiksy z radania 29.2-6
750
29.3. UKŁADY MNOZĄCE
,-1
p=a·b= 1:m''
J=O
I I I o =
__ ,,,....
I I o I = "
b
-· - '
I I I o = nf"
o o o o = nf')
I I I o = m<2)
I I I o -----· -- = nf"
I o I I o I I o = p
Rys. 29.13. ,,Szkolny" algorytm mnożenia pisemnego, na przykładzie mnożenia a = (1110) przez
,- '
h=(l!Ol), co daje w wyniku p=(IOI10IIO). Dodajemy Lmm, gdzie mC1>=a·bj·i. Tutaj
,-,
n= 4. Każdy wyraz powstaje przez przesunięcie a (jeili h, = I), albo O (jeśli b, = O) o i po-
m(I)
zycji w lewo. Bity, które nie zostały pokazane na rysunku są zawsze równe O, niezależnie od
wartości a i h
751
ROZDZIAŁ 29. UKŁADY ARYTMETYCZNE
,, '1,
I I I o
I
d:'1
1
o•>
o
(O) j
m,
b o
' o
IO
Pa
I I
P; P,
Rys. 29.14. Tablicowy układ mnożący, który oblicza iloczyn p = (.p.,,.,h.-i• ..., pr) dwóch liczb
n-bitowych a= (a._u a._ 2, ... , !lo) l b = (b._ 1, b._v ..., ho),pokazany tutaj dla n= 4. Ku.da
bramka AND G}11 oblicza bit iloczynu częściowego mY,.Każdy rząd sumatorów pełnych składa.
się na jeden sumator z zapamiętywaniem przeniesień. Dolne n bitów iloczynu to m~ oraz bity
u wymaczane przez wyjścia Wajnie prawej kolumny sumatorów pełnych. Górne n bitów iloczynu
powstaje przez dodanie bitów u oraz bitów II generowanych przez najniższy rząd sumatorów
pełnych. Na rysunku są. pokazane wartości bitów dla liczb a= (1110) oraz b = (1101) na wejś
ciu, co daje iloczyn p = (10110110), podobnie jak. na rys. 29.13 i rys. 29.15
752
29.3. UKŁADY MNOŻĄCE
mYt;= ai·bi
Iloczyn jednobitowych wartości można obliczyć bezpośrednio, używając bram-
ki AND, zatem wszystkie bity iloczynów częściowych (oprócz tych, o których
i tak wiadomo, że są równe O, więc nie trzeba ich w zasadzie obliczać) można
wyznaczyć w jednym kroku, używając n 2 bramek AND.
o o
I I
o
I
o
o
-- o m(O)
o o o o - m'"
-- J"J"
- --·· ·····- -- -
o I I I o
o o o
I I I o - m(ll
--
-------- -- -·---·-
I I o I I o ufll
o I o vCll
I I I o - J" m!3l
I o I o I I o --
-
I
-
I
o
I
I
o
I o I I o - •"
·-·- ·- ..
Rys. 29.15. Obliczanie sumy iloczynów częściowych przez wielokrotne dodawanie 2 zapamięty
waniem przeniesień. W tym przykładzie a= (I 110) a b = (1101 ). Biły nie pokazane na rysun-
ku są zawsze równe O, niezależnie od wartości a i b. Najpierw obliczamy ,n!0l + m!ll +O=
= u(ll + 0ui, potem ull) + tfll + ,n(l) = ,1,2J + tfll, następnie u(l) + 0 (2\ + ml31= u!ll + 0 c,1 i osta-
tecznie p = m( 0l + m(l) + m!l) + mUl = u 0 > + u!3l. Zwróćmy uwagę, że Po = m~ 0l oraz p 1 = uJQdla
i=l,2, ... ,n-1
753
ROZDZIAŁ 29. UKŁADY ARYTMETYCZNE
Pi,,-2, ···•Pn)=
<P211-I•
_
-
(Uzn-2.,
,.-,, Uzn-
<•-•j, .. ,, Un,.-,,) + ( Vzn-t,
,.-,, <•-•J <•-11)
V211- , ... , Vn
Analiza
Dane „przepływają" przez tablicowy układ mnożący od strony lewej do prawej
oraz z góry w dól. Dolne bity iloczynu <Pn-i•Pn-i• ... , p 0) zostają wyznaczone
w czasie @(n);tyle samo czasu potrzeba na przygotowanie danych wejściowych
dla sumatora. Jeśli użyjemy sumatora szeregowego, to zanim pojawią się wyż
sze bity iloczynu (p 2n_ 1, P2n-i, ..., Pn), upływa kolejnych 0(n) jednostek czasu.
754
29.3. UKŁADY MNOŻĄCE
Analiza
Czas działania drzewa Wallace'a o n wejściach zależy od głębokości sumato-
rów z zapamiętywaniem przeniesień. Na kai,dym po7iomie drzewa kolejne trój-
ki liczb zostają przetworzone w pary liczb, oprócz co najwyżej 2 liczb (takich
7
jak np. m<6 l i m<"> w pierwszej fazie). Wynika stąd, że maksymalną głębokość
D(n) górnej części drzewa Wallace'a o n wejściach można wyrazić w postaci
następującej równania rekurencyjnego:
o dla n~ 2
D(n) - I dlan=3
D(12n/3l) + I dla n~4
Jak widać na tym rysunku, drzewo Wallace'a nie jest faktycznie drzewem, lecz acyklicznym
ii
grafem skierowanym. Nazwa została zachowana ze względów historycznych.
-------------------------------~=
755
ROZDZIAŁ 29. UKŁADY ARYTMETYCZNE
m ", m ",
14 15
j1•
p
Rys. 29.16. Drzewo Wallace'a które sumuje 11= 8 iloczynów częściowych m1°l,m0 l, ..., mP). Każda
linia oznacza w istocie liczbę; obok każdej linii znajduje się liczba bitów, które ta linia reprezen-
tuje. Lewe wyjście kaWego sumatora z zapamiętywaniem przeniesień omacza bit sumy, a prawe
bit przeniesienia
którego rozwiąz.aniem jest D(n) = @(lgn) (por. przypadek 2 tw. 4.1 o rekuren-
cji uniwersalnej). Każdy sumator z zapamiętywaniem przeniesień działa w cz.a-
sie @(l). Wszystkie n częściowych iloczynów można wyznaczyć równolegle
w czasie @(1). (Najniższe i - 1 bitów mt0 , dla i= 1, 2, ... , n - 1, można na
stałe połączyć z O). Sumator równoległy działa w czasie 0(1g n). Stąd całkowity
czas mnożenia dwóch n-bitowych liczb jest równy 8(Jgn).
Układ mnożący n-bitowe liczby, oparty na drzewach Wallace'a, ma roz-
miar 0(n 2 ). Można się o tym przekonać, przeprowadzając następujące rozu-
mowanie. Oszacujemy najpierw rozmiar górnej części drzewa Wallace'a. Sto-
sunkowo łatwo jest otrzymać dolne ograniczenie O(n 2), ponieważ na pierw-
szym poziomie znajduje się L2n/3J sumatorów z zapamiętywaniem przeniesień,
z których każdy zawiera co najmniej n sumatorów pełnych. Aby uzyskać górne
ograniczenie O(n 2 ) zauważmy, że każdy sumator z zapamiętywaniem. przenie-
sień w drzewie Wallace'a zawiera co najwyżej 2n sumatorów pełnych, ponie-
waż ostateczny iloczyn ma 2n bitów. Wystarczy zatem wykazać, że w drzewie
Wallace'a jest w sumie tylko O(n) sumatorów z zapamiętywaniem przeniesień.
Niech C(n) będzie całkowitą liczbą sumatorów z zapamiętywaniem przeniesień
29.J. UKŁADY MNOŻĄCE
jeśli n=3
C(n) <:{ ~(f2n/Jl) + Ln/3J, jeśli n~4
ZADANIA
vY=
29.3-1. Udowodnij, że w tablicowym układzie mnożącym 1 O dla i= 1, 2,
..., n - 1 orazj = O, 1, ..., i, i+ n, i+ n+ 1, ..., 2n - 1.
29.3-2. Wykaż, że w tablicowym układzie mnożącym z rys. 29.14 wszystkie
(oprócz jednego) sumatory pełne w najwyższym rzędzie są zbędne. W wy-
niku ich usunięcia niektóre połączenia będą inaczej poprowadzone.
29.3-3. Zaló:imy, że sumator z zapamiętywaniem przeniesień ma wejścia x,
y i z oraz wyjścia si co długościach odpowiednio n"',ny, nz, n, i nc bitów.
Przyjmijmy również, bez straty ogólności, że nx ~ ny ~ n,. Wykaż, że
ns = nz oraz ze
n, dla
n -
0
{ n,+ 1 dla
758
29.4. UKŁADY Z TAKTOWANĄ PAMIĘCIĄ
,, ,, ''
,,
o ' I o ti
I I I o FA I u o- FA I
FA ,- :c FA ,, ,-
''
'' '' '' 'o ' ' li
I o 10 I Il
-..
"" '
'
;,gąem: r:;~f,!ifii
.-
1)
..
'"'""'
;'\ęjifh" 'I«-J
'W"."'111'tł ....,,.,;
......... ~
Rys. 29.17. Działanie bitowego sumatora szeregowego. Podczas i-tego okresu sygnału zegarowego
dJa i = O, 1, ..., n sumator pełny FA pobiera na wejścia bity a 1 i b, ze świata zewnętrznego, oraz bit
p, z rejestru. Sumator pełny umieszcza bit .f,na wyjściu z obwodu, a bit przeniesienia P1+i posyła do
rejestru, do wykorzystania w następnym okresie zegarowym. Rejestr jest inicjowany wartością
p 0 = O.{a)-{e) Stan układu w każdym z pięciu okresów zegarowych, podc:r.as obliczania sumy liczb
a= (1011) i b = (1001), tj. s = (10100)
albo poza układ, albo do wejść rejestrów. Tak samo jak w przypadku układów
kombinacyjnych, na fragmenty układów kombinacyjnych w układach z tak~
towaną pamięcią nakładamy ograniczenie, że nie mogą one zawierać cykli.
Każdy rejestr w układzie z taktowaną pamięcią jest sterowany sygnałem
okresowym, zwanym inaczej sygnałem zegarowym. Za każdym razem, gdy syg-
nał zegarowy ma wartość 1, rejestr zapamiętuje wartość znajdującą się wów-
czas na jego wejściu. Czas między kolejnymi impulsami zegara nazywamy jego
okresem. W globalnie taktowanym układzie wszystkie rejestry są sterowane za
pomocą tego samego zegara.
Przyjrzyjmy się dokładniej działaniu rejestru. Każdy impuls zegarowy jest
traktowany jako punkt w czasie. W chwili jego wygenerowania przez zegar
rejestr odczytuje wartość znajdującą się na wejściu w tej chwili i ją zapamiętuje.
Ta zapamiętana wartość pojawia się następnie na wyjściu rejestru, gdzie może
posłużyć do obliczenia wartości, które zostaną umieszczone w rejestrach przy
następnym impulsie z zegara. Innymi słowy, wartość znajdująca się na wejściu
rejestru w pewnym czasie między kolejnymi impulsami zegara pojawia się na
jego wyjściu w następnym okresie między impulsami.
Zajmiemy się teraz szczegółowym omówieniem układu z rys. 29.17, zwa-
nego bitowym sumatorem szeregowym. Aby zapewnić poprawność wyników
sumatora pełnego, będziemy zakładać, że okres sygnału zegarowego jest nie
mniejszy niż czas propagacji sumatora, co gwarantuje, że wartości w układzie
mają czas na ustabilizowanie się między kolejnymi impulsami. Kiedy wartość
sygnału zegarowego (rys. 29.17a) wynosi O, na wejścia sumatora pełnego są
podawane wartości bitów a0 i b0 • Zakładamy, że rejestr zostaje zainicjowany
--------- ---- ....
,.---------~=
759
ROZDZIAŁ 29. UKŁADY ARYTMETYCZNE
Analiza
Aby ustalić całkowity czas t obliczenia wykonywanego przez globalnie tak-
towany układ, trzeba znać liczbę p niezbędnych okresów zegarowych oraz dłu
gość każdego okresu d; wtedy t = pd. Długość okresu zegarowego musi wy-
starczać na ustabilizowanie się wszystkich wartości w układzie między kolej-
nymi taktami zegara. Mimo źe dla niektórych danych wejściowych układ może
się stabilizować wcześniej, jednak aby można było mieć gwarancję, że działa
poprawnie dla wszystkich danych, d musi być co najmniej proporcjonalne do
głębokości układu.
Oszacujmy czas potrzebny na dodanie dwóch liczb n-bitowych za pomocą
bitowego sumatora szeregowego. Każdy okres zegarowy ma długość 0(1), po-
nieważ głębokość sumatora dwubitowego wynosi 0(1). Wygenerowanie wszys-
tkich danych wyjściowych wymaga n + l taktów zegara, czas działania bitowe-
go sumatora szeregowego jest więc równy (n+ 1)0(1) = 0(n).
Rozmiar bitowego sumatora szeregowego (liczba bramek oraz rejestrów)
wynosi 0(1 ).
760
29.4. UKŁADY Z TAKTOWANĄ PAMIĘCIĄ
Układy mnożące dwie liczby n-bitowe z podrozdz. 29.3 mają rozmiar 0(n 2
).
Przestawimy teraz dwa układy mnożące o strukturze wektora (a nie jak po-
przednio tablicy dwuwymiarowej). Szybszy z nich działa w czasie @(n).
Wektorowe układy mnożące są implementacją algorytmu rosyjskich wieś
niaków (nazwa bierze się stąd, że ludzie z Zachodu odwiedzający Rosję w XIX
w. odkryli, że jest on tam powszechnie stosowany), którego działanie jest przed-
stawione na rys. 29.18a. Dla danych dwóch liczb a i b tworzymy dwie kolumny
liczb, z liczbami a i b na ich początku. W każdym wierszu wartość w kolum-
nie a jest połową poprzedniej wartości w kolumnie a z „obciętą" ewentualną
b b
",,.·-Ó;;'·;;:'ff'f'
"ftl '
"
Ji>OJ'f' r11.01
~.;·;Jt ''36'·" '1001' 111010
4 116 j(}(J l l 10100
2 232 l (J l '' 10100()
'
I( I ;'·~ I 111010000
_____
_,
'
551 !0001001 I !
(a) (b)
761
ROZDZIAŁ 29. UKŁADY ARYTMETYCZNE
(l{l) =9 a(
1)=9
b(l):58 b(l)=58
1
p(l)"' 29 ,} ) = 29
V(!): 0
(l(2)"" 4 a\Z) =4
2 2
b( )=116 b( )=116
p(Z) = 87 ,} 2l = 39
v(l) =48
(l(3) =2 a(
3l = 2
3
b( )=232 b(3)=232
p(3) = 87 u(
3) = 39
3
v( ) = 48
a(
4l,,, I a(
4) = 1
4 4
b( )=464 b( ) =464
p(4) = 87 ,/ 4)"' 39
4
v( ) = 48
(l(5)=0 a(S) =0
b(S)=928 b(S)=928
p(5): 551 u(SJ= 455
,} 51= 96
(•) (b)
762
29.4. UKŁADY Z TAKTOWANĄ PAMIĘCIĄ
(29.6)
(por. zad. 29.4-2). Początkowo a<0 > = a, b10l = b oraz pt 0J = O. W )-tym kroku
są wykonywane następujące obliczenia:
1. Jeśli aU!jest nieparzyste (tj. aW> = 1), to dodaj b do p: pu+ 1>-bf.J1 + pw.
(Dodawanie odbywa się za pomocą sumatora szeregowego rozpiętego przez
długość całego wektora; bity przeniesienia przepływają od prawej do lewej).
Jeśli aUl jest parzyste, top pozostaje niezmienione: pU+tJ - pUJ.
2. Przesuń a w prawo o jedną pozycję:
a,
u+iJ
-
{aPJdla
1 i:::;-;;2n - 2
O::;-;;
O dlai=2n-1
(29.7)
764
PROBLEMY
ZADANIA
29.4-1. Mając dane a= (101101 ), b = (Ol 1110) oraz n = 6, przedstaw dzia-
łanie algorytmu rosyjskich wieśniaków na liczbach a i b, zarówno w no-
tacji dziesiętnej, jak i dwójkowej.
29.4-2. Wykaż, że niezmienniki (29.6) i (29.7) są zachowywane przez wektoro-
we układy mnożące.
29.4-3. Wykaż, że w szybszej wersji wektorowego układu mnożącego zachodzi
vt2,,-1J = O. ·
29.4-4. Przeanalizuj i opisz, w jaki sposób można potraktować tablicowy
układ mnożący z podrozdz. 29.3.1, jako rozwinięcie szybszego wektorowe-
go układu mnożącego.
29.4-5. Niech (x 1, x 2, ••• ) będzie ciągiem wartości emitowanych po jednej na
każdy impuls zegara. Dla ustalonej liczby n, układ ma obliczać wartość
y1 = max x1
r--,,+1..;i,;;1
Problemy
29-1. Układy dzielące
Układ dzielący można zbudować z układów odejmujących i mnożących, wyko-
rzystując metodę zwaną iteracją Newtona. My zajmiemy się zbliżonym prob-
lemem - obliczania odwrotności, ponieważ dodanie do układu obliczającego
odwrotności jednego układu mnożącego, daje w efekcie układ dzielący.
765
ROZDZIAŁ 29. UKŁADY ARYTMETYCZNE
766
UWAG! DO ROZDZIAŁU
Uwagido rozdziału
Większość ksiąi.ek o arytmetyce komputerowej skupia się bardziej na prak-
tycznych aspektach konstrukcji układów niż związanej z tym teorii algoryt-
mów. Savage [173] jest jednym z niewielu autorów, którzy zajmowali się właś
ciwościami algorytmicznymi. Spośród opracowań, w których omówiono aryt-
metykę komputerową z uwzględnieniem zagadnień dotyczących sprzętu, pole-
camy szczególnie książki Cavanagha [39] i Hwanga [108}. Do dobrych prac na
temat projektowania układów można zaliczyć książkę 1Iilla i Patersona [96]
oraz (uwzględniająe'4 teorię języków formalnych) ksiąźkę Kohaviego [126].
Aiken i Hopper [71sięgają do początków historii algorytmów arytmetycz-
nych. Sumowanie szeregowe jest co najmniej tak stare jak liczydło, które ist-
nieje od około 5000 lat. Pierwsze automatyczne urządzenie wykonujące sumo-
wanie szeregowe zostało skonstruowane przez B. Pascala w 1642 r. Maszyna
licząca wykonująca ciąg dodawań potrzebnych do wyznaczenia iloczynu liczb
została zaprojektowana przez S. Morlanda w 1666 r. oraz niezależnie przez
G.W. Leibniza w 1671 r. Algorytm rosyjskich wieśniaków powstał z pewnością
wcześniej nii. w XIX wieku. Według Knutha [122] był używany przez matema-
tyków egipskich już około 1800 r.p.n.e.
Stany (anuluj, generuj i propaguj) ciągu przeniesień zostały wykorzystane
w maszynie liczącej zbudowanej w Harvardzie w połowie lat czterdziestych
[I 80]. Jedna z pierwszych implementacji sumowania równoległego została opi-
sana przez Weinbergera i Smitha [199], lecz ich metoda wymagała użycia du-
i.ych bramek. Ofman [152) wykazał, i.e można dodawać dwie liczby n-bitowe
w czasie O(lg n) za pomocą dodawania równoległego przy użyciu bramek
o stałym rozmiarze.
Pomysł przyspieszenia mnożenia za pomocą dodawania z zapamiętywaniem
przeniesień pochodzi od Estrina, Gilchrista i Pomerene'a [64]. Atrubin [13]
opisał nieskończony wektorowy układ mnożący, za pomocą którego moi.na
767
ROZDZIAŁ 29. UKŁADY ARYTMETYCZNE
mnożyć liczby binarne o dowolnej długości. Układ ten generuje n-ty bit iloczynu
zaraz po otrzymaniu n~tych bitów z wejścia. Układ mnożą.cy oparty na drzewach
Wallace'a jest przypisywany Wallace'owi [197], lecz na ten sam pomysł wpadł
niezależnie Ofman [152].
Algorytmy dzielenia sięgają czasów I. Newtona, który około 1665 r. wyna~
lazł metodę, nazywaną dziś iteracją Newtona. W problemie 29-1 używamy
iteracji Newtona do zbudowania układu dzielącego o głębokości O(lg n). Tę
2
Algorytmy równoległe
769
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
Model PRAM
Na rysunku 30. l widać podstawową architekturę maszyny równoległej o do-
stępie swobodnym (PRAM). PRAM składa się z p zwykłych (sekwencyjnych)
procesorów P0 , P 1 , ... , P11_ 1, które mają dostęp do wspólnej, globalnej pamię
ci. Wszystkie procesory mogą „równolegle" (jednocześnie) odczytywać z pa-
mięci globalnej lub do niej zapisywać. Procesory mogą także wykonywać rów-
nolegle różnorodne operacje arytmetyczne i logiczne.
770
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
nymi, logicznymi itp. Tak więc zliczanie liczby równoległych dostępów do pa-
mięci w algorytmach równoległych daje w rzeczywistości zupełnie dobrą ocenę
ich względnych wydajności. Słabą stroną założenia o jednostkowym czasie do-
stępu do pamięci w modelu PRAM jest to, że w rzeczywistych maszynach
równoległych pewne realizacje dostępu do pamięci są szybsze od innych. Jed-
nakże, jako pierwsze przybliżenie, założenie o jednostkowym czasie dostępu do
pamięci w modelu PRAM jest całkowicie uzasadnione.
Czas działania algorytmu równoległego zależy od liczby procesorów, na
których ten algorytm jest wykonywany oraz od rozmiaru danych wejściowych.
Dlatego, analizując algorytmy równoległe, musimy zwracać uwagę zarówno na
ich czas działania, jak i na liczbę używanych procesorów. To kontrastuje
z przypadkiem algorytmów sekwencyjnych, w analizie których skupialiśmy się
głównie na czasie działania. Co jest charakterystyczne, to zależność (ang. tra-
de-off) między czasem działania algorytmu równoległego a liczbą używanych
procesorów. Podrozdział 30.3 poświęcimy omówieniu takich zależności.
771
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
maszyny jest stosunkowo prosta, a działanie maszyny jest dlatego szybkie. Jeśli
założenie o jednostkowym czasie dostępu do pamięci ma dostarczyć sensownie
dokładnej miary wydajności algorytmów, to CRCW PRAM wymaga bardziej
skomplikowanych rozwiązań sprzętowych. Jednakże pisanie programów na
maszynę CRCW jest bezspornie prostsze niż pisanie programów na maszynę
EREW PRAM.
Z pozostałych dwóch typów algorytrnów-CREW i ERCW - więcej uwagi
w literaturze przedmiotu poświęcono algorytmom typu CREW. Z praktycz-
nego punktu widzenia umożliwienie jednoczesnych zapisów nie jest trudniejsze
niż umożliwienie jednoczesnych odczytów. W tym rozdziale każdy algorytm
dopuszczający jednoczesny odczyt lub jednoczesny zapis będziemy traktowali
jako algorytm typu CRCW, nie rozróżniając typów CREW i CRCW. Pewne
subtelne różnice między tymi typami omówimy w podrozdz. 30.2.
Jeśli nie poczyni się żadnych dodatkowych założeń, to nie jest jasno okreś
lone, co zostanie zapisane w komórce pamięci w wyniku jednoczesnego zapisy-
wania do niej przez wiele procesorów w algorytmie typu CRCW. W tym roz-
dziale przyjmiemy, że kiedy wiele procesorów jednocześnie zapisuje do tej sa-
mej komórki pamięci, wtedy muszą zapisywać jednolitą (tę sarną) wartość.
Model, w którym przyjmuje się, że konflikty zapisu są rozstrzygane w ten
właśnie sposób, nazywamy jednolitym-CRCW (ang. common-CRCW). W lite-
raturze można spotkać wiele typów maszyny PRAM, które różnią się sposo-
bami rozwiązywania konfliktów zapisu. Można wśród nich wyróżnić sposób
• dowolny (ang. arbitrary) - zapamiętywana jest dowolna wartość z wartości
zapisywanych do tej samej komórki pamięci;
• priorytetowy (ang. priority) - zapamiętywana jest wartość zapisywana przez
. ..
procesor o naJmrueJszym numerze;
• mieszany (ang. combining) - zapamiętywana wartość jest pewną, jednak ściś
le określoną kombinacją zapisywanych wartości.
W tym ostatnim przypadku ściśle określona kombinacja jest zazwyczaj
ł.ączną i przemienną operacją, jak na przykład dodawanie (zapamiętywana jest
suma zapisywanych wartości) lub branie maksimum (zapamiętywana jest tylko
wartość największa).
Synchronizacja i sterowanie
Algorytmy dla maszyny PRAM działają poprawnie pod warunkiem, że są one
w pełni zsynchronizowane. W jaki sposób taka synchronizacja jest zapewnia-
na? Procesory w algorytmach dla maszyny PRAM muszą często sprawdzać
warunki zakończenia wykonywania pętli, które zależą od stanów wszystkich
procesorów. W jaki sposób implementuje się funkcje, które sterują wykonywa-
niem algorytmów?
772
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
Zawartość rozdziału
773
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
30.1. Przeskakiwanie
Do szczególnie interesujących algorytmów dla maszyny PRAM zalicza się te,
które operują na wskaźnikach. W tym podrozdziale zbadamy bardzo silną
metodę - metodę przesk.akiwaniat - która pozwala na tworzenie szybkich
algorytmów równoległych dla list. W szczególności przedstawimy algorytm,
który w czasie O(lgn) oblicza dla każdego obiektu na liście n-obiektowej jego
odległość od końca listy. Następnie :zmodyfikujemy ten algorytm w taki spo-
sób, żeby można było wykonywać równoległe obliczenia prefiksowe na liście
n-obiektowej, także w czasie O(lgn). Na koniec zaprezentujemy metodę umoż
liwiającą przekształcanie wielu problemów dla drzew na problemy dla list,
które to można następnie rozwiązać za pomocą przeskakiwania. Wszystkie
algorytmy omawiane w tym podrozdziale są algorytmami typu BREW: jedno-
czesne dostępy do tej samej komórki pamięci nie są wymagane.
=~--""'"""'-··------------------------
774
30. 1. PRZESKAKIWANIE
d[;J = {o,
d[nexr[;JJ + I,
jeśli
jeśli
next[i] = NIL
next [i] # NIL
LIST-RANK(L)
1 for każdy procesor i in parallel {równolegle wykonaj}
2 doifnext[iJ=NIL
3 then d[i] +- O
4 else d(;J- I
5 while istnieje obiekt i taki, że next [i] # NIL
6 do for każdy procesor i in parallel
7 do if next [i] =f.NIL
8 then d[;J- d(;J + d[nexr[;JJ
9 next[i] +- next[next[i]]
(,) 1'r:3---1a4I:3
· 1 • Etl\'.+·
l'.11 ...W-»tfiiil.3.
6 1 o
1--->•t0:.1IJ
31->-lol/'J
5
4 6 I 5
(b)
-
/'
-- -
JiIZl
3 4 6 I 5
fi]•;;] ~ m.l
. ml
(cl
-
.
- -- 1·oa,1,,.
I
3 6 1 o
(d) llft"'1
l!WLlJ l,'ffiJ 11„d &\111
Rys. 30.Z. Obliczanie odległości obiektów listy od jej końca w czasie O(lg n), gdzie n Jest liczbą obiek-
tów na liście, z wykorzystaniem metody przeskakiwania. (1) Lista z z.ainicjowanymi wartościami d.
Po wykonaniu aJgorytmu d[i] jest równe odległości obiektu i od końca listy. Numer procesora
odpowiedziaJnego za dany obiekt listy jest zapisany nad tym obiektem. (b}-(d) Wskaźniki i wartoś
ci d po wykonaniu każdej iteracji pętli while w algorylm.ie LIST·RANK
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
jednej iteracji pętli while z wierszy 5-9. W części (a) widać listę zaraz po etapie
inicjowania. W pierwszej iteracji wskaźniki next pierwszych pięciu obiektów
listy są różne od NIL, tak że procesory odpowiedzialne za te elementy wykonu-
ją działania opisane w wierszach 8-9. Wynik obliczeń jest widoczny w części
(b). W drugiej iteratji tylko wskaźniki pierwszych czterech obiektów są różne
od NIL. Wynik wykonania tej operatji jest pokazany w części (c). W trzeciej
iteracji operacje są wykonywane tylko na pierwszych dwóch obiektach. Osta-
teczny wynik wykonania algorytmu LIST-RANK widać w części (d).
Operatję z wiersza 9, polegającą na wykonaniu przypisania next[i] +-
+- next[next[i]], nazywamy pneskokiem. Zauważmy, że wartości pól next
zmieniają się w trakcie wykonywania algorytmu, co powoduje zniszczenie
wejściowej listy. Jeśli lista powinna zostać zachowana, to można zrobić kopie
wskaźników next i używać kopii do obliczania odległości.
Poprawność
776
30.1. PRZESKAKIWANIE
Analiza
Pokażemy teraz, że dla n-obiektowej listy algorytm L!ST-RANK działa w czasie
O(lgn). Ponieważ inicjowanie przebiega w czasie stałym i każda iteracja pętli
wbile zabiera stały czas, wystarczy pokazać, że liczba wykonywanych iteracji
wynosi dokładnie fig nl. Istotną obserwacją jest, że w każdej iteracji przeskoki
wskaźników powodują przekształcenie każdej listy na dwie: jedną składającą
się z obiektów na pozycjach parzystych i drugą składającą się z obiektów na
pozycjach nieparzystych. A zatem każdy krok, w którym wskaźniki przeskaku-
ją, podwaja liczbę list i :anniejsza o połowę ich długości. Dlatego po wykonaniu
wszystkich flgnl iteracji wszystkie listy zawierają tylko po jednym obiekcie.
Zakładamy, że test zakończenia pętli w wierszu 5 jest wykonywany w cza-
sie stałym (przyjmujemy, że maszyna BREW PRAM ma do tego celu specjalną
sieć sterującą). Celem zadania 30.1-8 jest opisanie implementacji algorytmu
LIST-RANK na maszynie BREW PRAM, która działa w czasie O(lgn), a test
sprawdzający koniec wykonywania pętli jest wykonywany w sposób jawny.
Oprócz równoległego czasu działania istnieje jeszcze jedna miara wydajno-
ści algorytmów równoległych. Pracę wykonywaną przez algorytm równoległy
defmiuje się jako iloczyn jego czasu działania i liczby użytych procesorów.
Intuicyjnie, praca jest określona liczbą obliczeń, jakie wykonuje sekwencyjna
maszyna RAM, symulując działanie algorytmu równoległego.
Procedura LIST-RANK wykonuje pracę 0(nlgn), ponieważ jej czas działa
nia wynosi 0(lgn), a liczba zastosowanych procesorów wynosi 0(n). Prosty
algorytm sekwencyjny dla problemu ustalania porządku na liście działa w cza-
sie ®(n), co oznacza, że procedura LIST-RANK wykonuje większą pracę, niż
jest to absolutnie konieczne, ale tylko o czynnik logarytmiczny.
Mówimy, że algorytm A dla maszyny PRAM jest sekwencyjnie-efektywny
w odniesieniu do algorytmu B (sekwencyjnego lub równoległego) dla tego sa-
mego problemu, jeśli praca wykonywana przez A różni się od pracy wyko-
nywanej przez B co najwyżej o stały czynnik. Można też powiedzieć prościej,
że algorytm A dla maszyny PRAM jest sekwencyjnie-efektywny, jeżeli jest on
sekwencyjnie-efektywny w odniesieniu do najlepszego moiJiwego algorytmu
777
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
sekwencyjnego (dla maszyny RAM) dla tego samego problemu. Ponieważ naj-
lepszy możliwy algorytm dla problemu ustalania kolejności na liście działa
w czasie @(n), algorytm LIST-RANK nie jest sekwencyjnie-efektywny. W pod-
rozdziale 30.4 przedstawimy sekwencyjnie-efektywny algorytm równoległy dla
problemu ustalania porządku na liście.
Yk=Yk-i®xk
dla liczb całkowitych i oraz) z przedziału 1 ~i~ j :s;;n. Wtedy [k, k] = x"'dla
k=l,2, ...,ni
[i, kJ - [i,jJ® [j + 1, kJ
778
30.1. PRZESKAKIWANIE
LIST-PREFIX(L)
1 for każdy procesor i in parallel
2 do y[i]- x[i]
3 while istnieje obiekt i taki, że next[i] # NIL
4 do for każdy procesor i in parallel
5 do if next[i] i=, NIL
6 then y[next[i]J - y [i]® y [next [i]]
7 next[i] +- next[next[i]]
(b)
(<)
Rys. 30.3. Algorytm L!ST-PREFIXobliczania prefiksów na !iście. (a) Począlkową wartością y dla
k-tego obiektu na liście jest [k, kJ. Wskaźnik nexl dla k-tego obiektu wskazuje na obiekt (k + 1)-szy
lub NIL,jeśli k jest ostatnim obiektem na liście. (łHi) Wartości y i nexl przed wykonaniem testu
w wierszu 3. Wynik działania algorytmu jest pokazany w części (d). Dla każdego obiektu k war-
tością y jest [I, k]
779
ROZDZIAŁ 30. ALGORYTMY ROWNOLEGŁE
780
30.1. PRZESKAKIWANIE
781
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
ZADANIA
30.1-1. Podaj algorytm typu EREW, który w czasie O(lgn) sprawdza dla każ
dego obiektu na n-obiektowej liście, czy jest on obiektem środkowym
(ln/2J-girn).
30.1-2. Podaj algorytm typu EREW, który w czasie O(lgn) wykona obliczenia
prefiksowe na tablicy x[l „ n]. Nie używaj wskaźników, lecz wykonuj bez-
pośrednio obliczenia na indeksach.
30.1-3. Załóżmy, że każdy obiekt na n-obiektowej liście L został pokolorowa-
ny albo na czerwono, albo na niebiesko. Podaj efektywny algorytm typu
EREW tworzenia dwóch list złożonych z obiektów L: jednej składającej się
z obiektów niebieskich i jednej złożonej z obiektów czerwonych.
30.1-4. Na maszynie EREW PRAM rozproszono n obiektów między kilka
rozłącznych list cyklicznych. Podaj efektywny algorytm, który wybiera do-
wolnego reprezentanta z każdej listy i przekazuje identyflk:ator wybranego
obiektu do każdego innego obiektu na tej liście. Przyjmij, że kaidy proce-
sor zna własny, jednoznaczny indeks.
30.1-5. Podaj algorytm typu EREW, który w czasie O(lgn) oblicza ro7miary
poddrzew o korzeniach we wszystkich n węzłach drzewa binarnego.
(Wskazówka:Weź różnicę z dwóch sum obliczanych wzdłuż cyklu Eulera).
30.1-6. Podaj efektywny algorytm typu EREW obliczania numeracji preorder,
inorder i postorder w dowolnym drzewie binarnym.
782
30.1. PRZESKAKIWANIE
' . ( ,,
(b)
Rys. 30.4. Zastosowanie metody cyklu Eulera do obliczania głębokości każdego węzła w drzewie
binarnym. (a) Cykl Eulera jest listą odpowiadają.cą obchodzeniu drzewa. Ktirly procesor zawiera
liczbę używaną. w równoległych obliczeniach prefiksowych do wyliczania głębokości węzłów.
(b) Wynik równoległych obliczeń prefiksowych na liście z {a). Procesor C w ktirlym węźle {poko-
lorowany na czarno) zawiera obliczoną głębokość tego węzła. (Możesz sprawdzić wynik obliczeń
{prefiksowych, wykonując je sekwencyjnie.)
783
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
FIND-ROOTs(F}
1 for każ.dy procesor i in paralleł
784
30.2. ALGORYTMY TYPU CRCW A ALGORYTMY TYPU EREW
785
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
<•) 8
,,
(!)''
,,
·"''
(c) 8
@i • "@
"@ Iii;'' @' "'@ ''@
17<i, @]3
tp" ''@ ~ ?i)
''@ ~ © "@ @'' ''®I
",'
'
(d)
@' (j) ,,
"@
l.~
@"
~· "il
@'
''@ ®
,,
2(@
®' '@
19@
@ "
"@ @ © 23® ®16 IO@
l@ ©
Rys. 30.5. Znajdowanie korz.eni w lesie drzew binarnych na maszynie CREW PRAM. Obok węzłów
majdują się ich numery, a wartości pól root są podane wewnątrz węzłów. Dowiązania repn=ntują
Wllkaźniki do ojców. (•Kd) Stan drzew w lesie przed kaidorazowym wykonaniem wierS7.ll.4 w al-
gorytmie FIND-ROOTs. Zauważmy, że długości ścieżek są połowione w każdej iteracji
786
30.2. ALGORYTMY TYPU CRCW A ALGORYTMY TYPU EREW
FAST-MAX(A)
1 n+- length [A]
2 for i +- O to n - l in parallel
3 do m[i] +- TRUE
4 fori+-Oton-lij+-Oton-linparallel
5 doifA[i]<A[j]
6 then m [i]+- FALSE
7 for i +- O to n - 1 in parallel
8 do if m[i) = TRUE
9 then max+- A [i]
10 return max
787
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
A [j]
m
F' 6
T
9
T
. __,
F
2
'"""
T
9
·-·--·-
"""""
A [i]
'
6
9
F
F
F
F
T
F
F
F
T
F
F
T
2 T T T F T F
9 F F F F F T
------ .. -------
mu9
Rys. 30.6. Znajdowanie maksimum z n warlości w czasie O(I) na maszynie CRCW przez algorytm
FAST-MAX. Dla każdej uporządkowanej pary elementów z tablicy A= (S, 6, 9, 2, 9) wynik
porównania A [i]< A Ul jest pokez.any jako element macierzy. Lltera T jest skrótem od TRUE,
a litera F - od FA.I.Sil.Dla każdego wiersza zawierającego wartość TRUE(literę T) odpowiadający
mu element m, pokazany z prawej strony, ma wartość FALSB(litera F). Elementy z m, zawierające
wartości TRUE, odpowiadają maksymalnym elementom z A. W tym wypadku w zmiennej max
zostaje zapisane 9
Dlatego po wykonaniu wiersza 6 wartość m[i] = TRUE tylko dla tych in-
deksów i, dla których A [i] jest maksymalnym elementem w A. W wierszach
7-9 wartość maksymalna jest zapisywana w zmiennej max, która jest następnie
zwracana jako wynik działania algorytmu. Kilka procesorów może jednocześ
nie zapisywać w zmiennej max, ale jeśli tak jest, to wszystkie one zapisują tę
samą wartość. Jest to zgodne z modelem CRCW z jednolitym zapisem.
Ponieważ wszystkie trzy „pętle" w naszym algorytmie są wykonywane
równolegle, FAST-MAX działa w czasie 0(1). Oczywiście algorytm ten nie jest
sekwencyjnie efektywny - jest w nim używanych n2 procesorów, a problem
znajdowania maksimum w tablicy można sekwencyjnie rozwiązać w czasie
0(n). Można jednak uzyskać algorytm o lepsz.ej sekwencyjnej efektywności, co
pozostawiamy jako zad. 30.2-6.
W pewnym sensie istotne dla algorytmu FAST-MAXjest to, że maszyna
CRCW PRAM jest zdolna obliczyć iloczyn logiczny (AND) n zmiennych
w czasie stałym, używając n procesorów. (Ponieważ taki iloczyn można ob-
liczyć na CRCW z jednolitym zapisem, można go również obliczyć na każdym
innym typie maszyny CRCW). W rzeczywistości w algorytmie FAST-MAX
jest obliczanych kilka iloczynów logicznych jednocześnie - dla każdego i = O,
1, ...,n-1
·-'
m[i]- /\ (A[iJ;.A[i])
}""O
788
30.2. ALGORYTMY TYPU CRCW A ALGORYTMY TYPU EREW
TwIERDZENIE30.1.
Każdy p-procesorowy algorytm typu CRCW może być co najwyżej O(lgp)
razy szybszy od najszybszego p-procesorowego algorytmu typu BREW dla
tego samego problemu.
789
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
DOWÓD
Pokażemy, jak symulować w czasie O(lgp) na maszynie EREW PRAM jeden
krok z algorytmu typu CRCW. Ponieważ procesory w obu maszynach mają
taką samą moc, wystarczy skoncentrować się na dostępach do pamięci. Nasz
dowód ograniczymy tutaj tylko do jednoczesnych zapisów. Implementację jed-
noczesnych odczytów zostawiamy jak.o zad. 30.2-8
W symulacji jednoczesnego zapisu p procesorów maszyny EREW wyko-
rzystuje pomocniczą tablicę A o długości p. Idea symulacji jest zilustrowana
na rys. 30.7. Kiedy procesor P 1 z maszyny CRCW, dla i= O, 1, ... , p- 1, ma
zapisać wartość x 1 do komórki I;, odpowiadający mu procesor z maszyny
EREW zapisuje uporządkowaną parę (/ 1, x 1) w A [i). Ponieważ każdy procesor
(na maszynie EREW) zapisuje w innym miejscu pamięci, zapisy te są wyłączne.
Następnie pary zapisane w tablicy A są sortowane w czasie OQgp) względem
pierwszych elementów w parach. Po wykonaniu sortowania wszystkie wartości
(drugie elementy par), które na maszynie CRCW miały być zapisane w tym
samym miejscu, występują kolejno w A.
Każdy procesor P 1 z maszyny EREW, dla i= 1, 2, ... , p - 1, ogląda teraz
A[i] = (/1, x 1) i A[i- 1] = (/,, x,), gdzie j i k są wartościami z przedziału
O~J. k~p- l. Jeśli 11 -::f:.ft. lub i= O, to procesor P1, dla i= O, 1, ... , p-1,
zapisuje wartość x 1 na pozycji 11 w pamięci globalnej. W przeciwnym razie
procesor nie podejmuje żadnej akcji. Ponieważ tablica A została posortowana
względem pierwszych elementów w parach, tylko jeden procesor z.a.pisuje do tej
samej komórki pamięci i dlatego taki zapis jest wyłączny. Tak więc każdy krok
jednoczesnego zapisu z maszyny CRCW z jednolitym zapisem można zaimple-
mentować na maszynie EREW PRAM w czasie OQgn).
790
30.2. ALGORYTMY TYPU CRCW A ALGORYTMY TYPU EREW
Pamięc' globalna
maszynyc:14:·w
.....
.....
., ····'""""
.........
,,.,,,. ,
"""
12 '
~,.~·=~! ' '
,
•;
....
,.,.,,.,,,,,
'"'"
., '
'
"
43 I ,,
.~..~,.~
,,,.,,,,.......~.'
~~
..... ....
""""'"'"'
·'""""'"""
·"• ,,.,.
;,;;•:;;-,•,;;;;
,, .. ,. .,
....,,, ......
26 92
.·;·:;·:-';;:;
'.., ".
"., ..
-·---"--
"'
I, I
A
• (8.12) - I u
-~------·,
(8,12) --~ 1
(29,43) · 2
• 29,43)
-~-, ! :O
(b)
Rys. 30.7. Symulacja jednoczesnego zapisu na maszynie BREW PRAM. (a) Krok, w .którym 6 proce-
sorów maszyny CRCW z jednolitym ttpisem. pisze jednocześnie do wspólnej pamięci. (b) Symula-
tja kroku z (a) na maszynie EREW PRAM. Najpierw uporządkowane pary składające się z adresu
w pamięci i wartości, która tam ma zostać zapisana, są zapisywane w tablicy .4. Następnie tablica
.4 jest sortowana. Porównując sąsiednie elementy w tablicy, zapewniamy, że tylko pierwszy zapis,
z grupy identycmych zapisów do pamięci globalnej, zostaje wykonany. W tym wypad.ku zapisują
procesory P 0 , P, i P ~
deli. Jednak trzeba zdawać sobie sprawę z jednej wainej rzeczy: te modele są
tylko modelami. W świecie rzeczywistym różne modele stosuje się w różnych
granicach. Stopień, w jakim model odpowiada istniejącym rozwiązaniom tech-
nicznym, jest stopniem, w jakim analiza algorytmów w tym modelu pozwala
przewidywać zjawiska występujące w świecie rzeczywistym. Dlatego jest ważne
791
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
ZADANIA
30.2-1. Przypuśćmy, że wiemy o tym, iż las drzew binarnych składa się z tylko
jednego drzewa o n węzłach. Pokaż, że przy tym założeniu problem znaj-
dowania korzeni można rozwiązać na maszynie CREW PRAM w czasie
0(1). Uzasadnij, że kamy algorytm BREW dla tego problemu wymaga
czasu 0:(lg n).
30.2-2. Podaj algorytm typu BREW dla problemu znajdowania korzeni w lesie
o n węzłach działający w czasie O{lgn).
30.2-3. Podaj n-procesorowy algorytm typu CRCW, który oblicza sumę lo-
giczną (OR) n mliennych w czasie 0(1).
30.2-4. Opisz efektywny algorytm typu CRCW mnożenia dwóch macierzy lo-
gicznych wymiaru n x n przy użyciu n 3 procesorów.
30.2-5. Opisz algorytm typu BREW, który używając n 3 procesorów, oblicza
w czasie O(lg n) iloczyn dwóch macierzy wymiaru n x n zawierających licz-
by rzeczywiste. Czy istnieje szybszy algorytm na maszynie CRCW z jedno-
litym zapisem? Czy istnieje szybszy algorytm na jednym z silniejszych mo-
deli CRCW?
* 30.2-6. Udowodnij, że dla każdej stałej e > O istnieje algorytm typu CRCW,
który w czasie 0(1) przy uZyciu O(n 1 +,) procesorów znajduje maksymalny
element w n-elementowej tablicy.
* 30.2-7. Pokaż, jak scalić w czasie 0(1) na priorytetowej maszynie CRCW
PRAM dwie posortowane tablice, każda o długości n. Opisz, jak wykorzy-
stać ten algorytm do sortowania w czasie O(lgn). Czy Twój algorytm jest
sekwencyjnie efektywny?
30.2-8. Uzupełnij dowód twierdzenia 30.1, opisując implementację, w czasie
O(lgp) nap-procesorowej maszynie BREW PRAM, jednoczesnego cx:lczy-
tu z p-procesorowej maszyny CRCW PRAM.
30.2-9. Pokaż, jak na p-procesorowej maszynie BREW PRAM symulować
p-procesorową, z mieszanym zapisem maszynę CRCW PRAM, ze spowol-
nieniem tylko O(lgp). (Wskazówka:Zastosuj obliczenia prefiksowe).
792
30.3. TWIERDZENIE BRENTA I SEKWENCYJNA EFEKTYWNOSC
DOWÓD
Dane wejściowe dla symulowanego układu przechowujemy w pamięci globalnej
maszyny PRAM. W pamięci globalnej rezerwujemy też miejsce na dane pojawia-
jące się na wyjściu każdego elementu układu. Działanie jednego elementu można
wówczas symulować na jednym procesorze maszyny PRAM w czasie 0(1)
następująco. Procesor symulujący element po prostu odczytuje dane wejściowe
dla tego elementu z odpowiednich miejsc w pamięci, w których są przechowywa-
ne dane wejściowe dla całego układu lub dane wyjściowe tych elementów, które
produkują dane wejściowe dla elementu symulowanego. W ten sposób jest
symulowane przesyłanie danych między elementami w układzie. Następnie pro-
cesor oblicz.a wartość funkcji zadanej przez symulowany element i z.apisuje wynik
w odpowiednim miejscu globalnej pamięci. Ponieważ stopień wejściowy każdego
elementu jest ograniczony, każda funkcja może być obliczona w czasie 0(1).
Pozostaje pokazać, w jakiej kolejności przydzielać p procesorów maszyny
PRAM elementom układu, żeby łączny czas symulacji wynosił O(n/p + d).
Głównym ograniczeniem, jakie napotykamy, jest to, że element nie może być
symulowany, zanim nie zostaną obliczone wszystkie jego dane wejściowe. Mo-
żliwość jednoczesnego odczytu ma zastosowanie zawsze wtedy, kiedy kilka
symulowanych elementów wykorzystuje tę samą wartość.
---------------------·-- ..~·----=~
793
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
n
--+d
p
•
Jeśli stopień wyjściowy każdego elementu w układzie wynosi 0(1 ), to
twierdzenie Brenta można rozszerzyć na symulację w modelu BREW.
WNIOSEK
30.3.
Każdy n-elementowy układ o głębokości di ograniczonych stopniach wejścio
wym i wyjściowym można symulować na p-procesorowej maszynie BREW
PRAM w czasie O(n/p + d).
DOWÓD
Wykonujemy symulację podobną do tej z dowodu twierdzenia Brenta. Jedyną
różnicą jest symulacja przewodów, które w symulacji z twierdzenia 30.2 wyma-
794
30.3. TWIERDZENIE BRENTA I SEKWENCYJNA EFEKTYWNO$ć
11 Głębokość i
3 I
5 2
2 3
2 4
3 5
lys. 30.8. Twierdzerue Brenta. Symulacja układu o rozmiarze 15 i głębokości 5 przez 2-procesorową
maszynę CREW PRAM w 9 .:s;;15{1 + 5 krokach. Sieć jest symulowana od góry do dołu. Elemen-
ty, które są symulowane w tym samym czasie, są połączone w grupy oznaczone na rysunku
ciemnoszarym kolorem. Kaida grupa jest etykietowana liczbą równą numerowi kroku, w którym
są symulowane elementy z tej grupy
•
Opisana metoda symulacji na maszynie EREW nie działa dla elementów
o dowolnym stopniu wyjściowym, ponieważ w każdym kroku kopiowanie mo-
że zabierać więcej niż stały czas. Tak więc do symulacji układów o dowolnym
stopniu wyjściowym potrzebujemy jednoczesnego odczytu. (Z przypadkiem
dowolnego stopnia wejściowego można sobie czasami poradzić - jeśli elementy
795
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
TwIERDZENIE 30.4.
Jeśli algorytm A. działa
nap-procesorowej maszynie PRAM w czasie t, to dla
każdego p' < p istnieje
algorytm A' dla tego samego problemu działający na
p'-procesorowej maszynie PRAM w czasie O(pt/p').
DOWÓD
Ponumerujmy kolejne krok.i wykonywane w algorytmie A liczbami 1, 2, ..., t.
Algorytm A' symuluje każdy krok algorytmu A w czasie O(fp/p'l). Jest t ta-
kich kroków, tak więc całkowity czas symulacji wyoosi 0(1p/p'l t) - O(pt/p),
ponieważ p' < p. +
Algorytm A wykonuje pracę pt, a praca wykonywana przez A.' wynosi
(pt/p')p' = pt; symulacja jest zatem sekwencyjnie efektywna. W konsekwencji,
jeśli algorytm A jest sam sekwencyjnie efektywny, to także algorytm A' jest
sekwencyjnie efektywny.
Kiedy poszukujemy algorytmów sekwencyjnie efektywnych dla danego
problemu, nie jest konieczne konstruowanie różnych algorytmów dla różnych
liczb procesorów. Przypuśćmy na przykład, że potraftmy pokazać dokładne
dolne ograniczenia t na czas działania każdego algorytmu równoległego (bez
względu na liczbę używanych procesorów) rozwiązującego dany problem, i za-
łó:źmy, że najlepszy algorytm sekwencyjny dla tego problemu działa w cza-
sie w. Wówcz».S,żeby dla tego problemu otrzymać algorytmy efektywnie sek-
wencyjne dla wszystkich liczb procesorów p, dla których jest to możliwe, wy-
796
30.4. SEKWENCYJNIEEFEKTYWNERÓWNOLEGŁE OBLICZENIA PREFIKSOWE
ZADANIA
30.3-1. Udowodnij twierdzenie analogiczne do twierdzenia Brenta dla symula-
cji układów logicznych z bramkami AND i OR o dowolnym stopniu wej-
ściowym. (Wskazówka: Niech „rozmiarem" będzie łączna liczba wejść do
bramek w całym układzie).
30.3-2. Pokaż, że obliczenia prefiksowe dla n wartości przechowywanych w ta-
blicy można na maszynie BREW PRAM zaimplementować w czasie
O(lgn}, używając O(n/lgn) procesorów. Dlaczego tego wyniku nie można
rozszerzyć bezpośrednio na przypadek listy?
30.3-3. Podaj sekwencyjnie efektywny algorytm typu BREW, który w czasie
O(lgn) mnoży macierz A wymiaru n x n przez wektor b wymiaru n.
(Wskazówka: Skonstruuj dla tego problemu układ kombinacyjny).
30.3-4. Podaj algorytm typu CRCW mnożenia dwóch macierzy wymiaru
n x n przy użyciu n 2 procesorów. Twój algorytm powinien być sekwencyj-
nie efektywny względem zwykłego, sekwencyjnego algorytmu mnożenia
macierzy, działającego w czasie 0(n 3 ). Czy potrafisz przerobić swój algo-
rytm na algorytm typu EREW?
30.3-5. W pewnych modelach obliczeń równoległych pozwala się na to, żeby
w trak.cie obliczeń procesory stawały się nieaktywne. Tak więc liczba pro-
cesorów wykonujących obliczenia może się zmieniać w każdym kroku.
W takim modelu zdefiniujmy pracę jako łączną liczbę kroków wykonywa-
nych w trak.cie działania algorytmu przez aktywne procesory. Pokaż, że
każdy algorytm typu CRCW, który wykonuje pracę w i działa w czasie t,
można wykonać na p-procesorowej maszynie BREW PRAM w czasie
O((w/p + t) lgp). (Wskazówka: Trudną częścią zadania jest ustalanie kolej-
ności symulowania aktywnych procesorów w trakcie przebiegu obliczeń).
* 30.4. Sekwencyjnieefektywnerównolegleobliczenia
prefiksowe
W podrozdziale 30.1.2 zapoznaliśmy się z algorytmem LIST-R.ANK wyznaczania
porządku elementów na liście, którego można użyć do obliczania sum prefikso-
wych na n-obiektowych listach. Algorytm ten używa n procesorów i wykonuje
pracę 0(n lg n). Ponieważ możemy łatwo policzyć sumy preftk.sowesekwencyjnie
w czasie 0(n), algorytm LIST-RANKnie jest sekwencyjnie efektywny.
797
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
{a)
••
.a
{c)
{d)
798
30.4. SEKWENCYJNIEEFEKTYWNERÓWNOLEGŁE OBLICZENIA PREFIKSOWE
••
1111
I Usuwanie
ł z listy
I Włączenie z powrotem
ł na lisl~
1111
:ys. 30.10, Kolejne poziomy rekursji po wywołaniu RANDOMIZED--LIST·PREFIX dla lisly 9-obiektowej.
Na każdym poziomie rekunji obiekty pokolorowane na czarno są usuwane z listy. Rekursjarozwija s.ię
aż do osiągnięcia listy puslej, a następnie usunięte obiekty są włączane z powrotem na listę
przyjmujemy, że
lista jest dwukierunkowa. (Listę jednokierunkową można
przekształcić w listę dwukierunkową w czasie O(l)"t).
Idea algorytmu RANDOMIZED-LIST-PREFIXpolega na wykonaniu nastę
pujących kroków: najpierw usuwamy część obiektów z listy, następnie rekuren-
cyjnie wykonujemy obliczenia prefiksowe dla skróconej w ten sposób listy, po
czym wstawiamy na powrót usunięte początkowo elementy, otrzymując wynik.i
obliczenia preftlcsowego dla całej listy wejściowej. Rysunek 30.9 ilustruje pro-
ces rozwijania rekursji, a rys. 30.10 obrazuje, jak rekursja jest zwijana. Pokaże
my trochę później, że na każdym poziomie rekursji są zachowywane następują
ce dwie własności:
1 Jeśli mamy do dyspozycji n procesorów. Przy nJlgn procesorach zabiera to czas OQgn)
(przyp. tłum.).
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
800
30.4. SEKWENCYJNIE EFEKTYWNE RÓWNOLEGŁE OBLICZENIA PREFIKSOWE
1. Procesor pobiera jeden obiekt i, jeszcze nie usunięty z listy, spośród obiek-
tów, za które odpowiada.
2. Procesor „rzuca monetą symetryczną", otrzymując z równym prawdopodo-
bieństwem albo ORLA, albo RESZKĘ,
3. Jeśli wypadł ORZEŁ i obiekt next[i1 nie został pobrany przez związany z nim
procesor lub został pobrany, ale odpowiadający za niego procesor wyrzucił
RESZKĘ, to procesor zaznacza i jako wybrany do usunięcia.
.naliza
Ponieważ w każdym rekurencyjnym kroku czas działania procedury RANDO-
MIZED-LIST-PREFIXjest stały, do analizy czasu działania algorytmu wystarczy
określić, ile kroków potrzeba, żeby usunąć wszystkie obiekty z pierwotnej listy.
W każdym kroku każdy procesor z prawdopodobieństwem co najmniej 1/4
usuwa z listy pobrany przez siebie obiekt i. Dlaczego? ORZEŁ jest wyrzucany
z prawdopodobieństwem 1/2, a prawdopodobieństwo, że next[1] nie zostanie
pobrany przez odpowiadający za niego procesor lub zostanie pobrany i ten
procesor wyrzuci RESZKĘ, wynosi co najmniej 1/2. Ponieważ dwa rzuty monetą
są zdarzeniami niezależnymi, możemy pomnożyć ich prawdopodobieństwa
przez siebie, otrzymując prawdopodobieństwo co najmniej 1/4 na to, że obiekt
pobrany przez dany procesor zostanie usunięty. Ponieważ każdy procesor od-
powiada za @(lgn) obiektów, oczekiwany czas usunięcia wszystkich obiektów
związanych z jednym procesorem wynosi S(lgn).
Niestety, z tej prostej analizy nie wynika, że oczekiwany czas działania
procedury RANDOMIZED-LIST-PREF1X wynosi 8(lgn). Jeśli na przykład więk
szość procesorów usuwa szybko wszystkie swoje obiekty, a kilku procesorom
zabiera to dużo więcej czasu, średni czas potrzebny do usunięcia obiektów
przez jeden procesor może nadal wynosić @(lgn), ale czas działania całego
algorytmu jest długi.
801
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
-(,c(!)'-')""
"(:)''"
= 1/n2
jeśliprzyjmiemy c ~ 20. (Wiersz drugi wynika z nierówności (6.9)). Tak więc
prawdopodobieństwo, że nie wszystkie obiekty przynależne do danego proce-
sora zostaną usunięte z listy w clg n krokach, wynosi co najwyżej 1/n2 •
Chcemy teraz oszacować prawdopodobieństwo, że pewne obiekty spośród
wszystkich obiektów na liście nie zostaną z niej usunięte w c lgn krokach.
802
30.4. SEKWENCYJNIEEFEKTYWNERÓWNOLEGŁE OBLICZENIA PREFIKSOWE
n I I
~- . -·---- ~ -
lgn n2 ....., n
ZADANIA
30.4-1. Zilustruj na rysunku, co może zdarzyć się złego w algorytmie RAN-
DOMIZED-LIST-PREFIX, jeśli dwa sąsiednie obiekty na liście zostaną jedno-
cześnie wybrane do usunięcia.
r 30.4-2. Zaproponuj prostą zmianę w algorytmie RANDOMIZED-LIST-PREFIX,
żeby jej czas działania w najgorszym przypadku wynosił O(n) dla listy
złożonej z n obiektów. Wykorzystaj definicję wartości oczekiwanej do udo-
wodnienia, że z tą modyfikacją oczekiwany czas działania algorytmu wy-
nosi 00gn).
r 30.4-3. Pokaż, w jak.i sposób zaimplementować algorytm RANDOMIZED-
-LIST-PREFIX,żeby w najgorszym przypadku każdy procesor używał pa-
mięci rozmiaru O(n/p), niezależnie od głębokości rekursji.
r 30.4-4. Wykaż, że dla każdej stałej k ~ 1 algorytm RANDOMIZED-LIST-PRE-
FIX działa w czasie 00gn) z prawdopodobieństwem co najmniej 1- l/n1.
Pokaż, jak k ~a na stałą w oszacowaniu na czas działania algorytmu.
r 30.4-5. Korzystając z wyniku zad. 30.4-4, pokaż, że oczekiwany czas działania
algorytmu RANDOMIZED-LIST-PREFIX wynosi O(lgn).
803
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
łamanie symetrii
30.5. Deterministyczne
Rozwaimy sytuację, w której dwa róZD.eprocesory żądają wyłącznego dostępu
do obiektu, W jaki sposób procesory mogą zdecydować, który z nich zdobywa
prawo dostępu jako pierwszy? Chcielibyśmy uniknąć zarówno takich sytuacji,
w których oba nabywają prawa dostępu, jak i takich, w których żaden nie
nabywa takiego prawa. Problem wyboru jednego z procesorów jest przykła
dem problemu łamania symetrii. Wszyscy wielokrotnie spotykaliśmy się z za-
mieszaniem, jakie powstaje, gdy dwoje uprzejmych ludzi chce jednocześnie
przejść przez te same drzwi. Podobne problemy łamania symetrii spotykamy
często przy układaniu algorytmów równoległych. Efektywne rozwiązania tych
problemów są wysoce użyteczne.
Jedna z metod łamania symetrii polega na rzucaniu monetą. Rzut monetą
można zaimplementować na komputerze za pomocą generatora liczb loso-
wych. W wypadku łamania symetrii dla dwóch procesorów rzut monetą wy-
konują oba procesory. Jeśli jeden wyrzuci ORLA, a drugi wyrzuci RESZKĘ,
to ten, który wyrzucił ORLA, wygrywa. Jeśli oba wyrzucą to samo, próbują
jeszcze raz. Przy tej strategii symetria jest łamana w oczekiwanym stałym czasie
(patrz zad. 30.5-1).
O skuteczności metody losowego wyboru przekonaliśmy się w podrozdz.
30.4. W algorytmie RANDOMJZED-LIST-PREFIX sąsiednie obiekty na liście nie
mogą być jednocześnie wybrane do usunięcia, ale liczba wybranych obiektów
powinna być jak największa. Wśród pobranych obiektów żaden się jednak nie
wyróżnia. Jak się przekonaliśmy, losowość dostarcza prostej i skutecznej meto-
dy łamania symetrii między sąsiednimi elementami na liście, która gwarantuje
jednocześnie wybór wielu obiektów z dużym prawdopodobieństwem.
W tym podrozdziale zapoznamy się z deterministyC"Zną metodą łamania
symetrii. W tej metodzie zamiast wykonywania rzutów monetą działa się na
indeksach procesorów lub adresach w pamięci. Przykładowo, dla dwóch proce-
sorów możemy złamać symetrię, wybierając procesor z mniejszym indeksem
jako pierwszy - w oczywisty sposób można to zrobić w czasie stałym.
Ten sam pomysł, tylko wykorzystany dużo sprytniej, zastosujemy w algo-
rytmie łamania symetrii na n-obiektowej liście. Naszym celem jest wybór stałe
go procenta obiektów z listy, unikając przy tym wyboru obiektów sąsiednich.
Algorytm będzie można wykonać na n-procesorowej maszynie EREW w czasie
O(tg• n). Ponieważ lg• n :E;5 dla wszystkich n :E;2 65536 , we wszystkich praktycz-
nych zastosowaniach O(lg • n) można traktować jako małą stałą (patrz s. 59).
Nasz algorytm składa się z dwóch częsci. W części pierwszej koloruje się
listę 6 kolorami w czasie O(lg• n). W części drugiej 6-pokolorowanie przekształ
ca się w czasie stałym w „maksymalny zbiór niezależny" obiektów z listy.
Maksymalny zbiór niezależny będzie zawierał stały procent wszystkich obiek-
tów i żadne dwa jego obiekty nie będą sąsiednie.
804
30.5. DETERMINISTYCZNE ŁAMANIE SYMETRII
------------------
805
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
Nowym kolorem ostatniego elementu na liście jest (O, a 0 ), Stąd liczba bitów
potrzebnych do zapisania każdego koloru wynosi co najwyżej flgrl + l, Mu-
simy pokazać, że jeżeli na początku ka Mej iteracji kolorowanie jest poprawne,
to po jej wykonaniu nowe kolorowanie jest także poprawne. W tym celu wy-
każemy, że nierówność Cl[x] 'F C1[next[x]] pociąga za sobą nierówność
Cl+ 1{x] 'F Cl+ 1[next[x]], Załóżmy, że CJx] = a i Cl[next[x]] = b oraz że
Cl+ 1 [x] = (i, a1) i C1+ 1[next[x]] = <J,b1), Należy rozpatrzyć dwa przypadki.
Jeśli i "Fj, to (i, a1) 'F (J, b1) i dlatego oba nowe kolory są różne. Jeśli i= j,
to a1 "Fb1 = b1, co wynika z naszej metody nadawania nowego koloru, i po-
nownie oba nowe kolory są różne, (Podobnie można rozważyć sytuację na
końcu listy).
Metoda przekolorowywania używana w algorytmie Six-COLOR zamienia
kolor r-bitowy na kolor (flgrl + 1)-bitowy, co oznacza, że liczba bitów ściśle
maleje, jeśli tylko r ~ 4. Dla r = 3 dwa kolory mogą się różnić na jednej
806
o o o
o o o o
il
o
t ~ ~§ o·;~~8 o o o o~~
·a:: ~§ ·1~
o
li -;6
·•
.t::
·-
·•
"'o .-:::
oi!
o o o
12,; ft:
~]
!5 " • o
~] -~]- -~]- " fi]
Q.. ił: )3 p,. i !5
o o 0
o
" • o
~]
" 8. ,:i.. ~
0010 100
0110
01111
óoo10 Oli
011
J_
101
0001 001
00001
01010
0001
0000
001
r1 = ~gr,-,1 +1
,;; ~g(21g"-''n)l +l
= ~g(!g(I-''n) + ll + l
= ~g'"nl + 2
Wiersz czwarty wynika z założenia, że flgUlnl ~ 2, co oznacza, że f1g<1- 1lnl ~
~ 3. Dlatego po m =lg• n krokach liczba bitów w kolorowaniu wynosi
r,,, ~ flg<"'lnl + 2 = 3, ponieważ z defmicji lg" wynika, że IgC"'ln~ 1. Tak więc
jedna więcej iteracja wystarcza do otrzymania 6-kolorowania. Łączny czas
działania procedury SIX-COLORS wynosi zatem O(tg•n).
808
30.5. DETERMINISTYCZNE ŁAMANIE SYMETRII
809
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
ZADANIA
30.5-1. Pokaż, że
metoda łamania symetrii z przykładu z początku tego pod-
rozdziału działa w oczekiwanym czasie stałym.
30.5-2. Pokaż,jak.mając dane 6-kolorowanie, można kolorować listę 3 kolora-
mi w czasie 0(1), używając n procesorów maszyny EREW PRAM.
30.>3. Załóżmy, że każdy węzeł różny od korzenia w n-węzłowym drzewie
T ma wskaźnik do ojca. Podaj algorytm typu CREW, który w czasie
00g' n) pokoloruje T stalą liczbą kolorów.
* 30.5-4. Podaj efektywny algorytm dla maszyny PRAM kolorujący stałą liczbą
kolorów grafy o stopniu 3. Przeanalizuj swój algorytm.
30.>S. Zbiorem k-władającym na liście nazywamy zbiór obiektów (władców)
z listy taki, że żadni dwaj władcy nie są sąsiedni i co najwyżej k obiektów
nie będących władcami (poddanych) oddziela dwóch kolejnych władców.
Tak więc maksymalny zbiór niezależny jest 2-władający. Pokaż, jak można
dla n-obiektowej listy obliczyć w czasie 0(1) i przy użyciu n procesorów
zbiór O(lgn)-władający. Pokaż, jak przy tych samych założeniach można
obliczyć w czasie 0(1) zbiór O(lglgn)-władający.
* 30.5-6. Pokaż, jak wyznaczyć 6-kolorowanie n-obiektowej listy w czasie
O(lg(lg•n)). Załóż, że każdy procesor może zapamiętać obliczoną wcześ
niej tablicę ro2JDiaru O(lgn). (Wskazówka: Od ilu wartości zależy końcowy
kolor jednego obiektu w algorytmie 6-kolorowania SIX-COLOR?)
Problemy
30-1. Odcinkowe obliczenia prefiksowe
Podobnie jak zwykłe obliczenia prefiksowe, odcinkowe obliczenia prefiksowe
definiuje się za pomocą pewnego, łącznego operatora ®· Na wejściu jest dany
ciąg x = (x 1 , x 2 , ... , x,,), którego elementy nalei.ą do pewnej dziedziny S, i ciąg
odcinkowy b = (b 1 , 6 2 , ... , 6,,), którego elementy należą. do zbioru {O,I}, przy
czym b 1 = 1. Wynikiem odcinkowych obliczeń prefiksowych jest ciąg
y = (),1 , y 2 , •.• , y,,) elementów z dziedziny S. Bity z ciągu b wyznaczają po-
działy x i y na odcinki; nowy odcinek rozpoczyna się wszędzie tam, gdzie
b1 = 1, i ciągnie się aż do kolejnego bitu równego 1 (wyłącznie) lub wyczerpa-
nia się całego ciągu. Odcinkowe obliczenia prefiksowe polegają na wykonaniu
obliczeń prefiksowych niezależnie dla każdego odcinka z x i otrzymaniu w wy-
niku odpowiedniego odcinka wy. Rysunek 30.12 ilustruje odcinkowe oblicze-
nia prefiksowe z użyciem zwykłego dodawania.
810
PROBLEMY
Rys. 30.12. Odcinkowe obliczenia prefiksowe dla ciągu odcinkowego bi ciągu wejściowego x. Ciąg y
jest ciągiem wynikowym. Gąg b wyznacza S odcinków
(c) Opisz algorytm typu EREW, który w czasie O(klgn) posortuje listę n liczb
k-bitowych.
811
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
•
(JUMP). Wykorzystywany jest też podprogram STAR, w którym zm1enneJ •
<D(C)- I;height(T,)
T,
gdzie beigbt(TJ jest wysokością drzewa T1• Celem naszej analizy jest pokaza-
nie, że każdorazowe wykonanie pary operacji HOOK i JUMP zmniejsza cli(C)
o stały czynnik.
812
PROBLEMY
813
ROZDZIAŁ 30. ALGORYTMY RÓWNOLEGŁE
Uwagido rozdziału
Prace Akta [9], Karpa i Ramachandran [118] oraz Leightona [135] zawierają
przegląd algorytmów równoległych dla problemów kombinatorycznych. Róż
norodne architektury maszyn równoległych są opisane przez Hwanga i Briggsa
[109] oraz Hwanga i DeGroota [110].
Teoria obliczeń równoległych ma swój początek w latach czterdziestych
naszego stulecia, kiedy to J. Von Neumann [38] wprowadził ograniczony mo-
del obliczeń równoległych nazywany automatem komórkowym. Automat ko-
mórkowy jest w istocie dwuwymiarową tablicą procesorów o skończonej licz-
bie stanów, połączonych w prostokątną siatkę. Model PRAM zdefm.iowali
formalnie Fortune i Wyllie [73] w 1978 r., aczkolwiek wielu innych autorów
omawiało wcześniej zasadniczo podobne modele.
Metoda przeskakiwania została wprowadzona przez Wylliego [204]. Rów-
noległe obliczenia prefiksowe pojawiły się po raz pierwszy w pracy Ofmana
[152] w kontekście dodawania równoległego. Metoda cyklu Eulera pochodzi
od Tarjana i Vishkina [191].
Związek między czasem działania a liczbą procesorów w obliczeniach ma-
ksimwn ze zbioru n liczb zbadał Valiant [193), który także pokazał, że nie
istnieje sekwencyjnie efektywny algorytm dla tego problemu działający w cza-
sie 0(1). Cook, Dworki Reishuk [50] udowodnili, że wyznaczenie maksimum
na maszynie CREW PRAM wymaga czasu O(lgn). Metodę symulacji algo-
rytmów typu CRCW za pomocą algorytmów typu EREW :zaproponował Vi-
shkin [195].
Twierdzenie 30.2 podał Brent [34]. Anderson i Miller [11] opracowali pro-
babilistyczny, sekwencyjnie efektywny algorytm ustalania porządku na liście.
Dla tego samego problemu podali oni także algorytm detenninistycmy, który
jest tak.że sekwencyjnie-efektywny. Goldberg i Plotkin [84] zaproponowali de-
terministyczny algorytm łamania symetrii, omówiony w tym rozdziale. Jest on
oparty na podobnym algorytmie pochodzącym od Cole'a i Vishkina [47] i dzia-
łającym w takim samym czasie.
Rozdział 31
Operacjena macierzach
815
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
Macierzei wektory
Macierz jest prostokątną tablicą zawierającą liczby, Na przykład
a,,
a,, "'')
a,,
= (1
4
25 3)
6
(31.1)
1 4
AT= 2 5
3 6
Wektor jest jednowymiarową tablicą liczb. Na przykład
2
X= 3 (31.2)
5 •
XT=(2J5)
816
31.1. WŁASNO$CI MACIERZV
zwykle z kontekstu jasno wynika, czy chodzi o macierz zerową, cz;yo liczbę O.
Jeśli mamy na myśli macierz, to znany jest też z reguły jej wymiar.
Szczególnie często rozważa się macierze kwadratowen x n. Na specjalną
uwagę zasługują następujące ich rodzaje:
•11 o '" o
diag(a 11 , a22 , ... , ann) =
o a,, ' " o
' ' '
'
' '
o o
2. Macierz jednostkowa n x n oznaczana przez In jest macierzą diagonalną
z jedynkami na przekątnej
I. - diag(l, I, ... , I)
I o '" o
o I , __
o
' ' ' '
'
' •
o o 1
Kiedy I pojawia się bez indeksu, wymiar macierzy musi wynikać z konteks-
tu; i-ta kolumna macierzy jednostkowej jest wektorem jednostkowym e1•
3. Macierz trójdiagonalnaT to taka, dla której t 0 = O, jeśli tylko li - Jl > l.
Niezerowe elementy występują tylko na głównej przekątnej, bezpośrednio
nad nią (t 1•1+ 1 dla i= 1, 2, ... , n -1) lub bezpośrednio pod nią (11+ 1 ,1 dla
i= 1, 2, ... , n - 1):
o o o o ." o 1n,n -1 IM
817
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
4. Macierz trójkątna górna U to taka, dla której u1i = O, jeśli i> j. Wszystkie
elementy poniżej przekątnej są więc równe O:
o o ...
Macierz trójkątną górną nazywamy jednostkową macierzą trójkątną górną,
jeśli ma same jedynki na przekątnej.
5. Macierz trójkątna dolna L to taka, dla której ulJ = O, jeśli i< j. Wszystkie
elementy powyżej przekątnej są więc równe O:
111 o ... o
l,1 1,, ... o
L= •
O I O O O
O O O I O
P= I O O O O
O O O O I
O O I O O
Nazwa bierze się stąd, że pomnożenie wektora x przez taką macierz daje
w wyniku permutację elementów x.
7. Macierz symetryczna A spełnia warunek A= Ar. Na przykład
1 2 3
2 6 4
3 4 5
jest macierzą symetryczną.
818
31.1. WŁASNOŚCI MACIERlY
Operacje na macierzach
A +O-A
-O+A
A+(-A)-0
-(-A)+A
819
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
A(B + C) = AB+ AC
(B+ C)D=BD+ CD
Mnożenie macierzy n X n nie jest jednak przemienne, chyba że n= 1. Na przy-
AB=(~~)
zaś
BA=(~~)
'
xTy= LxJ1;
l "' 1
820
31.1. WŁASNOSCI MACIER2Y
(
1
1O
-(o
1)-1 1
1) -1
(31.6)
821
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
TwIERDZENIE31.1.
Macierz kwadratowa ma pełny rząd wtedy i tylko wtedy, gdy nie jest osobliwa .
TWIERDZENIE31.2.
Macierz A ma pełny rząd kolumnowy wtedy i tylko wtedy, gdy nie ma wek-
torów zerujących.
•
WNIOSEK 31.3.
Macierz kwadratowa A jest osobliwa wtedy i tylko wtedy, gdy ma wektor
•
zeruJący.
•
Minort:.10(jmacierzy A wymiaru n x n, dla n> 1, nazywamy macierz Ar;11
wymiaru (n - 1) x (n- I) otrzymaną przez usunięcie i-tego wiersza ij-tej ko-
lumny z macierzy A. Wyznacznik macierzy A wymiaru n x n definujemy reku-
. . . ,
rencyJnte za pomocą m1norow
822
31.1. WŁASNO$CI MACIERZV
jeśli n =1
det(A) = a 11 det(A 1111) - a 12 det(Ar 121 ) (31.7)
+ ...+ ( - I)"+ 1 a 111det(A! 1 „1), jeśli n> 1
•
TWIERDZENIE 31.5.
Macierz A wymiaru n x n jest osobliwa wtedy i tylko wtedy, gdy det(A) = O.
•
Macierze dodatnio określone
823
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
"
L xl
I= 1
>0
Tw!ERDZENIE31.6.
Dla dowolnej macierzy A z pełnym rzędem kolumnowym macierz Ar A jest
dodatnio określona.
DOWÓD
Musimy pokazać, że xT(ATA)x > O dla każdego niezerowego wektora x. Weź
my więc dowolny wektor x
- l!Axll'
;. o (31.8)
•
Inne własności macierzy dodatnio określonych opiszemy w podrozdz. 31.6.
ZADANIA
31.1-1. Udowodnij, że iloczyn dwóch macierzy trójkątnych dolnych jest ma-
cierzą trójkątną dolną. Udowodnij, że wyznacznik macierzy trójkątnej
(dolnej lub górnej) jest równy iloczynowi elementów leżących na jej prze-
kątnej. Udowodnij, że macierz odwrotna do macierzy trójkątnej dolnej,
jeśli istnieje, też jest trójkątna dolna.
31.1-2. Udowodnij, że jeśli P jest macierzą permutacyjną n x n, zaś A jest
macierzą n x n, to PA można otrzymać z macierzy A przez permutację jej
wierszy, a AP - przez permutację kolumn. Udowodnij, że iloczyn dwóch
macierzy permutacyjnych jest macierzą permutacyjną. Udowodnij, że jeśli
P jest macierzą _permutacyjną, to jest ona odwracalna, macierzą odwrotną
do niej jest pT, a pT także jest macierzą permutacyjną.
824
31.1. WŁASN05CI MACIERZV
31.1-3. Udowodnij, że (AB)T = BTAT oraz że ATA jest zawsze macierzą sy.
metryczną.
I x, x5 ••• xi-1
V(x 0 , X 1 , .•• , X 11_ 1 ) =
I x, xl •• • xi.-1
• •
• •
.,:-,
I x11-1
'
X11- l •••
,- '
•
wynosi
825
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
Zarys algorytmu
Algorytm Strassena może być rozpatrywany jako zastosowanie znanej metody:
,,dziel i zwyciężaj". Załóżmy, że chcemy obliczyć iloczyn C = AB, gdzie A,
B i C są macierzami n x n. Jeśli założymy ponadto, że n jest dokładną potę
gą 2, to możemy podzielić każdą z macierzy A, B i C na cztery macierze
n/2 x n/2 i przepisać równość C = AB w następujący sposób:
(31.9)
(W zadaniu 31.2-2 zajmujemy się przypadkiem, gdy n nie jest dokładną potęgą
2). Dla wygody podmacierze macierzy A są etykietowane alfabetycznie od le-
wej do prawej, podczas gdy podmacierze B są etykietowane z góry do dołu,
czyli zgodnie ze sposobem mnożenia macierzy. Równanie (31.9) odpowiada
czterem równaniom
r=ae+bf (31.10)
s=ag+bh (31.11)
t=ce+df (31.12)
U=cg+dh (31.13)
Każda z nich przedstawia dwie operacje mnożenia macierzy n/2 x n/2 i opera-
cję dodawania otrzymanych iloczynów. Posługując się tymi równaniami przy
tworzeniu naturalnego algorytmu typu „dziel i zwyciężaj", otrzymujemy na-
stępujące równanie rekurencyjne określające czas T(n) potrzebny do pomnoże
nia dwóch macierzy n x n:
826
31.2. ALGORYTM STRASSENA MNOŻENIA MACIER2Y
(31.15)
Nie jest rzeczą do końca jasną, jak Strassen odkrył iloczyny podmacierzy, na
których opiera się jego algorytm. Odtworzymy teraz jedną z możliwych dróg
prowadzących do tego odkrycia.
Przyjmijmy, że każdy iloczyn P1 może być zapisany w postaci
P; = AiBI
827
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
r=ae+bf
+l o o o e
o +l o o f
=(ab Cd)
o o o o g
o o o o h
e f g h
a + •
b • + • •
d • •
s=ag+bh
• +
• • +
• •
• •
t=ce+df
• •
+
• +
828
31,2. ALGORYTM STRASSENA MNOŻENIA MACIERZV
U=cg+dh
• •
=
+ •
+
Nasze poszukiwania szybszego algorytmu mnożenia macierzy rozpoczy-
namy od obserwacji, że podmacierz s może być przedstawiona jako
s = P 1 + P 2 , gdzie każda z macierzy P 1 i P 2 jest obliczona przy użyciu jednej
.. . .
operacJ1 mnozerua:
P1 = A1B1
=a·(g-h)
=ag-ah
+ -
•
• •
Pz = AzBz
=(a+b)·h
=ah+bh
• +
+
=(c+d)·e
829
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
=ce+ de
"
"
+
+
oraz
-d·(f-e)
-df-de
+
Wyrazem istotnym będziemy nazywać każdy z ośmiu wyra.z.ów występują
cych po prawej stronie równań (31.10)-(31.13). Użyliśmy już 4 iloczynów do
obliczenia podmacierzy s i t, których wyrazami istotnymi są ag, bh, ce i df
Zauważmy, że z P 1 oblicza się wyra.z.istotny ag, z P 2 -wyraz istotny bh, z P 3
- wyraz istotny ce, a z P 4 -wyra.z. istotny 4f.Musimy więc teraz tylko obliczyć
podmacierze r i u, których wyrazami istotnymi są ae, bf, cg i dh, nie używając
przy tym więcej niż 3 razy operacji mnożenia macierzy. Macierz P 5 jest okreś
lona w specjalny sposób, tak by obliczyć dwa wyrazy istotne naraz:
- (a + d) · (e + h)
=ae+ah+de+dh
+ +
+ +
830
31.2. ALGORYTM STRASSENA MNOŻENIA MAC!ERZV
P5 + P4 - P 2 = ae +dh+ df - bh
• + +
Dodając ws1.akże jeszcze jeden iloczyn
- (b - d) · if + h)
-bf+bh-df-dh
+ +
• •
otrzymujemy
= ae + bf
+
• +
831
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
+ • +
- •
- •
+
Odejmując dodatkowy iloczyn
- (a - c) · (e + g)
=ae+ag-ce-cg
+ +
•
- • -
• •
dostajemy
=cg+dh
• •
+
• • +
Uwagi
Duża stała ukryta w złożoności czasowej algorytmu Strassena czyni go nie-
praktycznym poza przypadkami, w których macierze są duże (n przynajmniej
832
31.2. ALGORYTM STRASSENA MNOŻENIA MACIERZY
45) i gęste (mało elementów zerowych). Dla małych macierzy zwykły algorytm
jest bardziej polecany, a dla dużych, ale rzadkich macierzy, istnieją specjalne
algorytmy w praktyce bardziej efektywne niż algorytm Strassena. Metoda
Strassena jest więc interesująca głównie z teoretycznego punk.tu widzenia.
Używając zaawansowanych metod, nie wchodzących w zakres tej książki,
można w rzeczywistości mnożyć macierze n x n w czasie lepszym niż 0(nlł:7).
Obecnie znane najlepsze ograniczenie górne wynosi w przybliżeniu w O(n2·376).
Najlepszym ograniczeniem dolnym jest oczywiste !l(n 2) (oczywiste dlatego, że
musimy wypełnić n 2 pozycji w macierzy wynikowej). Tak więc obecnie nie
wiemy, jak trudnym zadaniem jest w rzeczywistości mnożenie macierzy.
Konstruując algorytm. Strassena, nie zakładaliśmy, że elementy macierzy
są liczbami rzeczywistymi. Jedynym istotnym założeniem jest to, że są one
elementami pewnego pierścienia. Jednak czasami, jeśli to założenie nie jest
spełnione, możemy radzić sobie innymi metodami, które umożliwiają stosowa-
nie tego algorytmu. Mówimy o tym szerzej w następnym podrozdziale.
ZADANIA
31.2-1. Użyj algorytmu Strassena do obliczenia iloczynu
833
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
Quasi-pierścienie
834
* 31.3. RÓŻNE STRUKTURY ALGEBRAICZNE I MNOŻENIE MACIERZY BOOLOWSKICH
DOWÓD
Przeprowadzenie dowodu pozostawiamy czytelnikowi jako zad. 31.3-1.
•
Pierścienie
Jeśli wiemy, że
istnieje element przeciwny do każdego elementu, to możemy
zdefiniować odejmowanie jako a - b =a+ (-b).
Istnieje wiele przykładów pierścieni. Liczby całkowite (Z, +, ·, O, I) ze
zwykłymi operacjami dodawania i mnożenia tworzą pierścień. Liczby całkowi
te modulo n dla dowolnego całkowitego n> 1 - czyli (Zft, +, ·, O, 1),
gdzie + jest dodawaniem module n, a · jest mnożeniem modulo n - tworzą
pierścień. Innym przykładem jest zbiór R[x] wielomianów skończonego stop-
nia zmiennej x z rzeczywistymi współczynnikami, wraz ze zwykłymi operac-
jami (czyli (R[x], +,·,O, 1), gdzie+ jest operacją dodawania wielomianów,
a · operacją ich mnożenia).
Z następującego wniosku wynika, że twierdzenie 31.7 można uogólnić
w sposób naturalny na pierścienie.
835
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
DOWÓD
Przeprowadzenie dowodu pozostawiamy czytelnikowi jak.o zad. 31.3-3.
TwlERDZENIE 31.9.
Algorytm Strassena mnożenia macierzy działa prawidłowo dla macierzy utwo-
rzonych nad dowolnym pierścieniem.
DOWÓD
Algorytm Strassena zależy od poprawności algorytmu dla macierzy 2 x 2, któ-
ry wymaga tylko, by elementy macierzy należały do pierścienia. Ponieważ jest
tak z założenia, z wniosku 31.8 wynika, że macierze same tworzą pierścień.
Zatem zgodnie z zasadą indukcji algorytm Strassena działa poprawnie na każ
dym poziomie rekursji.
TwIERDZENIE 31.10.
JeśliM(n) oznacza liczbę operacji arytmetycznych potrzebnych do pomnożenia
dwóch macierzy n x n zbudowanych z liczb całkowitych, to dwie macierze
boolowskie n x n mogą być pomnożone za pomocą O(M(n)) operacji aryt-
metycznych.
836
* 31.3. RÓŻNE STRUKTURY ALGEBRAICZNE I MNOŻENIE MACIERZY BOOLOWSKłCH
DOWÓD
Oznaczmy dwie dane macierze przez A i B. Niech C = AB w boolowskim
quasi-pierścieniu, czyli
"
c11= V a1k/\bki
k= 1
Kai,de wyrażenie aikbAJnależące do tej sumy jest równe O wtedy i tylko wtedy,
gdy aik A bki = O, natomiast jest równe l, wtedy i tylko wtedy, gdy a 1k A bAJ= I.
Zatem suma c;1 wynosi O wtedy i tylko wtedy, gdy każde wyrażenie jest rów-
ne O, lub - co jest równoważne ~ wtedy i tylko wtedy, gdy alternatywa tych
wyrażeń (czyli c~) wynosi O. Macierz boolowska C może więc być odtworzona
za pomocą E>(n ) operacji arytmetycznych z całkowitoliczbowej macierzy C'
po prostu przez przyrównanie każdej sumy c/1 do O. Liczba operacji arytme-
tycznych dla całej procedury wynosi więc O(M(n)) + 9(n 2 ) = O(M(n)), ponie-
waż M(n) - i:ł(n').
•
Używając algorytmu Strassena, możemy zatem wykonać operację mnoże
nia macierzy boolowskich w czasie O(rt'17).
W zwykłej metodzie mnożenia macierzy boolowskich wykorzystuje się je-
dynie zmienne boolowskie. Stosując podaną adaptację algorytmu Strassena,
możemy uzyskać wynikową macierz z elementami rozmiaru n, wymagającymi
raczej całego słowa maszynowego niż pojedynczych bitów. Bardziej niepokoją
ce jest to, że wyniki pośrednie, które są liczbami całkowitymi, mogą urosnąć
do nawet większych rozmiarów. Jedną z metod zabezpieczania się przed zbyt
dużym wzrostem wyników pośrednich jest wykonywanie wszystkich obliczeń
modulo n+ 1. Zadanie 31.3-5 polega na wykazaniu, że liczenie modulo n+ l
nie ma wpływu na poprawność algorytmu.
Ciała
Pierścień (S, EB, 0, O,I) nazywamy ciałem, jeśli spełnia on dwie dodatkowe
własności.
837
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
Przykładem ciała mogą być liczby rzeczywiste (R, +,·,O, 1), zespolone
(C, +,·,O, I) lub liczby całkowite modulo liczba pierwsza p (Zp, +,·,O, 1).
Ponieważ w ciałach istnieje element odwrotny, możliwe jest więc dzielenie.
Mamy też do dyspozycji przemienność. Zawężając uwagę z quasi-pierścieni do
pierścieni, Strassen był w stanie zmniejszyć czas potrzebny do pomnożenia
macierzy. Ponieważ elementy macierzy często należą do jakiegoś ciała - na
przykład liczb rzeczywistych - można by mieć nadzieję, że używając ciał za-
miast pierścieni w rekurencyjnym algorytmie typu Strassena, będzie można ten
• ••
czas Jeszcze poprawie.
To podejście nie wydaje się jednak zbyt owocne. W rekurencyjnym al-
gorytmie typu „dziel i zwyciężaj" macierze na każdym poziomie rekursji muszą
tworzyć ciało. Niestety naturalne uogólnienie na ciała twierdzenia 31.7 oraz
wniosku 31.8 nie jest prawdziwe. Dla n> 1 zbiór macierzy n x n nigdy nie jest
ciałem, nawet gdy są one zbudowane nad ciałem. Mnożenie macierzy n x n nie
jest bowiem przemienne, a dla wielu macierzy n x n nie istnieją macierze od-
wrotne. Lepsze algorytmy mnożenia macierzy są więc raczej oparte na teorii
pierścieni, a nie na teorii ciał.
ZADANIA
* 31.3-1. Czy algorytm Strassena działa nad strukturą algebraiczną (Z [x], +, ·,
O, 1), gdzie Z [x] jest zbiorem wszystkich wielomianów zmiennej x o współ
czynnikach całkowitych, a + oraz· są zwykłymi operacjami dodawania
i mnożenia wielomianów?
* 31.3-2, Wytłumacz, dlaczego algorytm Strassena nie działa nad zamkniętymi
półpierścieniami (patrz podrozdz. 26.4) ani nad boolowskim quasi-pierś
cieniem ({O,!}, v, A, O, 1).
* 31.3-3, Udowodnij twierdzenie 31.7 i wniosek 31.8.
*31.3-4. Pokaż, że boolowski quasi-pierścień ({O, l}, v, A, O, 1) nie da się
rozszerzyć do pierścienia. Innymi słowy, pokaż, że nie jest możliwe doda-
nie elementu ,, -1" do quasi-pierścienia w taki sposób, by uzyskana struk-
tura algebraiczna utworzyła pierścień.
31.3-5. Udowodnij, że jeśli wszystkie obliczenia w algorytmie z twierdzenia
31.10 są wykonywanemodulo n+ 1, to algorytm cały czas działa popraw-
•
nie.
31.3-6. Pokaż, jak efektywnie wykazać, czy dany graf nieskierowany zawiera
trójkąt (zbiór trzech parami sąsiednich wierzchołków).
838
31.4. ROZWIĄZVWANIE UKŁAD0W ROWNAN LINIOWYCH
... a,. x, b,
... a, • x, b,
• •
Ax=b (31.18)
839
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
(31.19)
X= (A-'A)x
= A-'(Ax)
= A-'(Ax)
= (A · 0A)x'
= x'
W tym podrozdziale zajmiemy się głównie przypadkiem, w którym ma-
cierz A jest nieosobliwa lub - co jest równoważne (zgodnie z twierdzeniem
31.1) - rząd A jest równy liczbie niewiadomych n. Istnieją jednak inne moż
liwości, które zasługują na krótkie omówienie. Jeśli liczba równań jest mniejsza
niż liczba niewiadomych n - lub mówiąc bardziej ogólnie, rząd A jest mniejszy
niż n - to układ nazywamy podokreślonym. Podokreślony układ równań ma
zazwyczaj nieskończenie wiele rozwiązań (patrz zad. 31.4-8), choć może nie
mieć w ogóle rozwiązań, gdy równania są sprzeczne. Jeśli liczba równań prze-
kracza liczbę niewiadomych n, to układ jest nadokreślony i może nie mieć
żadnych rozwiązań. Znajdowanie dobrych przybliżeń rozwiązań nadokreślo
nych układów równań liniowych jest ważnym problemem., który rozważamy
w pod.rozdz. 31.6.
Wróćmy teraz do problemu rozwiązywania układu n równań z n niewiado-
mymi postaci Ax = b. Jednym z możliwych podejść jest obliczenie A- 1 , a na-
stępnie pomnożenie obydwu stron przez A- 1 , co da nam A- 1 Ax = A- 1 b, tj.
x = A- 1 b. To podejście prowadzi niestety do numerycznej niestabilności: błędy
w 2aokrągleniach kumulują się nadmiernie, kiedy używamy reprezentacji
zmiennoprzecinkowej zamiast idealnych liczb rzeczywistych. Na szczęście ist-
nieje inna metoda - rozkład LUP - która jest nwnerycznie stabilna i ma po-
nadto tę zaletę, że jest około 3 razy szybsza.
(31.20)
840
31.4. ROZWJĄZVWANIE UKŁADÓW RÓWNAŃ LINIOWYCH
gdzie
• L jest jednostkową macierzą trójkątną dolną,
• U jest macierzą trójkątną górną,
• P jest macierzą permutacyjną.
Macierze L, U i P spełniające równanie (31.20) nazywamy rozkładem LUP
macierzy A. Pokażemy, że dla każdej nieosobliwej macierzy A istnieje taki
rozkład.
Zaletą obliczania rozkładu LUP dla macierzy A jest to, że układy równań
liniowych można rozwiązywać o wiele łatwiej, gdy macierze są trójkątne, tak
jak w przypadku macierzy L i U. Po znalezieniu rozkładu LUP macierzy
A możemy rozwiązać równanie (31.18) Ax = b, rozwiązując wyłącznie układy
równań liniowych, w następujący sposób. Mnożąc obydwie strony Ax = b
przez P, otrzymujemy równoważne równanie PAx = Pb, które zgodnie z wy~
nikiem zad. 31.1~2 sprowadza się do permutacji równań (31.17). Korzystając
z naszego rozkładu (31.20), dostajemy
LUx-Pb
Ly-Pb (31.21)
Ux=y (31.22)
Ax = p- 1 LUx
= p-1Ly
= p-lpb
-b
Naszym następnym krokiem jest pokazanie, jak działa podstawianie do
przodu i do tyłu, i rozwiązanie samego problemu rozkładu LUP.
841
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
Y, = b!!:(l]
l21Y1+ Y2 = bJ<(l]
l31Y1+ /32)'2 + YJ = b,.[JJ
•
= b11:(n]
Jest rzeczą oczywistą, że rozwiązanie dla y 1 otrzymujemy wprost, gdyż
w pierwszym równaniu jest y 1 = bq 11. Po znalezieniu y 1 możemy podstawić
jego wartość do drugiego równania, otrzymując
Y2 = b„c21- l21Y1
Następnie możemy podstawić wartości y 1 i y 2 do trzeciego równania, co da
nam
y 1 = b„r,i - L IJJyi
i"' 1
Podstawianie do tylu jest podobne do podstawiania do przodu. Dla da-
nych U i y rozwiązujemy n-te równanie i działamy wstecz, aż dojdziemy do
pierwszego równania. Tak jak podstawianie do przodu, proces ten wymaga
czasu 0(n 2 ). Ponieważ macierz U jest trójkątna górna, możemy zapisać układ
(31.22) jako
Un,,.X„ Yn
31.4. ROZWIĄZVWANIE UKŁADÓW RóWNAN LINIOWYCH
•
•
lub ogólnie
LUP-SOLVE(L,U, n, b)
1 n+-rows[L]
2 fori+-lton
i-1
5 do x,-(Y,
- I u,,x,)/u„
)"'l+l
6 return x
1 2 O 0,1
3 5 4 X - 12,5
5 6 3 10,3
843
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
w którym
I 2 o
A- 3 5 4
5 6 3
0,1
b- 12,5
10,3
i szukamy niewiadomej x. Rozkład LUP jest następujący:
1 o o
L- 0,6 1 o
0,2 0,571 l
5 6 3
U= O 1,4 2,2
O O -1,856
oo l
P- O l O
l o o
(Można sprawdzić, żePA= LU). Używając podstawienia do przodu, rozwią
zujemy Ly = Pb ze względu na y:
l o o Y, 10,3
0,6 I o Y, 12,5
0,2 0,571 1 Y, 0,1
otrzymując
10,3
6,32
-5,569
844
31.4. ROZWIĄZVWANIE UKŁADÓW RÓWNAŃ LINIOWYCH
5 6 3 x, 10,3
O 1,4 2,2 x, 6,32
O O -1,856 x, -5,569
0,5
-02
'
3,0
Obliczanie rozkładu LU
Pokazaliśmy, źe jeślidokonamy rozkładu LUP danej nieosobliwej macierzy A,
to za pomocą podstawień do przodu i do tyłu możemy rozwiązać układ rów-
nań liniowych Ax = b. Pozostaje pokazać, jak w sposób efektywny otrzymać
rozkład LUP macierzy A. Zaczynamy od przypadku, w którym A jest nieosob-
liwą macierzą n x n, a macierz P jest niepotrzebna (czyli P = 111). W tym przy-
padku musimy znaleźć rozkład A= LU. Macierze Li U nazywamy rozkładem
LU macierzy A.
Metoda, jaką przeprowadzamy rozkład LU, jest nazywana eliminacją
Gaussa. Zaczynamy od odjęcia wielokrotności pierwszego równania od pozo-
stałych równań w ten sposób, że pierwsza zmienna zostanie z nich usunięta.
Z kolei odejmujemy wielokrotności drugiego równania od trzeciego i kolejnych
tak, by spowodować usunięcie z nich drugiej zmiennej. Postępujemy w ten
sposób tak długo, aż układ, który pozostanie, będzie miał postać trójkątną
górną- będzie to w rzeczywistości macierz U. Macierz L powstaje z czynników
mnożących wiersze, które powodują eliminację zmiennych.
Nasz algorytm implementujący tę strategię jest rekurencyjny. Chcemy
skonstruować rozkład LU dla macierzy A wymiaru n x n. Jeśli n= 1, to skoń
czyliśmy pracę, gdyż możemy wybrać jako L = 11 i jako U= A. Dla n> 1
dzielimy A na cztery części:
-(allWT)
V A'
gdzie v jest wektorem kolumnowym wymiaru (n - 1), wT jest wektorem wier-
szowym wymiaru (n - 1), a A' jest macierzą (n - 1) x (n - 1). Następnie, ko-
rzystając z praw algebry macierzy (sprawdź te równości, wykonując odpowied-
nie mnożenia), możemy rozłożyć A na
A-("''wT)
A'
V
= ( v/a11 1 O ) ("''
ln-1 O
(31.23)
nazywamy resztą
Scbura macierzy A ze względu na a 11 .
Następnie rekurencyjnie znajdujemy rozkład LU reszty Schura. Załóżmy, że
gdzie L' jest jednostkową macierzą trójkątną dolną, a U' jest macierzą trójkąt
ną górną. Następnie, korzystając z praw algebry macierzy, otrzymujemy
A-(-
I
v/a11 o ) ("''O
In-1
WT)
O ) ("''O L'U'
- ( v/aI 11 ln-l
Q)
L'
(a WT)
11
O U'
8~4~6------------------------
31.4. ROZWIĄZVWANIE UKŁADÓW RÓWNAŃ LINIOWYCH
LU-DECOMPOSITION(A)
1 n+-rows[A]
2 fork+-1 ton
3 do Uu+-au
4 fori+-k+lton
5
6 U11 +- akl
7 fori+-k+lton
8 doforj+-k+l ton
9
10 return Li U
Zewnętrzna pętla for, zaczynająca się w wierszu 2, wykonuje się raz dla każ
dego kroku rekursji. Wewnątrz tej pętli w wierszu 3 jest określany element
------------------ -----~=
847
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
osiowy jak.o «.1:.1:= au· W pętli for w wierszach 4-6 (do której nie wchodzimy,
gdy k = n) wektory v i wT są użyte do wypełnienia macierzy L i U. Elementy
wektora v są określone w wierszu 5 (v1 jest przechowywane w lik), a elementy
wektora wT są określone w wierszu 6 (wf jest przechowywane w u1a).Elementy
reszty Schura są liczone w wierszach 7-9 i przechowywane w macierzy A. Po-
nieważ wiersz 9 jest trzykrotnie zagnieżdżony, LU-DECOMPOSITION działa
w czasie 9(n 3 ) •
2 3 I 5
6 13 5 19
•3
3 l
4 7
•
5
4
2 J
,Je,·•· '
'
I
5
2
'
•
3
I
.l
4
4
I 5
2 4
2 19 10 23 I 16 9 18 I 4
4 10 l l 31 2 4 9 21 7
• 1 7 17 2 l
(•) (b) ( <.:) (d)
2 3 I 5 I o o o 2 3 l 5
6 13 5 19 3 l o o o 4 2 4
•
2 19 IO 23 l 4 l o o o I 2
4 IO Il 31 2 I 7 I o o o 3
A L u
(,)
Rys. 31.1. Ilustracja działania procedury LU-DECOMPOSTilON (a) Macierz A. (b) Element a 11 = 2
zaznaczony na cz.am.o jest osiowy, zaciemniona kolumna to v/a1i, a zaciemniony wiersz - wT.
Elementy U obliczone dotychczas są. powyżej linii poziomej, a elementy L - na lewo od linii
pionowej. Macierz reszty Schura A' - v.,,l"/a 11 zajmuje prawą dolną aęść. (c) Działamy teraz na
macierzy reszty Schura utworzonej w podpunkcie (b). Element a 22 = 4 zaznaczony na czarno jest
osiowy, a zacieniowane wiersze i kolumny to odpowiednio v/a22 i wT (pochodzące z podziału
reszty Schura). Linie dzielą macierz na dotychczas obliczone elementy U (powyżej), elementy
L (z lewej) i nową resztę Schura (część prawa dolna). (d) Nutępny krok kończy rozkład (element 3
w nowej reszcie Schura staje się częścią U, gdy proces się kończy). (e) Rozkład A = LU
848
31.4. ROZWIĄZVWANIE UKŁADÓW RÓWNAŃ LINIOWYCH
QA -("••
V
w')
A'
QA -("•• w')
V A'
( I
= v/0 O)("••
11 J"-_1 O
Reszta Schura A' - vwT/011 jest nieosobliwa, bo gdyby tak nie było, to wy-
znacznik: drugiej macierzy w ostatniej równości byłby równy O, zatem wyznacz-
nik A też byłby równy O, co znaczyłoby, że reszta jest osobliwa. Przeczy to
założeniu, że A jest nieosobliwa. Postępując tak konsekwentnie, możemy in-
dukcyjnie znaleźć rozkład LUP dla reszty Schura, jednostkową macierz trój-
kątną dolną L', macierz trójkątną górną U' i macierz permutacyjną P' takie, że
849
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
2.defmiujmy
PA=(~
;,) QA
= (~ ;,) (.1:,1
= (P'v:a
0) (•11
P' O A'- vwT/a WT )
11 11
= (P'v:a
0
J,,_1
11
) (••1
o P'(A'
- vwr/a
WT
11 )
)
0 ) (••1WT)
= (P'v:a
JPl-1
11 0 L'U'
= (P'v:a
0)
(a,
11
WT)
L' O
1
U'
=LU
850
31.4. ROZWIĄZYWANIE UKŁADÓW RÓWNAŃ LINIOWYCH
jeśli i> j
jeśli i~j
LUP-DECOMPOSITION(A)
1 n+-rows[A]
2 fori+-1 ton
3 dox[i]+-i
4 fork+-1 ton
5 dop+-0
6 łori+-kton
7 do if !a,.!> p
8 tbeo p +- laik!
9 k'+-i
10 ifp-0
11 tben error „macierz osobliwa"
12 zamień n[k] - 1t[k1
13 fori+-lton
14 do zamień a1c 1+-+a.t'i
15 fori+-k+lton
16 do all+- all/a"
17 forj+-k+lton
18 do a11+- aiJ - au:.a"i
851
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
2 3 4 -2 2 o l ,6 -3,2
4
o
_, 5
-2
4
3,4 _,
2 l o 2 0,6 l 0,4 --0,2
4 -2 3,4 -I 4 4,2 --0,6
(a) (b) (c)
5 5 4 2 3 5 5 4 2 3 5 5 4 2
0,6 o l ,6 -3,2 I 0,4 l 0,4
0,4
--0,2 •-I
(d)
0,4
4,2
--0,2
--0,6
2
4
0,6
--0,2 4,2 --0,6
2
4 4 --0.5
(c) IO
-l 5 5 4 2 3 5 5 4 2 3 5 5 4 2
0,4 -2
o - ..
2 0,4 --0,2 l 0,4 -2 0,4 --0,2 l 0,4 -2 0,4 --0,2
3 0,6 o l ,6 -3,2 4 --0,2 0,5 4 --0,2 0,5
'"'
o '
4 --0,2 0,5
(g)
-5 2 0,6 o
(h)
2 0,6
(i)
o
•'
'
-3
oo[ o 2 o o o o
[ o o o
ooo[
3 3
2
3 -2
4 2
0,6
=
[
0,4 1 o o
o
''
o -2
o o
4 2
0,4 --0.2
4 --0,5
o1 oo ''
-l -2 3,4 -1
--0,2
0,6
0,5
o
1
0,4 1 o o o -3
p A L u
Gł
ZADANIA
31.4--1.Rozwiąż równanie
852
31.5. ODWRACANIE MACIERZV
} Q Q X1 3
4 I o X2 14
-6 5 I X3 -7
4 -5 6
8 -6 7
12 - 7 12
J 5 4 X1 12
2 0 3 X2 9
5 8 2 x3 5
31.5. Odwracaniemacierzy
Choć w zastosowaniach praktycznych do rozwiązywania układów równań li-
niowych nie używa się z reguły operacji odwracania macierzy, wybierając za-
miast nich techniki bardziej stabilne numerycznie, takie jak rozkład LUP,
czasami zachodzi jednak potrzeba odwrócenia macierzy. W podrozdziale tym
853
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
A.Xi= e,
oddzielnie ze względu na X 1• Każdy z n wektorów X 1 może być znaleziony
w czasie 0(n 2 ); obliczenie X z rozkJadu LUP macierzy A. zajmuje więc 0(n 3)
czasu. Ponieważ rozkład LUP macierzy A można wykonać w czasie 0(n 3 ),
macierz A- 1 odwrotna do A może więc zostać obliczona w czasie 0(n 3 ).
854
31.5. ODWRACANIE MACIERZV
TwlERDZENIE 31.11. (Mnożenie macierzy nie jest trudniejsze niż icb odwracanie)
Jeśli możemy odwrócić macierz n x n w czasie /(n), gdzie J(n) = !l(n 2 ) i l(n)
spełnia warunek regularności /(3n) = O(I(n)), to możemy pomnożyć dwie maM
cierze n x n w czasie O(I(n)).
DOWÓD
Niech A i B oznaczają macierze n x n, których iloczyn C chcemy obliczyć.
Definiujemy macierz D wymiaru 3n x 3n w sposób następujący:
I" A O
D- O I. B
o o r.
Macierzą odwrotną do D jest
I. -A AB
1
D- = O I" -B
O O In
możemy więc obliczyć iloczyn AB, biorąc prawą górną pod.macierz macierzy
D- 1wymiaru n x n.
Macierz D możemy obliczyć w czasie 9(n 2
) = O(I(n)) i odwrócić ją w czaM
sie 0(/(3n)) = O(l(n)), zgodnie z warunkiem regularności nałożonym na ](n).
Mamy więc
M(n) - O(l(n))
•
Zauważmy, że I(n) spełnia warunek regularności, kiedy tylko wartości I(n)
nie „skaczą" za dużo. Na przykład, jeśli J(n) = S(n' lg' n) dla dowolnych staM
łych c > O, d ~ O, to I(n) spełnia warunek regularności.
855
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
M(n) = O(M(n + k)) dla O.; k.; n i M(n/2).; cM(n) dla pewnej stałej c.; 1/2,
to możemy odwrócić dowolną rzeczywistą macierz nieosobliwą n x n w czasie
O(M(n)).
Dowoo
Można mlożyć, że n jest dokładną potęgą 2, gdyż mamy
A = (A-,
0)- o) 1
(Olt O ft
A=(~
~) (31.25)
Następnie przyjmując
(31.26)
(31.27)
(CB- 1) • er
s- 1 • (CB- 1)
856
31.5. ODWRACANIE MACIERZV
•
Udowadniając twierdzenie 31.12, otrzymaliśmy nowy sposób rozwiązywa
nia równania Ax = b bez osiowania, jeśli tylko macierz A jest nieosobliwa.
Mnożąc obie strony równania przez AT, otrzymujemy (ATA)x =Arb.To prze-
kształcenie nie prowadzi do błędu, gdyż AT jest odwracalna, możemy więc
rozłożyć symetryczną macierz dodatnio określoną ATA, obliczając dla niej roz-
kład LU. Następnie wystarczy użyć podstawiania do przodu i do tyłu, żeby
znaleźć x, biorąc jako prawą stronę ATb. Choć metoda ta jest teoretycznie
poprawna, do praktycznych zastosowań lepsza jest procedura LUP-DECOM-
POSITION. Wymaga ona mniejszej o stały czynnik liczby operacji i ma nieco
lepsze własności numeryczne.
857
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
ZADANIA
LEMAT31.13.
Każda symetryczna macierz dodatnio określona jest nieosobliwa.
858
31.6. SYMETRYCZNE MACIERZE DODATNIO 0KRE$LONE I METODA ...
DOWÓD
Załóżmy, że macierz A jest osobliwa. Wówczas zgodnie z wnioskiem 31.3 ist-
nieje niezerowy wektor x tak.i, że Ax = O. Zatem xT Ax = O, macierz A nie
może więc być dodatnio określona.
•
Dowód, że można przeprowadzić rozkład LU symetrycznej macierzy do-
datnio określonej A bez dzielenia przez O, jest bardziej skomplikowany. Za-
czynamy od udowodnienia pewnych własności podmacierzy macierzy A. Zdefi-
niujmy w tym celu k-tą główną podmacierzmacierzy A jako macierz A1.zawie-
rającą przecięcie pierwszych k wierszy i k kolumn macierzy A.
LEMAT31.14.
JeśliA jest symetryczną macierzą dodatnio określoną, to każda główna pod-
macierz macierzy A jest również symetryczna i dodatnio określona.
DOWÓD
To, że każda główna podmacierz macierzy A1.jest symetryczna, jest oczywiste,
By udowodnić, że macierz A1.jest dodatnio określona, załóżmy, że x jest nieze-
rowym wektorem kolumnowym wymiaru k i niech podział macierzy A wyglą
da następująco:
Następnie otrzymujemy
•
Zwrócimy teraz uwagę
na pewne zasadnicze własności reszty Schura. Niech
A będzie symetryczną macierzą dodatnio określoną i niech A1.będzie główną
podmacierzą wymiaru k x k macierzy A. Dzielimy A w sposób następujący:
859
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
A=(i~) (31.28)
(31.29)
DOWÓD
Symetria macierzy Swynika z zad. 31.1-7. Pozostaje wykazać, że Sjest macierzą
dodatnio określoną. Rozważmy podział macierzy A dany równaniem (31.28).
Zgodnie z założeniem, dla dowolnego niezerowego wektora x, mamy
xT Ax > O.Podzielmy wektor x na dwa podwektory y i z pasujące odpowiednio
do A" i C. Ponieważ Ał 1 istnieje, dostajemy
(31.30)
860
31.6. SYMETRYCZNE MACIERZE DODATNIO 0KRE$LONE I METODA ...
Dla dowolnego z #:-O mamy więc zTSz = xT Ax > O, a zatem S jest macierzą
dodatnio określoną.
•
WNIOSEK31.16.
Rozkład LU symetrycznych macierzy dodatnio określonych nigdy nie prowa-
dzi do dzielenia przez O.
DOWÓD
Niech A będzie symetryczną macierzą dodatnio określoną. Udowodnimy fakt
silniejszy niż teza wniosku: każdy element osiowy jest dodatni. Pierwszy ele-
ment osiowy jest równy a 11 . Niech e 1 będzie pierwszym wektorem jednostko-
wym, zatem a 11 = e[Ae 1 >O.Ponieważ pierwszy krok rozkładu LU daje nam
resztę Schura macierzy A ze względu na A 1 = (a 11 ), z lematu 31.15 wynika
więc przez indukcję, że wszystkie elementy osiowe są dodatnie.
•
Metoda najmniejszych kwadratów
Dopasowywanie krzywych do danego zbioru punktów jest ważnym zastoso-
waniem macierzy symetrycznych dodatnio określonych. Niech dany będzie
zbiór m punktów
"
l'{x) = L c,f;(x)
i"' 1
861
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
••• f.(x,)
••• f.(x,)
A= • • •
•
•
•
• •
=
•••
F(x,J
17=Ac-y
862
31.6. SYMETRYCZNE MACIERZE DODATNIO OKRESLONE f METODA ...
Ponieważ
11~11'
- IIAc - YII'- ,f,(;±:,,
c1-Y,)'
możemy zminimalizować llrrll,różniczkując 11'111
2
ze względu na każde ck, a na-
stępnie przyrównując wyniki do zera:
(31.32)
(Ac - y)TA - O
AT(Ac-y)-0
co implikuje
(31 .33)
(31.34)
gdzie macierz A+= ((ATA)- 1 AT) nazywamy macierzą pseudoodwrotną macie-
rzy A. Pseudoodwrotność jest naturalnym uogólnieniem pojęcia macierzy od-
wrotnej do przypadku, w którym A nie jest kwadratowa (porównaj równanie
863
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
l x, xł l -1 l
l x, xl l 1 l
A= l x, xl l 2 4
1 x. xi 1 3 9
1 x, xl 1 5 25
1,200
C = -0,757
0,214
864
31.6. SYMETRYCZNE MACIERZE DODATNIO OKRE$LONE I METODA ...
3,0
2,5
0,5
- l-------+-----"o"o-----1-----1--- ----'---- ~ X
-2 -1 O 1 2 3 4 5
ZADANlA
31.6-1. Udowodnij, że każdy element diagonalny symetrycznej macierzy do·
datnio określonej jest dodatni.
31.6-,2. Niech A=(: ~) będzie symetryczną macierzą 2 x 2 dodatnio okreś·
loną.
Udowodnij, że jej wyznacznik. ac - b2 jest dodatni, .,uzupełniając
kwadrat" w podobny sposób do tego użytego w dowodzie lematu 31.15.
31.6-,3. Udowodnij, że największy element w symetrycznej macierzy dodatnio
określonej leży na przekątnej.
31.6-4. Udowodnij, że wyznacznik każdej głównej pod.macierzy macierzy sy·
metrycznej dodatnio określonej jest dodatni.
31.6-S. Niech A1: oznacza k·tą główną pod.macierz symetrycznej macierzy
A dodatnio określonej. Udowodnij, że det(A1:)/det(A1:-1 ) jest k·tym ele·
mentem osiowym podczas rozkładu LU, przyjmując, że det(A0 ) = l.
31.6-6. Znajdź funkcję postaci
865
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
(AA+)r = AA+
(A+A)T=A+A
Problemy
31-1. Algorytm Shamira mnożenia macierzy boolowskich
W podrozdziale 31.3 zauważyliśmy, że algorytm Strassena mnożenia macierzy
nie może być użyty bezpośrednio do mnożenia macierzy boolowskich, ponie-
waż boolowski quasi-pierścień Q = ({O, I}, v, A, O, 1) nie jest pierścieniem.
Twierdzenie 31. l Owskazuje wszakże, że jeśli użyjemy wyłącznie operacji aryt-
metycznych na słowach O(lgn)-bitowych, to możemy zastosować metodę
Strassena do mnożenia macierzy boolowskich n x n w czasie O(rł 21 ). W tym
miejscu zajmiemy się metodą probabilistyczną, w której stosuje się wyłącznie
operacje na bitach, żeby otrzymać prawie tak samo dobre ograniczenie, ale
z małym prawdopodobieństwem błędu.
(a) Pokaż, że R ~ ({O, I}, (l), A, O, 1), gdzie (l) oznacza funkcję XOR (różnicę
symetryczną), jest pierścieniem.
866
PROBLEMY
1 -1 o o o
-1 2 -1 o o
A- o -1 2 -1 o
o o -1 2 -1
o o o -1 2
f(x,) - f,(O) - Y,
867
ROZDZIAŁ 31. OPERACJE NA MACIERZACH
(a) Załóżmy, że dla i= O, 1, ..., n mamy dane nie tylko pary punkt~wartość
{(x;, yJ}, ale też pierwsze pochodne D 1 =f'(x 1) w każdym węźle. Wyraź
wszystkiewspółczynnikia 1 , b1, c1 orazd1 zapomocą wartościy 1 ,Y 1 + 1 , D 1iD;+ 1
(pamiętaj, że x 1 = r). Jak szybko można obliczyć 4n współczynników na
podstawie par punkt~wartość i pierwszych pochodnych?
Pozostaje problem, jak wybrać pierwsze pochodne f(x) w węzłach. Jedna z me-
tod polega na wymaganiu, by drugie pochodne były ciągłe w węzłach:
(31.35)
(c) Pokaż, że
(31.37)
(d) Przepisz równania (31.35)-(31.37) jako równanie macierzowe z szukanym
wektorem D = (D 0 , D 1 , ... , D.,). Jakie cechy ma macierz w tym równaniu?
(e) Wykaż, że zbiór n + 1 par punkt-wartość może zostać przybliżony za po-
mocą naturalnej krzywej sklejanej trzeciego stopnia w czasie O(n) (patrz
problem 31-2).
(f) Pokaż, jak określić naturalną krzywą trzeciego stopnia interpolującą n + 1
punktów (x 1, y 1) takich, że x 0 < x 1 < ... < x.,, nawet gdy X; nie jest koniecz-
nie równe i. Jakie równanie macierzowe musi zostać rozwiązane i jak szyb-
ko działa algorytm?
868
UWAGI DO ROZDZIAŁU
Uwagi do rozdziału
Wielomianyi FFT
Wielomiany
Wielomian zmiennej x nad ciałem F to funkcja A(x), którą można przedstawić
jako
·-'
A(x) - L a;x'
j.o o
·-'
A(x) - L a;x;
j= o
870
ROZDZIAŁ 32. WIELOMIANY 1 FFT
oraz
,-1
B(x) - L,b1xl
j =o
to
,-1
C(x) - L,c1x'
j=O
6x 3 + 7x' 10x + 9
2x 3 + 4x 5
30x 3 35x2 + 50x 45
24x" + 28x 3 40x 2 + 36x
-12x
.
6
---
-14x 5
--
+20x
- - -
4
- 18x3
- -- .. ----------
-12.x 6
-
5
l4x +44x4 20x 3 75x 2 + 86x 45
Innym sposobem przedstawienia iloczynu C(x) jest
2n- 2
C(x) - L, c1 od (32.1)
j=O
gdzie
I
ci = L a1r.bJ-1r. (32.2)
Ir.= o
ograniczenie-stopnia(C) = ograniczenie-stopnia(A) +
+ ograniczenie-stopnia(B) - 1
ograniczenie-stopnia(A) +
::s.;;
+ ograniczenie-stopnia(B)
871
ROZDZIAŁ 32. WIELOMIANY I FFT
Zawartość rozdziału
Reprezentacjaprzezwspółczynniki
872
32.1. REPREZENTACJA WIELOMIANÓW
873
ROZDZIAŁ 32. WIELOMIANY I FFT
TwIERDZENIE
32.1. (Jednoznaczność wielomianuinterpolacyjnego)
Dla dowolnego zbioru {(x 0, y 0), (x 1, y 1), ... , (xn-l• Yn-i)} złożonego z n par
punkt-wartość istnieje dokładnie jeden wielomian A(x) o ograniczeniu stop-
nia n tak.i, że y 1 = A(x 1 ) dla k = O, 1, ..., n -1.
DOWÓD
Dowód opiera się na istnieniu odwrotności pewnej macierzy. Równanie (32.3)
jest równoważne z równaniem macierzowym
I x, Xi •••
.xi-1 a, Yo
x,
-
I xl ~-1 a,
••• Y,
• • • • • • (32.4)
• • • •
• • • • • • •
I Xn-1 '
Xn-1 ••• x:-'
·-' an- 1 Yn-1
zatem na mocy twierdzenia 31.5, jeśli xt są różne, to jest ona odwrac.alna (to
znaczy nieosobliwa). Współczynniki a1 można więc wyznaczyć jednoznacznie
na podstawie reprezentacji przez wartości w punktach:
•
Dowód twierdzenia 32.1 opisuje algorytm interpolacji polegający na rozwią
zaniu układu (32.4) równań liniowych. Korzystając z algorytmu rozkładu LU
opisanego w rozdz. 31, możemy rozwiązać ten układ równań w czasie O(n3 ).
Szybszy algorytm interpolacji w n punktach opiera się na wzorze La-
grange'a:
A(x) -
.-,
"
L. Y,
t=O
.•.
CT(x-x
n'-(--
X1
- X)
)
1)
(32.5)
j,,;.l
874
32.1. REPREZENTACJA WIELOMIANÓW
oraz wielomianu B
{(xo, Yo+ YO), (x1, Y1 + yJ.), ···, (x,._ 1, Y,.-1 + Y~- 1)}
Czas dodawania dwóch wielomianów o ograniczeniu stopnia n, zadanych
przez wartości w punktach, wynosi zatem 0(n).
Reprezentacja przez wartości w punktach jest równie dogodna do mnoże
nia wielomianów. Jeśli C(x) = A(x)B(x), to C(xJ = A(x.1c)B(xJw każdym pun-
więc w celu otrzymania reprezentacji przez wartości w punktach wielo-
kcie X.1c,
mianu C możemy w każdym punkcie z osobna przemnożyć wartość wielo-
mianu A przez wartość wielomianu B. Musimy jednak uwzględnić to, że ogra-
niczenie stopnia wielomianu C jest sumą ograniczeń stopni wielomianów A i B.
Standardowa reprezentacja przez wartości w punktach dla A i B składa się
z n par punkt-wartość dla każdego wielomianu. Wymnażając wartości, do-
stajemy n par punkt-wartość dla C. Ponieważ jednak ograniczeniem stopnia
wielomianu C jest 2n, z twierdzenia 32.1 wynika, że do reprezentowania G' po-
trzebujemy 2n takich par. Musimy zatem wyjść od „rozszerzonych" reprezen-
tacji przez wartości w punktach dla A i B, z których każda będzie &ię składać
z 2n par punkt-wartość. Jeśli dane są rozszerzone reprezentacje przez wartości
w punktach dla A
t)Problem interpolacji jest bardzo subtelny pod względem numerycznej stabilności. Chociaż
opisywane tu metody są matematycznie poprawne, małe ró:znice wartości danych wejściowych lub
błędy zaokrąglenia podczas obliczeń mogą powodować duże różnice wyników.
ROZDZIAŁ 32. WIELOMIANY I FFT
oraz dla B
876
32.1. REPREZENTACJA WIELOMIANÓW
Ewaluacja Interpolacja
Czas 0(nlgn) Czas 0(nlgn)
Rys. 32.1. Graficzna ilustratja efektywnego sposobu mnożenia wielomianów. Wielomiany w górnej
części diagramu są reprezentowane przez współczynniki, a w dolnej - przez wartości w punktach.
Strzałki z lewej strony na prawą odpowiadają operacji mnożenia. Symbole w 2 • omaczają zespala~
ne pierwiastki stopnia 2n z jedności
Poniższa, korzystająca
z FFT procedura mnoży dwa wielomiany A(x)
i B(x) o ograniczeniu stopnia n w czasie 9(nlgn), przy czym wielomiany wej-
ściowe i wyjściowy są reprezentowane przez współczynniki. Zakładamy, że
n jest potęgą dwójki; warunku tego można zawsze dotrzymać, dostawiając
zerowe współczynniki przy najwyższych potęgach x.
--------------- -----------
877
ROZDZIAŁ 32. WIELOMIANY 1 FFT
TwIERDZENIE32.2.
Iloczyn dwóch wielomianów o ograniczeniu stopnia n można obliczyć w czasie
0(nlgn), przy czym wielomiany wejściowe i wyjściowy są reprezentowane
przez współczynniki.
•
ZADANIA
32.1-1. Pomnóż wielomiany A(x) = 7x 3 - x 2 + x - 10 i B(x) = 8x 3 - 6x + 3,
stosując równania (32.1) i (32.2).
32.1-2. Ewaluacji wielomianu A(x) o ograniczeniu stopnia n w danym punkcie
x 0 można również dokonać, dzieląc A(x) przez wielomian (x - x 0 ) i otrzy-
mując jako iloraz wielomian q(x) o ograniczeniu stopnia n - 1 oraz resztę
r, takie że
A(x) - q(x)(x - x 0 ) +r
Widać, że A(x 0 ) = r. Pokaż, jak obliczać resztę r i współczynniki ą(x)
w czasie E>(n),mając x 0 i współczynniki wielomianu A.
32.1-3. Wyprowadź reprezentację przez wartości w punktach wielomianu
,-1
A""'(x) = L a,._ _ixi 1 z reprezentacji przez wartości w punktach wielo-
i"' o ,-1
mianu A(x) = L a1xj, przy założeniu, że żadnym z punktów nie jest O.
i"" o
32.1-4. Pokaż, jak korzystając
ze wzoru (32.5), wykonywać interpolację w cza-
sie 0(n 2 ). (Wskazówka: Oblicz najpierw fL(x- x,1)i fL(x 1 - x.J, a na-
stępnie obliczaj poszczególne składniki, dzieląc przez (x - xt) i (xi - x.J.
Patrz zad.32.1-2).
32.1-5. Wyjaśnij, dlac;Lego błędna jest „oczywista" metoda dzielenia wielomia-
nów w reprezentacji przez wartości w punktach. Rozpatrz oddzielnie przy-
padek, w którym otrzymuje się dokładny wynik dzielenia, i przypadek
przeciwny.
32.1-6. Rozważmy dwa zbiory A i B, każdy zawierający po n liczb całkowitych
z przedziału od O do IOn. Chcemy obliczyć sumę kartezjańską zbiorów
A i B, zdefiniowaną jako
c-(x+y:xeAiyeB)
878
32.2. DFT I FFT
w"= 1
Istnieje dokładnie n zespolonych pierwiastków n-tego stopnia z jedności; są to
liczby e 2 'łtilr:fn dla k = O, 1, ... , n - 1. Żeby zinterpretować ten wzór, skorzystamy
z definicji funkcji wykładniczej zmiennej zespolonej:
i IDi
-1
_,. ,,t
--,
Rys. 32.l. Wartości w~, w~, ..., w~ na pła.szczyżnie zespolonej, gdzie ru8 =~ 1
' jest głównym pier-
wiastkiem stopnia 8 z jedności
_____________________ __
,,
879
ROZDZIAŁ 32. WIELOMIANY I FFT
(32.7)
DOWÓD
Lemat wynika bezpośrednio ze wzoru (32.6}, ponieważ
--w, .
•
WNIOSEK
32.4.
Dla dowolnej parzystej liczby n > D zachodzi
w:12 = ro2 = -1
DOWÓD
Przeprowadzenie dowodu pozostawiamy czytelnikowi jak.o zad. 32.2-1.
•
LEMAT32.5. (Lemat o redukcji)
Jeśli n > D jest parzyste, to zbiór kwadratów n zespolonych pierwiastków
n-tego stopnia z jedności to zarazem n/2 zespolonych pierwiastków stopnia n/2
z jedności.
DOWÓD
Na mocy lematu o skracaniu mamy (ro!}2 = ro!12 dla dowolnej nieujemnaj licz-
by całkowitej k. Zauważmy, że podnosząc do kwadratu wszystkie pierwiastki
n-tego stopnia z jedności, każdy pierwiastek stopnia n/2 z jedności dostajemy
dokładnie dwa razy, ponieważ
880
32.2. DFT I FFT
=
(w!+1112)2 w;k+11
= w2kw"
" "
-- w''
"
= (ru!)2
Zatem kwadraty w! i w!+ft/l są równe. Własność tę można wyprowadzić rów~
= -1 wynika, że w!+n/2 = -w!, czyli
nież z wniosku 32.4, gdyż z tego, że w:r1.
(w!+n/2)2 = (ru!)2.
•
Jak się przekonamy, lemat o redukcji ma podstawowe znaczenie w naszej
opartej na zasadzie „dziel i zwyciężaj" metodzie przechodzenia między reprezen-
tacjami wielomianów przez współczynniki i przez wartości w punktach, ponieważ
zapewnia, że rozwiązywane rekurencyjnie podproblemy są o połowę mniejsze.
·-'
I: cw:Y
~o
j=O
DOWÓD
Ponieważ wzór (3.3) można stosować do liczb zespolonych, mamy więc
(I)' - I
Założenie, żek nie dzieli się przez n zapewnia, że mianownik jest różny od zera,
ponieważ ro! = 1 tylko wtedy, kiedy k jest podzielne przez n.
•
Dyskretna transformata Fouriera (DFT)
Przypomnijmy, że chcemy dokonać ewaluacji wielomianu
881
ROZDZIAŁ 32. WIELOMIANY I FFT
·-'
A(x) - I
j=O
a1x'
·
o ogran1czen1u · n w pun kt ac h Wn,
· st oprua O w,u 1 Wn,
2 ... , Wnn-l(t o znaczy w n ze-
spolonych pierwiastkach n-tego stopnia z jedności} 1 ). Bez straty ogólności mo-
żemy założyć, że n jest potęgą 2, ponieważ dane ograniczenie stopnia można
zawsze powiększyć - zawsze możemy w miarę potrzeb dodawać zerowe współ
czynniki przy najwyższych potęgach. Zakładamy, że wielomian A jest zadany
przez współczynniki: a= (a 0 , a 1 , ... , an_ 1 ). Zdefiniujmy wartości Y1;dla k = O,
1, ..., n - 1 wzorem
,- '
= L a1w!i (32.8)
j=O
(32.9)
882
32.2. DFT I FFT
zatem problem ewaluacji A(x) w punktach w2,w,!, ..., w:-1 sprowadza się do:
a następnie
Na mocy lematu o redukcji, lista (32.10) składa się nie z n różnych warto-
ści, ale tylko z n/2 zespolonych pierwiastków stopnia n/2 z jedności, z których
każdy występuje dokładnie dwa razy. Dokonujemy zatem rekurencyjnie ewalu-
acji wielomianów Af01 i Ar11 o ograniczeniu stopnia n/2 we wszystkich n/2
zespolonych pierwiastkach stopnia n/2 z jedności. Obydwa podproblemy są
dokładnie tej samej postaci co problem pierwotny, ale dwukrotnie mniejszego
rozmiaru. Udało nam się podzielić obliczenie n-elementowego DFT II na dwa
obliczenia n/2-elementowego DFT„ 12. Podział ten jest podstawą poniższego
rekurencyjnego algorytmu FFT, obliczającego DFT dla n-elementowego wek-
tora a = (a0 , a 1, •••, a11_ 1 ), gdzie n jest potęgą dwójki.
RECURSIVE-FFT(a)
1 n+-- length [a] t> n jest potęgą 2.
2ifn=1
3 tben return a
4 ru +-- e2«i/n
5 ru'+-- 1
6 a 101+--(a 0 , a 2 , •.. , 0 11_ 2 )
7 a r11+-- (a1, a3, ... , a"_ i)
8 yroi +-- RECURSIVE-FFT(a[Ol)
9 y[ll +-- RECURSIVE-FFT(a[ll)
10 for k+--0 to n/2 - 1
11 do Yt +-- Ylo1+ w Yl11
01 11
12 Yt+(n/2) +-- Yl - myl
13 w+--ww 11
14 returny t> y jest wektorem kolumnowym.
883
ROZDZIAŁ 32. WIELOMIANYI FFT
Ytroi= AC01(ru!,2)
Jitl = Aftl(ru!,2)
lub
Ytro1= AfOl(ru;i)
J'I''- A11\ro;')
~ A(ro!)
_ roi .t r11
Yt+(nft) -Y1: - W11Y1:
884
32.2. DFT I FFT
Yo I I I I ••• I •o
Y, I w, w' w' ••• w,,- ' a,
" "
Y, I w; w: w! •••
ro;<n-1) a,
Y, I w' w' w' •••
wl<n-1) a,
• • •
" " •
" •
"• •
•
885
ROZDZIAŁ 32. WlELOM IANY I FFT
TwlERDZENIE 32.7.
Dla j, k = O, 1, ... , n - 1 elementem na pozycji (), k) w macierzy v; 1 jest
w;kl/n.
DOWÓD
Pokażemy, że V; V11 = In, gdzie J11 jest macierzą jednostkową (identycznościo
1
·-'
1
[V; VJ)j' = L (w;ki/n)(w!i')
k=O
= ·-'
L rffńU'- J)/n
k=O
•
Znając postać macierzy odwrotnej v; 1 , wiemy, ze DFT; 1 (y) zadane
jest wzorem
(32.11)
ZADANIA
Yl = 7!'12·-'
L (a 1zi'l2)(z-(k-J)'f2)
j= o
32.3. EfektywneimplementacjeFFT
Ponieważ praktyczne zastosowania DFT, tak.ie jak przetwarzanie sygnałów,
wymagają możliwie największej szybkości działania, w tym podrozdziale oma-
wiamy dwie efektywne implementacje metody FFT. Najpierw zajmiemy się
iteracyjną wersją algorytmu FFT, działającą w czasie 0(nlgn), ale z mniejszą
wartością stałej ukrytej w notacji 0 niż implementacja rekurencyjna z pod~
887
ROZDZIAŁ 32. WIELOMIANY I FFT
IteracyjnaimplementacjaFFT
Zauważmy najpierw, że w pętli for w wierszach 10-13 procedury RECURSIVE-
-FFT wartość w!yL 1l jest obliczana dwukrotnie. Projektanci kompilatorów na-
zywają taką wartość wspólnym podwyrateniem.Możemy przekształcić pętlę
w taki sposób, żeby wartość ta była obliczana tylko raz i przechowywana
w pomocniczej zmiennej t.
y~---..---
.,:
yfl
Rys. 32.3. Operacja motylkowa. Dwie wartości wejściowe wchodzą z lewej strony, w! zostaje
pomnożone przez yp 1, a suma i różnica wychodzą z prawej strony. Rysunek można interpretował
jak.o układ arytmetyczny
888
32.3. EFEKTYWNEIMPLEMENTACJEFFT
r,,,) "'7)
Rys. 32.4. Drzewo wejściowych wektorów dla rekurencyjnych wywołali. procedury RECUR.SIVE·FFT.
W wywołaniu zewnętrznym n = S
sób. Najpierw, rozważając pary kolejnych elementów, obliczamy DFT dla każ
dej pary za pomocą pojedynczej operacji motylkowej i zastępujemy daną
parę obliczonym wynikiem. Wektor nasz składa się teraz z n/2 takich dwu-
elementowych wyników. Następnie bierzemy po dwie takie pary, obliczamy
DFT dla każdej otrzymanej w ten sposób czwórki elementów wektora za po-
mocą dwóch operacji motylkowych i zastępujemy owe dwa dwuelementowe
wyniki jednym czteroelementowym. Wektor zawiera teraz n/4 4--elementowych
wyników DFT. Postępujemy tak dopóty, dopóki wektor nie będzie składał
się z dwóch wyników DFT, każdy długości n/2, które możemy następnie po-
łączyć za pomocą n/2 operacji motylkowych w jeden wynikowy wektor DFT
o n elementach.
żeby przejść od tej obserwacji do kodu, użyjemy tablicy A [O.. n - l],
zawierającej początkowo elementy wejściowego wektora a w kolejności, w ja-
kiej występują one w liściach drzewa na rys. 32.4. (Pokażemy później, jak
wyznaczyć ową kolejność). Ponieważ łączenie fragmentów wektora trzeba
wykonywać na każdym poziomie drzewa, wprowadzimy zmienną s przecho-
wującą numer poziomu i zmieniającą się od 1 (na dole drzewa, kiedy łączymy
pary w dwuelementowe wyniki DF"f) do lgn w korzeniu (kiedy łączymy dwa
fragmenty długości n/2, otrzymując ostateczny wynik). Algorytm ma zatem
następującą strukturę:
1 fors+-1 to lgn
2 dofork+-Oton-lby2a
3 do połącz dwa 2a- 1 --elementowe fragmenty
A[k„k+ 2•-• - I] i A[k + 2•- 1 .. k+ 2' - I]
w jeden 2'-elementowy \1/}'nikDFT w A [k .. k + 21 - I]
889
ROZDZIAŁ 32. WIELOMIANY I FFT
FFT-BASE(a)
1 n+- length [a] t> n jest potęgą 2.
2 fors+-1 to lgn
3 dom+-2a
4 (JJ +- e2,rl/m
5
•
fork+-Oton-lbym
6 doro+-1
7 forj+-Otom/2-1
8 do 1-wA[k + j+m/2]
9 u-A[k + Jl
10 A [k + J] - u + I
Il A[k+j+m/2]-u-t
12 ro+- w w.,.
lTERATIVE-FFT(a)
1 BIT-REVERSE-COPY(a, A)
2 n+- length (a] t> n jest potęgą 2.
3 fors+-ltolgn
4 dom+-2'
5 w +- e 2mfm
•
6 ro+-1
7 forJ-Otom/2-1
8 dofork+-Jton-lbym
9 dot-wA[k+m/2]
10 u-A[k]
li A[k]-u+ I
12 A[k+m/2]-u-t
13 ro+-ww.,.
14 return A
890
32.3. EFEKTYWNE IMPLEMENTACJE FFT
BIT-REVERSE-COPY(a, A)
1 n..- /ength [a]
2 fork..-Oton-1
3 do A [rev(k)] .._ a1;
891
ROZDZIAŁ 32. WIELOMIANY I FFT
- 0(nlgn)
------
a ------
"
• - w"
•
w"
'
w'-
+
•
w'
' ·• Y,
~~--~
s=3
Rys. 32.5. Układ arytmetyczny PARALLEL-FFTobliczający FFT dla fi= 8 danych wejściowych. Ety-
kiety fa.z składających się z operacji motylkowych odpowiadają iteracjom pętli zewnętrznej w pro-
cedurze FFf -BASE.FFf dla fi danych wejściowych można obliczyć za pomocą układu o głęboko
ści 0(1gn) zawierającego 0(fllgfl) bramek
892
PROBLEMY
Problemy
32-1. Mnożenie metodą „dziel i zwyciężaj"
893
ROZDZIAŁ 32. WIELOMIANY I FFT
(c) Pokaż, że dwie n-bitowe liczby całkowite można pomnożyć w O(n 1113 ) kro-
kach, przy czym w każdym kroku operujemy co najwyżej stałą liczbą bitów.
(a) Czy suma dwóch macierzy Toeplitza musi być macierzą Toeplitza? A ilo-
czyn?
(b) Opisz, jak reprezentować macierze Toeplitza, żeby dwie macierze Toeplitza
n x n można było dodawać w czasie O(n).
(c) Podaj działający w czasie O(nlgn) algorytm mnożenia macierzy Toeplitza
n x n przez wek.tor długości n. Wykorzystaj reprezentację z punktu (b).
(d) Podaj efektywny algorytm mnożenia dwóch macierzy Toeplitza n x n
i oszacuj czas jego działania.
A(x), jeśli t =o
A<tl(x)= ·f A<•-''(x), jeśli l~t~n-1
o, jeśli t ;;i: n
·-'
A(x) - L bl(x - x 0j
j=O
pokaż,
jak obliczyć A(tl(x0 ), dla t = O, I, ..., n - 1, w czasie O(n),
(b) Opisz, jak znaleźć b 0 , b 1, •.. , b,,__1 w czasie O(nlgn), mając dane
A(x 0 +w:)dlak=0, 1, ... ,n-1.
(c) Udowodnij, że
894
PROBLEMY
g(I) - {x,'/(
O,
-1)!, jeśli
jeśli
-(n-1)
1 ~/~(n-I)
~/~O
(d) Opisz, jak obliczyć A(x 0 + w~), dla k = O, 1, ..., n - l, w czasie O(nlgn).
Wyprowadź stąd wniosek, że ewaluacji wszystkich nietrywialnych pochod-
nych wielomianu A(x) w punkcie x 0 można dokonać w czasie O(nlgn).
(3x 3 + x2 - 3x + 1) mod (x 2 + x + 2) = 5x - 3
n -- 1
Mając daną reprezentację przez współczynniki wielomianu A(x) = L a1 ~
1„ o
oraz n punktów x 0, x 1 , ... , xn-l• chcemy obliczyć n wartości A(x 0 ), A(x 1), ... ,
;
A(xn- 1 ). Dla O~ i~ j ~ n - l zdefiniujmy wielomiany Pi1(x) = fi (x - x 1)
l=i
oraz Q;1{x) = A(x) mod Pu(x). Zwróćmy uwagę, że ograniczenie stopnia Q1J.x)
jest nie większe niż j - i.
895
ROZDZIAŁ 32. WIELOMIANY I FFT
Uwagi do rozdziału
Dobry opis szybkiego przekształcenia Fouriera i jego zastosowań podają Press,
Plannery, Teukolsky i Vetterling [161, 162]. Znakomite wprowadzenie w zaga-
dnienie przetwarzania sygnałów, będące popularnym obszarem zastosowań
FFT, stanowi praca Oppenheima i Willsky'ego [153].
Cooley i Tukey [51] to nazwiska, z którymi powszechnie wiąże się wynale-
zienie FFT w latach sześćdziesiątych. W rzeczywistości algorytm FF'T był już
wcześniej wielokrotnie odkrywany, ale z jego znaczenia nie zdawano sobie
w pełni sprawy w epoce poprzedzającej powstanie nowoczesnych maszyn cy-
frowych. Press, Plannery, Teukolsky i Vetterling za autorów tej metody uwa-
żają Rungego i Kóniga (1924).
Rozdział 33
Algorytmyteorioliczbowe
Teorię liczb traktowano niegdyś jako piękny, ale kompletnie bezużyteczny dział
czystej matematyki. Obecnie algorytmy teorioliczbowe znajdują szerokie zasto-
sowanie dzięki wynalezieniu systemów kryptograficznych bazujących na dużych
liczbach pierwszych. Możliwość praktycznego stosowania tych systemów opiera
się na tym, że umiemy łatwo znajdować duże liczby pierwsze, natomiast ich
bezpieczeństwo wynika z tego, iż nie potraftmy rozłożyć na czynniki iloczynu
duZych liczb pierwszych. W tym rozdziale przedstawimy nieco wiadomości
z teorii liczb i algorytmów stanowiących podstawę takich zastosowań.
W podrozdziale 33.1 wprowadzimy podstawowe pojęcia teorii liczb, jak
podzielność, przystawanie module i jednoznaczność rozkładu na czynniki.
W podroMziale 33.2 omówimy jeden z najstarszych algorytmów świata: al-
gorytm Euklidesa obliczania największego wspólnego dzielnika dwóch liczb
całkowitych. W podrozdziale 33.3 przypomnimy podstawy arytmetyki modu-
larnej, a w podrozdziale 33.4 zajmiemy się zbiorem wielokrotności danej licz-
by a modulo n i pokażemy, jak znaleźć wszystkie rozwiązania równania
ax = b (mod n), korzystając z algorytmu Euklidesa. W podrozdziale 33.5
przedstawimy chińskie twierdzenie o resztach, a w podrozdziale 33.6 rozważy
my potęgi danej liczby a modulo n i zaprezentujemy algorytm szybkiego potę
gowania, służący do efektywnego obliczania a" mod n dla danych a, b i n.
Operacja ta jest podstawą efektywnego sprawdzania, czy dana liczba jest liczbą
pierwszą. W podrozdziale 33.7 opiszemy system RSA, czyli kryptosystem
z kluczem jawnym. Z kolei w podrozdziale 33.8 przedstawimy probabilistyczny
algorytm sprawdrania, czy dana liczba jest pierwsza, którego można użyć do
efektywnego znajdowania dużych liczb pierwszych - podstawowej operacji
przy tworzeniu kluczy dla systemu RSA. Wreszcie w podrozdziale 33.9 omówi-
my prostą, ale efektywną heurystykę rozkładania na czynniki niewielkich liczb
całkowitych. Ciekawostką jest fakt, że wolelibyśmy, żeby rozkład na czynniki
897
ROZDZIAŁ 33. ALGORYTMY TEORl0LICZB0WE
Podzielność i dzielniki
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, ...
(Celem zad. 33.1-1 jest wykazanie, że liczb pierwszych jest nieskończenie wie-
le). Liczbę całkowitą a> I, która nie jest liczbą pierwszą, nazywamy liczbą
złożoną. Na przykład 39 jest liczbą złożoną, bo 3 l 39. Liczba 1 nie jest
ani liczbą pierwszą, ani złożoną, podobnie jak O i wszystkie ujemne liczby
całkowite.
899
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
900
33.1. PODSTAWOWEPOJĘCIA TEORII LICZB
dla dowolnych liczb całkowitych x i y. Oprócz tego, jeśli a Ib, to albo lal ~ Ibi,
albo b = O, skąd wynika, że
jeślialhibla,toa= +b (33.7)
Największy wspólny dzielnik. (NWDt) dwóch liczb całkowitych a i b, które
nie są jednocześnie równe O, to największy spośród wspólnych dzielników a i b;
zapisujemy go jako gcd(a, b). Na przykład gcd(24, 30) - 6, gcd(5, 7) - 1,
a gcd(O, 9) = 9. Jeśli żadna z liczb a, b nie jest zerem, to gcd(a, b) jest liczbą
całkowitą z przedziału od 1 do min(lal, Ibi). Definiujemy gcd(O, O)jako O; dzięki
temu standardowe własności funkcji gccl (takie jak poniższa równość (33.11))
są zawsze prawdziwe.
Oto podstawowe własności funkcji gcd:
TwIERDZENIE 33.2.
Jeśli a i h są dowolnymi liczbami całkowitymi,
nie równymi jednocześnie zeru,
to gcd(a, b) jest najmniejszym dodatnim elementem zbioru {ax + by: x, y EZ}
kombinacji liniowych a i b.
' Tutaj będrie stosowany skrót gcd pochodzący od ang. greatest common dh!isor (przyp.
tłum.).
901
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
DOWÓD
Niech s będzie taką najmniejszą dodatnią kombinacją liniową a i b, czyli niech
s = ax + by dla pewnych x, yeZ. Niech q = La/sj. Z równania (33.2) wynika
wówczas, że
amods=a-qs
DOWÓD
Wniosek ten wynika z równania (33.6), ponieważ gcd(a, b) jest kombinacją
liniową a i b na mocy twierdzenia 33.2.
•
WNIOSEK33.4.
Dla dowolnych liczb całkowitych a i b oraz liczby naturalnej n zachodzi
zależność
902
33.1. PODSTAWOWE POJĘCłATEORII LICZB
DOWÓD
Przeprowadzenie dowodu pozostawiamy czytelnikowi jak.o zad. 33.1-4.
•
Liczby względnie pierwsze
Dwie liczby całkowite a i b są względnie pierwsze, jeśli ich jedynym wspólnym
dzielnikiem jest 1, tzn. jeśli gcd(a, b) = I. Na przykład liczby 8 i 15 są względ
nie pierwsze, ponieważ dzielnikami liczby 8 są: I, 2, 4 i 8, a dzielniki liczby 15
to: 1, 3, 5 i 15. Poniższe twierdzenie mówi, że jeśli dwie liczby są względnie
pierwsze z trzecią liczbą p, to ich iloczyn jest także względnie pierwszy z p.
TwIERDZENIE 33.6.
Dla dowolnych liczb całkowitych a, bip, jeśli gcd(a, p) = 1 i gcd(b, p) = 1, to
gcd(ab, p) - I.
DOWÓD
Z twierdzenia 33.2 wynika, że istnieją liczby x, y, x' i y' takie, że
ax+py= 1
bx' + py' =1
Wymnażając te równania, po przekształceniu otrzymujemy
ab(xx') + p(ybx' + y'ax + pyy') - I
Liczba 1 jest więc dodatnią kombinacją liniową ab i p, zatem odwołanie do
twierdzenia 33.2 kończy dowód.
•
Mówimy, że liczby n 1 , n 2 , ... , n1 są parami względnie pierwsze,jeśli dla i cl j
mamy gcd(n;, ni)= 1.
Jednoznaczność rozkładu
Oto elementarny, ale ważny fakt dotyczący podzielności przez liczby pierwsze.
TwIERDZENIE 33. 7,
Dla dowolnej liczby pierwszej p i dowolnych liczb a, b, jeśli p Iab, to p Ia
lubpjb.
DOWÓD
Przypuśćmy przeciwnie, że p Iab, ale p A'a i p A'b. Zatem gcd(a, p) = I
i gcd(b, p) = 1, ponieważ jedynymi dzielnikami p są I i p, a z założenia pnie
903
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
•
Konsekwencją twierdzenia 33.7 jest to, że każda liczba całkowita ma jed-
noznaczny rozkład na czynniki pierwsze.
DOWÓD
Przeprowadzenie dowodu pozostawiamy czytelnikowi jako zad. 33.1-10.
•
Na przykład liczbę 6000 można jednoznacznie zapisać jako 24 · 3 · 53 .
ZADANIA
33.1-1. Udowodnij, że istnieje nieskończenie wiele liczb pierwszych. (Wska-
zówka: Wykaż, że żadna z liczb pierwszych p 1 , p 2 , •••, Pt nie dzieli
{piJl, ...p,) + I).
33.1-2. Udowodnij, że jeśli alb i ble, to ale.
33.1-3. Udowodnij, że jeśli p jest liczbą pierwszą i O < k < p, to gcd(k, p) = 1.
33.1-4. Udowodnij wniosek 33.5.
33.1-5. Udowodnij, że jeśli p jest liczbą pierwszą i O < k < p, to p I(~)· Wy-
wnioskuj stąd, że dla dowolnych a, b oraz liczby pierwszej p zachodzi
zależność
904
33.2. NAJWIĘKS2Y WSPÓLNY DZIELNIK
a - p'•p''
l 2 .. • p'•
r (33.13)
(33.14)
905
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBQWE
Jak okaże się w podrozdz. 33.9, najlepsze znane algorytmy rozkładu na czyn-
niki nie działają w czasie wielomianowym. Takie podejście do problemu ob-
liczania największych wspólnych dzielników nie wydaje się więc prowadzić do
efektywnego algorytmu.
Algorytm Euklidesa obliczania największego wspólnego dzielnik.a opiera
się na następującym twierdzeniu.
Dowon
Pokażemy, że gcd(a, b) i gcd(b, a mod b) dzielą się nawzajem, więc na mocy
równania (33.7) liczby te muszą być równe (poniewai obydwie są nieujemne).
Najpierw pokażemy, że gcd(a, b) Igcd(b, a mod b). Jefili d = gcd(a, b), to
dla i dlb. Na mocy równania (33.2) mamy (a mod b) = a - qb, gdzie
q = La/bJ. Skoro więc (a mod b) jest kombinacją liniową a i b, z równania
(33.6) wynika, że dl (a mod b). Zatem, poniewai dl bi dl (a mod b), z wniosku
33.3 wynika, że dl gcd(b, a mod b) lub równoważnie
Dowód, że gcd(b, a mod b)) gcd(a, b) jest prawie identyczny. Jeśli teraz
d = gcd(b, a mod b), to dl b i dl (a mod b). Ponieważ a= qb + (a mod b),
gdzie ą = La/hJ,więc a jest kombinacją liniową bi (a mod b). Z równania
(33.6) wnioskujemy, że dl a. Paniewa.i dl b i dl a, więc na mocy wniosku 33.3
dl gcd(a, b) lub równoważnie
906
33.2. NAJWIĘKSZV WSPÓLNY DZIELNIK
EUCLlD(a, b)
I Hb=O
2 tb.en return a
3 else return EUCLID(b, a mod b)
EUCL1D(30,21) = EUCL1D(2l, 9)
= EUCLID(9, 3)
= EUCLID(3,O)
=3
LEMAT 33,10,
Jeślia > b ~ O i wywołanie EUCLID(a, b) prowadzi dok ~ 1 wywalań rekuren-
cyjnych, to a~ F1 + 2 i b ~ F 1 +i·
DOWÓD
Dowód przebiega przez indukcję względem k. W celu udowodnienia kroku
podstawowego indukcji przyjmijmy k = 1. Wówczas b ~ I = F 2 , a skoro
907
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
b + (a mod b) -b + (a - La/b)Jb)
a;,b+(amodb)
•
Można pokazać, że górne ograniczenie z twierdzenia 33.11 jest najlepszym
możliwym os7.acowaniem. Najgorsze dane wejściowe dla algorytmu EUCLID
stanowią kolejne liczby Fibonacciego. Ponieważ przy obliczaniu Eucuo~
(F 3 , F 2 ) wykonuje się dokładnie jedno wywołanie rekwencyjne, a dla k ~ 2
zachodzi Fk+1 mod Fk = Fk- l• więc mamy
- gcd(F,, F,_ ,)
Zatem przy obliczaniu EUCLID(Ft+l• Ft) wykonuje się dokładnie k-1 wywo-
łań- tyle, ile wynosi górne ograniczenie z twierdzenia 33.11.
Ponieważ Fk to w przybliżeniu q,•'jJS,gdzie tp to „złota proporcja"
(I + J5)/2, zdefmiowana równaniem (2.14), liczba wywołań rekurencyjnych
w algorytmie EUCLID wynosi O(lg b). (Patrz zad. 33.2-5, aby otrzymać do-
908
33.2. NAJWIĘKSZV WSPÓLNY DZIELNIK
Rozszerzonyalgorytm Euklidesa
Zmodyftk.ujemy teraz algorytm Euklidesa tak, żeby obliczał dodatkowo pewne
użyteczne informacje. Konkretnie, rozszerzymy go w tak.i sposób, żeby obliczał
całkowitoliczbowe współczynniki x i y tak.ie, że
EXTENDED-EUCLID(a,b)
I ifb-0
2 then return (a, I, O)
3 (d', x', y') .- EXTENDED-EUCLID(b, a mod b)
4 (d, x, y) ~ (d', y', x' - La/bjy')
5 return (d, x, y)
909
ROZDZIAŁ 33. ALGORYTMY TEORłOLICZBOWE
d = bx' + (a - La/bJb)y'
= ay' + b{x' - La/bjy')
ZADANIA
910
33.3. ARYTMETYKA MODULARNA
każ, żefunkcja gcd daje ten sam wynik niezale-1:nieod kolejności podania
jej argumentów. Opisz, jak znalei.ć x 0 , x 1 , ... , xft takie, że gcd(a 0 , a 1 , ... ,
a,.)= a0 x 0 + a 1x 1 + ...+ a,.x". Wykaż, że liczba dzieleń wykonywanych
przez Twój algorytm to O(n + lg(max a 1)).
'
33.2-9. Zdefmiujmy lcm(a 1 , a 2 , .•. , an) jako najmniejszą wspólną wielokrotność
liczb całkowitych a 1 , a 2 , .•. , an, tzn. najmniejszą nieujemną liczbę całkowi
tą, będącą wielokrotnością każdej spośród liczb a1• Pokaż, jak efektywnie
obliczać lcm(a 1 , a 2 , .•• , an), korzystając z (dwuargumentowej) operacji gcd
jako procedury pomocniczej.
33.2-10. Udowodnij, że liczby n 1 , n2 , n 3 i n4 są parami względnie pierwsze
wtedy i tylko wtedy, gdy gcd(n 1 n 2 , n 3 n4 ) = gcd(n 1n 3 , n2nJ = 1. Ogólniej,
wykaż, że liczby n 1 , n2 , ••• , n" są parami względnie pierwsze wtedy i tylko
wtedy, gdy pewnych llgkl par liczb będących iloczynami liczb n1 jest
względnie pierwszych.
33.3. Arytmetykamodularna
Nieformalnie możemy myśleć o arytmetyce modularnej jak o zwykłej arytme-
tyce liczb całkowitych, z tą różnicą, że ponieważ nasze obliczenia prowadzimy
modulo n, każdy otrzymywany wynik zastępujemy elementem zbioru {O,1, ... ,
n- 1} przystającym do x modulo n (tzn. x zastępujemy przez x mod n). Ten
nieformalny model wystarcza nam, jeśli ograniczamy się do operacji dodawa-
nia, odejmowania i mnożenia. Bardziej formalny model arytmetyki modular-
nej, który teraz przedstawimy, najlepiej opisywać w ,języku" teorii grup.
Grupy skończone
Jako przykład rozważmy znaną nam już grupę (Z, +) liczb całkowitych
Z z działaniem dodawania: O jest elementem neutralnym, zaś elementem od-
wrotnym do elementu a jest -a. Jeśli w grupie (S, EB)jest spełnione prawo
911
ROZDZIAŁ 33. ALGORYTMY TE0Rl0LICZB0WE
ab - a'b' (mod n)
Tw!ERDZENIE33.12.
System (Z,., +.,) jest skończoną grupą przemienną.
912
33.3. ARYTMETYKA MODULARNA
DOWÓD
Łączność i przemienność operacji + 11 wynikają z łączności i przemienności
operacji +:
- [a + (b + c)],
- [a],+, Ub],+, [c],)
-[b + al,,
- [b], +" [a],
+, o I 2 3 4 5 ,, I 2 4 7
--··-
8 II
...·-- ------ .
13 14
o •o I 2 3 4 5 I I 2 4 7 8 II 13 14
I - I 2 3 4 5 o 2 2 4 8 14 I 7 I I 13
2 : 2 3 4 5 o I 4 4 8 13I 2 14 7 II
3 i 3 4 5 o I 2 7 7 14 13 4 11 2 I 8
4 :4 5 o I 2 3 8 8 I 2 II 4 13 14 7
5 o I 2 3 4 Il Il 7 14 2 13 I 8 4
I' 13 13 11 7 I 14
14 14 13 Il 8 7 '
4
4
2
2
I
(a) (b)
Rys. 33.2. Dwie grupy skończone. Klasy równoważności są oznaczone przez reprezentujące je ele-
menty. (a) Grupa (Z 6 , + 6 ). (b) Grupa (Z~~· ·1 ,)
913
ROZDZIAŁ 33. ALGORYTMY TEOR!OL!CZBOWE
gdzie działaniem grupowym jest mnożenie modulo 15. (Element [a]15 oznacza-
my tu jako a). Na rysunku 33.2b jest przedstawiona grupa (Z~s, ·15 ). Na
przykład 8 · 11 = 13 (mod 15). Elementem neutralnym w tej grupie jest l.
TWIERDZENIE 33.13.
System (Z:, ·11) jest skończoną. grupą przemienną.
DOWÓD
Z twierdzenia 33.6 wynika, że zbiór z:
jest zamknięty ze względu na opera-
cję ·11 • Łączność i przemienność ·11 można udowodnić tak jak dla + 11 wdowo-
dzie twierdzenia 33.12. Elementem neutralnym jest [1}11• W celu wykazania
istnienia elementu odwrotnego weźmy dowolny element a zbioru z:
i niech
(d, x, y) będzie wynikiem wywołania procedury ExTENDEO-EUCLID(a, n).
Wówczas d = 1, gdyż a Ez:,oraz
ax+ny= l
lub równoważnie
ax = 1 (mod n)
Liczba [x]11 jest zatem odwrotnością [a]11 ze względu na mnożenie modulo n.
Dowód, że elementy odwrotne są wyznaczone jednoznacznie, odłożymy do
wniosku 33.26.
•
W dalszej części tego rozdziału, zajmując się grupami (Z 11, +11) i (Z 11, •11),
będziemy stosowali dogodną praktykę oznaczania klas równoważności przez
reprezentujące je elementy oraz zapisywania operacji + 11 i ·11 za pomocą zwykłej
arytmetycznej notacji, odpowiednio + i · (lub po prostu zapisywania czynni-
ków iloczynu koło siebie). Przystawanie modulo n można także interpretować
jako równość w Z 11• Na przykład poniższe dwa zapisy są równoważne:
ax = b (mod n)
914
33.3. ARYTMETYKA MODULARNA
(33.20)
Podgrupy
Jeśli (S, EB)jest grupą, S' c S i (S', EB)także jest grupą, to (S', El))nazywamy
podgrupą (S, ffi). Liczby parzyste na przykład tworzą podgrupę grupy liczb
całkowitych z operacją dodawania. Poniższe twierdzenie stanowi skuteczne
narzędzie rozpoznawania podgrup.
915
ROZDZIAŁ 33. ALGORYTMY TE0Rl0LJCZB0WE
DOWÓD
Przeprowadzenie dowodu pozostawiamy czytelnikowi jako zad. 33.3-2.
•
Na przykład zbiór {O,2, 4, 6} tworzy podgrupę Z 8 , ponieważ jest nmknię
ty ze względu na operację + (a ściślej +8 ).
Poniższe bardzo pożyteczne twierdzenie mówi o warunku, jaki musi speł
niać rozmiar podgrupy.
WNIOSEK33.16.
Jeśli S' jest właściwą podgrupą grupy skończonej S, to IS'I ~ ISl/2.
•
Podgrupy generowane przez element
Z twierdzenia 33.14 wynika interesujący sposób tworzenia podgrupy grupy
skończonej (S, EB): wybrać element a i wziąć wszystkie elementy, które
można uzyskać z a za pomocą działania grupowego. ściślej, zdefiniujmy aCt.J
dla k ;, I jako
1 •
a<>= EBa=aEBaEB ... EBa
I= 1
•
Jeśli na przykład weźmiemy a= 2 w grupie Z 6 , to ciąg a<1l, aC2>,...wygląda tak:
2, 4, O, 2, 4, O, 2, 4, O, ...
(a) - {d'':k;, I}
916
33.3. ARYTMETYKA MODULARNA
Mówimy, że
element a generuje podgrupę (a) albo że a jest generatorem (a).
Ponieważ zbiór Sjest skończony, więc (a) jest skończonym podzbiorem S, być
może zawierającym cały zbiór S. Ponieważ z łączności operacji EB wynika, że
a<OE9aU>= au+})
<O>= {o)
(!) ={O,!, 2, 3, 4, 5)
(2) = {O,2, 4)
Podobnie, w z; mamy
(!) = {!}
(2) = {!, 2, 4)
(3) = {!, 2, 3, 4, 5, 6)
TwlERDZENIE 33.17.
Dla dowolnej grupy skończonej (S, EB)i dowolnego a e S rząd elementu a jest
równy rozmiarowi generowanej przez niego grupy, tzn. ord(a) = l(a)I-
Dowóo
Niech t = ord(a). Ponieważ a<tJ= e i fi.t+t) = d,1l EBa!"J = d,"l dla k ;i, 1, więc
jeśli i > t, to a11J= d,IJ dla pewnego j < i. Po a<r)nie pojawiają się już zatem
żadne nowe elementy, czyli (a)= {a<1l, a<2i, ... , a<tl}. Aby wykazać, że
l(a)j = t, przypuśćmy przeciwnie, że a<fJ= aU) dla pewnych i, j spełniających
I~ i<}~ t. Wówczas a<l+tJ = tiJ+lJ dla k ;i, O. Wynika stąd jednak., że
aU+<r-J))= tiJ+(r-JJJ = e, co stanowi sprzeczność, gdyż i+ (t- 1) < t, at jest
najmniejszą liczbą dodatnią taką, że d,1l = e. Zatem wszystkie elementy ciągu
a(1 >,a12l, ... , a 1tJ są różne, więc l(a)I = t.
•
WNIOSEK33.18.
Ciąg at1 l, a12>,...jest okresowy z okresem t = ord(a); tzn. a0> = d,l) wtedy i tyl-
ko wtedy, gdy i - j (mod 1).
•
917
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
W myśl powyższego wniosku należy przyjąć a!0 >jako e oraz a(J)jako a!lmodt
dla dowolnej liczby całkowitej i.
WNIOSEK 33.19.
Jeśli(S, EB)jest grupą skończoną z elementem neutralnym e, to dla dowolnego
a ES zachodzi zależność
tf1Sll= e
DOWÓD
Z twierdzenia Lagrange'a wynika, że ord(a) I IS!,zatem IS!- O (mod t), gdzie
t - ord(a).
•
ZADANIA
33.3--1. Wypisz tabele działań grupowych dla grup (Z 4 , + J i (Z;, · 5). Wykaż,
że grupy te są izomorficzne, wskazując wzajemnie jednoznaczną odpowie-
dniość a: między ich elementami taką, że a + b = c (mod 4) wtedy i tylko
wtedy, gdy •(a)· •(b) = •(c) (mod 5).
33.3--2. Udowodnij twierdzenie 33.14.
33.3--3. Wykaż, że jeśli p jest liczbą pierwszą, e zaś jest liczbą całkowitą dodat-
nią, to zachodzi zależność
918
33.4. ROZWIĄZVWANIE LINIOWYCH RÓWNAŃ MODULARNYCH
TWIERDZENIE33.20.
Dla dowolnych dodatnich liczb całkowitych a i n, jeśli d = gcd(a, n), to
(a> - (d) - {O,d, 2d, ..., ((n/d) - I)d) (33.23)
a zatem
l(a>I - n/d
DOWÓD
Zaczniemy od pokazania, że de(a). Wywołując procedurę EXTENDED-
-EUCLID(a, n), otrzymujemy liczby x' i y' takie, że ax' + ny' = d. Zatem ax' d
(mod n), więc de (a).
Ponieważ de (a), również każda wielokrotność d należy do (a), bo wielo-
krotność wielokrotności a jest wielokrotnością a. Tak więc (a) zawiera każdy
element zbioru {O,d, 2d, ..., ((n/d) - I)d), tzn. (d) c (a>.
Pokażemy teraz, że (a) c (a). Jeśli me(a), tom= ax mod n dla pew-
nego całkowitego x, a więc m = ax + ny dla pewnego całkowitego y. Ponie-
waż jednak d I a i d I n, to na mocy równania (33.6) d I m. Zatem me (a).
Wiemy już, że (a)= (d'). Aby udowodnić, że l(a)I = n/d, zauważmy, iż
między O a n - l włącznie znajduje się dokładnie n/d wielokrotności liczby d.
•
WNIOSEK33.21.
Równanie ax-= b (mod n) jest rozwiązywalne ze względu na niewiadomą
x wtedy i tylko wtedy, gdy gcd(a, n) Ib.
•
WNIOSEK 33.22.
Równanie ax = b (mod n) albo ma d różnych rozwiązań modulo n, gdzie
d = gcd(a, n), albo wcale nie ma rozwiązań.
DOWÓD
Jeśli równanie ax - b (mod n) ma rozwiązanie, to be (a). Ciąg ai mod n dla
i= O, 1, ... na mocy wniosku 33.18 jest okresowy z okresem l(a)I = n/d. Jeśli
be (a), to b pojawia się w ciągu ai mod n dla i= O, 1, ... , n - I dokładnie
d razy, ponieważ blok rozmiaru (n/d) elementów (a) powtarza się dokładnie
d razy dla i przebiegającego wartości od O do n - I. Pozycje x tych d wystąpień
są rozwiązaniami równania ax - b (mod n).
•
TWIERDZENIE 33.23.
Niech d = gcd(a, n) i załóżmy, że d = ax' + ny' dla pewnych całkowitych x'
i y' (na przykład wyliczonych za pomocą procedury EXTENDED-EUCLID). Jeśli
919
ROZDZIAŁ 33. ALGORYTMY TEORIOLłCZBOWE
x0 - x'(b/d) mod n
DOWÓD
Ponieważ ax' - d (mod n), więc mamy
ax 0 = ax'(b/d) (mod n)
- d!_b/d)(mod n)
- b (mod n)
DoWOD
Ponieważ n/d > O i O:s;;i(n/d) < n dla i= O, 1, ..., d- 1, wartości x 0 , x 1 , ... ,
x 4 _ 1 są parami różne, modulo n. Z okresowości ciągu ai mod n (wniosek
33.18) wynik.a, że jeśli x 0 jest rozwiązaniem równania ax = b(mod n), to jest
nim także każde Xt. Na mocy wniosku 33.22 rozwiązań jest dokładnie d, są to
więc właśnie x 0 , x 1 , ... , x 4 _ 1 .
•
Przedstawiliśmyaparat matematyczny potrzebny do rozwiązania równa-
nia ax = b (mod n); poniższy algorytm wypisuje wszystkie rozwiązania tego
równania. Dane wejściowe a i b są dowolnymi liczbami całkowitymi, n zaś jest
dowolną dodatnią liczbą całkowitą.
MODULAR-LINEAR-EQUATION-SOLVER(a, b, n)
1 (d, x', y') +- EXTENDED-EUCLID(a, n)
2 ifdlb
3 then x 0 +- x'(b/d) mod n
4 fori+-Otod-1
5 do wypisz (x 0 + i(n/d)) mod n
6 else wypisz „brak rozwiązań"
920
33.4. ROZWIĄZYWANIE LINIOWYCH RÓWNAŃ MODULARNYCH
WNIOSEK 33.25.
Dla dowolnego n> 1, jeśli gcd(a, n)= 1, to równanie ax - b (mod n) ma
dokładnie jedno rozwiązanie modulo n.
+
W często spotykanym i ważnym przypadku, gdy b = 1, element x, którego
szukamy, to multyplik.atywna odwrotność a modulo n.
WNIOSEK
33.26.
Dla dowolnego n> l, jeśli gcd(a, n)= 1, to równanie
ax = 1 (mod n) (33.24)
ma dokładnie jedno rozwiązanie modulo n. W przeciwnym razie nie ma roz-
. .
w1ązan1a.
+
Wniosek 33.26 pozwala nam na używanie oznaczenia (a- 1 mod n) w odnie-
sieniu do jedynej multyplikatywnej odwrotności a mod ul o n, jeśli a i n są względ-
921
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
ZADANIA
33.4-1. Znajdź wszystkie rozwiązania równania 35x = 10 (mod 50).
33.4-2. Udowodnij, że z równania ax = ay (mod n) wynika x = y (mod n), jeśli
tylko gcd(a, n)= 1. Wykaż, że warunek gcd(a, n)= 1 jest konieczny, po-
dając kontrprzykład, w którym gcd(a, n)> 1.
33.4-3. Dokonajmy następującej zmiany w 3 wierszu procedury MODULAR-
-LINEAR-EQUATION-SOLVER:
3 tben x 0 - x'(b/a) mod (n/a)
Czy procedura pozostanie poprawna? Wytłumacz, dlaczego tak lub dla-
•
czego nie.
* 33.4-4. Niech f(x) =fo +f 1 x + ... + J;X (mod p) będzie wielomianem stop-
nia t o współczynnikach J; wziętych z z,,,gdzie p jest liczbą pierwszą.
Mówimy, że aE z„ jest pierwiastkiem!, jeśli/(a) = O (mod p). Udowodnij,
że jeśli a jest pierwiastkiem f, to f(x) - (x - a)g(x) (mod p) dla pewnego
wielomianu g(x) stopnia t - I. Udowodnij przez indukcję względem t, że
wielomian /(x) stopnia t może mieć co najwyżej t różnych pierwiastków
modulo liczba pierwsza p.
922
33.5. CHtNSKIE TWIERDZENIE O RESZTACH
(33.25)
to
(a + b) mod n -c-+ ((a 1 + b 1 ) mod n1 , ... , + bJ mod nJ
(a.1;: (33.26)
(33.28)
DOWÓD
Przekształcenia między tymi dwiema reprezentacjami są dosyć proste. Przejście
wymaga jedynie k dzieleń. Obliczenie a, mając (a 1 , a2 ,
od a do (a 1 , a 2 , ••• , a.1;:)
jest niemal równie proste przy użyciu poniższego wzoru. Niech
..., a.1;:),
m; = n/n 1 dla i= 1, 2, ... , k. Ponieważm 1 = n 1 n2 ••. n;_1 n1+ 1 ••• n1;:,
mamy m; - O
(mod ni) dla wszystkich} -=I-i. Zatem przyjmując
(33.29)
(33.30)
923
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
(mod n,)
(mod n1)
•
Z poniższych wniosków będziemy korzystać w dalszej części tego rozdziału.
WNIOSEK 33.28.
Jeśli n 1 , n 2 , ... , nt są parami względnie pierwsze i n= n1n2 ••• n,.,to dla dowol-
nych liczb całkowitych a 1 , a 2 , ... , at układ równań
x = a1 (mod n1)
dla i= 1, 2, ..., k ma dokładnie jedno rozwiązanie mod.ula n ze względu na
niewiadomą x.
•
WNIOSEK 33.29.
Jeśli n 1 , n 2 , .•• , nt są parami względnie pierwsze i n= n 1n 2 ... nt, to dla dowol-
nych liczb całkowitych x i a zachodzi
x = a(mod n)
•
924
33.5. CHll'ilSKIE TWIERDZENIE O RESZTACH
a=2(mod 5)
a= 3 (mod 13)
skąd a 1 = 2, n 1 = m 2 = 5, a2 = 3 oraz n 2 = m 1 = 13. Chcemy obliczyć a mod
65, bo n= 65. Ponieważ 13- 1 = 2 (mod 5) i 5- 1 = 8 (mod 13), więc mamy
c1 = 13(2 mod 5) = 26
c 2 = 5(8 mod 13) = 40
oraz
a= 2·26 + 3·40 (mod 65)
- 52 + 120 (mod 65)
= 42 (mod 65)
o l 2 3 4 5 6 7 8 9 10 11 12
o o 40 15 55 30 5 45 20 60 35 10 50 25
l 26 l 41 16 56 31 6 46 21 61 36 11 51
2 52 27 2 42 17 57 32 7 47 22 62 37 12
3 13 53 28 3 43 18 58 33 8 48 23 63 38
4 39 14 54 29 4 44 19 59 34 9 49 24 64
Rys. 33.3. llustratja chińskiego twierdzenia o resztach dla n 1 = 5 i n2 = 13. W tym przykładzie
c1 = 26, a c2 = 40. W i-tym wierszu i j-tej kolumnie znajduje się ta.ka wartość a moduJo 65, że
(a mod 5) = i oraz (a mod 13) ""j. Zwróćmy uwagę, że przecięcie wiersza O i kolumny O zawiera
wartość O. Podobnie, w wierszu 4 i kolumnie 12 majduje się 64 (róv.noważne -1). Poniewai:
cl= =
26, przejście o jeden wiersz w dół zwiększa wartość a o 26. Analogicmie, c2 40 oznacza, że
przejście w prawo o jedną kolumnę zwiększa a o 40. Zwiększenie a o 1 odpowiada przejściu po
skosie w dól i w prawo, przy zawinięciu dolnego brzegu tabeli na górny i prawego na lewy
ZADANIA
33.5-1. wszystkie rozwiązania równań x - 4 (mod 5) i x = 5 (mod 11).
Znajdź
33.5-2. Znajdź wszystkie liczby x dające reszty I, 2, 3, 4, 5 przy dzieleniu przez,
odpowiednio, 2, 3, 4, 5, 6.
925
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
i o I 2 3 4 5 6 7 8 9 IO Il ...
3;mod 7 1 3 2 6 4 5 I 3 2 6 4 5 ...
a potęgami 2 modulo 7 są
I o I 2 3 4 5 6 7 8 9 10 11 ...
21 mod 7 1 2 4 I 2 4 I 2 4 I 2 4 ...
W tym podrozdziale (a) oznacza podgrupę z:
generowaną przez a, nato-
miast ordn(a) (,,rząd elementu a modulo n") oznacza rząd a w Na przykład z:,
(2) = {I, 2, 4} w z;,
a ord.,(2) = 3. Korzystając z definicji funkcji Eulera tp(n)
jak.o rozmiaru grupy z:
(patrz pod.rozdz. 33.3), zastosujemy wniosek 33.19
do z:,otrzymując twierdzenie Eulera, a w szczególnym przypadku grupy z;,
gdzie p jest liczbą pierwszą, twierdzenie Fermata.
DOWÓD
Na mocy równania (33.21), jeśli p jest liczbą pierwszą, to cp(p) = p - I.
•
Wniosek ten stosuje się do każdego elementu ZP z wyjątkiem O, ponieważ
Ofz;. Dla każdego aEZP zachodzi natomiast aP = a (mod p), o ile p jest
liczbą pierwszą.
Jeśli ordn(g) = 1z:1,
to każdy element grupy z: jest pewną potęgą g ma-
duło n i mówimy, że g jest pierwiastkiem pierwotnym lub generatorem z:.Na
przykład 3 jest pierwiastkiem pierwotnym modulo 7. Jeśli grupa ma pier- z:
wiastek pierwotny, to mówimy, że jest ona grupą cykliczną. Dowód poniższego
twierdzenia, autorstwa Nivena i Zuckermana [85), pominiemy.
TwlERDZENIE33.32.
Wartości n> 1, dla których grupa z:jest cykliczna, to 2, 4, pe i 2pe dla
wszystkich nieparzystych liczb pierwszych p i dowolnych dodatnich liczb cał
kowitych e.
•
Jeśli g jest pierwiastkiem pierwotnym z:,
zaś a jest dowolnym elementem
z:, to istnieje z takie, że 1f - a (mod n). Takie z nazywamy logarytmem dys-
kretnym albo indeksem elementu a modulo n przy podstawie g; wartość tę
oznaczamy przez indn, 9 (a).
DOWÓD
Załóżmy najpierw, że x =e y (mod cp(n)).Wówczas x = y + kcp(n)dla pewne-
go k. Zatem
~ - gY+ką,(n) (mod n)
- gY. (g"'lnl)k(mod n)
= g'· I' (mod n)
= gY (mod n)
927
ROZDZIAŁ 33. ALGORYTMY TEOR10L1CZB0WE
•
Przejście do logarytmów dyskretnych może e7.asem uprościć rozumowanie
dotyczące równań modularnych, co ilustruje dowód poniż.szego twierdzenia.
TWIERDZENIE 33.34.
Jeśli p jest nieparzystą liczbą pierwszą i e ~ 1, to równanie
x' - I (mod p') (33.34)
ma dokładnie dwa rozwiązania, a mianowicie x = 1 i x = -1.
DOWÓD
Niech n= pe. Z twierdzenia 33.32 wynika, że z:zawiera pierwiastek pierwotny
g. Równanie (33.34) można zapisać jak.o
(i"'·•'"')'= g'"'···'''
(mod n) (33.35)
Zauważmy, że skoro ind"_,(1) = O, to z twierdzenia 33.33 wynika, że równanie
(33.35) jest równoważne z równaniem
2 · ind,,,(x) - O (mod q,(n)) (33.36)
Do rozwiązania tego równania ze względu na niewiadomą ind",,(x) za-
stosujemy metody z podrozdz. 33.4. Jeśli przyjmiemy d - gcd(2, q,(n)) -
= gcd(2, (p- l)pe~i) = 2, to ponieważ d I O, z twierdzenia 33.24 wynika, że
równanie (33.36) ma dokładnie dwa rozwiązania, a bezpośrednio można
sprawdzić, że są nimi x = 1 i x = -1.
•
Liczba x jest nietrywialnym pierwiastkiem kwadratowym z 1 modulo n, jeśli
spełnia równanie x 2 = 1 (mod n), ale x nie przystaje do żadnego z „trywial-
nych" pierwiastków kwadratowych: 1 ani -1 modulo n. Na przykład 6 jest
nietrywialnym pierwiastkiem kwadratowym z 1 modulo 35. Poniższy wniosek
z twierdzenia 33.34 wykorzystamy w dowodzie poprawności algorytmu Mil-
lera-Rabina służącego do sprawdzania, czy dana liczba jest liczbą pierwszą
(patrz podrozdz. 33.8).
WNIOSEK33.35.
Jeśli istnieje nietrywialny pierwiastek kwadratowy z 1 modulo n, to n jest
liczbą złożoną.
--·----------------------------
928
33.6. POTĘGI ELEMENTU
DOWÓD
Wniosek ten powstaje po prostu z zaprzeczenia twierdzenia 33.34. Jeśli istnieje
nietrywialny pierwiastek kwadratowy z 1 modulo n, to n nie może być liczbą
pierwszą ani potęgą liczby pierwszej.
•
Potęgowanie przez wielokrotne podnoszenie do kwadratu
MODULAR-EXPONENTIATION(a,b, n)
I c.,_O
2 d .....1
3 niech (b", b"_ 1, ... , h 0 ) będzie binarną reprezentacją h
4 for i+- k downto O
5 doc+-2c
6 d+-(d·d)modn
7 ifb1=l
8 thenc+-c+l
9 d+-(d·a)modn
10 return d
929
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
; I 9 8 7 6 5 4 3 2 I o
,, I o o o I I o o o o
I 2 4 8 17 35 70 140 280 560
'
d 7 49 157 526 160 241 298 166 67 I
ZADANIA
33.6-1. Wypełnij tabelę zawierającą rzędy wszystkich elementów grupy Z~ 1 •
Znajdź najmniejszy pierwiastek pierwotny g i utwórz tabelę zawierającą
wartości ind 11 ,,(x) dla wszystkich xeZ~ 1 .
33.6-2. Podaj algorytm potęgowania modularnego przeglądający bity liczby
b od strony prawej do lewej zamiast od lewej do prawej.
33.6-3. Wyjaśnij, jak obliczać a- 1 mod n dla dowolnego aez:,
korzystając
z proc.edury MODULAR-EXPONENTIATION, przy założeniu, że znasz war-
tość <p(n),
t Nazwa pochodzi od nazwisk trzech twórców: Rivesta, Shamira i Adlemana (przyp. red.).
930
33.7. SYSTEM KRYPTOGRAFICZNY Z KLUCZEM JAWNYM RSA
M - S ,.(P,.(M)) (33.37)
M- P,.(S,.(M)) (33.38)
931
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
Bob Alicja
Kanał przepływu informacji
Szyfrowanie Deszyfrowanie
M
.
--+-łt:,1-!'~~\iJ· ___ C=PA(M)
_:__;_c__:_~ c----1„
I.·
SA . M
Podsłuchujący przeciwnik
•
C
Rys. 33.5. Szyfrowanie w systemie z kluczem jawnym. Bob szyfruje wiadomość M, używając klucza
jawnego PA AJitji i przesyła Alicji otrzymany teht zaszyfrowany C = P,t(M). Przeciwnik.,który
przechwycił przesyłany tek.st zaszyfrowany, nie otrzymuje żadnej informacji o M. Alicja otrzymuje
tekst C i odszyfrowuje go za pomocą. swojego klucza tajnego, otrzymując pierwotną wiadomość
M = S,ł(C)
932
33.7. SYSTEM KRYPTOGRAFICZNY Z KLUCZEM JAWNYM RSA
• Alicja oblicza swój podpis cyfrowy a dla wiadomości M' za pomocą swojego
klucza tajnego S,1jako a= S,1(M').
• Alicja wysyła do Boba parę wiadomość/podpis (M', a).
• Kiedy Bob otrzymuje parę (M', a), może sprawdzić, czy naprawdę pochodzi
ona od Alicji, korzystając z klucza jawnego Alicji i badając, czy zachodzi
równość M' = P,1(0). (Zakładamy, że M' zawiera imię Alicji, dzięki czemu
Bob wie, czyjego klucza jawnego użyć). Jeśli równość zachodzi, to Bob
może przyjąć, że wiadomość M' została faktycznie podpisana przez Alicję.
Jeśli nie, Bob wnioskuje, że wiadomość M' lub podpis cyfrowy a uległy
uszkodzeniu wskutek błędów transmisji albo też para (M', a) stanowi próbę
podszycia się pod Alicję.
Proces ten jest zilustrowany na rys. 33.6. Ponieważ podpis cyfrowy zapewnia
zarówno potwierdzenie tożsamości podpisującego, jak i autentyczności treści
podpisanej wiadomości, stanowi on odpowiednik ręcznego podpisu podpisem-
nym dokumentem.
Ważną własnością podpisu cyfrowego jest to, że jego autentyczność może
zweryfikować każdy, kto ma dostęp do klucza jawnego osoby podpisującej.
Podpisana wiadomość może zostać sprawdzona przez jedną osobę, a następnie
przekazana innym osobom, które także mogą ją sprawdzić. Wiadomość może
być na przykład elektronicznym czekiem Alicji wystawionym na Boba. Bob po
sprawdzeniu podpisu Alicji na czeku może przesłać ów czek do swojego banku,
który także sprawdzi podpis i zrealizuje stosowny przelew,
Alicja Bob
Podpisywanie
,S~-·:O"=SA(M')
i ,,
Akceptacja
(M',CT) M'
M'-_J_----~~---'"--""---L--''.'___J
Kanał przepływu informacji
Rys. 33.6. Podpis cyfrowy w systemie z kluczem jawnym. Alicja podpisuje wiadomość M', dołączając
do niej swój cyfrowy podpis (1 = S,.(M'). Przesyła do Boba parę wiadomość/podpis (M', (1),a ten
sprawdza.ją., badając, czy M' = P,4((1).Jeśli za.chodzi równość, Bob traktuje (M', IT)jako wiadomość
podpisaną przez Alitję
-·"--------------------------------
933
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
934
33.7. SYSTEM KRYPTOGRAFICZNY Z KLUCZEM JAWNYM RSA
DOWÓD
Z równań (33.39) i (33.40) wynika, że dla dowolnego ME Z,._zachodzi
Bezpieczeństwo
systemu RSA opiera się w dużej mierze na trudności roz-
•
kładania na czynnik.i dużych liczb. Jeśli nasz przeciwnik potrafi rozłożyć na
czynniki liczbę n z klucza jawnego, to może na podstawie klucza jawnego
------------------------------
935
ROZDZIAŁ 33. ALGORYTMY TEOR10LJCZB0WE
936
* 33.8. SPRAWDZANIE, CZY LICZBA JEST LICZBĄ PIERWSZĄ
937
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
. n(n)
hm ----- = 1
11.... «> n/Inn
•
Oszacowanie n/In n daje stosunkowo dokładne oszacowanie wartości x(n)
już dla niewielkich n. Na przykład dla n= 109 różnica wynosi mniej niż 6%,
bo x(n) = 50 847 478, a n/ln n = 48 254942. (Dla naukowca zajmującego się
teorią liczb 109 to mała liczba).
Korzystając z twierdzenia o liczbach pierwszych, prawdopodobieństwo te-
go, że losowo wybrana liczba n okaże się liczbą pierwszą, możemy oszacować
przez 1/lnn. W celu znalezienia liczby pierwszej tej samej długości co n będzie
my zatem musieli przebadać około In n losowo wybranych liczb w pobliżu n.
Na przykład znalezienie 100-cyfrowej liczby pierwszej wymagałoby sprawdze-
nia około In 10100 ~ 230 losowo wybranych liczb 100-cyfrowych. (Liczbę tę
można zmniejszyć o połowę, wybierając tylko liczby nieparzyste).
W dalszej części tego podrozdziału zajmiemy się problemem sprawdzania,
czy dana duża nieparzysta liczba całkowita n jest liczbą pierwszą. Dla wygody
przyjmiemy, że rozkładem n na czynniki jest
n -p'•p'•
1 2 ... p'·
r (33.41)
938
* 33.8. SPRAWDZANIE, C2Y LICZBA JEST LICZBĄ PIERWSZĄ
z-:={1,2, ...,n-1}
939
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
PSEUDOPRIME(n)
l if M0DULAR-EXPONENTIATION(2, n - I, n);/; l (mod n)
2 tben return ZŁOŻONA t> Na pewno.
3 else return PIERWSZA t> Miejmy nadzieję!
Procedura ta może popełniać błędy, ale tylko jednego rodzaju. Jeśli udziela
odpowiedzi, że n jest liczbą złożoną, jest to zawsze prawda. Jeśli oświadcza,
że n jest liczbą pierwszą, to myli się tylko wtedy, gdy n jest liczbą pseudopierw-
szą przy podstawie 2.
Jak często nasza procedura się myli? Zaskakująco rzadko. Wśród n mniej-
szych niż 1OOOOsą tylko 22 wartości, dla których się to zdarza; pierwsze cztery
z nich to 341,561,645 i 1105. Można pokazać, że prawdopodobieństwo popeł
nienia błędu przez powyższy program dla losowo wybranej liczby P-bitowej
dąży do zera przy p --+ oo. Pomerance (90] podaje dokładniejsze oszacowanie,
z którego wynika, iż jest mniej niż jedna szansa na milion, że losowo wybrana
liczba 50-cyfrowa, którą powyższa procedura określi jak.o pierwszą, okaże się
pseudopierwsza przy podstawie 2, a dla losowo wybranej liczby I DO-cyfrowej
szansa ta jest mniejsza niż jeden na 1013 .
Niestety, nie uda się nam wyeliminować wszystkich błędów, sprawdzając po
prostu, czy spełnione jest równanie (33.42) dla kolejnej podstawy, powiedzmy
a= 3, ponieważ istnieją liczby złożone n, które spełniają równanie (33.42) dla
każdego a Ez:. Liczby te znane są pod nazwą liczb Carmichaela. Pierwsze trzy
liczby Carmichaela to 561, 1105 i 1729.Liczby Carmichaela występują niesłycha
nie rzadko; na przykład wśród liczb mniejszych od 100 OOO OOO jest ich zaledwie
255. W zadaniu 33,8-2 będzie wyjaśnione, dlaczego są one taką rzadkością.
Pokażemy teraz, jak ulepszyć metodę sprawdzania, czy liczba jest pierw-
sza, żeby liczby Carmichaela nie mogły spowodować jej błędnego działania.
940
* 33.8. SPRAWDZANIE, CZY LICZBA JEST LICZBĄ PIERWSZĄ
a"-' ,t 1 (mod n)
WITNESs(a, n)
1 niech (b1;, bt-l• ..., b0 ) będzie binarną reprezentacją liczby n -1
2 d,f----1
3 for i ,.__k downto O
4 do x,.__d
5 d+-(d·d)modn
6 ifd=lix#lix=#:n-1
7 then return TRUE
8 ifb,-1
9 then d,.__(d·a) mod n
10 ifd,'l
11 then return TRUE
12 return FALSE
941
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
942
* 33.8. SPRAWDZANIE, CZY LICZBA JEST LICZBĄ PIERWSZĄ
Jeśli
n jest liczbą ,B-bitową, procedura MILLER-RABIN wykonuje O(s,B)
operacji arytmetycznych i O(s,83) operacji na bitach, ponieważ związana z nią
praca jest asymptotycznie nie większa niż przy .vmodularnych potęgowaniach.
TWIERDZENIE 33.38.
Jeśli n jest nieparzystą liczbą złożoną, to liczba.świadectw złożoności n wynosi
przynajmniej (n - 1)/2.
DOWÓD
Pokażemy, że liczba liczb nie będących świadectwami nie przekracza (n - 1)/2,
skąd wynika teza twierdzenia.
Zauważmy najpierw, że każda liczba nie będąca świadectwem musi być
elementem z:,
ponieważ dla każdej takiej liczby a zachodzi d'- 1 - I (mod n),
a jeśli gcd(a, n)= d> 1, to na mocy wniosku 33.21 równanie ax = 1 (mod n)
nie ma rozwiązania x. (W szczególności rozwiązaniem nie jest x = tł'- 2). Za-
tem każdy element zbioru z,,.- z:
jest świadectwem złożoności n.
żeby zakończyć dowód, wykażemy, że wszystkie liczby nie będące świade
ctwami są zawarte we właściwej podgrupie B grupy z:.
Na mocy wniosku
33.16 mamy wówczas IBI::,;: 1z:112.Ponieważ 1z:1::,;:n - 1, dostajemy IBI~
::,;:(n - 1)/2. Liczba liczb nie będących świadectwami nie przekracza zatem
(n - 1)/2, więc świadectw jest przynajmniej (n - 1)/2.
Pokażemy teraz, jak znaleźć właściwą podgrupę B grupy Z~ zawierającą
wszystkie liczby nie będące świadectwami. Dowód rozbijemy na dwa przypadki.
~----------------------9~43
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
Warunek ten nie zachodzi dla e > 1, gdyż lewa strona dzieli się pr:rez p, a pra-
wa nie. Liczba 11 nie jest zatem potęgą liczby pierwszej.
Ponieważ n nie jest potęgą liczby pierwszej, rozłóżmy ją na iloczyn n 1n 2 ,
gdzie n1 i 112 są większe niż 1 i względnie pierwsze. (Może istnieć wiele sposo-
bów takiego rozkładu i nie ma znaczenia, który z nich wybierzemy. Jeśli na
przykład 11 = p'j_•
p1•... p;·, to możemy wybrać 111 = p'j_•i n2 = p1•P~'... p;·).
2.defmiujmy t oraz u tak, że n - 1 = 2'u, gdzie t ~ I, u zaś jest nieparzyste.
Dla dowolnego a EZ: rozważmy ciąg
(33.45)
944
* 33.8. SPRAWDZANIE, CZY LICZBA JEST LICZBĄ PIERWSZĄ
w= 1 (mod n 2)
Stąd
w2 i., - - 1 (mod n 1 )
w2i" - 1 (mod n2 )
•
TWIERDZENIE 33.39.
Dla dowolnej nieparzystej liczby n > 2 i dodatniej liczby s prawdopodobień
stwo tego, że procedura MILLER-RABIN(n, s) udzieli błędnej odpowiedzi, nie
przekracza 2 - •.
DOWÓD
Z twierdzenia 33.38 wiemy, że jeśli n jest liczbą złożoną, to w każdym przebie-
gu pętli w wierszach 1-4 prawdopodobieństwo znalezienia świadectwa x złożo
ności n jest równe przynajmniej 1/2. Procedura MILLER-RABIN popełnia błąd
tylko wtedy, gdy w żadnym z s przebiegów głównej pętli nie trafi na świade
ctwa złożoności n. Prawdopodobieństwo takiego ciągu niepowodzeń nie prze-
kracza 2-•.
•
Przyjęcie s = 50 powinno
zatem wystarczyć w niemal każdym zastosowa-
niu, jakie sobie mo.żna wyobrazić. Jeśli próbujemy znajdować duże liczby
pierwsze, stosując algorytm MILLER-RABIN do losowo wybranychdużych liczb,
to można pokazać (chociaż tego dowodu tu nie przedstawimy), że już przy
bardzo małych wartościach s (powiedzmy s = 3) szansa na błędny wynik jest
945
ROZDZIAŁ 33. ALGORYTMY TE0Rł0LICZB0WE
ZADANIA
33.8-1. Udowodnij, że jeśli n> 1 nie jest liczbą pierwszą ani potęgą liczby
pierwszej, to istnieje nietrywialny pierwiastek kwadratowy z 1 module n.
* 33.8-2. Można nieco „wzmocnić" twierdzenie Eulera do następującej postaci:
gdzie dla n= pi• ... p~· liczba l(n) jest zdefiniowana wzorem
l(n) - lcm(ą,(pj•), ... , ą,(p;•)) (33.47)
946
* 33.9. ROZKŁAD NA CZYNNIKI
POLLARD-RHO(n)
1 i+- I
2 x 1 +-RANDOM(O,n - 1)
3 y +- X 1
4 k+-2
5 while TRUE
6 doi+-i+l
7 x 1 +-(xf_ 1 -l)modn
8 d~ gcd(y- x,, n)
9 ifd:;ćlid"#n
IO then wypisz d
Il ifi-k
12 theny+-x 1
13 k~2k
Procedura działa
w następujący sposób. W wierszach 1-2 są nadawane
wartości początkowe: miiennej i jest przypisywana wartość I, a x 1 otrzymuje
losowo wybraną wartość ze zbioru Z". W nieskończonej pętli while szukamy
czynników w rozkładzie n. W każdym przebiegu pętli while,korzystając z reku-
•
rencY)nego wzoru
(33.49)
947
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
996 ---- 3 l O
/ ',._
814 396
I
.,·, 177
\ 84
x,"
x6
1
1186 120
l
x, I\ 1194
/
I
.r, 8 ,, " 8
,, 3I ,,' x,"
I3
I2 X'' 2
.I
x, 2
"
mod 1387 mod 19 mod 73
Rys. 33.7. Heurystyka ,,ro" Pollarda. (•) Wartości utworzone za pomocą wzoru rekurencyjnego
x 1+ 1 +--(xf - l) mod 1387, poczynając od x 1 = 2. Roiklad na czynniki pierwsze liczby 1387 to
19· 73. Grube strzałki oznaczają
iteracje wykonywane przed znalezieniem czynnika 19. Cienkie
strzałki wskazują wartości, które nie zostały osiągnięte, żeby zilustrować kształt litery „ro". Liczby
widocme na szarym tle to wartości y zapamiętywane przez procedurę PoLLARD-RHo.Czynnik 19
zostaje znaleziony po osiągnięciu x 7 = 177, kiedy zostaje obliczona wartość gcd(63-177,
1387) = 19. Pierwsza powtarzają.ca się wartość x to 1186, ale czynnik 19 zostaje malez.iony prt.ed
jej osiągnięciem. (b) Wartości obliczone za pomocą tego samego wzoru rekurencyjnego modulo 19.
Każda wartość x 1 pcxiana w punkcie (a) przystaje modulo 19 do pokazanej tu wartości x;.Na
przykład zarówno x 4 = 63, jak i x 7 = 177 przystają do 6 modulo 19. (c) Wartości obliczone za
pomocą lego samego wzoru rekurencyjnego mod.ula 73. Kai,da wartość x 1 z punktu (a) przystaje
mod ulo 73 do pokazanej tu wartości x;.
Na mocy chińskiego twierdzenia o resztach każdy element
w punkcie (a) odpowiada parze elementów, jednemu z punktu (b) i jednemu z (c)
949
ROZDZIAŁ 33. ALGORYTMY TE0Rl0L1CZB0WE
950
PROBLEMY
ZADANIA
33.9-1. Kiedy w przykładzie na rys. 33.7a procedura POLLARD-RHOwypisze
czynnik 73 liczby 1387?
33.9-2. Załóżmy, że marny daną funkcję/: Z"-+ Z" oraz początkową wartość
x 0 EZ". Zdefiniujmy x 1 =f(x 1_ 1) dla i=l, 2, ... Niech t i u>O będą
najmniejszymi wartościami takimi, że Xr+J = xt+ ..+i dla i= O, 1, ... W termi-
nologii algorytmu „ro" Pollarda t jest długością „ogonka", u zaś jest długo
ścią cyklu stanowiącego „główkę" litery ro. Podaj efektywny algorytm
wyznaczania dokładnych wartości t i u oraz przeanalizuj czas jego działania.
33.9-3. Ilu kroków będzie potrzebowała procedura POLLARD-RHOdo znale-
7jenia czynnika postaci p", gdzie p jest liczbą pierwszą, a e > l?
* 33.9-4. Wadą procedury POLLARD-RHOw przedstawionej postaci jest to, że
wymaga ona jednego obliczenia gcd dla każdego elementu ciągu rekuren-
cyjnego. Istnieje możliwość grupowania obliczeń gcd przez obliczenie ilo-
czynu pewnej porcji kolejnych x 1, a następnie wyznaczenie gcd tego iloczy-
nu i zapamiętanej wartości y. Opisz dokładnie, jak zaimplementowałbyś tę
ideę, dlaczego jest ona poprawna i jaki rozmiar porcji wybrałbyś jako
najefektywniejszy, jeśli liczba n jest ,B-bitowa.
Problemy
33-1. Binarny algorytm gcd
Na większości komputerów operacje odejmowania, sprawdzania, czy dana
liczba binarna jest parzysta, oraz dzielenia przez 2 można wykonać znacznie
szybciej niż obliczanie reszt. Niniejszy problem dotyczy binarnego algorytmu
gcd, który w odróżnieniu od algorytmu Euklidesa nie wymaga obliczania reszt.
951
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
i jej potęgi).
(d) Załóżmy teraz, że dodawanie dwóch liczb P-bitowych zajmuje czas 0(P),
a ich mnożenie zajmuje czas 0(P 2 ). Jak.ie jest oszacowanie czasu działania
powyższych trzech metod przy użyciu tej bardziej realistycmej miary kosz-
tu podstawowych operacji arytmetycznych?
952
UWAGI DO ROZDZIAŁU
Podaj efektywny algorytm rozstrzygania, czy dana liczba a jest resztą kwa-
dratową modulo p. Dokonaj analizy efektywności swojego algorytmu.
(c) Wykaż, że jeśli p jest liczbą pierwszą postaci 4k + 3, a zaś jest resztą kwad-
ratową w z;,to a1:.+ 1 mod p jest pierwiastkiem kwadratowym z a modu-
Io p. Ile czasu potrzeba na znalezienie pierwiastka kwadratowego z reszty
kwadratowej a modulo p?
(d) Opisz efektywny probabilistyczny algorytm znajdowania niereszty kwad-
ratowej modulo dowolna liczba pierwsza p. Jaka jest średnia liczba opera-
cji arytmetycznych wykonywanych przez Twój algorytm?
Uwagi do rozdziału
Znakomite wprowadzenie do elementarnej teorii liczb stanowi książka Nivena
i Zuckermana [151). Książka Knutha [122] zawiera dobre omówienie algoryt-
mów znajdowania największego wspólnego dzielnika, a także i innych pod-
stawowych algorytmów teorioliczbowych. Bliższy współczesności przegląd ob-
liczeniowej teorii liczb stanowią prace Riesela [168] i Bacha [16J. Dixon [56]
przedstawia zarys metod rozkładu na czynniki i sprawdzania, czy liczba jest
liczbą pierwszą. Sprawozdania z konferencji pod redakcją Pomerance'a [159]
zawierają kilka ciekawych artykułów przeglądowych.
W książce [122] Knuth omawia powstanie algorytmu Euklidesa. Pojawił
się on w księdze 7 (twierdzenia I i 2) dzieła greckiego matematyka Euklidesa,
zatytułowanego Elementy, napisanego około roku 300 p.n.e. Opis Euklidesa
mógł być wzorowany na algorytmie autorstwa Eudoksusa, datowanym około
roku 375 p.n.e. Algorytm Euklidesa jest być może najstarszym nietrywialnym
algorytmem; rywalizować z nim może jedynie algorytm mnożenia, zwany al-
gorytmem rosyjskich wieśniaków (patrz rozdz. 29), który był już znany staro-
żytnym Egipcjanom.
953
ROZDZIAŁ 33. ALGORYTMY TEORIOLICZBOWE
954
UWAGI DO ROZDZIAŁU
Wyszukiwanie
wzorca
956
ROZDZIAŁ 34. WYSZUKIWANIE WZORCA
Tekst T a b C b c a b a c
s=3
Wzorzec P
Rys. 34.1, Problem wyszukiwania wzorca. Celem jest znalezienie wszystkich wystąpień wzorca P =
= abaa w tekście T = abcabaabcabac. Wzorzec występuje dokładnie raz, z przesunięciem s = 3.
Przesunięcie s = 3 jest nazywane poprawnym. Pojedyncze symbole wzorca są połączone pionowy"
mi liniami z odpowiadającymi im symbolami w tekście; symbole, które do siebie pasują, są przed-
stawiane na szarym tle
Notacja i terminologia
Przez I' oznaczamy zbiór wszystkich tekstów (słów) utworzonych z symboli
alfabetu E. W tym rozdziale rozważamy tylko słowa o skończonej długości.
Słowo o długości zero, nazywane słowem pustymi oznaczone przeze, też należy
do E'. Długość słowa x oznaczamy przez lx!. Konkatenacja(złożenie) dwóch
słów x i y (oznaczona przez xy) jest słowem długości lx\+ lYI,składającym się
z symboli x, za którymi występują symbole y.
Mówimy, że słowo w jest prefiksemsłowa x (co oznaczamy wcx), gdy
x = wy dla pewnego słowa y EJ;'. Zauważmy, że jeśli w c x, to lwi .s.;;lxl. Po-
dobnie, mówimy, że słowo w jest sufiksemsłowa x (co oznaczamy w:::ix), gdy
x = yw dla pewnego yei::•. Zależność w::ix implikuje lwi .s.;;lxl. Słowo puste e
jest jednocześnie prefiksem i sufiksem każdego słowa. Na przykład mamy
abcabcca oraz cca:::iabcca. Warto zauważyć, że dla każdych słów x i y oraz
każdego symbolu a mamy X::JY wtedy i tylko wtedy, gdy xa::Jya. Zauważmy
również, że c oraz :J są relacjami przechodnimi. Następujący lemat przyda
. ' , . .
nam się pozrueJ.
957
ROZDZIAŁ 34. WYSZUKIWANIE WZORCA
'
y
I I
~
ł
X XL,__
' X
'
Yc__ y y
Rys. 34.2. Graficzny dowód lematu 34. l, Zakładamy, że x:::::izi y::iz. Trzy części rysunku odpowiada-
ją trzem przypadkom lematu. Pionowe I.iniełączą pasujące do aiebie segmenty (S7Aiykolor) tekstu.
= =
(a) Jesli jxl " IYI to x ::Jy. (b) Jeśli lxl )< IY!,to Y::J x. (c) Jeśli lxl lyl to x y
DOWÓD
Poglądowy dowód jest przedstawiony na rys. 34.2.
•
Dla uproszczenia zapisu oznaczamy k-symbolowy prefiks P[l .. k] wzorca
P[l „ mJprzez P1 . Zatem P 0 = e oraz Pm = P = P[l .. mJ.Podobnie, oznacza-
my k-symbolowy prefiks tekstu T przez T1 . Używając tej notacji, możemy
wyrazić problem wyszukiwania wzorca jako problem znajdowania wszystkich
przesunięć s w przedziale O ~ s ~ n - m takich, że P ::J T~+111•
W naszym pseudojęzyku programowania przyjmujemy, że porównywanie
dwóch tekstów tej samej długości jest operacją elementarną. Jeśli teksty są
porównywane od strony lewej do prawej i proces ten zatrzymuje się w chwili
niezgodności dwóch symboli, to przyjmujemy, że czas takiego testu jest propo-
rcjonalny do liczby porównywanych symboli. Bardziej formalnie: test „x = y"
potrzebuje (z defmicji) czasu 8(t + I), gdzie t jest długością najdłuższego sło
wa z takiego, że zcx i zcy.
958
34.1. ALGORYTM „NAIWNY"' WYSZUKIWANIA WZORCA
-• C • • b
·-···
C • C
• • b C
L, '
-] s=2
c"_ • b ' • • bł
Rys. 34.3. Działanie „naiwnego" algoryl.mu wyszukiwania wzorca dla P = aab i 1· = acaabc. Wyob~
raimy sobie wzorzec P jako „okienko", które przesuwamy nad tekstem. Części (a)-(d) ilustrują
cztery kolejne testy. W każdej z nich pionowe linie łączą odpowiadające sobie zgodne segmenty
(szary kolor na rysunku), a zygzakowana linia wskazuje pierwszą niezgodność (o ile laka istnieje).
Znalezione zostaje jedno wystąpienie wzorca z przesunięciem s = 2, pokazanym w części (c)
NAIVE-STRING-MATCHER(T, P)
1 n+- length [T]
2 m +- length [P]
3 fors+-Oton-m
4 do if P[l .. m] - T[s + I „ s + m]
5 then wypisz „Wzorzec występuje z przesunięciem'' s
959
ROZDZIAŁ 34. WYSZUKIWANIE WZORCA
ZADANIA
1- a-m
(n - m + I) --1 - - a- 1 "..._,2(n - m + I)
C ab CC ba cba c ab
ab o ba o C
oraz jako
C ab ccbac ba C ab
ab o ba o C
34.2. AlgorytmRabina-Karpa
Rabin i Karp zaproponowali algorytm wyszukiwania wzorca, który zachowuje
się świetnie w praktyce oraz daje się łatwo modyfikować dla innych pokrew-
nych problemów, takich jak szukanie wzorców dwuwymiarowych. Pesymis-
34.2. ALGORYTM RABINA-KARPA
961
ROZDZIAŁ 34. WYSZUKIWANIE WZORCA
235902 141!f) 6 7 3 9 9 2 1
mooIJ
,.,
(b)
\ cyfra I cyfra
2
\
14152 "' (31415 - 3. HXlOO)·IO
l /
+ 2 (mod 13)
.. {7-3·3)·10+2 (mod13)
"" 8 (mod 13)
,,,
Rys. 34.4. Algorytm Rabina-Karpa. Każdy symbol jest cyfrą dziesiętną, a obliczamy wartości modu-
Io 13. (a) Tekst i wyróznione szarym kolorem okienko długości 5. Wartość numeryczna szarej
liczby obliczana modulo 13 wynosi 7. (b) Ten sam tekst z obliczonymi wartościami modulo 13 dla
każdej możliwej pozycji okienka długości S. Zakładając, że mamy wzorzec P = 3141S, szukamy
okienek, których wartość modulo 13 jest równa 7, ponieważ 3141S = 7 (mod 13). Dwa takie
malezione okienka są omaczone na rysunku kolorem sz.arym.Pierwsze z nich, zaczynają.ce się na
pozycji 7, jest faktycznym wystąpieniem wzorca, podczas gdy drugie, zaczynają.ce się na pozycji 13,
jest błędnym „strzałem". (c) Obliczanie wartości okienka w stałym czasie, na podstawie wartości
poprzedniego okienka. Pierwsze okienko ma wartość 3141S. Usuwając najbardziej znaczą.cą cyfrę
3, przesuwając w lewo (mnożąc przez 10), a następnie wstawiając najmniej maczącą cyfrę 2,
otrzymujemy nową wartość 14152. Obliczenia są wykonywane modulo 13, zatem wartością ob-
liczoną dla pierwszego okienka jest 7, a dla drugiego okienka~ 8
962
34.2. ALGORYTM RABINA-KARPA
Jedyną trudnością w tej procedurze jest to, że p i t, mogą być zbyt duże.
Jeśli P zawiera m symboli, to przyjmowanie, że każda operacja arytmetyczna
dla p (które składa się z m cyfr) zajmuje „stały czas", nie jest rozsądne. Na
szczęście można sobie z tym prosto poradzić, jak to jest pokazane na rys. 34.4:
obliczamy pi t, modulo q dla odpowiednio dobranego mniejszego q. Ponieważ
obliczenia p, ! 0 i wzoru (34.1) mogą być wykonane module q, widzimy, że
pi wszystkie t 1 mogą być obliczone module q w czasie O(n + m). Jak.o q wybie-
ramy przeważnie taką liczbę pierwszą, że IOą mieści się akurat w słowie kom-
putera, co pozwala wykonywać wszystkie operacje arytmetyczne z pojedynczą
precyzją. Zazwyczaj dla d-elementowego alfabetu {O,1, ..., d - 1} wybieramy
ą tak, że dq mieści się w słowie komputera, i dostosowujemy wzór (34.1) do
obliczeń modulo q, otrzymując w ten sposób
gdzie h - dm- i (mod q) jest wartością cyfry „1" na najbardziej znaczącej pozy-
cji w liczbie m-cyfrowej.
Działanie w arytmetyce modulo q może prowadzić teraz do błędu ze
względu na to, że t, = p (mod q) nie implikuje t, =
p. Z drugiej strony, jeśli
t, "lep (mod q), to z pewnością wiemy, że t, #- p i że przesunięcie sjest niepo-
prawne. Możemy więc użyć testu ! 1 = p (mod q) jako szybkiego testu heurys-
tycznego do eliminowania niepoprawnych przesunięć s. Każde przesunięcie s,
dla którego t~ p (mod q), musi być jeszcze zweryfikowane, tzn. musimy spra-
wdzić, czy sjest rzeczywiście poprawne, czy też „spudłowaliśmy". Testowanie
takie można wykonać przez bezpośrednie sprawdzenie warunku P[l .. m] =
= T[s + 1 .. s + m]. Jeśli q jest dostatecznie duże, to możemy się spodziewać,
że „spudłujemy" wystarczająco rzadko, żeby koszt dodatkowego sprawdzania
był mały.
Powyższa idea jest zrealizowana w następującej procedurze, której dany-
mi wejściowymi są tekst T, wzorzec P, liczba d (zwykle równa II]) i liczba
•
pierwsza q.
RABIN-KARP-MATCHER(T, P, d, q)
1 n +- /ength [[]
2 m +- length [P]
3 h+-dm- 1 modq
4 p+-0
5 t0 +-O
6 fori+-1 tom
7 do p- (dp + P[i]) mod q
8 ! 0 ...._ (dt 0 + T[i]) mod q
9 fors+-Oton-m
------------- --· ..,-, ----
963
ROZDZIAŁ 34. WYSZUKIWANIE WZORCA
10 do if p = I,
11 lhen if P[l .. m] = T[s + 1 .. s+ m]
12 tben wypisz „Wzorzec występuje z przesunięciem" s
13 ifs<n-m
14 then /1 + 1 +-(d(t 1 - T[s + l]h) + T[s + m + ID mod q
964
34.3. WYSZUKIWANIE WZORCA Z WYKORZYSTANIEM AUTOMATÓW SKOlilCZONYCH
ZADANIA
34.2-1. Ile błędnych „strzałów" wykona algorytm Rabina-Karpa, szukając
wzorca P = 26 w tekście T= 3141592653589793 i wykonując obliczenia
modulo q = 11?
34.2-2. Jak można rozszerzyć metodę Rabina-Karpa dla problemu jednoczes-
nego szukania k zadanych wzorców?
34.2-3. Pokaż, jak można rozszerzyć metodę Rabina-Karpa dla problemu szu-
kania wzorca wymiaru m x m w tablicy n x n. (Wzorzec można przesuwać
pionowo lub poziomo, ale nie można go obracać).
34.2-4. Alicja ma kopię pliku składającego się z n bitów A = (a,._ 1, a11_ 2 , ... ,
a 0 ), a Bob podobnie ma n-bitowy plik B = (b 11_ 1 , b11_ 2 , ••• , b 0 ). Alicja
i Bob chcą sprawdzić, czy ich pliki są identyczne. W celu uniknięcia prze-
syłania sobie całych plików A lub B używają oni następującego testu pro-
babilistycznego. Wybierają wspólnie liczbę pierwszą q > 1000n i losową
liczbę x ze zbioru {O,1, ..., n - I}. Następnie Alicja oblicza
-----·--------------------
34.3. Wyszukiwaniewzorcaz wykorzystaniemautomatów
skończonych
W niektórych algorytmach wyszukiwania wzorca są budowane automaty skoń
czone, które przeglądają tekst Tw celu znalezienia wszystkich wystąpień wzor-
ca P. W tym podrozdziale przedstawimy metodę budowy takiego automatu.
Automaty szukające wzorca są bardzo efektywne: badają każdy symbol tekstu
dokładnie raz, przeznaczając stały czas dla pojedynczego symbolu. Zatem czas
działania algorytmu - gdy automat jest już zbudowany -wynosi 0(n). Jednak-
że czas konstruowania automatu może być długi, gdy alfabet I jest duży.
W podrozdziale 34.4 opiszemy sprytny sposób ominięcia tego problemu.
965
ROZDZIAŁ 34. WYSZUKIWANIE WZORCA
Automaty skończone
Automatem skończonym M nazywamy uporządkowaną piątkę (Q, q0 , A, E,
c5),w której
• Q jest skończonym zbiorem stanów automatu,
• q 0 EQ jest stanem początkowym,
• A c: Q jest zbiorem stanów akceptujących,
• E jest alfabetem wejściowym,
• c5jest funkcją Q x E: -+ Q, zwaną funkcją przejść automatu M.
Automat skończony rozpoczyna działanie w stanie q0 , a następnie wczytu-
je kolejne symbole słowa wejściowego. Jeśli automat jest w stanie q i czyta
symbol wejściowy a, to przechodzi on od stanu q do stanu c5(ą, a). Jeśli bieżący
stan q jest elementem A, to mówimy, że automat M akceptuje wczytany do-
tychczas tekst. Tekst wejściowy, który nie jest zaakceptowany, jest „odrzuco-
ny" przez automat. Rysunek 34.5 obrazuje powyższe definicje na przykładzie
prostego automatu o dwóch stanach.
Dla automatu M oznac2n:1yprzez tj,:i;•-+ Q tak.zwaną rozszenooą funkcję
przejść, zdefiniowaną w ten sposób, że tj,(w)jest stanem, do którego przechodzi
Wejście •
Stan • b o
o •
I tHE
o b
(•) (b)
Rys. 34.5. Przykład prostego dwustanowego automatu skończonego u zbiorem stanów Q = {O, I},
stanem początkowym q0 = O i a1fabetem wejściowym X= {a, b}. (a) Tablicowa reprezentacja
funkcji przejść d. (b) Diagram opisujący automat. Stan I jest jedynym stanem akc.eptującym (kolor
czarny na rysunku). Krawędzie skierowane reprezentują przejścia. Na przykład krawędź od stanu
I do stanu O etykietowana symbolem b odpowiada prujściu d(l, b) =O.Automat ten akc.eptuje
zbiór tekstów kończących się nieparzystą liczbą symboli a. Formalnie, tekst x jest akceptowany
wtedy i tylko wtedy, gdy x = yz, gdzie y = i luby kończy się literą b, a z= ar. i k jest nieparzyste.
Na przykład ciąg.iem kolejnych stanów dla tekstu abaaa (włącmie u stanem początkowym) jest
(O, I, O, 1, O, 1), tak więc automat akc.eptuje ten tekst. Dla tekstu abbaa ciągiem stanów jest (O, I,
O, O, I, O), zatem automat odrzuca ten tekst
966
34.3. WYSZUKIWANIE WZORCA Z WYKORZYSTANIEM AUTOMATÓW SKOŃCZONYCH
</>(,)= ą,
967
ROZDZ!AŁ 34. WYSZUKIWANIE WZORCA
• •
• b • C
b
b
(a)
Wejście
p
Stan • b C
o o o •
l 2 o b
2 o o •
3 4. o b
4 o o •
5 l 4 6 l 2 3 4 5 6 7 8 9 10 11
1 o o
C
' ·i, :i.'.,.i"li.f·\·:
.~.--
•'
6
• T[i J
• b
3 .,,4_, 5,_ 6 Ili 2 •
4·"'5 0
b
7 l 2 o Stan 1/)(T.) o l 2 3
(b) (c)
Rys. 34.6. (11)Diagram przejśc dla automatu wyszukiwania wzorca akceptującego wszystkie teksty,
których sufiksem jest wzorzec 11bab11ca.Stanem początkowym jest O, natomiast stan 7 (kolor czarny
na rysunku) jest jedynym stanem akceptującym. Krawędź skierowana od stanu i do stanu j z ety-
ldetą a repreuntuje przejście ,Xi, a) =j. Krawędzie skierowane na prawo tworzą „szkielet" auto-
matu (pogrubione krawędzie na rysunku); odpowiadają one pozytywnym porównaniom z sym-
bolami wejściowymi. Krawędzie skierowane na lewo odpowiadają negatywnym porównaniom.
Niektóre krawędzie prowadzące do stanu O pominęliśmy. (b) Funkcja przejść ó i wzorzec
P = ab11b11ca.Miejsca odpowiadające pozytywnym porównaniom są pokazane na szarym tle. (c)
Działanie automatu dla tekstu T = abababaceba. Pod każdym symbolem T[11jest zapisany stan
!p(TJ, w którym automat znajduje się po wczytaniu prefiksu Jj. Znalezione zostaje jedno wystąpie
nie wzorca, kończące się na pozycji 9
P. Jeśli następnym wczytanym symbolem jest T[i + I]= a, to stan zmienia się
na a(T;+ 1 ) = a(T 1a). Dowód twierdzenia pokazuje, że a(T 1a) = a(Pł a). W celu
obliczenia długości najdłuższego sufiksu T1a, który jest prefiksem P, możemy
obliczyć najdłuższy sufiks P'1.a,
który jest prefiksem P. W każdym stanie automat
musi jedynie znać najdłuższy prefiks P będący sufiksem dotychczas wczytanego
tekstu. Zatem, przyjmując ó(q, a)= u(P<1.a), zachowujemy wymagany niezmien-
nik (34.4). To nieformalne rozumowanie spróbujemy wkrótce sformalizować.
W automacie wyszukiwania wzorca z rys. 34.6 mamy na przykład
ó(5, b) = 4. Wynika to stąd, że jeśli automat wczyta b w stanie q = 5, to
Pt b = ababab, a najdłuższy prefiks P, który jest również sufiksem ababab wy-
nosi P 4 = abab.
968
34.3. WYSZUKIWANIE WZORCA Z WYKORZYSTANIEM AUTOMATÓW SKONCZONYCH
FINITE·AUTOMATON·MATCHER(T,ó, m)
1 n +- length [T]
2 q+-0
3 fori+-lton
4 do q - o(q, T[i])
5 ifq=m
6 tbens+-i-m
7 v,,ypisz „ Wzorzec występuje z przesunięciem" s
DOWÓD
Zgodnie z rys. 34.7, niech r = u(xa). Jeśli r = O, to nierówność r ~ u(x) + I
zachodzi w sposób trywialny ze względu na nieujemność a(x). Załóżmy zatem,
żer> O. W tym wypadku P,::Jxa zgodnie z definicją a. Tak więc P,_ 1 ::JX
(usuwamy a z końca P, oraz z końca xa). Zatem r - 1 ~ o{x), ponieważ u(x)
jest największym k, dla którego Pk ::i x.
•
LEMAT 34.3. (Rekurencja dla funkcji sufiksowej)
Dla każdego tekstu x i symbolu a, jeśli q = o{x), to 11(xa)= u(Pąa).
969
ROZDZIAŁ 34. WYSZUKIWANIE WZORCA
Rys. 34.7. Ilustratja dowodu lematu 34.2. Na rysunku widać, żer ,i,;;a(x) + I, gdzie r = ,r(xa)
DOWÓD
Z definicji funkcji CJmamy PIJ.~x. Jak widać na rys. 34.8, Pąa~xa. Jeśli
przyjmiemy r = CJ(xa),to r ~ q + I z lematu 34.2. Ponieważ Pqa~ xa, P, ~ xa
i !Pr J ~ IPIJ.aj,więc lemat 34.1 implikuje, że P,-::JPqa.Dlatego też r ~ CJ(Pqa),
tzn. że CJ(xa)~ CJ(PIJ.a).Zachodzi również CJ(Pąa) ~ CJ(xa),ponieważ Pąa-::Jxa.
Zatem CJ(xa)= a(Pqa).
X
- ..-,
- . ''
·•I
'
'
'
' ',
' •'
'. ' ' '
' ' '
. .,,.: ,_- . ,,
,,,
.. ,,;~ .',:
' ,,,
.. ,., 1j\ '"''
.·,,r"-.•~, ' .. ,'
' ', ' ' ' •' ' •a
,,;,
,_,..,.~
. ·''
,, ; ' ,,
• •
., '""
" o'
'
,,
•
Rys. 34.8. Ilustratjadowodu lematu 34.3. Na rysunku widać, żer = u(P,a), gdzie q = a(x) ir = ,r(xa)
•
Jesteśmy
teraz gotowi do przeprowadzenia dowodu głównego twierdzenia
charakteryzującego zachowanie się automatu wyszukiwania wzorca. Jak stwier-
dziliśmy wcześniej, twierdzenie to mówi, że automat w każdym kroku pamięta
najdłuższy prefiks wzorca będący sufiksem dotychczas wczytanego tekstu.
TWIERDZENIE 34.4.
Jeślir/>jest rozszerzoną funkcją przejść automatu wyszukiwania wzorca dla
danego wzorca P, a T[l .. n] jest tekstem wejściowym dla automatu, to
,f,(T1) = u(T,)
dla i= O, 1, ... , n.
DOWÓD
Dowód przebiega przez indukcję względem i. Dla i= O twierdzenie jest w oczy-
wisty sposób prawdziwe, ponieważ T 0 = s. Zatem r/>(T0 ) = CJ(T
0 ) = O.
970
34.3. WYSZUKIWANIE WZORCA Z WYKORZYSTANIEM AUTOMATÓW SKOl'ilCZONYCH
- li(ą, a) (z definicji q)
= u(T1+1) (z definicji T; + 1 )
•
Z twierdzenia 34.4 wynika, że jeśli automat przechodzi do stanu q w wier-
szu 4, to q jest największą wartością taką, że Pą :JT;. Mamy zatem q = m
w wierszu 5, gdy wystąpienie wzorca P zostało właśnie wykryte. Wynika stąd,
że procedura FINITE-AlITOMATON-MATCHER działa poprawnie.
Obliczaniefunkcji przejść
Następująca procedura oblicza funkcję przejść tJ dla danego wzorca P[l .. m].
COMPUTE-TRANSITION-FUNCTION(P,l')
1 m +- /ength [P]
2 forą+-Otom
3 doforaeI
4 dok+-min(m+l,ą+2)
5 repeatk+-k-1
6 until Pt:JPąa
7 li(ą, a)~k
8 return tJ
971
ROZDZIAŁ 34. WYSZUKIWANIE WZORCA
ZADANIA
34.3-1. Skonstruuj automat wyszukiwania wzorca P = aabab i przetestuj jego
działanie dla tekstu T = aaababaabaababaab.
34.3-2. Narysuj diagram przejść automatu wyszukiwania wzorca ababbabba-
babbababbabb nad alfabetem I= {a, b}.
34.3-3. Wzorzec P nazywamy ssmorozlączoym, gdy Pl-:JP, implikuje k = O
lub k = q. Opisz strukturę automatu wyszukiwania tego typu wzorca.
* 34.3-4. Dla danych dwóch wzorców Pi P' opisz konstrukcję automatu skoń
czonego wyszukującego wystąpienia każdego z nich. Spróbuj zminimalizo-
wać liczbę stanów takiego automatu.
34.3-5. Dla danego wzorca P zawierającego symbole uniwersalne (patrz zad.
34.1-5) pokaż, jak zbudować automat skończony wyszukujący P w tekście
Tw czasie O(n), gdzie n= ITI.
972
34.4. ALGORYTM KNUTHA-MORRISA-PRATTA
c b a b T
C a p
(o)
bacbab a b C b T
b a c a P
(b)
(c)
Rys. 34.9. Funkcja prefiksowa n:. (a) Wzor~ P = ababaca jest przystawiony do tekstu T tak, że
pierwszych q = 5 symboli pasuje do s.iebie.Pasujące symbole, pokazane na szarym tle, są połącza"
ne pionowymi liniami. (b) Korzystając z tego, że 5 symboli pasuje, wnioskujemy, że pr:z.esunięcie
:;+ I jest niepoprawne, natomiast przesunięcie s' = s + 2 jest zgodne z nasz11dotychczasową wie-
dzą o tekście i jest potencjalnie poprawne. (c) Informacja użyteczna w powyższym rozumowaniu
może być obliczona wcześniej dla samego wzorca. Widzimy tutaj, że najdłuższym preftk.semP bę
dą.cym sufiksem P, jest P 3 • Informacja ta jest obliczona i zapamiętana w tablicy n, a więc 1t [5] = 3,
Wiedząc, że ą symboli pasuje przy przesunięciu s, wnioskujemy, że następnym potencjalnie po-
prawnym pr:z.esunięciem jest l = s + (q - n [ąl)
973
ROZDZIAŁ 34. WYSZUKIWANIE WZORCA
gdzie s' + k = s + q?
Tak.ie przesunięcie s' jest następnym przesunięciem większym niż s, które
może okazać się poprawnym zgodnie z naszą wiedzą o T[s + 1 .. s + q]. W naj-
lepszym przypadku mamy, że s' = s + q, a przesunięcia s + l, s + 2, ... ,
s + q - I są od razu wyeliminowane. W każdym razie, dla nowego przesunię
cia s' nie musimy sprawdzać pierwszych k symboli P wzorca z odpowiadający
mi im symbolami tekstu T, ponieważ wiemy, że pasują one do siebie zgodnie
z równaniem (34.5).
Potrzebna informacja może być obliczona przez porównanie wzorca z so-
bą samym, jak jest to pokazane na rys. 34.9c. Ponieważ T[s' + 1 .. s' + k] jest
częścią znanego segmentu teksu, jest ono sufiksem tekstu P.,. Równanie (34.5)
może być zatem interpretowane jako pytanie o największe k < q takie, że
Pt=iPą. Tak więc s' = s + (q -k) jest następnym potencjalnie poprawnym
przesunięciem. Okazuje się, że bardziej się opłaca pamiętać liczbę k symboli,
które pasują względem nowego przesunięcia s', zamiast zapamiętywać s' - s.
Informacja ta może być użyta do przyspieszenia działania zarówno algorytmu
,,naiwnego", jak i algorytmu wykorzystującego automat skończony.
Opiszemy teraz dokładniej wstępne obliczenia dla wzorca. Dla danego
wzorca P[l .. m] funkcjaprefiksowa
Tak więc n[q] jest maksymalną długością prefiksu wzorca P będącego właś
ciwym sufiksem Pą. Na przykład na rys. 34.lOa jest pokazana pełna funkcja
n dla wzorca ababababca.
Algorytm Knutha-Morrisa-Pratta jest opisany poniżej nieformalnie jako
procedura K.MP-MATCHER. Algorytm zasadniczo symuluje procedurę FINI-
TE-AUTOMATON-MATCHER.Procedura KMP-MATCHER wywołuje pomocni-
czą procedurę COMPUTE-PREFIX-FUNCTIONobliczającą n.
KMP-MATCHER(T,P)
1 n+- length [f]
2 m +- length (P]
··----
974
34.4. ALGORYTM KNUTHA-MORRISA·PRATTA
3 :n:- COMPUTE-PREFIX-FUNCTION(P)
4 ą-o
5 fori-lton
6 do while q > O i P[q + I] # T[i]
7 do q - :n:[qJ
8 ifP[q+IJ-T[i]
9 tbeną-ą+l
IO if q - m
11 then wypisz „Wzoruc występuje z przesunięciem" i- m
12 q- n[q]
COMPUTE-PREFIX-FtJNCTION(P)
1 m-length[PJ
2 n[tJ-o
3 k-o
4 forą-2tom
5 do while k > O i P[k + I] P # [q]
6 dok- n[k]
7 i!P[k+l]-P[q]
8 tbenk-k+l
9 n[q]-k
1O return :n:
975
ROZDZIAŁ 34. WYSZUKIWANIE WZORCA
DOWÓD
Udowodnimy najpierw, że
976
34.4. ALGORYTM KNUTHA-MORRISA-PRATTA
• b
a. b C a 11:(8]=6
11:[6]= 4
Rys. 34.10. Ilustracja lematu 34.5 dla wzorca P = ababababca i q = 8. (a) Funkcja 11. Ponieważ
11[8]= 6, 11(6]= 4, 11[4]= 2 oraz 11[2}=0, iterując 11 otrzymujemy 11°[8]= {8, 6, 4, 2, O}. (b)
Przesuwamy okien.ko zawierające wzorzec P na prawo. Przyjrzyjmy się, kiedy prefiks P1 wzorca
P pasuje do właściwego sufiksu P 8 ; zachodri to dla k = 6, 4, 2 i O. Na rysunku pierwszy wiersz
zawiera P, przerywana linia pionowa jest narysowana dokładnie za P 8. Kolejne wiersze pokazują
wszystkie przesunięcia P, które powodują, że pewien prefiks Pt wzorca Ppasuje do pewnego sufiksu
P8 . Kolejno pasujące symbole są umieszczone na szarym tle. Pionowe linie łączą pasujące symbole.
2.atem {k:Pl::JP,} = {8, 6, 4, 2, O}.Lemat mówi, że n"[q] = {k:Pl::JP,} dla wszystkich q
LEMAT 34.6.
Niech P będzie wzorcem długości mi niech n będzie funkcją prefiksową dla P.
Wtedy dla q = l, 2, ... , m, jeśli n[q] > O, to zachodzi n[ą] -1 E n•[q - 1].
977
ROZDZIAŁ 34. WYSZUKIWANIE WZORCA
DOWÓD
Jeśli k=n[q]>O, to P1 -=iPą, a zatem P1 _ 1 -=iPą-i (przez pominięcie ostat-
niego symbolu z P„ i Pą). Z lematu 34.5 wynika, że k - 1 En-.[q -1].
WNIOSEK 34. 7,
Niech P będzie wzorcem długości mi niech n- będzie funkcją prefiksową dla P.
Dla q = 2, 3, ..., m zachodzi
o, jeśli E4 _ 1 = 0
n[q] - {l + max{kEEq_ 1 }, jeśli Eą-t ie 0
DOWÓD
Jeślir = n[q], to P, ::i Pą, a więc r ;:i: 1 implikuje P[r] = P[q]. Z lematu 34.6
wynika zatem, że jeśli r ;;i: I to
•
Skończymy teraz dowód poprawności obliczania funkcji n przez procedurę
COMPUTE-PREFIX-FUNCTION. w procedurze tej na początku każdej iteracji
pętli for w wierszach 4-9 mamy k = n[q - 1]. Warunek ten jest wymuszony
w wierszach 2 i 3, kiedy pierwszy raz wchodzjmy do pętli, oraz zachodzi w każ
dej kolejnej iteracji na skutek wiersza 9. W wierszach 5-8 jest modyfikowane
k tak, że staje się ono poprawną wartością n[q]. W pętli obejmującej wiersze
5-6 są przeglądane wszystkie wartości kEn *[q - I] do chwili znalezienia takiej,
która spełnia zależność P[k + 1] = P[q]; wtedy wiemy, że k jest największą.
wartością w zbiorze Eq-i· Zatem na mocy wniosku 34.7 przypisujemy na n[q]
wartość k + 1. Jeśli nie ma takiego k, tok= O w wierszach 7-9, a n[ą] otrzymu-
978
34.4. ALGORYTM KNUTHA-MORRISA-PRATTA
ZADANIA
34.4-1. Wyznacz funkcję prefiksową ,r dla wzorca ababbabbababbababbabb,
gdy alfabetem jest I= {a, b}.
979
ROZDZIAŁ 34. WYSZUKIWANIE WZORCA
34.4-l. Podaj górną granicę na rozmiar n' [ q] jako funkcję zależną od q. Pokaż
na przykładzie dokładność swojego oszacowania.
34.4-3. Opisz, jak można wyznaczyć wystąpienia wzorca P w tekście T za
pomocą funkcji n dla słowa PT (słowo o długości m + n będące konkate~
nacją P i 7).
34.4-,J. Pokaż, jak można ulepszyć procedurę KMP-MATCHER, zastępując
funkcję n w wierszu 7 (ale nie w wierszu 12) przez n', gdzie n' jest zdefinio-
wana rekurencyjnie dla q = l, 2, ... , m:
o, jeśli rr[ą] - O
rr'[ą] - rr'[rr[ą]], jeśli rr[ą] #a O i P[rr[ą] + I] - P[q + I]
rr[ą], jeśli rr[ą] #a O i P[rr[ą] + I] #a P[q + I]
Wyjaśnij,
dlaczego zmodyfikowany algorytm jest poprawny oraz w jakim
sensie modyfikacja ulepsza algorytm.
34.4-5. Skonstruuj liniowy algorytm sprawdzający, czy tekst T jest cykliczną
rotacją danego tekstu T'. Na przykład arc i car są swoimi cyklicznymi
rotacjami.
* 34.4-6. Skonstruuj efektywny algorytm obliczający funkcję przejść ó dla auto-
matu szukającego wzorca P. Twój algorytm powinien działać w czasie
O(mll:I). (Wskazówka: Udowodnij, że li(q, a) - li(rr[ą], a), jeśli q - m lub
P[q + I] #a a).
----------------------------
* 34.5. Algorytm Boyera-Moore'a
Jeśli wzorzec P jest względnie długi, a alfabet I jest dostatecznie duży, to
algorytm opracowany przez Roberta S. Boyera i J. Strothera Moore'a jest
prawdopodobnie najbardziej praktycznym algorytmem.
BOYER-MOORE-MATCHER(T,P, I}
l n .._ length [f]
2 m-length[P]
3 ,1..._ CoMPUTE-LAST-0CCURRENCE-FUNCTI0N(P,m, I)
4 y .._ COMPUTE-GOOD-SUFFIX-FUNCTION(P,m)
5 s-o
6 whiles~n-m
7 do)-m
8 wbilej > Oi PU] - T[s + j]
9 do)-J-1
IO ifj-0
980
* 34.5. ALGORYTM BOYERA-MOORE'A
12 S+-S + I
13 elses+-s+ 1
Heurystyka niezgodności
W sytuacji pojawienia się negatywnego wyniku porównania heurystyka nie-
zgodności korzysta z informacji o położeniu niezgodnego symbolu T[.v+ j] we
wzorcu Geśli jest jakiekolwiek) w celu zaproponowania odpowiedniego przesu-
nięcia. W najlepszym przypadku niezgodność może wystąpić przy pierwszym
porównaniu (P[m] c!-T[s + m]) i niezgodny symbol T[.~+ m] w ogóle nie wy-
stępuje we wzorcu. (Wyobraźmy sobie szukanie amw tekście b".) W tym wypa-
dku możemy wykonać przesunięcie m, ponieważ każde przesunięcie mniejsze
_____________________ ,_____
,,.,,_,,
_____ ~=
981
ROZDZIAŁ 34. WYSZUKIWANIE WZORCA
••• w r t e n t h a t ···
~
r a m i n i
(,)
.
••• w r i t t • n
- n o t ',łJ C • - t h • t •••
I
>+4
r • m i
(b)
"'I
n ., , a o • n o •
••• w r i t t
• n
- n o t i ·•·· • '(,f,
- t h a I t I •••
,+3
r • m i n i a !"O.;;". n o •
(c)
Rys. 34.11. llustracja heurystyk w algorytmie Boyem-Moore' a. (a) Szukanie wzorca ,eminiscence w tek-
ście przez porównywanie symboli od strony prawej do lewej. Przesunięcie sjest niepoprawne; chociaż
,,dobry sufiks'' ce wzorca pasuje do odpowiadających mu symboli tekstu {kolor szary na rysunku),
jednak w tekście został wykryty „niezgodny symbol" i, który nie pasuje do symbolu n we wzorcu.
{b) Heurystyk.a niezgodności „proponuje" przesu~e wzorca. w prawo,jeśli można, o wielkość, która
zagwarantuje, że niezgodny symbol tekstu będzie pasował do pierwszego od prawej wystąpienia tego
symbolu we wzorcu. W tym przykładzie przesunięcie wzorca o 4 pozycje w prawo powoduje to, że
symbol I w tekście będzie pasował do prawostronnego wystąpienia i we wzorcu, na pozycji 6. Jeśli
niezgodny symbol nie występuje we wzorcu, to wzorzec może zostać całkowicie przesunięty poza ten
symbol. Jeśli prawostronne wystąpienie niezgodnego symbolu we wzorcu jest na prawo od pozycji
bieżącego niezgodnego symbolu, to heurystyka ta się nie stosuje. (c) W przypadku heurystyki dobrego
sufiksu, wzorzec jest przesunięty na prawo o tyle pozycji aby zagwarantować, że w ten sposób nie
pomijamy żadnego potencjalnego wystąpienia zgodnego ze sprawdzonym właśnie sufiksem. W przy-
kładzie, przesuwając wzorzec o 3 pozycje na prawo, spełniamy ten warunek. Ponieważ heurystyka
dobrego sufiksu sugeruje przesunięcie o 3 pozycje, podczas gdy druga heurystyka daje przesunięcie
równe 4, więc aJgorytm Boyera-Moore'a wykonuje przesunięcie o 4 pozycje
982
* 34,5. ALGORYTM BOYERA-MOORE'A
COMPUTE-LAST-0CCURRENCE-FUNCTI0N(P,m, E)
1 for każdy symbol aEE
2 do .![a] - O
3 forJ-1tom
4 do .![P[j]J - j
5 return A
983
ROZDZIAŁ 34. WYSZUKIWANIE WZORCA
Niezgodny symbol ł
.,. J: • V i o n i n
' i n i •
ł
...i:; I• Iv IO 11 Iu It Ii IO I• I_Ii I• I_It Ih I• I_It Ir I• I• It I• I• In It I_Io I< I···
s + 11
"irj ejmji lnli I• IcI•I nicl• I
,.,
••• w r i t n o t
' r • • i
I•
••• w r i t n o t C
• t h • t • ••
,,, i n • C
• n C
•
{b)
•.. 9 o l o
' f ...
' i n i •
,,,
Rys. 34.12. Przypadki heurystyki niezgodności. (a) Niezgodny symbol h nie występuje we wzorcu, tak
więc wzorzec może być przesunięty oj= 11 symboli, przesuwając się poza niezgodny symbol.
(h) Prawostronne wystąpienie niezgodnego symbolu we wzorcu jest na pozycji k <}, tak że wzo-
nec może być przesunięty oj- k symboli. Ponieważ j = 10 i k = 6 dla niezgodnego symbolu i,
wzorzec może zostać przesunięty o 4 pozycje, zanim symbole i będą pasować. (c) Prawostronne
wystąpienie niezgodnego symbolu we wzorcu jest na pozycji k > j. W tym przykładzie j = 10
i k = 12 dla niezgodnego symbolu e. Heurystyka niezgodnego symbolu proponuje teraz niedodat-
nie przesunięcie, które jest zignorowane
984
* 34.5. ALGORYTM BOYERA-MOORE"A
(fen drugi zbiór może być pusty). Warto zauważyć, że z definicji wynika nieró-
wność y[j] > O dla wszystkich j = I, 2, ... , m, co gwarantuje, że algorytm
Boyera-Moore'a wykona dodatnie przesunięcie.
Aby jeszcze bardziej uprościć opis funkcji y, definiujemy P' jako odwróco-
ny wzorzec P, a n' jako jego funkcję prefiksową. To znaczy, P'[1] =
= P[m - i+ I] dla i= 1, 2, ... , m, a n-'[tljest maksymalnym u takim, że u< t
oraz P~.:::JP;.
Jeśli k jest największą możliwą wartością taką, że P[j + 1 .. m] ~Pk, to
twierdzi.my, iż
n'[/] - m - j (34.8)
985
ROZDZIAŁ 34. WYSZUKIWANIE WZORCA
y[j] - m - max({n[m]}
u {m - I+ n'[/]: 1 ~ I~ m i j - m - n'[/]})
- min({m - n[m])
u{l-n'[l]:l~/~m i J-m-n'[I]}) (34.9)
COMPUTE-Gooo-SUFFIX-FUNCTION(P, m)
1 1t +- COMPUTE-PREFIX-FUNCTION(P)
2 P' +- odwrócone P
3 n'+- COMPUTE-PREFIX-FUNCTION(P')
4 forj+-Otom
5 do y[J]-m- n[m]
6 forl+--ltom
7 doj+--m-n'[/]
8 il y[J] > I - n'[/]
9 then y[j] - I - n'[/]
1O return y
986
PROBLEMY
ZADANIA
34.S-1. Oblicz funkcje ,t i y dla wzorca P = 0101101201 i alfabetu E =
- {O, I, 2}.
34.5-2. Podaj przykłady demonstrujące, że przy zastosowaniu kombinacji obu
heurystyk (niezgodności i dobrego sufiksu) algorytm Boyera-Moore'a
działa znacznie lepiej niż wtedy, kiedy jest w nim wykorzystywana sama
heurystyka dobrego sufiksu.
* 34.5-3. Ulepszenie podstawowej procedury Boyera-Moore'a, które jest często
używane w praktyce, polega na zastąpieniu funkcji y funkcją y' zdefinio-
waną następująco:
Problemy
34-1. Wyszukiwanie wzorca związane z powtarzającymi się podslowami
Niech yi oznacza konkatenację słowa y ze sobą i razy. Na przykład
(ab) 3 = ababab. Mówimy, że słowo x E E ma czynnik powtóneń r, jeśli x = y
0
dla pewnego y Ei:• i pewnego r > O. Niech p(x) oznacza największe r takie, że
x ma czynnik powtórzeń r.
-
(a) Skonstruuj efektywny algorytm, który dla zadanego wzorca P[l „ m] obli-
cza p(P;) dla i= 1, 2, ... , m. Jaki jest czas działania Twojego algorytmu?
(b) Dla każdego wzorca P[l .. m] niech p•(P) będzie zdefiniowane jako
„
max 1 1,.,,,p(Pi). Udowodnij, że jeśli wzorzec P jest wybrany losowo ze
zbioru wszystkich ciągów binarnych długości m, to oczekiwaną wartością
p'(P)jest 0(1).
(c) Uzasadnij, dlaczego następujący algorytm wyszukiwania wzorca znajduje
poprawnie wszystkie wystąpienia wzorca P w tekście T[l .. n] w czasie
O(p '(P)n + m).
987
ROZDZIAŁ 34. WYSZUKIWANIE WZORCA
REPETITION-MATCHER(P, 7)
I m - length [PJ
2 n +- length [T]
3 k-1 +p'(P)
4 ą+-0
5 s+-0
6 whiles~n-m
7 do if T[s + q +I]= P[q + 1]
8 thenq+-q+l
9 ifq=m
IO then wypisz „Wzorzec występuje z przesunięciem" s
11 il q = m lub T[s + q + 1] a' P[q + I]
12 thens-s+max(l,1q/kl)
13 q +- O
<•,oa,)(ą) = a,(a,(ą))
(b) Udowodnij, że o jest operacją łączną.
(c) Udowodnij, że óxy może być obliczone z tablicowej reprezentacji óx i óY
w czasie 0(1) na CREW PRAM. Wyraź liczbę potrzebnych procesorów
jako funkcję IQI.
(d) Udowodnij, że <P(T1) = óT ,(ą 0 ), gdzie ą 0 jest stanem początkowym auto-
matu M.
988
UWAGI DO ROZDZIAŁU
(e) Pokaż, jak można znaleźć wystąpienia wzorca w tekście długości n w czasie
O(lgn) na CREW PRAM. Zakładamy, że wzorzec jest podany w postaci
odpowiadającego mu automatu skończonego.
Jwagi do rozdziału
Związek wyszukiwania wzorca z teorią automatów skończonych jest rozważa
ny przez Abo, llo_pcrofta i Ullmana w [4]. Algorytm Knutha-Morrisa-Pratta
[125) był opracowany niezależnie przez Knutha i Pratta oraz przez Morrisa;
opublikowali oni wspólną pracę na ten temat. Algorytm Rabina-Karpa był
podany przez Rabina i Karpa [117], natomiast algorytm Boyera-Moore'a po-
chodzi od Bayera i Moore'a [32]. Galil i Seiferas [78] podają interesujący al-
gorytm wyszukiwania wzorca w pamięci 0(1) (poza tą używaną do przechowy-
wania wzorca i tekstu, która nie może być modyfikowana).
Rozdział 35
Geometriaobliczeniowa
'
990
35.1. WŁASNOSCI ODCINKÓW
991
ROZDZIAŁ 35. GEOMETRIA OBLICZENIOWA
się pr7.ecinają
- wyznaczenie dla każdego odcinka równania prostej zawierają
cej ten odcinek postaci y = mx + b (m jest współczynnikiem kierunkowym,
b zaś jest przesunięciem na osi y), znalezienie punktu przecięcia prostych
i sprawdzenie, r:zy ten punkt należy do obu odcinków - wymaga zastosowania
dzielenia przy znajdowaniu punktu przecięcia. Jeśli odcinki są prawie równo-
ległe, to metoda ta jest bardzo wrażliwa na dokładność operacji dzielenia na
komputerze. Opisana w tym podrozdziale metoda, w której unika się dzielenia,
jest znacznie dokładniejsza.
Iloczyn wektorowy
Podstawę naszych metod badania odcinków stanowi obliczanie iloczynu wek-
torowego. Rozważmy wektory p 1 i p 2, pokazane na rys. 35.la. Iloczyn wek-
torowy p 1 x p 2 może być interpretowany jako wyposażone w znak pole rów-
noległoboku utworzonego przez punkty (O, O), p 1, p 2 i p 1 + p 2 = (x 1 + x2,
y 1 + y 2). Równoważna, ale bardziej praktyczna definicja określa iloczyn wek-
torowy jako wyznacznik macierzy 1l
p 1 xp 2 =det
x, x,)
( Y1 Yi
= -P2 XPi
Jeśli wartość p 1 x p 2 jest dodatnia, to punkt p 1 jest położony zgodnie z ruchem
wskazówek zegara w stosunku do p 2 względem początku układu (O, O); jeśli
iloczyn wektorowy jest ujemny, to p 1 leży przeciwnie do ruchu wskazówek
zegara w stosunku do p2• Na rysunku 35.lb widać obszary zgodny i przeciwny
do ruchu wskazówek zegara względem wektora p. Jeśli iloczyn wektorowy jest
równy O, mamy do czynienia z sytuacją brzegową; wektory są wtedy współ
liniowe i mają ten sam lub przeciwny kierunek.
żeby sprawdzić, czy odcinek skierowany p 0p 1 jest położony zgodnie z ru-
chem wskazówek zegara w stosunku do odcinka skierowanego p 0 p 2 względem
ich wspólnego końca p 0 , stosujemy translację punktu p 0 do początku układu.
To znaczy, oznaczamy jako p 1 - Po wektor pi= (xJ.,yf), gdzie xi = x 1 - Xo,
a y { = y 1 - Yo,i podobnie definiujemy p 2 - p 0 • Następnie obliczamy iloczyn
wektorowy
(p, - p,) x (p, - p 0 ) - (x 1 - x 0 )(y, - y 0 ) - (x, - x,)(y, - y,)
--------
!) Iloczyn wektorowy jest tak naprawdę obiektem przestrzeni trójwymiarowej. Jest to wektor
prostopadły zarówno do p 1, jak i p.,, o zwrocie zgodnym z ,,regułą prawej ręki" i długości
lxiYi - XzY11. W tym rozdziale jOOnak wygodnie będzie nam traktować iloczyn wektorowy po
prostu jako wartośc x 1y 1 - X:i}'p
992
35.1. WŁASNQ$C! ODCINKÓW
(0,0) X
(a) (b)
Rys. 35.1. {a) Iloczyn wektorowy wektorów p 1 i p 2 to pole równoległoboku ze znakiem. (b) Jasnoszary
obszar zawiera wektory położone zgodnie z ruchem wskazówek zegara względem p. Ciemnoszary
obszar składa się z wektorów położonych przeciwnie do ruchu wskazówek zegara względem p
Jeśli
jego wartość jest dodatnia, to wektor p 0 p 1 jest położony zgodnie
z ruchem wskazówek zegara w stosunku do p 0 p 2 ; jeśli ujemna, to przeciwnie.
P, Pe
Orientacja przeciwna Orientacja zgodna
do ruchu z ruchem
wskazówek zegara wskazówek zegara
Po Po
(a) (b)
Rys. 35.2. Wykorzystanie iloczynu wektorowego do sprawdzania, w którą slronę skręca.my w punk-
do PiPi-Sprawdr.amy, czy odcinek skierowany p-;;;:,
cie p 1, przechodząc z odcinka PrJJ, Jeży zgodnie
czy pr1.eciwnie do ruchu wskazówek zegara w stosunku do odcinka skierowanego p---;p;_. (a) Jeśli
przeciwnie, to skręcamy w lewo. (b) Jeśli zgodnie, to skręcamy w prawo
993
ROZDZIAŁ 35. GEOMETRIA OBLICZENIOWA
Proces sprawdzania, czy dwa odcinki się przecinają, składa się z dwóch kro-
ków. Pierwszy krok to szybka eliminacja:odcinki nie mogą się przecinać, jeśli
nie przecinają się ich prostokątne ograniczenia. Prostokątne ograniczeniefigury
geometrycznej to najmniejszy prostokąt o bokach równoległych do osi układu
współrzędnych zawierający tę figurę. Prostokątne ograniczenie odcinka Pl.Pi
to prostokąt (ft1, jJ2) o lewym dolnym rogu jJ 1 = (.X1, j\) i prawym górnym rogu
Pi= (X2 , .Y2), gdzie .X1 = min(x 1, x 2), .Y1 = min(J, 1, y 2), X2 = max:(x1, xJ, a .Y2 =
= max:(y1, y 2). Dwa prostokąty, reprezentowane przez swój lewy dolny i prawy
górny róg (ft1, fi2) i (ft3 , j) 4), przecinają się wtedy i tylko wtedy, gdy prawdziwa
jest koniunkcja
(Xi~ .X3)A (.i4 ~ Xi) A (Ji2~ f3) A {Ji4~ .Pi)
Prostokąty muszą się przecinaćw obydwu wymiarach. Pierwsze dwa z powyż
szych porównań służą do sprawdzania, czy prostokąty przecinają się na współ
rzędnych x; drugie dwa dotyczą przecinania się na współrzędnych y.
Drugi krok sprawdzania, czy dwa odcinki się przecinają, polega na zbada-
niu, cey każdy odcinek przecina prostą zawierającą ten drugi. Odcinek p1p 2
(p4-P1}x(p2-P1) < O
(p3-P1)X(p2-P1) <O
P,
P;
P,
(P4-P1)X(p2-P1) >O
P, P,
(,) (b)
(P3-P1)>1.(p2-P1l <O
P, ,.. . • • • p
(p4-P1)x{p2-P1)"' O
''
'' '
'
' '
P, P, ' ______'',
(p4-P1)X(p,-p1) =0
P;
:.·-'1
p'
P, r, (P3-P1)x(p2-P 1) = O p,V,.:
(cl (d) (,)
Rys. 35.3. Sprawdzanie czy odcinek p..,p~przecina prostą zawierającą odcinek PiPi· (a) Jeśli tak, to
znaki iloczynów wektorowych (p3 - p 1} x (p2 - p 1)i (p, - p 1} x (p 2 - p 1) są różne. (b} Jeśli nie, to
znaki tych iloczynów są takie same. (c)-(d) Przypadki brzegowe, w których przynajmniej jeden
z iloczynów wektorowych jest zerem, a odcinek przecina prostą. (e) Przypadek brzegowy, w któ-
rym odcinki są współliniowe, aJe s.ię nie przecinają. Obydwa iloczyny wektorowe są równe zero, ale
nasz algorytm nie będzie ich obliczał, ponieważ odcinki nie przechodzą, testu szybkiej eliminacji
- ich prostokątne ograniczenia się nie przec:inają
994
35-1. WŁASN0$C! ODCINKÓW
przecina prostą, jeśli punkt p 1 leży po jednej stronie prostej, a punkt p 2 po drugiej.
Dopuszczamy tak.że sytuację, w której p 1 lub p 2 leży na prostej. Dwa odcinki
przecinają się wtedy i tylko wtedy, gdy przechodzą z wynikiem pozytywnym test
szybkiej eliminacji i każdy z nich przecina prostą zawierającą drugi odcinek.
Do sprawdzania, czy odcinek p 3 ft4 przecina prostą przechodzącą przez
punkty p 1 i p 2 , możemy wykorzystać iloczyn wektorowy. Idea, co widać na
rys. 35.3a i b, polega na sprawdzeniu, czy odcinki skierowane p 1p 3 i p 1p 4 mają
przeciwne orientacje względem p 1p 2 . Jeśli tak, to nasz odcinek przecina prostą.
Wzajemną orientację możemy zbadać za pomocą iloczynu wektorowego, spra-
wdzając po prostu, czy znaki iloczynów (p3 - p 1) x (p 2 - p 1) i (p 4 - p 1) x
><(p 2 - p 1) są różne. Z sytuacją brzegową mamy do czynienia, gdy któryś
z iloczynów jest zerowy. Wtedy punkt p 3 lub p 4 leży na prostej zawierającej
odcinek p1--ji1_.Ponieważ nasze dwa odcinki przeszły już test szybkiej eliminacji,
jeden z punktów p 3 i p 4 musi naprawdę leżeć na odcinku p 1p 2 • Dwie takie
sytuacje są pokazane na rys. 35.3c i d. Przypadek, w którym dwa odcinki są
współliniowe, ale się nie przecinają, przedstawiony na rys. 35.3e, zostaje wyklu-
czony przez test szybkiej eliminacji. Ostatnia sytuacja brzegowa występuje, gdy
jeden lub obydwa odcinki mają długość O,tzn. gdy końce odcinka się pokrywa-
ją. Jeśli oba odcinki mają długość O, to wystarcza test szybkiej eliminacji. Jeśli
tylko jeden odcinek, powiedzmy [)3 P4,ma długość O, to odcinki się przecinają
wtedy i tylko wtedy, gdy iloczyn wektorowy (p 1 - p 1) x (p2 -p 1)jest równy O.
ZADANIA
35.1-1. Udowodnij, że jeśli wartość p 1 x p 2 jest dodatnia, to wektor Pi jest
położony zgodnie z ruchem wskazówek zegara w stosunku do wektora p 2
względem punk.tu (O, O), a jeśli wartość tego iloczynu wektorowego jest
ujemna, to Pi leży przeciwnie do ruchu wskazówek zegara w stosunku do p 2•
995
ROZDZIAŁ 35. GEOMETRIA OBLICZENIOWA
996
35.2. SPRAWDZANIE, CZY JAKAKOLWIEK PARA ODCINKÓW SIĘ PRZECINA
Uporządkowanie odcinków
Ponieważ zakładamy, że nie ma pionowych odcinków, każdy z wejściowych
odcinków przechodzących przez daną pionową prostą zamiatającą przecina ją
w jednym punkcie. Możemy zatem uporządkować odcinki przecinające piono-
wą prostą zamiatającą ze względu na współrzędne y punktów przecięcia.
Ujmując rzecz dokładniej, rozważmy dwa nie przecinające się odcinki s 1
i s2• Mówimy, że odcinki te są porównywalnew x 0 , jeśli pionowa prosta zamia-
tająca o współrzędnej x równej x 0 przecina obydwa z nich. Mówimy, że s 1 leży
powyżej s2 w x, co zapisujemy jako s 1 >x s2, jeśli s 1 i s2 są porównywalne w x,
a przecięcie s1 z prostą zamiatającą w x znajduje się wyżej niż przecięcie s2 z tą
samą prostą zamiatającą. Przykładowo na rys. 35.4a zachodzą relacje a>, c,
a> 1 b, b > 1 c, a> 1 c i b >., c. Odcinek d nie jest porównywalny z żadnym
innym odcinkiem.
Dla dowolnego ustalonego x relacja ,, > x" jest porządkiem liniowym
(patrz pod.rozdz. 5.2) w zbiorze odcinków, które przecinają prostą zamiatającą
o współrzędnej x. Porządek ten może być różny dla różnych wartości x, ponie-
waż jedne odcinki wchodzą do owego zbioru, a inne go opuszczają. Odcinek
___________
____ _ ,,
997
ROZDZIAŁ 35. GEOMETRIA OBLICZENIOWA
'
a .,'
d~ g ;
,, h
'
'' ' J'' '
' '' ' '
t
' (,)
" ' '
(b)
w
Rys. 35.4. Uporządkowanie odcinków na różnych pionowych prostych zamiatających. (a) Zachodzą
relacje a >, c, a >, h, h >, c, a >, c i b >. c. Odcinek d nie jest porównywalny z żadnym
z pozostałych narysowanych odcinków. (b) Kiedy odcinki ei f się przecinają, ich kolejność się
cxiwraca: mamy e >, /, alef>~ e. Dla dowolnej prostej zamiatającej (takiej jak z), przechodzącej
przez szary obsz.ar, odcinki ei/ sąsjadują ze sobą w związanym z nią. porządku liniowym
Przesuwanieprostejzamiatającej
W algorytmach, w których wykorzystuje się metodę zamiatania, są zazwyczaj
używane dwa zbiory danych:
998
35,2. SPRAWDZANIE, CZY JAKAKOLWIEK PARA ODCINKÓW SIĘ PRZECINA
ANY-SEGMENTS-INTERSECT(S)
1 T +- 0
2 posortuj końce odcinków w S od lewej do prawej, rozstrzygając remisy
na korzyść punktów o mniejszej współrzędnej y
3 for każdy punkt p na posortowanej liście końców odcinków
4 do if p jest lewym końcem odcinka s
5 then INSERT(T, s)
6 if (ABoVE(T, s) istnieje i przecina s) lub (BELOW(T, s) istnieje
i przecina s)
7 then returnTR UE
8 if p jest prawym końcemodcinka s
9 then if oba odcinki ABOVE(T, s) i BELOW(T, s) istnieją i ABOVE(T, s)
przecina BELOW(T, s)
1O then returnTRUE
11 DELETE(T,s)
12 return FALSE
999
ROZDZIAŁ 35. GEOMETRIA OBLICZENIOWA
''
'
,' a d
' '
'
' ''
''
'
I
b
a a a d
b , a d '
' d
b ' b '
b b
°'"'
Rys. 35.5. Działanie algorytmu ANY-SEGMENTS-lNTER!iECT.
Każda linia przerywana to prosta zamia-
tającadla pewnego zdarzenia, a kolejność nazw odcinków pod każdą prostą zamiatającą to po-
rządek w zbiorze T po przebiegu pętli for, przetwarzającym odpowiednie Warzenie. Przecięcie
odcinków di b zostaje wykryte przy usuwaniu odcinka c
Poprawność algorytmu
Poniższe twierdzenie mówi, że algorytm ANY-SEGMENTS-INTERSECTjest po-
prawny.
1000
35.2. SPRAWDZANIE, CZV JAKAKOLWIEK PARA ODCINKÓW SIĘ PRZECINA
TWIERDZENIE 35.1.
Wywołanie procedury ANY-SEGMENTS-lNTERSECl'(S)zwraca wartość TRUE
wtedy i tylko wtedy, gdy któreś odcinki ze zbioru S się przecinają.
DOWÓD
Procedura może zadziałać niepoprawnie albo zwracając wartość TRUE, jeśli nie
ma żadnych przecięć, albo zwracając FALSE, jeśli istnieje co najmniej jedno
przecięcie. Pierwszy przypadek nie może wystąpić, ponieważ procedura ANY-
-SEGMENTS-INTERSECTzwraca wartość TRUE jedynie wtedy, kiedy znajduje
przecięcie dwóch wejściowych odcinków.
Żeby wykazać, że drugi przypadek również nie może zajść, w celu doprowa-
dzenia do sprzeczności załóżmy, że istnieje przynajmniej jedno przecięcie, ale
procedura ANY-SEGMENTS-INTERSECTzwraca wartość FALSE.Niech p będzie
pierwszym z lewej strony punktem przecięcia, przy czym remisy rozstrzygamy na
korzyść punk.tu o mniejszej współrzędnej y, i niech a i b będą odcinkami przeci-
nającymi się w punk.ciep. Ponieważ na lewo od p nie ma żadnych przecięć,
porządek określony przez T jest taki sam we wszystkich punktach na lewo odp.
Ponieważ żadne trzy odcinki nie przecinają się w tym samym punkcie, istnieje
prosta zamiatająca z, na której a i b stają się sąsiadami w liniowym porządku l.
1
1001
ROZDZIAŁ 35. GEOMETRIA OBLICZENIOWA
Czasdziałania algorytmu
Jeślizbiór s zawiera n odcinków, to algorytm ANY-SEGMENTS-INTERSECT
działa w czasie O(nlgn). Czas wykonywania instrukcji w wierszu I to 0(1).
Wykonanie operacji w wierszu 2 zajmuje czas O(n lg n), jeśli użyjemy algoryt-
mu mergesort lub heapsort. Ponieważ jest w sumie 2n zdarzeń, pętla for
w wierszach 3-11 wykona co najwyżej 2n obrotów. Każdy przebieg pętli zaj-
muje czas O(lgn), gdyż każdą operację na drzewie czerwono-czarnym wykonu-
je się w czasie O(lgn), a korzystając z metod opisanych w podrozdz. 35.1,
sprawdzenie czy dwa odcinki się przecinają, można wykonać w czasie 0(1).
Łączny czas wynosi zatem O(nlgn).
ZADANIA
3S.2-1. Wykaż, że w zbiorze n odcinków może być 0(n 2 ) przecięć.
3S.2-l. Pokaż, jak za pomocą iloczynów wektorowych dla danych dwóch nie
przecinających się odcinków a i b, porównywalnych w x, sprawdzić w cza-
sie 0(1), która z relacji a >" b czy b >" a jest spełniona.
35.2-3. Profesor Maginot proponuje tak zmodyfikować procedurę ANY-SEG.
MENTS-lNTERSECT,żeby zamiast kończyć działanie po znalezieniu przecię
cia wypisywała ona przecinające się odcinki i przechodziła do następnego
przebiegu pętli for. Profesor nazywa tak otrzymaną procedurę PROC-IN-
TERSECTING-SEGMENTS i twierdzi, że wypisuje ona wszystkie przecięcia
od strony lewej do prawej, zgodnie z ich występowaniem w zbiorze odcin-
ków. Wykaż, że profesor popełnił dwa błędy w rozumowaniu, podając
przykład zbioru odcinków, w którym pierwsze przecięcie znalezione przez
procedurę PROC-INTERSECTING-SEGMENTS nie jest pierwszym z lewej
strony, oraz zbioru odcinków, w którym PROC-lNTERSECTING-SEGMENT
nie znajduje wszystkich przecięć.
3S.l-4. Podaj działający w czasie O(nlgn) algorytm sprawdzania, czy n-wierz-
chołkowy wielokąt jest prosty.
3S.2-S. Podaj działający w czasie O(nlgn) algorytm sprawdzania, czy dwa pro-
ste wielokąty zawierające w sumie n wierzchołków się przecinają.
3S.2-6. Kolo jest to okrąg plus jego wnętrze. Można je reprezentować przez
punkt środkowy i promień. Dwa koła przecinają się, jeśli mają jakiś punkt
wspólny. Podaj działający w czasie O(nlgn) algorytm sprawdzania, czy
którekolwiek dwa ze zbioru n kół się pr:,.ecinają.
35.2-7. Pokaż, jak dla danego zbioru n odcinków, zawierającego w sumie
k przecięć, wypisać wszystkie k przecięć w czasie O((n + k)lg n).
35.2-8. Opisz,jak zaimplementować operacje na drzewach czerwono-czarnych,
żeby procedura ANY-SEGMENTS~INTERSECT działała poprawnie, nawet
jeśli niektóre odcinki są pionowe lub więcej niż dwa odcinki przecinają się
w jednym punkcie. Udowodnij poprawność swojej implementacji.
1002
35.3. ZNAJDOWANIE WYPUKŁEJ OTOCZKI
35.3. Znajdowanie
wypuklejotoczki
Wypukła otoczka zbioru punktów Q to najmniejszy wielokąt wypukły Ptaki, że
każdy punkt ze zbioru Q leży albo na brzegu P, albo w jego wnętrzu. Wypukłą
otoczkę zbioru Q oznaczamy przez CH(Q). Odwołując się do intuicji, możemy
wyobrazić sobie punkty ze zbioru Q jako wystające z deski gwoździe. Kształt
wypuklej otoczki przybierze wówczas gwnka obejmująca ciasno wszystkie gwoź
dzie. Na rysunku 35.6 jest przedstawiony zbiór punktów i jego wypukła otoczka.
W tym podrozdziale przedstawiamy dwa algorytmy obliczania wypuk.lej
• •
• • • P,
P„ P9 • P; P;
P, • P,
P„ P,
P,•
P,
Po
Rys. 35.6. Zbiór punktów Q wraz z zaznaczoną na sraro swoją wypukłą otoczką CH(Q)
1003
ROZDZIAŁ 35. GEOMETRIA OBLICZENIOWA
Algorytm Grahama
W algorytmie Grahama problem wypukłej otoczki jest rozwiązywany z użyciem
stosu S, który zawiera kandydatów na wierzchołki otoczki. Każdy punkt
z wejściowego zbioru Q jest raz wkładany na stos, a punkty nie będące wierz-
chołkami CH(Q) są w końcu ze stosu zdejmowane. Po zakończeniu działania
algorytmu stos S zawiera wyłącznie wierzchołki Clł(Q), w przeciwnej do ruchu
wskazówek zegara kolejności ich występowania na brzegu.
Dane wejściowe dla procedury GRAHAM~SCAN stanowi zbiór punktów Q,
gdzie IQI~ 3. Procedura korzysta z funkcji TOP(S), zwracającej element na
szczycie stosu S bez zmiany S, oraz NEXT~1'o~TOP(S), zwracającej element
położony o jedno miejsce poniżej szczytu stosu, bez zmiany stosu S. Jak zaraz
wykażemy, stos S zwracany przez procedurę GRAHAM-SCAN zawiera, patrząc
od dołu do góry, wszystkie wierzchołki CH(Q) w kolejności przeciwnej do
ruchu wskazówek zegara.
1004
35.3. ZNAJDOWANIE WYPUKŁEJ OTOCZKI
GRAHAM-SCAN(Q)
1 niech p 0 będzie punktem w Q o minimalnej współrzędnej y, lub,
w przypadku remisu, pierwszym takim punktem z lewej
2 niech (pi, p 2, •.• , Pm) będą pozostałymi punktami Q, posortowanymi
ze względu na wsp. kątową w biegunowym układzie współ
rzędnych o środku w Po w kierunku przeciwnym do ruchu
wskazówek zegara Geśli więcej niż jeden punkt ma taką samą
wsp. kątową, usuń wszystkie oprócz położonego najdalej od p 0 )
3 top(S] +- O
4 PUSH(p0 , S)
5 PUSH(p,, S)
6 Pus,1(p,, S)
7 fori+-3tom
8 do wbile kąt utworzony przez punkty NEXT-TO-TOP(S),TOP(S) i P;
nie oznacza skrętu w lewo
9 do POP(S)
IO PUSH(S, p;)
11 return S
-
-
-
-
-
P„
•
'
'
'
:p
...
9
- '- p R ' -
- ' '' ' ' '
p
7
'
P,
'
•
~ P„
•
.. .
-
' ,'
- ,
- -
- •P4 P1
' ' '' ''
,,'' '' ,,,
' '' ' ' ' p
'::/>' _, .· ,- l Pi~)
.,':,~~',:~1::.,-<i~
-~:---~··-~·-:f---:.-
-~--~-:- -:-~-:..--lp, ___ P,
Po (,) (b)
P, P, Po P, P, Po
P„
• • P, • • • P„
• • P, • • P,
P,
•
P;
• ·-,;:,_____ P,
Pn• P, P12• P,
p,• P,•
P, P,
Po (c) Po (d)
P„ P, P, P, P„ P, P, Po
• • Po • • •
Po
• P, • P,
•
P,
P, • P;
Pn• P1-i • P,
Pi• P,•
P, P,
P, (c) Po (0
Rys. 35.7. Działanie algorytmu GRAHAM-&ANna zbiorze punktów Q z rys. 35.6. Bieżąca wypukła
otoczka majdująca się na stos.ie S w każdym kroku jest zaznaczona na szaro. (a) Punkty (pt, Pi,
..., p 12) posortowane ze względu na współrz.ędne kątowe w biegunowym układzie współrz.ędnych
o początku w p 0 i stos S zawierający początkowo punkty p 0 , p 1 i pl. (b)-(k) Stos S po każdym
przebiegu pętli forw wierszach 7-10. Linie przerywane obrazują skręty inne niż: w lewo, powodują
ce usuwanie punktów ze stosu. Na przykład w części (h) skręt w prawo w kącie ł'..p,1¼[)9 powoduje
usunięcie ze stosu p 1, a następnie skręt w prawo w kącie ł'.,p,JJ1p9 powoduje usunięcie p 7• O) Ob-
liczona przez procedurę wypukła otoczka, ta sama co na rys. 3S.6
1006
35.3. ZNAJDOWANIE WYPUKŁEJ OTOCZKI
P, Po P, Po
P„ • P„
• P, • P,
Po • P, Po • P,
'12• P, P12 • P,
p,• P,•
P, P,
Po (g) Po (h)
Pw, Pw
'
P„
• •
P„ P,
P, • P,
'r,• P,
P,•
--- P, ,...---- P,
P, (i) Po Ul
P,
• •
P, P,
•
P,
P, •r '
'" P,•
(k)
,,___--p·
Po (I)
Pętla for w wierszach 7-10 wykonuje po jednym obrocie na każdy punkt pod-
ciągu (p 3, p 4, ••• , Pm>·Naszą intencją jest, żeby po przetworzeniu punktu pj
stos S zawierał, patrząc od spodu, wierzchołki CH({p0 , p 1, ••• , pj}) w kolejności
przeciwnej do ruchu wskazówek zegara. W pętli while w wierszach 8-9 punkty
usuwane są ze stosu, kiedy okazuje się, że nie należą do otoczk.L Kiedy prze-
1007
ROZDZIAŁ 35. GEOMETRIA OBLICZENIOWA
DOWÓD
Jak wspomnieliśmy wyżej, wierzchołek będący wypukłą kombinacją p 0 i pew-
nego innego punktu ze zbioru Q nie należy do CH(Q). Takiego wierzchołka nie
będzie w ciągu (p 1, p 2 , ... , Pm), więc na pewno nigdy nie pojawi się na stosie S.
P;
Po
(o) (b)
1008
35.3. ZNAJDOWANIE WYPUKŁEJ OTOCZKI
p
p
(,) (b)
Rys. 35.9. Dodanie punktu z obszaru za.cieniowanego do wielokąta wypukłego P daje znowu wielo-
kąt wypukły. z.acielllowany obszar jest ograniczony przez bok p,p~i przedłużenia dwóch sąsiednich
boków. (a) Zacieniowany obszar jest ograniczony. (b) Zacieniowany obszar jest nieograniczony
1009
ROZDZIAŁ 35. GEOMETRIA OBLICZENIOWA
1010
35.3. ZNAJDOWANIE WYPUKŁEJ OTOCZKI
szu 8 i każde wywołanie POP zajmuje czas 0(1), am.:::;;;n - 1, całkowity czas
spędzony w pętli while to O(n). Czas działania algorytmu GRAHAM-SCAN wy-
nosi zatem O(n lg n).
Algorytm Jarvisa
W algorytmie Jarvisa wypukła otoczka zbioru punktów Q jest obliczana meto-
dą znaną jako owijanie. Algorytm działa w czasie O(nh), gdzie h jest liczbą
wierzchołków CH(Q). Jeśli h wynosi O(lgn), algorytm Jarvisa jest asympto-
tycznie szybszy od algorytmu Grahama.
Ujmując rzecz intuicyjnie, algorytm Jarvisa naśladuje owijanie ciasno wokół
zbioru Q kawałka papieru. Zaczynamy od zamocowania końca papierowej
taśmy do najniżej położonego punktu w zbiorze, tzn. do tego samego punktu p 0,
od którego zaczynaliśmy algorytm Grahama. Punkt ten jest wierzchołkiem
wypuklej otoczki. Napinamy taśmę, ciągnąc ją w prawo, a następnie podnosimy
ją do góry, dopóki nie natrafimy na jakiś punkt. Punkt ten także musi należeć
do otoczki. Trzymając taśmę napiętą, wędrujemy w ten sposób naokoło zbioru
wierzchołków, dopóki nie trafimy z powrotem do początkowego punktu p 0 •
Bardziej formalnie rzecz biorąc, algorytm Jarvisa konstruuje ciąg
H = <Po, Pi, ... , Ph-i> wierzchołków CH(Q). Zaczynamy od punktu p 0 • Jak
widać z rys. 35.10, następny wierzchołek p 1 wypukłej otoczki ma najmniejszą
współrzędną kątową względem p 0 • (W przypadku remisów wybieramy punkt
leżący najdalej od p 0). Podobnie, p 2 ma najmniejszą współrzędną kątową
względem Pi itd. Kiedy osiągamy wierzchołek położony najwyżej, powiedzmy
Pk (rozstrzygając remisy na korzyść wierzchołka leżącego najdalej), mamy
skonstruowany, pokazany na rys. 35.10, prawy łańcuch otoczki CH(Q). Żeby
skonstruować lewy łańcuch, zaczynamy od Pk i wybieramy Pk+I jako punkt
o najmniejszej współrzędnej kątowej w biegunowym układzie współrzędnych
o środku Pk, ale z ujemnejpółosi x. Kontynuujemy ten proces tworzenia lewego
łańcucha, wybierając współrzędne kątowe z ujemnej części osi x, dopóki nie
powrócimy do naszego początkowego wierzchołka p 0 •
Moglibyśmy opisać algorytm Jarvisa jako pojedyncze obiegnięcie wokół
wypuklej otoczki, to znaczy bez oddzielnego konstruowania prawego i lewe-
go łańcucha. Implementacje takie zazwyczaj przechowują wartość kąta wy-
branego ostatnio boku otoczki z osią x i wymagają, żeby ciąg kątów związa
nych z bokami otoc7.k:i był ściśle rosnący (w zakresie od O do 2n: radianów).
Zaletą konstruowania osobnych łańcuchów jest to, że nie musimy obliczać
kątów w sposób jawny; do porównywania kątów wystarczają metody opisane
w podrozdz. 35.I.
Jeśli algorytm Jarvisa został za.implementowany właściwie, to działa on
w czasie O(nh). Dla każdego spośród h wierzchołków otoczki CH(Q) znaj-
dujemy wierzchołek o minimalnej współrzędnej kątowej. Każde porównanie
-""----
1011
ROZDZIAŁ 35. GEOMETRIA OBLICZENIOWA
• '
'
'
'' . • • •
''' •
'
' •
'''
'
'
' •
''
'
--
Lewy łańcuch Prawy łańcuch
Rys. 35.10. Działanie algorytmu Jarvisa Pierwszy wybrany wierzchołek to najniżej położony punkt
p0• Kolejny wierzchołek:, Pi, ma najmniejszą ze wszystkich punktów współrzędną kątową względem
p 0• Z kolei p 2 ma najmniejszą współrzędną kątową względem PP Prawy łańcuch kończy się na
najwyżej położonym punk.cie pl. Następnie jest konstruowany lewy łańcuch przez majdowanie
najmniejszych współrzędnych kątowych względem ujemnej półosi x
ZADANIA
1012
35.4. ZNAJDOWANIE PARY NAJMNIEJ ODLEGŁYCH PUNKTÓW
p
•
(,) (b)
Rys. 35,l l. Definicja gwiazdy na ui:ylek zad. 35.3-4. (a) Gwiazda. Odcinek od punktu p do dowolnego
punktu q na brzegu przecina brzeg tylko w q. (b) Wielokąt nie będą.cy gwiazdą. Zacieniowany obszar
po lewej stronie to cień punktu q, a po prawej - cień q'. Ponieważ obszary te są rozłączne, jądro
wielokąta jest puste
pokrywać; wtedy odległość między nimi jest równa O. Problem ten znajduje
zastosowania na przykład w systemach kontroli ruchu. W systemie kontroli
ruchu powietrznego lub morskiego informacja o tym, które dwa obiekty znaj-
dują się najbliżej siebie, może się przydać do wykrywania potencjalnych kolizji.
„Siłowy" algorytm znajdowania pary najmniej odległych punktów
1013
ROZDZIAŁ 35. GEOMETRIA OBLICZENIOWA
Połącz: Para najmniej odległych punktów jest albo parą o odległości ó znale-
zioną przez jedno z wywołań rekurencyjnych, albo parą, w której jeden
punkt należy do PL• a drugi do PR· Algorytm sprawdza, c::z;yistnieje
1014
35A. ZNAJDOWANIE PARY NAJMNIEJ ODLEGŁYCH PUNKTÓW
f->-P,
• ''
P, ~
.
.'
''
' .''
' •
• 2/J Para punktów
• pokrywających się:
jeden z P,.,
• drugi z P11.
•
•
'.
'
' .' '
'
'
Para punktów
pokrywających się:
jeden z Pi,
• I •' • drugi z P11.
(•) (b)
Rys. 35.12. Kluczowe fakty w dowodzie, że algorytm znajdowania najmniej odJeglej pary punktów
musi sprawdzać tylko 7 punktów następujących po każ.dym punkcie w tablicy Y'. (a) Jeśli Pi E PL
i PREPR są od siebie odległe o mnitj niż ó, muszą się mieścić wewnątrz prostokąta ó x 2ó, przez
którego środek przechodzi prosta/. (b) Przykład, że cztery punkty, z których każde dwa są od siebie
odlegle przynajmniej o ó, mogą pomieścić się w kwadracie ó x ó. Po lewej stronie znajdują się
4 punkty z PL•a po prawej 4 punkty z PR·W prostokącie ó x 2ó może pomieścić się 8 punktów,jeśli
punkty narysowane na prostej/ są w rzeczywistości parami pokrywających się punktów: jeden z PL•
a drugi z PR
1015
ROZDZIAŁ 35. GEOMETRIA OBLICZENIOWA
Poprawność algorytmu
Poprawność opisanego powyżej algorytmu znajdowania pary najmniej odleg-
łych punktów jest oczywista, z wyjątkiem dwóch kwestii. Po pierwsze, kończąc
rekursję kiedy IPI :::;;3, zapewniamy sobie to, że nigdy nie będziemy dzielić
zbioru składającego się tylko z jednego punktu. Drugą kwestią jest to, że musi-
my sprawdzać tylko 7 punktów następujących po każdym punkcie p w tablicy
Y'; teraz zajmiemy się dowodem tej własności.
Przypuśćmy, że na pewnym poziomie rekursji parę najmniej odległych
punktów stanowią pLePL i PRE PR. Zatem odległość ó' między PL a PR jest
ostro mniejsza niż ó. Punkt PL musi leżeć na prostej / lub na lewo od niej,
ale bliżej niż ó. Podobnie, PR leży na I lub na prawo od niej i bliżej niż
ó. Co więcej, odległość w poziomie PL i PR jest mniejsza niż ó. Zatem, jak
widać na rys. 35.12a, PL i PR mieszczą się w prostokącie ó x 2ó położonym
symetrycznie względem prostej l. (W prostokącie tym mogą również być i in-
ne punkty).
Pokażemy teraz, że w owym prostokącie ó x 2ó może znajdować się co
najwyżej 8 punktów ze zbioru P. Rozważmy kwadrat ó x ó stanowiący lewą
połowę tego prostokąta. Ponieważ wszystkie punkty zbioru PL są odlegle od
siebie przynajmniej o ó, wewnątrz tego kwadratu mogą się znajdować co naj-
wyżej cztery punkty; na rys. 35.12b widać, w jaki sposób. Podobnie, co naj-
wyżej cztery punkty ze zbioru PR mogą się znajdować w kwadracie ó x ó sta-
nowiącym prawą połowę prostokąta. Zatem w sumie w prostokącie ó x 2ó
może się zmieścić co najwyżej 8 punktów ze zbioru P. (Zauważmy, że ponieważ
punkty na prostej l mogą należeć zarówno do PL, jak i PR• na I mogą leżeć
nawet 4 punkty. Liczba ta zostaje osiągnięta, jeśli istnieją dwie pary pokrywa-
jących się punktów, z których każda składa się z jednego p11nktu z PL i jednego
z PR• jedna para znajduje się na przecięciu l z górnym, a druga - z dolnym
bokiem prostokąta).
Wiedząc, że wewnątrz prostokąta może się znajdować co najwyżej 8 punk-
tów ze zbioru P, łatwo stwierdzić, że wystarczy sprawdzać po 7 punktów na-
stępujących po każdym punkcie w tablicy Y'. Trzymając się założenia, że para
najmniej odległych punktów to PL i PR,możemy bez straty ogólności przyjąć, że
PL poprzedza PR w tablicy Y'. Wówczas, nawet jeśli PL występuje najwcześniej,
a PR najpóźniej jak można w tablicy Y', punkt PR jest na jednej z 7 pozycji
następujących po PL· Wykazaliśmy zatem poprawność algorytmu znajdowania
pary najmniej odległych punktów.
1016
35.4. ZNAJDOWANIE PARY NAJMNIEJ ODLEGŁYCH PUNKTÓW
l length[YL] - length[YR] +- O
2 for i +- 1 to length[Y]
3 doifY{i]EPL
4 tben length[YL] - length[YL]+ 1
5 Y[length[YL]] - Y[;J
6 else length[YR] - length[YR]+ 1
7 Y[length[Y,]] - Y[;J
Badamy po prostu po kolei punk.ty z tablicy Y. Jeśli punkt Y[i] nalezy do PL,
dodajemy go na koniec tablicy YL; w przeciwnym razie dołączamy go na ko-
niec tablicy YR. Podobnie wygląda pseudokod tworzenia tablic XL, XR i Y'.
Pozostaje jedynie pytanie, jak uzyskać początkowe uporządkowanie punk-
tów. Robimy to, po prostu poddając je sortowaniuwstępnemu; tzn. sortujemy
je tylko raz, przed pierwszym wywołaniem rekurencyjnym. Posortowane tabli-
ce zostają przekazane jako parametry pierwszego wywołania rekurencyjnego,
a stąd w miarę potrzeby rozdziela się je w dalszych wywołaniach rekurencyj-
nych. Sortowanie wstępne zwiększa czas działania o dodatkowy składnik
O(nlgn), ale teraz każdy krok rekursji zajmuje czas liniowy, jeśli pominiemy
wywołania rekurencyjne. Jeśli zatem przez T(n) oznaczymy czas działania al-
gorytmu na jednym poziomie rekursji, a przez T'(n) czas działania całego al-
gorytmu, to mamy T'(n) = T(n) + O(n lg n) oraz
1017
ROZDZIAŁ 35. GEOMETRIA OBLICZENIOWA
Problemy
35-1. Wypukle warstwy
Dla danego zbioru punktów Q na płaszczyźnie indukcyjnie definiujemy wypuk-
le warstwy Q. Pierwsza wypukła warstwa Q składa się z punktów Q będących
wierzchołkami CH(Q). Dla i> 1 zdefiniujmy Q; jako zbiór powstały przez
usunięcie z Q wszystkich punktów z wypukłych warstw 1, 2, ... ,i-I. Wów-
czas i-ta wypukła warstwa Q to CH(Q;), jeśli Q, 'F 0, a w przeciwnym razie jest
nie zdefiniowana.
(b) Niech j będzie najmniejszym indeksem takim, że y1 < y, chyba że y < yk;
wówczas przyjmujemy j = k + 1. Wykaż następujące własności warstw
maksimów zbioru Q'.
1019
ROZDZIAŁ 35. GEOMETRIA OBLICZENIOWA
354. Rozkłady
skoncentrowane
Rozważmy problem obliczania wypukłej otoczki zbioru punktów na płasz
czyźnie, które wylosowano zgodnie z pewnym znanym rozkładem prawdo-
podobieństwa. Czasami oczekiwany rozmiar wypukłej otoczki n punktów
wylosowanych zgodnie z takim rozkładem wynosi O(n 1-•) dla pewnej stałej
e > O. Rozkład tak.i nazywamy skoncentrowanym,Do rozkładów skoncent-
rowanych należą:
• Rozkład
jednostajny na kole o promieniu jednostkowym. Oczekiwany roz-
miar otoczki to 0(n 1 13 ).
• Rozkład jednostajny wewnątrz wielokąta wypukłego o k bokach, dla do-
wolnego ustalonego k. Oczekiwany rozmiar otoczki to E>(lgn).
• Dwuwymiarowy rozkład nonnalny, Oczekiwany rozmiar otoczki to E>Ogn),
1020
UWAGI DO ROZDZIAŁU
Uwagido rozdziału
NP-zupełność
1022
36.1. CZAS WIELOMIANOWY
36.1. Czaswielomianowy
Nasze rozważ.ania dotyczące NP-zupełności rozpoczynamy od sformalizowa-
nia pojęcia problemów rozwiązywalnych w czasie wielomianowym. Problemy
takie trak.tuje się powszechnie jako łatwo rozwiązywalne. Powód, dlaczego tak
jest, stanowi kwestię filozoficzną, a nie matematyczną. Wymieńmy trzy moty-
wujące go argumenty.
Po pierwsze, chociaż rozsądnie jest potraktować problem, którego rozwią
zanie wymaga czasu 0(n 100 ) jak.o trudno rozwiązywalny, bardzo niewiele pra-
ktycznych problemów wymaga czasu rzędu wielomianu tak wysokiego stopnia.
Napotykane w praktyce problemy rozwiązywalne w czasie wielomianowym
mają zazwyczaj znacznie mniejszą złożoność.
Po drugie, dla wielu rozsądnych modeli obliczeń problem dający się roz-
wiązać w czasie wielomianowym w jednym z nich można również rozwiązać
w czasie wielomianowym w innym modelu. Na przykład klasa problemów
rozwiązywalnych w czasie wielomianowym na sekwencyjnej maszynie o do-
stępie swobodnym, używanej w większej części tej książki, jest identyczna
z klasą problemów rozwiązywalnych w czasie wielomianowym na abstrakcyj-
1023
ROZDZIAŁ 36. NP-ZUPEŁNOSC
nych maszynach Turinga 11. Pokrywa się ona również z klasą problemów roz-
wiązywalnych w czasie wielomianowym na komputerze równoległym, nawet
jeśli liczba procesorów rośnie wielomianowa ze względu na rozmiar danych
wejściowych.
Po trzecie, klasa problemów rozwiązywalnych w czasie wielomianowym
ma dobre własności domykania, ponieważ rodzina wielomianów jest zamknię
ta ze względu na operacje dodawania, mnożenia i składania. Jeśli na przykład
dane wyjściowe jednego algorytmu wielomianowego są danymi wejściowymi
dla innego algorytmu, to tak otrzymany złożony algorytm jest wielomianowy.
Jeśli algorytm, który jest wielomianowy, o ile pominiemy koszt wywoływanych
podprogramów, wywołuje stalą liczbę razy podprogramy o złożoności wielo-
mianowej, to czas działania całości jest wielomianowy.
Problemy abstrakcyjne
Żeby móc mówić o klasie problemów rozwiązywalnych w czasie wielomiano-
wym, musimy najpierw formalnie sprecyzować pojęcie „problemu". Definiuje-
my problem abstrakcyjny Q jako relację dwuargumentową na zbiorze I egzemp-
lany problemu i zbiorze S rozwiązań problemu. Jako przykład rozważmy pro-
blem SHORTEST-PATH znalezienia najkrótszej ścieżki między dwoma da-
nymi wierzchołkami w grafie nieskierowanym G = (V, E), bez wag na krawę
dziach. Egzemplarzem problemu SHORTEST-PATH jest trójka uporządko
wana, składająca się z grafu i dwóch jego wierzchołków. Rozwiązanie to ciąg
wierzchołków grafu, być może pusty (co oznacza, że ścieżka nie istnieje). Sam
problem SHORTEST-PATH to relacja wiążąca każdy egzemplarz grafu i parę
wierzchołków z najkrótszą ścieżką w tym grafie, łączącą te dwa wierzchołki.
Ponieważ najkrótsze ścieżki nie muszą być wyznaczone jednoznacznie, dany
egzemplarz problemu może mieć więcej niż jedno rozwiązanie.
Takie sformułowanie problemu abstrakcyjnego jest zbyt ogólne jak na
nasze potrzeby. Dla uproszczenia w teorii NP-zupełności ograniczamy się do
rozważania problemów decyzyjnych: tak.ich, których rozwiązanie stanowi odpo-
wiedź tak/nie. W tym wypadku możemy patrzeć na abstrakcyjny problem de-
cyzyjny jak na funkcję odwzorowującą zbiór egzemplarzy problemu I w zbiór
rozwiązań {O,I}. Na przykład problem decyzyjny PATH, związany z proble-
mem najkrótszej ścieżki, można sformułować tak: ,,Dany jest graf G = ( V, E),
dwa wierzchołki u, vE V i nieujemna liczba całkowita k. Czy istnieje ścieżka
w G łącząca u i v, o długości co najwyżej k?" Jeśli i= (G, u, v, k) jest egzemp-
larzem tego problemu, to PATH(i) = 1 (tak), jeżeli najkrótsza ścieżka od u do
v ma długość co najwyżej k, w przeciwnym zaś wypadku PATH(z) = O (nie).
1024
36.1. CZAS WIELOMIANOWY
Kodowanie
Jeśliprogram komputerowy ma rozwiązywać pewien problem abstrakcyjny,
egzemplarze problemu muszą być reprezentowane w sposób zrozumiały dla
programu. Kodowanie zbioru S abstrakcyjnych obiektów to odwzorowanie
ez S w zbiór ciągów złożonych z zer i jedynek 1l. Wszyscy na przykład znamy
sposób kodowania liczb naturalnych N= {O,1, 2, 3, 4, ... } jak.o ciągów binar-
nych {O, I, 10, li, 100, ...}. W kodowaniu tym e(l7) = 10001. Każdy, kto
zainteresował się komputerową reprezentacją znaków na klawiaturze, spotkał
się z kodami ASCII lub EBCDIC. W kodzie ASCII mamy e(A) = 1000001.
Również złożone obiekty można zakodować jako ciągi
bitów, łącząc reprezen-
tacje ich części składowych. Wielomiany, grafy, funkcje, pary uporządkowane
- wszystko to można zakodować w postaci ciągów binarnych.
Dane wejściowe dla algorytmu komputerowego, który „rozwiązuje" pe-
wien abstrakcyjny problem decyzyjny, stanowi zatem tak naprawdę zakodo-
wana postać egzemplarza problemu. Problem, którego zbiór egzemplarzy jest
zbiorem ciągów binarnych, nazywamy problemem konkretnym. Mówimy, że
algorytm rozwiązuje konkretny problem w czasie O(T(n)), jeśli otrzymawszy
tł Pri.eciwdziedziną
funkcji e nie muszą być ciągi binarne;może to być równie dobrze zbiór
słów nad dowolnym skończonym alfabetem o przynajmniej dwóch symbolach.
1025
ROZDZIAŁ 36, NP-ZUPEŁNQ$Ć
1026
36.1. CZAS WIELOMIANOWY
LEMAT 36.1.
Niech Q będzie abstrakcyjnym problemem decyzyjnym na zbiorze egzemplarzy
I i niech e 1 i e 2 będą wielomianowo równoważnymi kodowaniami na!. Wów-
czas e 1(Q)EP wtedy i tylko wtedy, gdy e 2(Q)EP.
DOWÓD
Wystarczy, że udowodnimy tylko jedną z implikacji, ponieważ druga jest syme-
tryczna. Załóżmy zatem, że e 1 (Q) można rozwiązać w czasie O(nt) dla pewnej
stałej k. Dalej, załóżmy, że dla każdego egzemplarza problemu i kodowanie
e 1(1)można obliczyć z kodowania e2(1) w czasie O(nc) dla pewnej stałej c, gdzie
n = ]e2 (z)I.Aby rozwiązać problem e 2 (Q) dla danych e 2 (z), obliczamy najpierw
e1 (i), a następnie wykonujemy algorytm dla e 1(Q) na danych e 1 (z). Ile czasu to
zajmie? Zamiana kodowania zajmuje czas O(nc), a zatem le1(1)!= O(n~, ponie-
waż rozmiar danych wyjściowych komputera sekwencyjnego nie może być
większy niż jego czas działania. Czas rozwiązania problemu dla danych e 1 (i)
wynosi O(le1 (i)lt) = O(nct), jest więc wielomianowy, bo ci k są stałymi.
•
A zatem to, czy egzemplarze problemu abstrakcyjnego są kodowane binar-
nie czy przy podstawie 3, nie wpływa na jego „złożoność", czyli na to, czy jest
on rozwiązywalny w czasie wielomianowym czy nie. Jeśli natomiast będą one
kodowane unarnie, złożoność problemu może się zmienić. Żeby można było
przechodzić od problemu abstrakcyjnego do konkretnego w sposób niezależny
od kodowania, będziemy zazwyczaj zakładali, że egzemplarze problemu są
zakodowane w jakiejkolwiek zwartej postaci, o ile wyraźnie nie powiemy ina-
czej. Dokładniej, będziemy zakładać, że kodowanie liczby całkowitej jest wielo-
mianowa równoważne jej reprezentacji binarnej i że kodowanie zbioru skoń
czonego jest wielomianowo równoważne przedstawieniu go jako otoczonej na-
wiasami listy jego elementów rozdzielonych przecinkami. (Jednym z takich
schematów kodowania jest kod ASCII). Dysponując tak.im „standardowym"
kodowaniem, możemy konstruować rozsądne kodowania innych matematycz-
nych obiektów, jak krotki, grafy i formuły. Standardowe kodowanie obiektu
1027
ROZDZIAŁ 36. NP-ZUPEŁNO$C
L- {xeE': Q(x)- I}
,~0~2~8---------------------~
36.1. CZAS WIELOMIANOWY
(fam, gdzie wygodniej, będziemy czasem używać tej samej nazwy PATH za-
równo w odniesieniu do problemu decyzyjnego, jak i do odpowiadającego
mu języka).
Skorzystanie z terminologii teorii języków formalnych pozwala nam wyra-
zić związek między problemami decyzyjnymi a rozwiązującymi je algorytmami
w zwarty sposób. Mówimy, że algorytm A akceptuje słowo xe{O, t}•, jeśli dla
danych wejściowych x algorytm oblicza A(x) = 1. Język akceptowany przez
algorytm A to zbiór L = {xe{O, 1}•: A(x) = l}, czyli zbiór tych słów, które
algorytm akceptuje. Algorytm A odrzuca słowo x, jeśli A(x) = O.
Nawet jeśli język L jest akceptowany przez algorytm A, algorytm nie musi
koniecznie odrzucać danego mu na wejściu słowa x f L. Algorytm może się na
przykład zapętlić. Język L jest rozstrzygalny przez algorytm A, jeśli każdy ciąg
binarny jest albo akceptowany, albo odrzucany przez A. Język L jest akcep-
towany w czasie wielomianowym przez algorytm A, jeśli dla dowolnego słowa
xe L długości n algorytm akceptuje x w czasie O(rł) dla pewnej stałej k.
Język L jest rozstrzygalny w czasie wielomianowym za pomocą algorytmu A,
jeśli dla dowolnego słowa xe{O, 1} długości n algorytm rozstrzyga przynależ
0
ność x do L w czasie O(nk) dla pewnej stałej k. Zatem, aby akceptować język,
algorytm musi troszczyć się tylko o słowa z L, aby zaś rozstrzygać o języku,
musi akceptować bądź odrzucać każde słowo z {O, 1}'.
Język PATH na przykład można akceptować w czasie wielomianowym.
Jeden z wielomianowych, akceptujących go algorytmów oblicza najkrótszą
ścieżkę od u do v w G za pomocą przeszukiwania wszerz, a następnie porów-
nuje otrzymaną długość ścieżki z k. Jeśli długość nie przekrac-za k, algorytm
wypisuje odpowiedź I i się zatrzymuje. W przeciwnym razie algorytm wchodzi
w nieskończoną pętlę. Algorytm ten nie rozstrzyga o PATH, ponieważ nie
udziela wyraźnej odpowiedzi O w przypadkach, w których długość najkrótszej
ścieżki przekrac-za k. Algorytm rozstrzygający o PATH musi explicite odrzucać
ciągi binarne nie należące do PATH. Dla problemów decyzyjnych w rodzaju
PATH nietrudno taki algorytm znaleźć. Dla innych problemów, jak problem
stopu Turinga, istnieje algorytm akceptujący, ale nie ma rozstrzygającego.
Możemy nieformalnie zdefmiować klasę złożoności jako zbiór języków, do
którego przynależność jest określana pewną miarą złożoności Gak na przy-
kład czas działania) algorytmu rozstrzygającego, czy dane słowo x należy do
1029
ROZDZIAŁ 36. NP-ZUPEŁNQ$C
Jak się okazuje, P jest tak.że klasą języków akceptowalnych w czasie wielo-
.
m1anowym.
TwIERDZENIE 36.2.
P = {L: L jest akceptowany przez algorytm wielomianowy}
DOWÓD
Ponieważ klasa języków rozstrzygalnych za pomocą algorytmów wielomiano-
wych jest podzbiorem klasy języków akceptowanych przez algorytmy wielo-
mianowe, musimy tylko pokazać, że jeśli L jest akceptowany przez algorytm
wielomianowy, to jest także rozstrzygalny za pomocą algorytmu wielomiano-
wego. Niech L będzie językiem akceptowanym przez pewien algorytm wielo-
mianowy A. Użyjemy klasycznej metody „symulacji" w celu skonstruowania
innego algorytmu wielomianowego A', który rozstrzyga o L. Ponieważ A ak-
ceptuje L w czasie O(,ł) dla pewnej stałej k, istnieje także stała c taka, że
A akceptuje L w co najwyżej T = cnk krokach. Dla dowolnego wejściowego
słowa x algorytm A' symuluje działanie algorytmu A przez czas T. Po upływie
czasu T algorytm A' sprawdza zachowanie A. Jeśli A zaakceptował x, to A'
akceptuje x, wypisując 1. Jeśli A nie zaakceptował x, to A' odrzuca x, wypisu-
jąc O. Narzut na symulację A przez A' nie zwiększa czasu działania więcej niż
o czynnik wielomianowy, A' jest zatem wielomianowym algorytmem rozstrzy-
gającym o L.
•
Zauważmy, że dowód twierdzenia 36.2 jest niekonstruktywny. Dla danego
języka LEP być może nie znamy ograniczenia czasu działania algorytmu
A akceptującego L. Wiemy natomiast, że takie ograniczenie istnieje, czyli
istnieje wykorzystujący je algorytm. A', chociaż być może nie potrafuny go
łatwo znaleźć.
ZADANIA
36.1-1. Zdefiniujmy problem optymalizacyjny LONGEST-PATH-LENGTH
jak.o relację wiążącą każdy egzemplarz grafu nieskierowanego i parę jego
wierzchołków z długością najdłuższej ścieżki prostej między tymi dwoma
1030
36.2. WERYFIKACJA W CZASIE WIELOMIANOWYM
1031
ROZDZIAŁ 36. NP-ZUPEŁNOSC
Cykle Hamiltona
(•) (b)
1032
36.2. WERYFIKACJA W CZASIE WIELOMIANOWYM
Algorytmy weryfikacji
1033
ROZDZIAŁ 36. NP-ZUPEŁNOŚĆ
Klasazłożoności NP
Klasa złożoności
NP to klasa języków, które można weryfikować za pomocą
algorytmu wielomianowego 1l. Dokładniej, język L należy do klasy NP wtedy
i tylko wtedy, gdy istnieją dwuparametrowy wielomianowy algorytm A i stała
c takie, że
L = {xE {O, l} ·: istnieje takie świadectwo y, gdzie IYI= O(]xl'),
że A(x, y) ~ I}
1034
p
Rys. 36.2. Cztery możliwości związków między klasami złożoności. Na każd)m diagramie ot.acz.anie
jednego obszaru przez drugi oznacza relację ścisłego zawierania zbiorów. (11.)P =NP= co-NP.
Większość badaczy uważa tę możliwość za najmniej prawdopodobną. (b) Jeśli NP jest zamknięta
ze względu na dopełnienia, to NP= CO·NP, ale nie musi przy l}m zachodzić P = NP. (c)
P = NP n co-NP, ale NP nie jest zamknięta ze względu na dopełnienia. (d) NP ,f. co-NP
i P #- NP n co-NP. Większość badaczy uwaza tę możliwość za najbardziej prawdopodobną
ZADANIA
Redukowalność
1036
36.3. NP-ZUPEŁNO$ć I REDUKOWALNO$C
LEMAT 36.3.
Jeśli L 1 , L 2 c {O, t}• są językami takimi, że L 1 ~pL 2, to z tego, że L 2 EP,
wynika, że L 1 EP.
1037
ROZDZIAŁ 36. NP-ZUPEŁNOŚĆ
DOWÓD
Niech A 2 będzie algorytmem wielomianowym rozstrzygającym o L 2 , a F -wie-
lomianowym algorytmem redukcji, obliczającym funkcję redukcji/ Skonstru-
ujemy wielomianowy algorytm A 1 , rozstrzygający o L 1 .
Rysunek 36.4 ilustruje tę konstrukcję. Dla danego na wejściu słowa
xE {O, 1}• algorytm A 1 korzysta z F, żeby przekształcić x w J (x), a następnie
korzysta z A 2 , żeby sprawdzić, czy /(x)EL 2 • Odpowiedzią udzielaną przez A 1
jest wartość obliczona przez A 2 •
//;,) e L 1 L l .,.
X /(x) X E
. F A,
A,
Rys. 36.4. Dowód lematu 36.3. Algorytm F jesl algorytmem redukcji, obliczającym funkcję redukcji
f z 1 1 do L 2 w czasie wielomianowym, a A 1 jest wielomianowym algorytmem rozslrzygającym o Ll.
Algorytm A I rozstrzyga, czy x E L 1 , stosując F do przeksztak:enia dowolnego wejściowego słowa x na
f(x), a polem za pomocą Al rozstrzygając, C!.lY f(x)EL 2
1038
36.3. NP·ZUPEŁNOŚĆ I AEDUKOWALNOŚĆ
TwIERDZENIE 36.4.
Jeślijakikolwiek problem NP-zupełny jest rozwiązywalny w czasie wielomia-
nowym, to P = NP. Jeśli jakikolwiek problem w NP nie jest rozwiązywalny
w czasie wielomianowym, to żaden problem NP-zupełny nie jest rozwiązywal
ny w czasie wielomianowym.
DOWÓD
Przypuśćmy, że LEP, a także LENPC. Dla każdego L' ENP zachodzi L' ~PL
na mocy własności (2) z definicji NP-zupełności. Z lematu 36.3 wynika zatem,
że L' EP, co dowodzi pierwszej części twierdzenia.
Dla dowodu drugiej części załóżmy, że istnieje LENP taki, że Lf: P. Niech
L' E NPC będzie dowolnym językiem NP-zupełnym. W celu doprowadzenia do
sprzeczności przypuśćmy, że L'eP. Wówczas jednak, skoro L l!{.pL', to na
mocy lematu 36.3 zachodzi LEP.
•
To właśnie jest powód, dla którego próby odpowiedzi na pytanie, czy
P ef:.NP, koncentrują się wokół problemów NP-zupełnych. Większość infor-
matyków sądzi, że P '# NP, czego konsekwencją jest układ zależności między
P, NP i NPC pokazany na rys. 36.5. Być może któregoś dnia ktoś znajdzie
algorytm wielomianowy dla jakiegoś problemu NP-zupełnego, dowodząc
w ten sposób, że P = NP. Ponieważ jednak dotychczas nie jest znany algorytm
wielomianowy dla żadnego problemu NP-zupełnego, więc dowód, że dany pro-
blem jest NP-zupełny, jest silnym argumentem za tezą, że problem ten jest
trudno rozwiązywalny.
Rys. 36.5. Oto jak większość informatyków wyobraża sobie układ zależności między P, NP i NPC.
Zarówno P, jak i NPC są całkowicie zawarte w NP, a Pr, NPC =0
1039
ROZDZIAŁ 36. NP·ZUPEŁNOSC
,, I I
" ., .,,,.
}''' .
I I ,f ·'Sc•'
'2 I
o
I
o I
I
,, o
l•J
,,------.---
<·
;.·,,,J;'
.------c '
(b)
Rys. 36.6. Dwa egzemplarze problemu spełnialności układów logicmych. (a) Przypisanie wartości
(x 1 = I, x 1 = l, x 3 = O) wejściom tego układu powOOuje, że wartością na wyjściu układu jest I.
Układ ten jest zatem spełniałny. (b) Żadne wartościowanie wejść tego układu nie powoduje poja-
wienia się na wyjściu obwodu wartości 1. Układ nie jest zatem spelniałny
1040
36.3. NP-ZUPEŁNOŚĆ I REDUKOWALNOSC
wyjściu układu z rys. 36.6b; wartością wyjściową jest zawsze O, a więc układ nie
jest spełni al ny.
Problem spełoialności układów logicznych to „Czy dany układ logicmy,
zbudowany z bramek AND, OR i NOT ,jest spełnialny?" żeby móc postawić to
pytanie w sposób formalny, musimy ustalić standardowe kodowanie układów.
Można skonstruować kodowanie podobne do stosowanego w przypadku gra-
fów, które przekształca dowolny układ Cna ciąg binarny ( C) długości niewiele
większej niż ro:zmiar samego układu. Możemy zatem zdefmiować język formalny
LEMAT36.5.
Problem spełnialności układów logicznych należy do klasy NP.
DOWÓD
Skonstruujemy dwuparametrowy, wielomianowy algorytm A, weryfikujący ję
zyk CIRCUIT-SAT. Jednym z parametrów wejściowych dla A jest układ lo-
gicmy C (a raczej jego standardowe kodowanie). Drugim parametrem jest
świadectwo odpowiadające wartościowaniu wejść układu C.
Algorytm A jest skonstruowany następująco. Dla każdej bramki logicmej
należącej do układu sprawdza on, czy wartość wyjścia z bramki podana
w świadectwie jest poprawnie obliczona jako funkcja wartości z wejść bramki.
Następnie, jeśli wartością wyjściową całego układu jest I, algorytm odpowiada
I, ponieważ wartości przypisane wejściom układu C tworzą wartościowanie
spełniające. W przeciwnym razie odpowiedzią algorytmu jest O.
Jeśli układ C sprawdzany za pomocą algorytmu A jest spełnialny, to ist-
nieje świadectwo o długości wielomianowej względem ro:zmiaru C, dla którego
1041
ROZDZIAŁ 36. NP-ZUPEŁNOŚC
A zwróci wartość l. Jeśli układ nie jest spełnialny, żadne świadectwo nie prze-
kona A, że jest inaczej. Algorytm A działa w czasie wielomianowym: przy
dobrej implementacji - w liniowym. Język CIRCUIT-SAT można zatem wery-
fikować w czasie wielomianowym, czyli QRCUIT-SAT E NP.
•
Druga część dowodu NP-zupełności CIRCUIT-SAT to wykazanie, że
język ten jest NP-trudny. Oznacza to, iż musimy wykazać, że każdy język
w klasie NP jest redukowalny w czasie wielomianowym do CIRCUIT-SAT.
Ścisły dowód tego faktu pełen jest technicznych zawiłości, poprzestaniemy
więc na jego szkicu, opierając się na pewnej znajomości zasad funkcjonowania
komputerów,
Program jest przechowywany w pamięci komputera jako ciąg instrukcji.
1"ypowa instrukcja składa się z kodu operacji, którą należy wykonać, adresów
argumentów oraz adresu, pod którym należy umieścić wynik. Specjalna ko-
mórka pamięci, zwana licznikiem rozkazów, przechowuje numer instrukcji,
która ma być wykonana jako następna. Licznik ten jest automatycznie zwięk
szany po pobraniu kolejnej instrukcji, wskutek czego komputer wykonuje in-
strukcje sekwencyjnie. Wykonanie instrukcji może jednak powodować zapisa-
nie jakiejś wartości w liczniku rozkazów, co prowadzi do zaburzenia zwykłej
sekwencyjnej kolejności operacji, umożliwiając tworzenie pętli i rozgałęzień
w programie.
W każdej chwili działania programu cały stan obliczeń jest reprezentowa-
ny w pamięci komputera. (Przyjmujemy, że w pamięci jest przechowywany sam
program, licznik rozkazów, obszar roboczy programu i wszelkie .zmienne sys-
temowe zawierające infonnacje o stanie komputera). Każdy konkretny układ
zawartości pamięci komputera nazywamy konfiguracją. Wykonanie instrukcji
można traktować jako przekształcenie jednej konfiguracji w drugą. Co istotne,
maszynę dokonującą tego przekształcenia można zaimplementować jako układ
logiczny, który w dowodzie poniższego lematu oznaczamy symbolem M.
LEMAT36.6.
Problem spelnialności układów logicznych jest NP-trudny.
DOWÓD
Niech L będzie dowolnym językiem należącym do klasy NP. Opiszemy wielo-
mianowy algorytm obliczania funkcji redukcji!, która każdemu ciągowi binar-
nemu x przyporządkowuje układ C = f(x) taki, że xEL wtedy i tylko wtedy,
gdy CeCIRCUIT-SAT.
Ponieważ LE NP, musi istnieć algorytm A weryfikujący L w czasie wielo-
mianowym. Konstruowany przez nas algorytm F będzie korzystał z dwupara-
metrowego algorytmu A do obliczania funkcji redukcji/
1042
36.3. NP-ZUPEŁNOSC I REDUK0WALN0$C
1043
ROZDZIAŁ 36. NP-ZUPEŁNOSć
Dane wejściowe
PC
PC
PC
PC
Wyjście 0/l
Rys. 36.7. Ciąg konfiguracji wytwarzanych przez algorytm A działający na słowie wejściowym
x i świadectwie y. Każda konfiguracja reprezentuje stan komputera w jednym kroku obliczeń
i oprócz A, x oraz y zawiera licznik rozkazów (PC, od ang. Program Counter), pomocnicze dane
o stanie maszyny oraz obszar roboczy. Z wyjątkiem świadectwa y startowa konfiguracja c0 jest
ustalona. Każda konfiguracja jest przekształcana w następną 1.apomocą układu logicznego M.
Wyjście algorytmu to wyróżniony bit w obsmrze roboczym
(,' jest spełnialny wtedy i tylko wtedy, gdy istnieje świadectwo y takie, że
A(x, y) = 1. Po drugie, trzeba dowieść, że Fdziała w czasie wielomianowym.
żeby wykazać, że F poprawnie oblicza funkcję redukcji, załóżmy, że ist-
nieje świadectwo y długości O(nk) takie, że A(x, y) = 1. Jeśli wówczas użyje
my y jako wejścia dla C, wyjściem C będzie C(y) = A(x, y) = 1. Jeśli więc
istnieje świadectwo, to C jest spełnialny. W celu udowodnienia odwrotnej im-
1044
36.3. NP-ZUPEŁNO$ć I REOUKOWALNO$C
plikacji załóżmy, że C jest spelnialny. Istnieje zatem wejście y dla układu C ta-
kie, że C(y) = I, skąd wnioskujemy, że A(x, y) = 1. Algorytm F oblicza więc
funkcję redukcji poprawnie.
Żeby zakończyć dowód, musimy jedynie wykazać, że F działa w czasie
wielomianowym względem n= lxl.Pierwszą poczynioną przez nas obserwacją
jest to, że liczba bitów potrzebnych do reprezentowania konfiguracji jest wielo-
mianowa ze względu na n. Sam program algorytmu A ma rozmiar stały, nieza-
leżny od rozmiaru jego danych wejściowych x i y. Długość wejściowego słowa
x jest równa n, a długość świadectwa y to O(tf'). Ponieważ algorytm wykonuje
co najwyżej O(rł) kroków, rozmiar potrzebnego mu obszaru roboczego taicie
jest wielomianem względem n. (Zakładamy, że obszar ten jest spójny; celem
zad. 36.3-4 jest rozszerzenie układu na przypadek, w którym pamięć wykorzys-
tywana przez A jest rozproszona na dużo większym obszarze i to w różny
sposób dla różnych słów wejściowych x).
Układ M implementujący strukturę komputera ma rozmiar wielomianowy
względem długości konfiguracji, która z kolei jest wielomianowa względem
O(nt), a więc także względem n. (Większa część tego układu implementuje
logiczną strukturę pamięci). Układ C składa się z co najwyżej t = O(n") kopii
układu M, jego rozmiar jest więc wielomianowy ze względu na n. Konstrukcję
układu C dla wejściowego słowa x algorytm redukcji F wykonuje w czasie
wielomianowym, ponieważ czas realizacji każdego kroku konstrukcji jest wie-
lomianowy.
Język CIRCUIT-SAT jest zatem przynajmniej tak samo trudny jak: każdy
•
język w klasie NP, a ponieważ należy on do NP, jest NP-zupełny.
TwlERDZENIE 36.7.
Problem spełnialności układów logicznych jest NP-zupełny.
DOWÓD
Natychmiastowy na mocy lematów 36.5 i 36.6 oraz definicji NP-zupełności .
•
ZADANIA
36.3-1. Wykaż, że ~ P jest relacją przechodnią na zbiorze języków. To znaczy,
wykaż, że jeśli L 1 ~pL 2 i L 2 ~pL 3 , to L 1 ~pL 3 .
36.3-2. Udowodnij, że L ~PL wtedy i tylko wtedy, gdy L ~pL,
36.3-3. Wykaż, że w alternatywnym dowodzie lematu 36.5 jako świadectwa
można użyć wartościowania spełniającego. Dla którego świadectwa do-
wód jest łatwiejszy?
36.3-4. W dowodzie lematu 36.6 :zakładamy, że obszar roboczy algorytmu A
zajmuje ciągły fragment pamięci rozmiaru wielomianowego. Gdzie w do-
1045
ROZDZIAŁ 36. NP-ZUPEŁNO$ć
36.4. DowodzenieNP-zupe/ności
NP-zupełność problemu spełnialności układów wykazaliśmy, dowodząc bezpo-
średnio, że L ~P CIRCUIT-SAT dla każdego języka Le NP. W tym podroz-
dziale pokażemy, w jaki sposób dowodzić NP-zupełności języka bez bezpo-
średniego redukowania do niego kaidego języka w klasie NP. Zilustrujemy tę
metodę dowodząc, że rozmaite problemy spełnialności formuł są NP-zupełne.
Podrozdział 36.5 zawiera o wiele więcej przykładów zastosowania tej metody.
Następujący lemat stanowi podstawę naszej metody dowodzenia NP-zu-
pełności języków.
LEMAT 36.8.
JeśliL jest językiem takim, że L' ~PL dla pewnego L'eNPC, to L jest NP-
-trudny. Co więcej,jeśli Le NP, to LeNPC.
DOWÓD
Ponieważ L' jest NP-zupełny, dla wszystkich L" E NP zachodzi L' 1 ~pL'. Z za-
łożenia L' ~pL, a zatem na mocy przechodniości relacji ~P (zad. 36.3-1) ma-
my L" ~pL, co dowodzi, że L jest NP-trudny. Jeśli przy tym Le NP, to rów-
nież LeNPC.
•
Innymi słowy, redukując
do L jeden język L', o którym wiadomo, że jest
NP-zupełny, implicite redukujemy do L każdy język w klasie NP. Lemat 36.8
daje nam zatem metodę dowodzenia, że język L jest NP-zupełny:
1046
36.4. DOWODZENIE NP-ZUPEŁNOSCI
I. Udowodnij, że LENP.
2. Wybierz język L', o którym wiadomo, że jest NP-zupełny.
3. Opisz algorytm obliczania funkcji/, przekształcającej każdy egzemplarz L'
w egzemplarz L.
4. Udowodnij, że funkcja/ma tę własność, że xEL' wtedy i tylko wtedy, gdy
f(x)cL dla dowolnego xc{O, l}'.
5. Udowodnij, że algorytm obliczania/działa w czasie wielomianowym.
Spelnialność formul
Zilustrujemy metodę redukcji, podając dowód NP-zupełności problemu stwier-
dzania, czy spełnialna jest dana formuła logiczna, a nie układ. Jest to histo-
rycznie pierwszy problem, którego NP-zupełności dowiedziono.
Problem spclnialności (formul) zdefiniujemy jako język SAT w sposób na-
stępujący. Egzemplarz problemu SAT stanowi formula logiczna cf,złożona z
Na przykład formula
1047
ROZDZIAŁ 36. NP-ZUPEŁNOSC
~ (I V ~(I V I)) A I
~(lvO)Al
~ I
TWlERDZENIE36.9.
Problem spełnialności formuł logicznych jest NP-zupełny.
DOWÓD
Wykażemy najpierw, że SATeNP. Następnie udowodnimy, że CIRCUIT-
-SAT ~rSAT; na mocy lematu 36.8 zakończy to dowód twierdzenia.
żeby udowodnić, że język SAT należy do klasy NP, wykażemy, iż świadec
two składające się z wartościowania spełniającego dla wejściowej formuły q,
można weryfikować w czasie wielomianowym. Algorytm weryfikacji zastępuje
po prostu każdą zmienną w formule odpowiadającą jej wartością, a następnie
oblicza otrzymane wyrażenie, tak jak robiliśmy to w równaniu (36.2). Czynno-
ści te można bez trudu wykonać w czasie wielomianowym. Jeśli wartością
wyrażenia jest 1, to formuła jest spełnialna. Wykazaliśmy zatem prawdziwość
pierwszego warunku NP-zupełności.
W celu udowodnienia, że język SAT jest NP-trudny, wykażemy, że CIR-
CUIT-SAT ~pSAT. Innymi słowy, każdy egzemplarz problemu spełnialności
obwodów można w czasie wielomianowym zredukować do egzemplarza prob-
lemu spełoialności formuł. Każdy obwód logiczny można metodą indukcji
przedstawić w postaci formuły logicznej. Dla bramki, wyjście z której jest zara-
zem wyjściem z całego układu, konstruujemy indukcyjnie formuły odpowiada-
jące każdemu z jej wejść. Formułę dla całego układu otrzymujemy następnie,
zapisując wyrażenie stosujące funkcję realizowaną przez bramkę do formuł
reprezentujących wejścia bramki.
Niestety, ta naturalna metoda nie daje redukcji w czasie wielomianowym.
Występowanie wspólnych podformuł może spowodować wykładniczy wzrost
rozmiaru tak utworzonej formuły (patrz zad. 36.4~1). Algorytm redukcji musi
więc być nieco sprytniejszy.
···----------------------
1048
------
36.4. DOWODZENIE NP-ZUPEŁNO$CI
x, x,
X,
x,
x,
x, x,,
x, x,
Rys. 36.8. Redukcja problemu spełnialności układów do problemu spełnialności formuł. Formuła
konstruowana przez algorytm redukcji zawiera zmienną. odpowiadają.cą ka.i.demu przewodowi
układu
I\ (x 5 .-+(X 1 V x 2 ))
Dla danego układu C łatwo skonstruować taką formulę tj, w czasie wielo-
•
mtanowym.
Dlaczego spełnialność układu C jest równoważna ze spelnialnością for-
muły tj,?Jeśli C ma wartościowanie spełniające, wartość na każdym pruwodzie
jest dobrze zdefmiowana, a na wyjściu układu jest 1. Przypisanie wartości na
1049
ROZDZIAŁ 36, NP-ZUPEŁNOSC
•
Spełnialność formuł 3-CNF
NP-zupełność wielu problemów można wykazać przez redukcję problemu spel-
nialności formuł. Algorytm redukcji musi jednak radzić sobie z dowolną for-
mulą wejściową, a to może się wiązać z olbrzymią liczbą przypadków do roz-
ważenia. W związku z tym często wolelibyśmy dokonywać redukcji ograniczo-
nego języka formul logicznych, żeby owych przypadków było mniej. Oczywi-
ście nie możemy ograniczyć języka do tego stopnia, żeby stal się rozwiązywalny
w czasie wielomianowym. Wygodnym do rozważania językiem jest spelnial-
ność formul 3-CNF<',czyli język 3-CNF-SAT.
Spełnialność formuł 3-CNF defmiujemy za pomocą następujących pojęć.
literał w formule logicznej to wystąpienie zmiennej lub jej negacji. Formuła
logiczna jest w postaci koniunkcyjnej normalnej albo CNF (od ang. conjunctive
norma!form), jeśli jest zapisana jako koniunkcja klauzul, z których każda jest
alternatywą jednego lub więcej literałów. Formuła logiczna jest w postaci
3-koniunkcyjnej normalnej albo 3-CNF, jeśli każda klauzula zawiera przy tym
dokładnie trzy różne literały.
Na przykład formuła
TwlERDZENIE 36.10.
Spełnialność fonnul logicznych w postaci 3-koniunkcyjnej nonnalnej jest prob-
lemem NP-zupełnym.
DOWÓD
Argument, którego użyliśmy w dowodzie twierdzenia 36.9 do wykazania, że
SATeNP, można równie dobrze zastosować tutaj, żeby wykazać, że 3-CNF-
1050
~SA1"eNP. Pozostaje więc tylko wykazać, że problem 3-CNF-SAT jest NP-
-trudny. Udowodnimy to wykazując, że SAT ~p3-CNF-SAT, i korzystając
z lematu 36.8.
Algorytm redukcji można rozbić na trzy podstawowe kroki. W każdym
z nich przekształcamy stopniowo wejściową formułę ej,do postaci coraz bliższej
docelowej 3-koniunkcyjnej postaci normalnej.
Pierwszy krok jest podobny do użytego przy dowodzeniu, że CIRCUI'f-
-SAT ~pSAl' w twierdzeniu 36.9. Najpierw budujemy binarne „drzewo roz-
kładu" wejściowej formuły ej,,którego liśćmi są literały, a węzłami wewnętrz
nymi~ spójniki. Na rysunku 36.9 widać takie dr7.ewo rozkładu dla formuły
(36.3)
Jeśli wejściowa formula zawiera takie klauzule, jak alternatywa większej liczby
literałów, to korzystając z łączności, można tak rozstawić nawiasy, żeby każdy
węzeł wewnętrzny w powstałym drzewie miał jednego lub dwóch synów. Binar-
ne drzewo rozkładu można teraz traktować jak układ logiczny, obliczający
pewną funkcję.
Naśladując redukcję z dowodu twierdzenia 36.9 z każdym wejściem z węz
ła wewnętrznego związujemy zmienną y 1• Następnie przepisujemy pierwotną
formułę ej,jako koniunkcję zmiennej z korzenia i klauzul opisujących operacje
realizowane przez wszystkie węzły. Dla formuły (36.3) otrzymujemy wyrażenie
i\ CY2+-+(y3V y4))
V
' '
' ·'
'
r~·6,
A (y 3 +-+(X1 -+Xi))
A (y4 +-+ •y,)
A (y 5 +-+ (y 6 V x 4 ))
------ ..
Y, Y,
----
,, (y1-(y2A -U:2))
I I I o
I I o I
I o I o
I o o o
o I I -- I
o I o, o
o o I -
I
o o o I
Ó'1 A Yi A Xi) V (yl A -,Yi A Xi) v(yl A -,Yi A 'Xi)v( 'Y1 A Yi A 'Xi)
Stosując prawa De Morgana, dostajemy formulę CNF
= ( 'Y1
r/JJ_ V -,Yi V 'Xi) A(-,Y1 V Yi V -,Xi)
A(-iy 1 V Yi V Xi)A(y 1 V -iy 2 V Xi)
równoważną z klauzulą tpJ_.
--~----------------------
1052
36.4. DOWODZENIE NP-ZUPEŁNOŚCI
1053
ROZDZIAŁ 36. NP-ZUPEŁNOSC
36.5. ProblemyNP-zupełne
Problemy NP-zupełne pojawiają się w najrozmaitszych dziedzinach, jak logika
matematyczna, teoria grafów, arytmetyka, projektowanie sieci, zbiory i ich
podziały, zapisywanie i odczytywanie informacji, szeregowanie zadań i układa
nie harmonogramów, programowanie matematyczne, algebra i teoria liczb, gry
i łamigłówki, automaty i teoria języków formalnych, optymalizacja progra-
mów i wiele innych. W tym podrozdziale użyjemy metody redukcji w dowo-
dach NP-zupełności rozmaitych problemów zaczerpniętych z teorii grafów
i podziałów zbioru.
Na rysunku 36.11 jest przedstawiona struktura zależności dowodów NP-
-zupełności w podrozdz. 36.4 i niniejszym. NP-zupełności każdego języka wi-
docznego na tym rysunku dowodzi się przez redukcję języka, od którego pro-
wadzi do niego strzałka. W korzeniu znajduje się język CIRCUIT-SAT, które-
go NP-zupełność udowodniliśmy w twierdzeniu 36.7.
36.5.1. Problemkliki
Klika w grafie nieskierowanym G = (V, E) to podzbiór V' c V, w którym
każda para wierzchołków jest połączona krawędzią należącą do E. Inaczej
36.5. PROBLEMY NP-ZUPEŁNE
CIRCUIT-SAT
SAT
3-CNF-SAT
CL!QUE HAM-CYCLB
!VERTBX-COVER
-
TSP
SUBSET-SUM
Rys. 36.11. Struktura dowodów NP-zupełności w pod.rozdz. 36.4 i 36.5. Wszystkie dowody wynikają
ostatecznie z reduktji NP-zupełnego problemu CIRCUIT-SAT
TwlERDZENIE 36.11.
Problem klik.ijest NP-zupełny.
DOWÓD
Żeby wykazać, że CLIQUE E NP, dla danego grafu G E) jako świadec
= (V,
twa użyjemy zbioru V' c V wierzchołków kliki. Stwierdzić, czy V' jest kliką,
można w czasie wielomianowym, sprawdzając, czy dla każdej pary u, v E V'
krawędź (u, v) należy do E.
Pokażemy teraz, że problem kliki jest NP-trudny, dowodząc, że 3-CNF-
-SAT ~pCLIQUE. Fakt, że można coś takiego udowodnić, jest nieco zaska-
1055
ROZDZIAŁ 36. NP-ZUPEŁNOSć
kujący, ponieważ na pierwszy rzut oka formuły logiczne wydają się mieć nie-
wiele wspólnego z grafami.
Redukcję zaczynamy od egzemplarza problemu 3-CNF-SAT. Niech
ej,= C1 A C 2 A .•• A C1 będzie formulą logiczną 3-CNF ok klauzulach. Każda
klauzula C, dla r = 1, 2, ..., k zawiera dok.ładnie trzy różne literały li, IZ i/).
Skonstruujemy graf G taki, że formuła ej,jest spełnialna wtedy i tylko wtedy,
gdy G zawiera klikę rozmiaru k.
Graf G = (V, E) konstruujemy w następujący sposób. Każdej klauzuli
C, = (/'i v IZ v 13) w cJ,odpowiada trójka wierzchołków v'i_,vZ i vl w zbio-
rze V. Wierzchołki vj i vj łączymy krawędzią, jeśli zachodzą obydwa poniższe
warunki:
Graf ten można łatwo obliczyć z formuły cJ,w czasie wielomianowym. Jeśli
na przykład
1056
36.5. PROBLEMY NP-ZUPEŁNE
•
W przykładzie na rys. 36.12 wartościowaniem spełniającym dla formuły
<I>jest (x 1 = O, x 2 = O, x 3 = 1). Odpowiadająca mu klika rozmiaru k = 3 skła
da się z wierzchołków odpowiadających literałom: •x 2 z pierwszej klauzuli, x 3
z drugiej i x 3 z trzeciej.
1057
ROZDZIAŁ 36. NP-ZUPEŁNO$ć
u~----(,;')
w
'
y
(,) (b)
Rys. 36.13. Redukcja problemu CLIQUE do VERTEX-COYER. (a) Graf nieskierowany G = (V, EJ
z kliką V'= {u, v, x, y}. (b) Utworzony przez algorytm redukcji graf G o pokryciu wierzchoł
kowym V- V'= {w,z}
TwlERDZENIE 36.12.
Problem pokrycia wierzchołkowego jest NP-zupełny.
DOWÓD
Najpierw wykażemy, że VERTEX-COVEReNP. Załómly, że dany jest graf
G = (V, E) i liczba całkowita k. Naszym świadectwem będzie samo pokrycie
wierzchołkowe V' c: V. Działanie algorytmu weryftlc.acji polega na upewnieniu
się, że IV'J= k, a następnie dla każdej krawędzi (u, v)EE sprawdzeniu, czy
ue V' lub vE V'. Weryfikację taką można bez trudu wykonać w czasie wielo-
•
m1anowym.
Udowodnimy, że problem pok.rycia wierzchołkowego jest NP-trudny, po-
kazując, że CLIQUE ~P VERTEX-COVER. Redukcja ta jest oparta na poję
ciu „dopełnienia" grafu. Dla danego grafu nieskierowanego G = (V, E) defi-
niujemy dopełnienie G jako graf G = (V, E), gdzie E = {(u, v): (u, v)łE).
Inaczej mówiąc, <).jest grafem zawierającym dokładnie te krawędzie, które nie
należą do G. Na rysunku 36.13 przedstawiono graf i jego dopełnienie jako
ilustrację redukcji problemu CLIQUE do VERTEX-COVER.
Wejście dla algorytmu redukcji stanowi egzemplarz (G, k) problemu
kliki. Algorytm oblicza dopełnienie G, co łatwo wykonać w czasie wielo-
mianowym. Wynikiem działania algorytmu redukcji jest egzemplarz (G,
lf-1- k) problemu pokrycia wierzchołkowego. żeby zakończyć dowód, wy-
starczy pokazać, że powyższe przekształcenie jest faktycznie redukcją: graf G
zawiera klikę rozmiaru k wtedy i tylko wtedy, gdy graf c· ma pok.rycie wie-
rzchołkowe rozmiaru IVI- k.
Załóżmy, że G zawiera klikę V' c V taką, że IV I = k. Twierdzimy, że
1
1058
36.5. PROBLEMY NP-ZUPEŁNE
1059
ROZDZIAŁ 36. NP-ZUPEŁNQ$C
TWIERDZENIE 36.13.
Problem sumy podzbioru jest NP-zupełny.
DOWÓD
Żeby wykazać, że SUBSET-SUM należy do NP,jak.o świadectwa dla egzemp-
larza problemu (S, t) użyjemy podzbioru S'. Za pomocą algorytmu weryftka-
cji można w czasie wielomianowym sprawdzić, czy t = L s.
,es'
I, jeśli wierzchołek
v1 jest końcem krawędzi e1
bij= { o •
w przeciwnym •
razie
1060
rv /n1olil'/i/.:0K·unvrn
u/.:/a<i:rt 1·:'wórkow_rn1 J).:1ts1c111ic
('('('('('
., l C I <,
',,; - -
•
'' I o I I •
IaI ( b)
'
-
,.
' - oo oo o o oo o I - 16
Y;
''
-o
- I
I
() () ()
()
()
-
-
64
256
I cI
Rys. 36.14. Redukcja problemu pokrycia wierzchołkowego do problemu sumy podzbioru. (a) Graf
nieskierowany G. Pokrycie wierzchołkowe {v1 , v 1, v4 } rozmiaru 3 jest oznaczone jaśniejszym kolo-
rem. (b) Macierz incydentji tego grafu. Cieniowanie wierszy odpowiada pokryciu wierz.chołkowe
mu z punktu (a). Każda krawędź e1 ma l przynajmniej w jednym jasnoszarym wierszu. (c) Od-
powiadający egzemplarz problemu sumy p<Xlzbioru.Obramowany fragment to macierz incydencji.
Pokryciu wierzchołkowemu {v1, v 1 , v4 } rozmiaru k = 3 odpowiada tutaj oznaczony jamoszarym
kolorem podzbiór {I, 16, 64, 256, 1040, 1093, 1284} o sumie 3754
IE!- I
t=k41EI+ L 2·4j
i"' o
1062
36.5. PROBLEMY NP-ZUPEŁNE
TwIERDZENIE 36.14.
Problem cyklu Hamiltona jest NP-zupełny.
DOWÓD
Pokażemy najpierw, że problem HAM-CYCLE należy do klasy NP. Dla da-
nego grafu G = (V, E) naszym świadectwem jest ciąg IVIwierzchołków tworzą
cych cykl Hamiltona. Algorytm weryfikacji polega na sprawdzeniu, że ten ciąg
zawiera każdy wierzchołek ze zbioru V dokładnie raz i że dopisując pierwszy
wierzchołek jeszcze raz na końcu otrzymujemy cykl w G. Sprawdzenia tego
można dokonać w czasie wielomianowym.
Udowodnimy teraz, że problem HAM-CYCLE jest NP-zupełny, pokazu-
jąc, że 3-CNF-SAT ::s:;;pHAM-CYCLE. Dla danej formuły logicznej cppostaci
3-CNF, zawierającej zmienne x 1 , x 2 , ... , xn i zbudowanej z klauzul C 1 , C2 , ... ,
C1:,z których każda składa się z dokładnie trzech różnych literałów, konstruuje-
my w czasie wielomianowym graf G = (V, E) tak.i, że G zawiera cykl Hamiltona
wtedy i tylko wtedy, gdy formuła cpjest spełnialna. Nasza konstrukcja opiera
się na gadżetach, czyli fragmentach grafu wymuszających pewne jego własności.
Naszym pierwszym gadżetem jest podgraf A pokazany na rys. 36.15a.
Przypuśćmy, że A jest pod grafem pewnego grafu G i że jedynym połączeniem
A z resztą G są wierzchołki a, a', bib'. Załóżmy przy tym, że graf G ma cykl
Hamiltona. Ponieważ każdy cykl Hamiltona w G musi przechodzić przez
(,) (b)
-
'4
-"
A
b ..,
(c) (d)
Rys. 36.15. (a) Gadżet A używany przy redukcji problemu 3-CNF-SAT do HAM-CYCLE. (b)-(c)Jeśli
A jest pod graf em pewnego grafu G, który zawiera cykl Hamiltona i jedyne połączenie A zresztą grafu
G prowadzi przez wierzchołki a, a', bi b', to zamaczone krawędzie stanowią jedyne dwa możliwe
sposoby przechodzenia cyklu Hamiltona przez krawędzie podgrafu A. (d) Skrócone omaczenie
gadżetu A
1063
ROZDZIAŁ 36. NP-ZUPEŁNOŚĆ
wierzchołki z 1 ,
z 2 , z 3 i z4 na jeden ze sposobów pokazanych na rys. 6.15b i c,
możemy traktować podgraf A tak., jak gdyby był on tylko parą krawędzi (a, a')
i (b, b'), ale z ograniczeniem, że każdy cykl Hamiltona w G musi zawierać
dokładnie jedną z tych krawędzi. Wystąpienie gadżetu A będziemy zapisywać
w postaci przedstawionej na rys. 36.15d.
Drugim gadżetem jest podgraf B widoczny na rys. 36.16. Przypuśćmy, że
B jest pod grafem pewnego grafu G i że jedyne połączenie B z resztą G stanowią
wierzchołki b 1 , b 2 , b 3 i b 4 • Cykl Hamiltona w grafie Gnie może przechodzić
przez wszystkie trzy krawędzie (b 1 , b2 ), (b2 , b3 ) i (b3 , b4 ), bo wówczas musiałby
ominąć wszystkie wierzchołki gadżetu oprócz b 1 , b 2 , b 3 i b4 • Cykl Hamiltona
w G może jednak przechodzić przez każdy właściwy podzbiór tego zbioru
krawędzi. Rysunki 36.I6a-e zawierają pięć takich podzbiorów; pozostałe dwa
można otrzymać, odbijając symetrycznie części (b) i (e). Gadżet ten będziemy
przedstawiać jak na rys. 36.I6f; chodzi w nim o to, że do cyklu Hamiltona
trzeba wziąć przynajmniej jedną ze ścieżek wskazywanych przez strzałki.
Graf G, który skonstruujemy, składa się głównie z kopii tych dwóch ga-
dżetów. Konstrukcję ilustruje rys. 36.17. Dla każdej spośród k klauzul formuły
tJ,dołączamy do grafu kopię gadżetu B i łączymy je wszystkie w następujący
sposób. Jeśli przez bu oznaczymy kopię wierzchołka b1 w i-tej kopii gadżetu B,
to dla i= 1, 2, ... , k -1 łączymy b 1, 4 z b 1+ 1 , 1 .
Następnie dla każdej zmiennej x 111formuły q,do grafu dodajemy dwa wierz-
chołki x;,.i x;. Łączymy je ze sobą za pomocą dwóch kopii krawędzi (x;,.,x;),
które dla rozróżnienia oznaczymy jako e111ie,,,. Idea konstrukcji polega na tym,
że jeśli do cyklu Hamiltona wchodzi krawędź e111, to odpowiada to przypisaniu
zmiennej x,,,wartości I. Jeśli do cyklu wchodzi krawędź e,,,, zmiennej tej jest
przypisywana wartość O. Każda para takich krawędzi stanowi dwukrawędzio
wy cykl; wszystkie temale cykle łączymy ze sobą, dodając krawędzie (x;,.,x::i+1 )
dla m = l, 2, ... , n - 1. Łączymy lewą (odpowiadającą klauzulom) część grafu
z prawą (odpowiadającą zmiennym) częścią za pomocą dwóch krawędzi (b1 , 1 ,
xJ.) i (b1 •4 , xZ) (na rys. 36.17 krawędzie najwyższa i najniższa) .
To nie koniec konstrukcji grafu G, bo musimy jeszcze powiązać zmienne
z klauzulami. Jeśli j-tym literałem klauzuli C 1 jest x,,,,to krawędź (b1i, bi,J+1)
z krawędzią e,., łączymy gadżetem A. Jeśli j-tym literałem klauzuli C; jest
......,x,,,,
to gadżet A umieszczamy między krawędzią (biJ, b1,J+1 ) a kra-
wędzią tf,,,. W przykładzie na rys. 36.17, ponieważ klauzula C2 jest równa
2 v x 3 ), trzy gadżety A umieszczamy następująco:
(x 1 v ......,x
• między (b 2 • 1 , b2 , 2 ) a e 1 ,
• między (b 2 , 2 , b 2 , 3) a e 2 , oraz
• między (b 2 ,3 , b 2 ,J a e3 .
Zauważmy, że połączenie dwóch krawędzi za pomocą gadżetu A oznacza
tak naprawdę zastąpienie każdej z nich pięcioma krawędziami odpowiednio
1064
36.5. PROBLEMY NP-ZUPEŁNE
(d) (e) lD
Rys. 36.16. Gadżet B używany przy redukcji problemu 3-CNF-SAT do HAM-CYCLE. żadna
ścieżka od wierzchołka h 1 do h„ zawierająca wszystkie wierzchołki gadżetu nie może przechodzić
przez wszystkie trzy krawędzie (h 1 , h2 ), (h2 , h 3 ) i (h 3 , h,.), może jednak przechodzić przez każ.dy
właściwy podzbiór tego zbioru krawędzi. (a}{e) Pięć spośród tych podzbiorów. (I) Skrócone oma-
czenie tego gadżetu; do cyklu Hamiltona musi wchodzić przynajmniej jedna ze wskazywanych
przez strzałki ścieżek
1065
ROZDZIAŁ 36. NP-ZUPEŁNQ$C
B -,,
,A
-----\A
Rys. 36.17. Graf G skonstruowany dla formuły ,j> =(•X1 V X2 V •X3)A (Xi V •X2 V X3)A (x1 V X2
v •x 3 ). Wartościowaniem spełniającym szmiennych formuły ,j>jests(x 1) = O,s(x 2 ) = I is(x 3 ) = I, co
odpowiada pokazanemu cyklowi Hamiltona. Zauważmy, że jeśli s(x.,) = l, to krawędź e„ należy do
cyklu Hamiltona, a jeśli s(x ..) = O, to do cyklu należy krawędź e.
1066
36.5. PROBLEMY NP-ZUPEŁNE
x'
'
bu
(b.,. A •'
'"
' ,,
-
(b„ A
•"'
b,.. ,.
(•) (b)
'
Rys. 36.18. Sposób postępowania, gdy do krawędzie. lub e„dochodzi wiele gadżetów A. (a) Frag-
ment rys. 36.17. (b) Faktycznie konstruowany podgraf
1067
ROZDZIAŁ 36. NP-ZUPEŁNOSC
trzech krawędzi musi zatem odpowiadać literał, którego wartością jest 1, więc
klauzula Cf jest spełniona. To samo zachodzi dla każdej klauzuli C1, gdzie
i= l, 2, ... , k, a więc jest spełniona cała formula cf,.
W celu udowodnienia odwrotnej implikacji załóżmy, że formuła tp ma
wartościowanie spełniające s. Stosując poniższe reguły, możemy skonstruować
cykl Hamiltona w grafie G: bierzemy do cyklu krawędź em-jeśli xm = 1, a kra-
wędź em -jeśli Xm = O; krawędź (b 1,j, bi,i+ 1 ) bierzemy wtedy i tylko wtedy, gdy
)-ty literał klauzuli C; ma przy tym wartościowaniu wartość O. Reguły te da-
ją się zastosować, bo założyliśmy, że s jest wartościowaniem spełniającym
dla formuły ef,.
Nadmieńmy na koniec, że graf G można skonstruować w czasie wielo-
mianowym. Zawiera on po jednym gadżecie B dla każdej spośród k klauzul
formuły tp.Każdemu wystąpieniu literału w tpodpowiada jeden gadżet A, jest
ich więc w sumie 3k. Ponieważ gadżety A i B są stałego rozmiaru, graf G zawie-
ra O(k) wierzchołków i krawędzi i łatwo skonstruować go w czasie wielomia-
nowym. Przedstawiliśmy zatem redukcję w czasie wielomianowym problemu
3-CNF-SAT do HAM-CYCLE.
•
36.5.5. Problem komiwojażera
W problemiekomiwojażera, ściśle związanym z problemem cyklu Hamiltona,
komiwojażer musi odwiedzić n miast. Modelując problem za pomocą grafu
pełnego o n wierzchołkach, możemy powiedzieć, że komiwojażer chce znaleźć
marszrutę, czyli cykl Hamiltona, odwiedzając każde miasto dokładnie raz
i kończąc w mieście, z którego wystartował. Koszt podróży z miasta i do miasta
j to liczba całkowita c(i, 1), a komiwojażer chce przebyć marszrutę o minimal-
nym łącznym koszcie, gdzie łączny koszt jest sumą kosztów poszczególnych
krawędzi marszruty. Na rysunku 36.19 na przykład optymalną marszrutą jest
(u, w, v, x, u) o koszcie 7. Język formalny dla problemu komiwojażera to
TwlERDZENIE 36.15.
Problem komiwojażera jest NP-zupełny.
1068
'36.5. PROBLEMY NP-ZUPEŁNE
Rys. 36.19. Egzemplarz problemu komiwojażera. Z.amaczone krawędzie stanowią optymalną marsz-
rutę o koszcie 7
DOWÓD
Wykażemy najpierw, re TSP należy do NP. Dla danego egzemplarza problemu
jako świadectwa użyjemy ciągu n wierzchołków marszruty. Algorytm weryfika-
cji polega na upewnieniu się, że ciąg zawiera każdy wierzchołek dokładnie raz,
zsumowaniu kosztów krawędzi i sprawdzeniu, czy otrzymana suma nie prze-
kracza k. Operacje te można z pewnością wykonać w czasie wielomianowym.
żeby udowodnić, że problem TSP jest NP-trudny, wykażemy, że HAM-
TSP. Niech G = (V, E) będzie egzemplarzem problemu HAM-
-CYCLE ,:;;;;p
-CYCLE. Egzemplarz problemu TSP konstruujemy w następujący sposób.
Tworzymy graf pełny G' = (V, E1, gdzie E' = {(i, j): i, je V), i definiujemy
funkcję kosztu c wzorem
•
ZADANIA
36.5-1. W problemie izomorfizmu podgrafu mamy dane dwa grafy G 1 i G2 i py-
tamy, czy G 1 jest podgrafem G2 . Wykaż, że problem izomorfizmu pod-
grafu jest NP-zupełny.
36.5-2. Dla danej całkowitoliczbowej macierzy A wymiaru m x n i całkowito
liczbowego wektora b długości m w problemie zero-jedynkowego programo-
1069
ROZDZIAŁ 36. NP-ZUPEŁNOŚĆ
Problemy
~1. Zbiór niezależny
Zbiór niezależny w grafie G = ( V, E) to podzbiór V' c V zbioru wierzchołków
taki, że co najwyżej jeden z końców każdej krawędzi z E należy do V'. Problem
zbioru niezależnego polega na znalezieniu zbioru niezależnego maksymalnego
rozmiaru w danym grafie G.
1070
PROBLEMY
Jft-2. Kolorowaniegrafu
k-kolorowaoiegrafu nieskierowanego G = ( V, E) to funkcja c: V-+ { 1, 2, ..., k}
taka, że c(u) =Fc(v) dla każdej krawędzi (u, v) EE. Inaczej mówiąc, liczby 1, 2,
..., k reprezentują k kolorów, a sąsiednie wierzchołki muszą mieć różne kolory.
Problemkolorowaniagrafupolega na wyznaczeniu minimalnej liczby kolorów
potrzebnych do pokolorowania danego grafu.
1071
ROZDZIAŁ 36. NP-ZUPEŁNOSC
TRUE
,-------~
Rys.. 36.20. Gadżet odpowiadający klauzuli (x v y v z), wykorzystywany w problemie 36--2
Uwagi do rozdziału
Książka Gareya i Johnsona (79] stanowi doskonałe
wprowadzenie do zagad-
nienia NP-zupełności, zawierając szczegółowe omówienie teorii i katalog wielu
problemów znanych jako NP-zupełne w 1979 r. (Lista dziedzin, w których
występują problemy NP-zupełne, zamieszczona na początku podrozdz. 36.5
jest zaczerpnięta z jej spisu treści). U Hopcrofta i Ullmana [104] oraz Lewisa
i Papadimitriou (I 39] można znale-lć dobre omówienie NP-zupełności w kon-
tekście teorii złożoności. Aho, Hopcroft i Ullman [4] również omawiają tema-
tykę NP-zupełności i podają kilka przykładów redukcji, w tym redukcję prob-
lemu cyklu Hamiltona do problemu pokrycia wierzchołkowego.
Pojęcie klasy P wprowadził w 1964 r. Cobham [44] i, niezależnie, w 1965 r.
Edmonds [61], który wprowadził także pojęcie klasy NP i postawił hipotezę, że
P '#NP.Pojęcie NP-zupełności zaproponował w 1971 r. Cook [49], który po-
dał pierwsze dowody NP-zupełności problemów spelnialności formuł i speł
nialności formuł 3-CNF. Levin [138] odkrył to pojęcie niezależnie, podając
dowód NP-zupełności problemu wypełniania płaszczyzny. Karp [116] w 1972 r.
wprowadził metodę redukcji i przedstawił szeroką gamę problemów NP~zupeł
nych. Jego praca zawierała między innymi oryginalne dowody NP-zupełności
problemów kliki, pokrycia wierzchołkowego i cyk.lu Hamiltona. Od tamtych
czasów za sprawą wielu badaczy powstały setki dowodów NP-zupełności roz~
mai tych problemów.
Dowód twierdzenia 36.14 to adaptacja dowodu z pracy Papadimitriou
i Steiglitza [154].
Rozdział 37
Algorytmyaproksymacyjne
max CC')
( :::;:
c·• C p(n) (37.1)
ROZDZIAŁ 37. ALGORYTMY APROKSYMACYJNE
IC- c·1
c·
gdzie, jak poprzednio, c· jest kosztem rozwiązania optymalnego, a C to koszt
rozwiązania uzyskanego za pomocą algorytmu aproksymacyjnego. Błąd
względny jest zawsze nieujemny. Dla algorytmu aproksymacyjnego i(n) jest
ograniczeniembłędu względnego, jeśli
IC- c·1
--c~----
~ E(n) (37.2)
1074
ROZDZIAŁ 37. ALGORYTMY APROKSYMACYJNE
Zawartość rozdziału
1075
ROZDZIAŁ 37. ALGORYTMY APROKSYMACYJNE
37.1. Problempokryciawierzchołkowego
Definicja i dowód NP-zupełności problemu pokrycia wierzchołkowego pojawi-
ły się w pod.rozdz. 36.5.2. Pokryciem wierzchołkowym grafu nieskierowanego
G = (V, E) jest podzbiór V' c V taki, że jeśli (u, v) jest krawędzią w grafie, to
albo ue V', albo ve V' (albo obydwa). Rozmiar pokrycia wierzchołkowego to
liczba należących do niego wierzchołków.
Problem pokrycia wierzchołkowego polega na malezieniu w danym grafie
nieskierowanym pokrycia wierzchołkowego minimalnego rozmiaru. Nazywa-
my je optymalnym pokryciem wierzchołkowym. Problem ten jest NP-trud.ny,
ponieważ odpowiadający mu problem decyzyjny jest NP-zupełny, na mocy
twierdzenia 36.12.
Chociaż znalezienie optymalnego pokrycia wierzchołkowego w grafie G mo-
że nie być łatwe, niezbyt trudno znalei.ć pokrycie wierzchołkowe bliskie optymal-
nemu. Poniższy algorytm aproksymacyjny otrzymuje jako dane wejściowe graf
nieskierowany G, a w wyniku daje pokrycie wierzchołkowe, którego ro7miar na
pewno nie przekracza rozmiaru pokrycia optymalnego więcej niż dwukrotnie.
APPROX-VERTEX-COVER(G)
1 C+-0
2 E'-E[G]
3 while E' ;< 0
4 do wybierz dowolną krawędź (u, v) z E'
5 c-cu{u,v)
6 usuń z E' wszystkie krawędzie incydentne z u lub v
7 return C
TwIERDZENIE 37.1.
Ograniczenie względne algorytmu APPROX-VERTEX-COVER wynosi 2.
1076
• • /."', •
/
,.,
..
•
'• /!
' .
•
),i..,:IRIJl&l.,Ę,Ą (
• • • • I ,I , • • • • 'b,
. ··-- •
'· h .I!:m:;;:;;~;; .' ', .'
' ','
.. ___ ,,.,
• •
,
' (; 'iii
/
i ll ••w(J
"_,,
)
!' I 'd'
•
'' . -- • I) '. ' d '
'
'," /
,·'. ~-
• ,,
(e)
(1·--
. ...
'
.
.
• ', i: )'
'
ID •
Rys. 37.1. Dzia/anie procedury APPROX-VERTEX-CoVER. (a) Wejściowy graf Go 7 wierzchołkach
i 8 krawędziach. (b) Krawędź (b, c), oznaczona pogrubioną linią,jest pierwszą krawędzią wybraną
przez procedurę APPROX-VERTEX-CoVER. Wierzchołki bi c, na rysunku jasnoszare, zostają dodane
do zbioru C zawierającego budowane pokrycie wierzchołkowe. Krawędzie (a, b), (c, e) i (c, d),
narysowane linią przerywaną, zostają usunięte, ponieważ są teraz pokryte przez pewien wierz-
chołek z C. (e) Końce krawędzi (e, j) zoslaj, dodane do C. (d) Końce krawędzi (d, g) zostają
dodane do_C. (e) Zbiór C, stanowiący pokrycie wierzchołkowe utworzone przez APPROX-VERTEX-
·COVER, składa się z 6 wierzchołków b, c, d, e, f, g. (I) Optymalne pokrycie wierzchołkowe tego
grafu zawiera tylko 3 wierzchołki: h, d j e
DOWÓD
Zbiór C skonstruowany przez procedurę APPROX-VERTEX-COVERjest pokry-
ciem wierzchołkowym, ponieważ pętla w algorytmie jest wykonywana tak dłu
go, aż każda krawędź z E[G] zostanie pokryta przez jakiś wierzchołek z C.
Żeby się przekonać, że algorytm APPROX-VERTEX-COVERoblicza pokry-
cie wierzchołkowe co najwyżej dwukrotnie większe od optymalnego, oznaczmy
przez A zbiór krawędzi wybranych w wierszu 4 procedury APPROX-VERTEX-
-COVER. Żadne dwie krawędzie z A nie mają wspólnego wierzchołka, ponieważ
za każdym razem, kiedy w wierszu 4 jest wybierana krawędź, wszystkie inne
krawędzie incydentne z jej końcami zostają usunięte z E' w wierszu 6. Każde
wykonanie operacji w wierszu 5 dodaje dwa nowe wierzchołki do C, zatem
ICJ = 21AI.Aby jednak pokryć wszystkie krawędzie z A, każde pokrycie wierz-
chołkowe - w szczególności pokrycie optymalne C: - musi zawierać przynaj-
mniej jeden z końców każdej krawędzi z A. Ponieważ żadne dwie krawędzie
1077
ROZDZIAŁ 37. ALGORYTMY APROKSYMACYJNE
w A nie mają wspólnego końca, żaden wierzchołek pokrycia nie jest incydentny
z więcej niż jedną krawędzią z A. Mamy zatem IAI::;;:;ic"I i ICI~ 21c1,co
kończy dowód twierdzenia.
ZADANIA
•
37.1-1. Podaj przykład grafu, dla którego algorytm APPROX-VERTEX-COVER
zawsze znajduje rozwiązanie gorsze od optymalnego.
37.1-2. Profesor Nixon proponuje heurystykę rozwiązywania problemu pokry-
cia wierzchołkowego polegającą na wielokrotnym wybieraniu wierzchołka
o najwyższym stopniu i usuwaniu wszystkich incydentnych z nim krawę
dzi. Podaj przykład dowodzący, że heurystyka profesora nie ma ogranicze-
nia względnego 2.
37.1-3. Podaj efektywny algorytm zachłanny znajdowania optymalnego po-
krycia wierzchołkowego dla drzewa, działający w czas.ie liniowym.
37.1-4. Z dowodu twierdzenia 36.12 wiemy, że problem pokrycia wierzchoł
kowego i NP-zupełny problem kliki są dualne w tym sens.ie, że optymalne
pokrycie wierzchołkowe jest dopełnieniem kliki maksymalnego rozmiaru
w dopełnieniu grafu. Czy z tej współzależności wynik.a istnienie algorytmu
aproksymacyjnego o stałym ograniczeniu względnym dla problemu kliki?
Odpowiedź uzasadnij.
37.2. Problemkomiwojażera
W problemie komiwojażera, wprowadzonym w podrozdz. 36.5,5, mamy dany
pełny graf nieskierowany G = (V, E), z którego każdą krawędzią (u, v) EE jest
związany nieujemny całkowity koszt c(u, v), a musimy znaleźć cykl Hamiltona
(marszrutę) w Go minimalnym koszcie. Rozszerzając naszą notację, oznaczmy
przez c(A) łączny koszt krawędzi w podzbiorze A c E:
c(A) = L c(u, v)
(11,u)1o..t
1078
37.2. PROBLEM KOMIWOJAŻERA
APPROX-TSP-TOUR(G,c)
1 wybierz wierzchołek re V[G] na „korzeń"
2 zbuduj minimalne drzewo rozpinające T dla G o korzeniu r
za pomocą procedury MST-PRIM(G, c, r)
3 niech L będzie listą wierzchołków drzewa T w kolejności preorder
4 return cykl Hamiltona H odwiedzający wierzchołki w takiej kolejności
jak w L
1079
ROZDZIAŁ 37. ALGORYTMYAPROKSYMACYJNE
@-
t '~ e
-©
---® - .
h
(>)
I (b)
(c)
1-1
(d) (cl
Rys. 37.l. Działanie procedury APPROX-TSP·TOUR.(a) Dany zbiór punktów leżących w węzłach
siatki całkowiloliczbowej. Na przy kl.ad j znajduje się jedną jednostkę na prawo i dwie jednostki
powyżej h. Funkcją kosztu pary punktów jest zwykła euklidesowa odległość między nimi. (b)
Minimalne drzewo rozpinające T dla tych punktów, wyznaczone przez procedurę MST-PRIM.
Wierzchołek a jest korzeniem. Wierzchołki są poetykietowane tak, jak były dodawane do drzewa
przez procedurę MST-PRIM, w porządku alfabetycznym. (e) Obejście drzewa T, zaczynając od a.
Wierzchołki są odwiedzane w kolejności a, b, c, b, h, b, a, d, e,j, e, g, e, d, a. Przechodz.ąc drzewo
T metodą preorder, wypisujemy wierzchołek tylko wtedy, kiedy napotykamy go po raz pierwszy,
co daje kolejność a, b, c, h, d, e,j, g. (d) Marszruta otrzymana przez odwiedzenie wierzchołków
w kolejności wyznaczonej przez przejście metodą preorder. Tę właśnie marszrutę H oblicza al-
gorytm APPROX·TSP-TouR.Jej łączny koszt wynosi w przybliżeniu 19,074. (e) Optymalna marsz-
ruta 1t dla danego zbioru wierzchołków. Jej łączny koszt wynosi około 14,715
1080
37.2. PROBLEM KOMIWOJA2ERA
TwlERDZENIE37.2.
Algorytm APPROX-TSP-TOURjestalgorytmem aproksymacyjnym z ogranicze-
niem względnym 2 dla problemu komiwojażera z nierównością trójkąta.
DOWÓD
Oznac11i1yprzez Jt optymalną marszrutę dla danego zbioru wierzchołków.
Warunkiem równoważnym treści twierdzenia jest c(H)::;;;;2c(d), gdzie H jest
marszrutą obliczoną przez algorytm APPROX-TSP-TOUR.Ponieważ przez
usunięcie dowolnej krawędzi z marszruty otrzymujemy drzewo rozpinające,
więc jeśli T jest minimalnym drzewem rozpinającym dla danego zbioru wierz-
chołków, to
a, b, c, b, h, b, a, d, e,f, e, g, e, d, a
a więc koszt W jest co najwyżej dwa razy większy niż koszt optymalnej
marszruty.
Niestety, W nie określa zwykle marszruty, gdyż niektóre wierzchołki są
odwiedzane więcej niż raz. Korzystając z nierówności trójkąta, możemy jednak
wyeliminować wizytę w dowolnym wierzchołku z W, nie powiększając kosztu.
(Usunięcie z W wierzchołka v odwiedzanego między u a w odpowiada przejściu
1081
ROZDZIAŁ 37. ALGORYTMY APROKSYMACYJNE
a, b, c, h, d, e,f, g
Jest to taka sama kolejność, jak otrzymana przez przejście metodą preorder
drzewa T. Niech H będzie cyklem, na którym wierzchołki występują w tej
właśnie kolejności. Jest to cykl Hamiltona, ponieważ każdy wierzchołek jest
odwiedzany dokładnie raz, i to jego właśnie oblicza algorytm APPROX-TSP-
-TOUR. Ponieważ cykl H otrzymaliśmy, usuwając wierzchołki z pełnego przejś
cia W, zachodzi więc
•
Pomimo dobrego ograniczenia względnego, wynikającego z twierdzenia 37.2,
APPROX-TSP-TOUR nie jest zwykle najpraktyczniejszym algorytmem dla tego
problemu. Istnieją inne algorytmy aproksymacyjne w praktyce zachowujące się
zazwyczaj znaci.nie lepiej (patrz uwagi na końcu tego rozdziału).
TWIERDZF..NIE 37 .3.
Jeśli P #- NP i p ~ I, to nie istnieje wielomianowy algorytm aproksymacyjny
o ograniczeniu względnym p dla ogólnego problemu komiwojażera.
DOWÓD
Dowód polega na doprowadzeniu do sprzeczności. Załóżmy przeciwnie, że dla
pewnej liczby p ~ 1 istnieje wielomianowy algorytm aproksymacyjny A
o ograniczeniu względnym p. Bez straty ogólności możemy założyć, że p jest
liczbą całkowitą, w razie potrzeby zaokrąglając je w górę. Pokażemy, jak uży
wać algorytmu A do rozwiązywania problemu cyklu Hamiltona (zdefiniowa-
nego w podrozdz. 36.5.5) w czasie wielomianowym. Ponieważ problem cyklu
Hamiltona jest NP-zupełny, na mocy twierdzenia 36.14, z możliwości rozwią
zania go w czasie wielomianowym wynika, że P = NP (tw. 36.4).
1082
37.2. PROBLEM KOMIWOJA2ERA
Ponieważ krawędzie spoza grafu G są tak kosztowne, istnieje duża luk.a między
kosztem marszruty stanowiącej cykl Hamiltona w G (koszt IV]) a kosztem
dowolnej innej marszruty (koszt większy niż PlV]).
Co się dzieje, jeśli zastosujemy algorytm aproksymacyjny A do problem.u
komiwojażera (G', c)? Algorytm A zawsze znajduje marszrutę o koszcie nie
większym niż p razy koszt optymalnej marszruty, więc jeśli G zawiera cykl
Hamiltona, to A musi go znaleźć. Jeśli G nie ma cyklu Hamiltona, to A znaj-
duje marszrutę o koszcie większym niż plVj. Możemy zatem użyć algorytmu
A do rozwiązania problemu cyklu Hamiltona w czasie wielomianowym.
•
ZADANIA
37.2-1. Pokaż, jak w czasie wielomianowym można przekształcić jeden przy-
padek problemu komiwojażera w inny, którego funkcja kosztu spebtia
nierówność trójkąta. Obydwa problemy muszą mieć taki sam zbiór opty-
malnych marszrut. Wyjaśnij, dlaczego takie wielomianowe przekształcenie
nie przeczy twierdzeniu 37.3.
1083
ROZDZIAŁ 37. ALGORYTMY APROKSYMACYJNE
37.3. Problempokryciazbioru
Problem pokrycia zbioru to problem optymalizacyjny stanowiący model dla
wielu zadań związanych z doborem zasobów. Jest on uogólnieniem NP-zupeł
nego problemu pokrycia wierzchołkowego, a zatem jest również NP-trudny.
Algorytm aproksymacyjny dla problemu pokrycia wierzchołkowego nie daje
się tu jednak zastosować, musimy więc szukać innych rozwiązań. Przedstawi-
my prostą zachłanną heurystykę o logarytmicznym ograniczeniu względnym.
Oznacza to, że wraz ze wzrostem rozmiaru problemu rozmiar rozwiązania
przybliżonego może rosnąć w stosunku do rozmiaru optymalnego rozwiąza~
nia. Ponieważ jednak funkcja logarytmiczna rośnie dość wolno, taki algorytm
aproksymacyjny może mimo wszystko dawać użyteczne wyniki.
Dane dla problemu pokrycia zbioru to para (X, !F), składająca się ze zbioru
skończonego X i rodziny !F podzbiorów X takiej, że każdy element zbioru
X należy do przynajmniej jednego podzbioru z rodziny §':
us
x- s.,
1084
37.3. PROBLEM POKRYCIA ZBIORU
X= US (37.8)
s,.
O każdej rodzinie et, spełniającej warunek (37.8), będziemy mówić, że pokrywa
X. Rysunek 37.3 stanowi ilustrację problemu .
• s, • •
• • •
• • s,
•
•s, s, •s, •s,
Rys. 37.3. Przykładowe dane (X, ') dla problemu pokrycia zbioru, gdzie X sirłada się z 12 czarnych
s.,
punktów, a gr = {Sv S'/;>S 3, S4, Sj> S6 }. Minimalne pokrycie zbioru to I( = {S3, s,}. Algorytm
zachłanny znajduje pokrycie rozmiaru 4, wybierając kolejno zbiory S 1, s., S, i S 1
GREEDY-SET-COVER(X, :F)
1 U+-X
1085
ROZDZIAŁ 37. ALGORYTMY APROKSYMACYJNE
2 re-0
3 while U i' 0
4 do wybierz SE ff, który maksymalizuje IS n Ul
5 U+-U-S
6 lf-lfu{S}
7 returnre
W przykładzie
na rys. 37.3 algorytm GREEDY-SET-COVERdodaje kolejno do
rezbiory fl'1, S4 , S5, S3 .
Algorytm działa w sposób następujący. W każdej fazie U oznacza zbiór nie
pokrytych dotychczas elementów. Zbiór qJ zawiera konstruowane pokrycie.
Wiersz 4 to krok, w którym jest podejmowana decyzja zachłanna. Wybierany
jest podzbiór S, pokrywający możliwie najwięcej spośród nie pokrytych ele-
mentów (remisy są rozstrzygane w dowolny sposób). Po wybraniu S jego ele-
menty są usuwane z U, a S zostaje dodany do qJ. Kiedy algorytm kończy
działanie, zbiór qJ stanowi podrodzinę !F pokrywającą X.
Algorytm GREEDY-SET-COVERłatwo zaimplementować tak, by działał
w czasie wielomianowym ze względu na IXI i l!FI.Ponieważ liczba przebiegów
pętli w wierszach 3-6 wynosi co najwyżej min(]Xl,IFI), a wnętrze pętli można
zaimplementować tak, żeby wykonywało się w czasie O(IXI l!FI), istnieje im-
plementacja działająca w czasie O(IXI JF!min(JXI, 1§1)). Celem zadania 37.3-3
jest uzyskanie złożoności liniowej.
Analiza
Wykażemy teraz, żepokrycie zbioru znajdowane przez algorytm zachłanny nie
jest dużo większe od optymalnego. Dla wygody w tym ro:zdziale d-tą liczbę
harmoniczną lid= L' 1/i (patrz podrozdz. 3.1) będziemy oznaczać przez H(d).
i= 1
fwIERDZENIE 37.4.
Ograniczenie względne algorytmu GREEDY-SET-COVERwynosi
J/(max{l.>1:
Sc9'})
DOWÓD
Dowód przeprowadzimy, związując z każdym zbiorem wybieranym przez al-
gorytm pewien koszt, ro:zdzielając ten koszt między elementy pokrywane po
raz pierwszy i wykorzystując owe koszty do wyprowadzenia zapowiedzianej
zależności między rozmiarem optymalnego pokrycia q/• a rozmiarem pokrycia
q/ znajdowanego przez algorytm. Niech S; oznacza i-ty podzbiór wybierany
przez procedurę GREEDY-SET-COVER;dodanie przez algorytm S; do ma re
1086
37.3. PROBLEM POKRYCIA ZBIORU
C = ·----------- I
"' IS; - (S1 u S2 u ... u S1_ 1)I
Algorytm znajduje pokrycie CCo całkowitym koszcie l<tl,a koszt ten zostaje
rozdzielony między elementy zbioru X. Ponieważ optymalne pokrycie <t • także
pokrywa X, mamy
(37.9)
L
,.,c,.; H(ISJ) (37.10)
l~I .; L H(ISJ)
Se'#•
.; l~·l·H(max{ISl:Seji,})
. ' ''
co dowodzi tezy twierdzenia. Pozostaje więc jedynie wykazać n1erownosc
(37.10). Dla dowolnego zbioru Se:F oraz i= 1, 2, ... , 1'1Pfl,
niech
1087
ROZDZIAŁ 37. ALGORYTMY APROKSYMACYJNE
Zauważmy, że
H(b) - H(a) -
•L 1/i
1=11+ 1
I
;, (b - a) b
Po zastosowaniu tej nierówności otrzymujemy sumę „teleskopową"
•
L c, <: L (H(u,_,) - H(uJ)
XES /"' 1
- H(u,,) - H(u,)
- H(u,,) - H(O)
- H(u,,)
- H(ISI)
•
WNIOSEK37,5.
Algorytm GREEDY-SET-COVERma ograniczenie względne (lnlX] + 1).
DOWÓD
Wynika z nierówności {3.12) i twierdzenia 37.4.
-------------------------
•
1088
37.4. PROBLEM SUMY PODZBIORU
ZADANIA
37.3-1. Potraktujmy każde z poniższych słów jak.o zbiór liter: {arid, dash, drain,
heard, lost, nosa, shun, slate, snare, thread}. Wskaż pokrycie obliczone
przez algorytm GREEDY-SET-COVER,jeśli remisy są rozstrzygane na ko-
rzyść słowa znajdującego się wcześniej w słowniku.
37.3-2. Udowodnij, stosując redukcję problemu pokrycia wierzchołkowego, że
wersja decyzyjna problemu pokrycia zbioru jest NP-zupełna.
37.3-3. Pokaż, jak zaimplementować algorytm GREEDY-SET-COVBR, żeby
działał w czasie O( L
s,, ISJ).
37.3-4. Znajdź prosty dowód poniższej słabszej wersji twierdzenia 37.4:
l~I,; J~'Jmax{JSJ:SeF}
37.4. Problemsumypodzbioru
Dane wejściowe dla problemu sumy podzbioru stanowi para (S,t), gdzie Sjest
zbiorem {Xi, x 2, ••• , xn} dodatnich liczb całkowitych, a t jest dodatnią liczbą
całkowitą. Nasz problem decyzyjny polega na rozstrzygnięciu, czy istnieje pod-
zbiór zbioru S, którego suma równa jest dokładnie docelowej wartości t. Prob-
lem ten jest NP-zupełny (patrz podrozdz. 36.5.3).
Związany z powyższą wersją decyzyjną problem optymalizacyjny pojawia
się w praktycznych zastosowaniach. W problemie optymalizacyjnym chcemy
znaleźć podzbiór {x 1, x 2, •••, xn}, którego suma jest możliwie największa, ale nie
przewyższa t. Przypuśćmy na przykład, że mamy ciężarówkę, na którą można
załadować nie więcej niż t kilogramów towaru, oraz n różnych skrzynek do
1089
ROZDZIAŁ 37. ALGORYTMY APROKSYMACYJNE
Algorytm wykładniczy
S+x = {s + x:seS}
Będziemy wykorzystywać pomocniczą procedurę MERGE-LISTS(L, L'), zwra-
cającą posortowany ciąg stanowiący efekt scalenia dwóch posortowanych cią
gów wejściowych Li L'. Podobnie jak procedura MERGE, używana przy sor-
towaniu przez scalanie (podrozdz. 1.3.1), MERGE-LISTS działa w czasie
O(ILI + ]T...'I). (Pseudokodu procedury MERGE-LISTS nie zamieszczamy). Dane
wejściowe dla procedury EXACT-SUBSET-SUM stanowi zbiór S = {x 1, x 1 , ••• , xn}
i docelowa wartość t.
EXACf-SUBSET-SUM(S,t)
I n~ISI
2 Lo~<o>
3 fori-1 ton
4 do LJ - MERGE-LISTS(L1_i, L 1_ 1 + xJ
5 usuń z L, wszystkie elementy większe niż t
6 return największy element listy L~
P,={0, I}
P,= {O,1, 4, 5}
P, - {O, I, 4, 5, 6, 9, 10}
1090
37.4. PROBLEM SUMY PODZBIORU
(37.11)
y-z
~-,; ó
y
lub równoważnie
(I - ó)y,; z,; y
L- (IO, 11, 12, 15, 20, 21, 22, 23, 24, 29)
1091
ROZDZIAŁ 37. ALGORYTMY APROKSYMACYJNE
TRIM(L, ó)
I m~ ILI
2 L'~<Y,)
3 last +- y 1
4 fori+-2tom
5 do if last < (I - ó)y,
6 then dołącz y 1 na koniec listy L'
7 last+- Y 1
8 return L'
Elementy L są przeglądane w porządku rosnącym, a liczba jest umieszczana na
wynikowej liście L I tylko wówczas, gdy jest pierwszym elementem L, albo nie
może być reprezentowana przez liczbę ostatnio dołączoną do L'.
Wykorzystując procedurę TRIM, możemy skonstruować nasz schemat ap-
roksymacji w sposób następujący. Dane wejściowe dla procedury to zbiór
S = {x1, x 2, ••• , xn} zawierający n liczb całkowitych (w dowolnej kolejności),
docelowa wartość t oraz parametr e opisujący ,,jak.ość aproksymacji", przy
czymO<e<l.
APPROX-SUBSET-SUM(S, t, e)
I •~ISI
2 L,,~ (O)
3 fori+-1 ton
4 do L 1 +-MERGE-LISTS(L;_ 1, L,_ 1 + x)
5 L; +-TRIM(L 1, e/n)
6 usuń z L 1 wszystkie elementy większe niż t
7 niech z będzie największą wartością w Ln
8 return z
W wierszu 2 tworzymy [.,0 - listę zawierającą tylko jeden element O. Celem
pętli w wierszach 3-6 jest wyznaczenie L 1 - posortowanej listy stanowiącej od-
powiednio skróconą wersję zbioru P1, pozbawioną wszystkich elementów więk
szych niż t. Ponieważ lista L 1jest tworzona z L,_ 1, musimy zapewnić, że wielo-
krotne skracanie nie powoduje zbyt wielkiej niedokładności. Wkrótce przeko-
namy się, że algorytm APPROX-SUBSRT-SUM znajduje poprawne przybliżenie,
o ile takie istnieje.
Jak.o przykład rozpat.tzmy zbiór
L- (104,102,201, 101)
1092
37.4. PROBLEM SUMY PODZBIORU
wiersz 2: L, = (O),
wiersz 4: L 1 = (O, 104),
wiersz 5: L 1 = (O, 104),
wiersz 6: L, = (O, 104),
wiersz 4: L, = (O, 102, 104,206),
wiersz 5: L, = (O, 102,206),
wiersz 6: L, = (O, 102, 206),
wiersz 4: L, = (O, 102,201, 206,303,407),
wiersz 5: L 3 = (O, 102,201,303,407),
wiersz 6: L, = (O, 102,201, 303),
wiersz 4: L 4 = (O, 101,102,201,203, 302,303,404),
wiersz 5: L 4 = (O, 101,201, 302,404),
wiersz 6: L, = (O, 101,201,302).
TwlERDZENIE37.6.
APPROX-SUBSET-SUM jest w pełni wielomianowym schematem aproksymacji
dla problemu sumy podzbioru.
DOWÓD
Operacje skracania listy L 1 w wierszu 5 i usuwania z L 1 wszystkich elementów
większych niż t nie zmieniają faktu, że każdy element L 1 należy także do Pi"
Wartość z zwracana w wierszu 8 jest zatem rzeczywiście sumą pewnego pod-
zbioru S. Pozostaje wykazać, że jest ona nie mniejsza niż 1 - e razy wartość
rozwiązania optymalnego. (Zauważmy, że ponieważ problem sumy podzbioru
jest problemem maksymali7.3.Cji, nierówność (37.2) jest równoważna z nierów-
nością C'(l - e)::;; C). Musimy także udowodnić, że algorytm działa w czasie
wielomianowym.
W celu wykazania, że błąd względny udzielanej odpowiedzi jest mały, za-
uważmy, że skracając listę L 1, wprowadzamy między pozostające na liście war-
tości reprezentantów a wartości przed jej skróceniem błąd względny nie prze-
kraczający e/n. Przez indukcję względem i można pokazać, że dla każdego
elementu y zbioru P1 nie większego niż t istnieje ze L 1 takie, że
(37.12)
1093
ROZDZIAŁ 37. ALGORYTMY APROKSYMACYJNE
Jeśli y • e
P 11 oznacza optymalne rozwiązanie problemu sumy podzbioru, to ist-
nieje ze L 11 takie, że
(37.13)
d(
dni-~ ')" >0
I- t < (1 - t/n)"
skąd
(1-t)y"~z
'
na mocy równania (2.1 O). Oszacowanie to jest wielomianowe ze względu na
liczbę n danych wejściowych, liczbę bitów lg t potrzebnych do reprezentacji t
i 1/s. Ponieważ czas działania procedury APPROX-SUBSET-SUM jest wielomia-
nem ze względu na długość L 1, jest ona w pełni wielomianowym schematem
aproksymacji.
ZADANIA
37.4-1. Udowodnij równość (37.11).
37.4-2. Udowodnij nierówności (37.12) i (37.13).
37.4-3. Jak 7Jllodyfikowalbyś przedstawiony w tym podrozdziale schemat
aproksymacji, aby umożliwiał on znajdowanie dobrego przybli:Zenia mini-
1094
PROBLEMY
malnej wartości nie mniejszej niż t, będącej sumą pewnego podzbioru da-
nej na wejściu listy?
Problemy
37-1. Problem pakowania
Załóżmy, że mamy dany zbiór n obiektów, a rozmiar s, i-tego obiektu spełnia
warunek O< s1 < l. Chcemy zapakować wszystkie obiekty do minimalnej licz-
by skrzyń rozmiaru jednostkowego. Każda skrzynia może pomieścić dowolny
zbiór obiektów, których łącz.ny rozmiar nie przekracza 1.
1095
ROZDZIAŁ 37. ALGORYTMY APROKSYMACYJNE
Uwagi do rozdziału
Istnieje bogata literatura dotycząca algorytmów aproksymacyjnych. Dobrą
lekturą na początek jest praca Gareya i Johnsona [79]. Znakomite przedstawie-
nie algorytmów aproksymacyjnych można również znaleźć u Papadimitriou
i Steiglitza [154). Lawler, Lenstra, Rinnooy Kan i Shmoys [133] wyczerpująco
omawiają problem komiwojażera.
Papadimitriou i Steiglitz przypisują algorytm APPROX-VERTEX-COVER
F. Gavrilowi i M. Yannakakisowi. Algorytm APPROX-TSP-TOUR pojawił się
w znakomitej pracy Rosenkrantza, Steamsa i Lewisa [170]. Twierdzenie 37.3
pochodzi od Sahniego i Gonzalesa [41]. Algorytm APPROX-SUBSET-SUMi jego
analiza są lużno oparte na podobnych algorytmach aproksymacyjnych dla
problemu plecakowego i sumy podzbioru autorstwa Ibarry i Kima [111].
Literatura
(I] Milton Abramowitz and Irene A. Stegun, editon. Handbook of Mathemat·
ical Functions. Dover, 1965.
[2] G. M. Adel'son-Vel'skil and E. M. Landis. An algorithm for the organiza-
tioh of information. Soviet Mathematics Doklady, 3: 1259-1263, 1962.
[31 Leonard M. AdJeman, Carl Pomerance, and Robert S. Rumely. On distin-
guishing prime num bers from composite num bers. Annals of Mathematics,
117:173-206, 1983.
(4] Alfred V. Abo, Jolin E. Hopcroft, Jeffrey D. Ullman. Projektowanie i analiza
algorytmów komputerowych. PWN, Warszawa 1983.
[5] Alfred V. Aho, John E. Hopcroft, and Jeffrey D. Ullman. Data Structures
and Algorithms. Addison-Wesley, I 983.
[6] Ravindra K. Ahuja, Kurt Mehlhom, James B. Orlin, and Robert E. Tarjan.
Faster algorithms for the shortest path problem. Technical Report 193,
MIT Operations Research Center, 1988.
[7) Howard H. Aiken and Grace M. Hopper. The automatic sequence con-
trolled calculator. In Brian Randell, editor, The Origins of Digital Com-
puters, pages 203-222. Springer-Verlag, third edition, l 982.
(8] M. Ajtai, J. Komlós, and E. Szemerćdi. An O(nlogn) sorting network. In
Proceedingsof the Fifteenth Annual ACM Symposium on Theory of Com-
puting, pages 1-9, 1983.
(9] Selim G. Ald. The Design and Analysis of Parallel Algorithms. Prentice-
Hall, 1989.
[IO) Richard J. Anderson and Gary L. Miller. Detenninistic parallel list rank-
ing. In John H. Reif, editor, 1988 Aegean Workshop on Computing, volume
319 of Lecture Notes in Computer Science, J)ages 81-90. Springer-Yerlag,
1988.
[11] Richard J. Anderson and Gary L. Miller. A simple randomized parallel
algorithm for list-ranking. Unpublished manuscript, 1988.
[12] Tom M. Apostoł. Calcu/us, volume I. Blaisdell Publishing Company,
second edition, 1967.
[13] A. J. Atrubin. A one-dimensional real-time iterative multiplier. JEEE
Transactions on E/ectronic Computers, EC-14(1):394-399, 1965.
[14) Sara Baase. Computer Algorithms: lntroduction to Design and Analysis.
Addison-Wesley, second edition, 1988.
[ 15) Eric Bach. Private communication, 1989.
[16) Eric Bach. Number-theoretic algorithms. In Annual Review ofComputer
Science, volume 4, pages 119-172. Annual Reviews, Inc., 1990.
1097
[ I 7] R. Bayer. Symmetric bi nary B-trees: Data structure and maintenance al-
gorithms. Acta lnformalica, 1:290-306, 1972.
{18] R. Bayer and E. M. McCreight. Organization and maintenance of large
ordered index es. Acta Jnformatica, I ( 3): I 73-189, I 972.
[19] Paul W. Beame, Stephen A. Cook, and H. James Hoover. Log depth cir-
cuits for division and related problems. SIAM Journal on ('omputing,
15(4):994-1003, 1986.
[20] Pierre Beauchemin, Gilles Brassard, Claude Crćpeau, Claude Gautier, and
Carl Pomerance. The generation of random numbers that are probably
prime. Journal ofCryptofogy, 1:53-64, 1988.
[21] Richard Bellman. Dynamie Programming. Princeton University Press,
l 957.
[22] Richard Bellman. On a routing problem. Quarter!y of Applied Mathemal-
ics, 16(1):87-90, 1958.
[23] Michael Ben-Or. Lower bounds for algebraic computation trees. In Pro-
ceedings of the Fifteenth Annual ACM Symposium on Theory of Computing,
pages 80-86, 1983.
[24] Jon L. Bentley. Writing Efficient Programs. Prentice-Hall, 1982.
{25}Jon L. Bentley. Perełki oprogramowania.WNT, Warszawa 1992.
[26] Jon L. Bentley, Dorothea Haken, and James B. Saxe. A generał method
for solving divide-and-conquer recurrences. SIGACT News. 12(3):36-44,
1980.
(27] William H. Beyer, editor. CRC Standard Mathematica/ Tab/es. The Chem-
ical Rubber Company, 1984.
[28] Patrick Billingsley. Probability and Measure. John Wiley & Sons, second
edition, 1986.
[29] Manuel Blum, Robert W. Floyd, Vaughan Pratt, Ronald L. Rivest, and
Robert E. Tarjan. Time bounds for selection. Journal of Computer and
System Science:;,7(4):448-461, 1973.
[30] Bćla Bollob.is. Random Graphs. Academic Press, 1985.
[31 J J. A. Bondy and U. S. R. Murty. Graph Theory with Applications. American
Elsevier, 1976.
[321 Robert S. Boyer and J. Strother Moore. A fast string-searching algorithm.
Communications of the ACM, 20( 10):762-772, 1977.
[33] Gilles Brassard and Paul Bratley. Algorithmics: 1'heoryand Practice. Pren-
tice-Hall, 1988.
[34] Richard P. Brent. The parallel evaluation of generał arithmetic expressions.
Journal of the ACM, 21 (2):201-206, 1974.
[35] Richard P. Brent. An improved Monte Carlo factorization algorithm. B/1",
20(2):176-184, 1980.
[36] Mark R. Brown. The Ana/ysis of a Practical and Nearly Optima/ Priority
Queue. PhD thesis, Computer Science Department, Stanford University,
1977. Technical Report STAN-CS-77-600.
[37] Mark R. Brown. lmplementation and analysis of binomial queue algo-
rithms. SIAM Journal on Computing, 7(3):298-319, 1978.
[38] Arthur W. Burks, editor. Theory of Se[f-ReproducingAutomata. University
of Illinois Press, 1966.
[39] Joseph J. F. Cavanagh. Digital Computer Arithmetic. McGraw-Hill, 1984.
[40) H. Chemoff. A measure of asymptotic efficiency for tests of a hypothe-
sis based on the sum of observations. Annals of Mathematical Statistics,
23:493-507, 1952.
[41] Kai Lai Chung. Elementary Probability Theory with Stochastic Processes.
Springer-Verlag, 1974.
[42] V. Chvital. A greedy heuristic for the set-covering problem. Mathematics
ofOperations Research, 4(3):233-235, 1979.
[43) V. Chvital, O. A. Klamer, and O. E. Knuth. Selected combinatorial re-
search problems. Technical Report STAN-CS-72-292, Computer Science
Department, Stanford University, 1972.
[44] Alan Cobham. The intrinsic computational difficulty of functions. In Pro-
ceedings of the 1964 Congress for Logic, Methodology, and the Philosophy
of Science, pages 24-30. North-Holland, 1964.
[45] H. Cohen and H. W. Lenstra, Jr. Primality testing andjacobi sums. Math-
ematics ofComputation, 42(165):297-330, 1984.
[46] Richard Cole. Parallel merge sort. In Proceedings of the 27th Annual Sym-
posium on Foundations of Computer Science, pages 511-516. IEEE Com-
puter Society, 1986.
[47] Richard Cole and Uzi Vishkin. Deterministic coin tossing with applica-
tions to optima! parallel list ranking. lnformation and Control, 10( I ):32-
53, 1986.
[48] O. Corner. The ubiquitous 8-tree. ACM Computing Surveys, 11(2):121-
137, 1979.
[49] Stephen Cook. The complexity of theorem proving procedures. In Pro-
ceedings of the Third Annua! ACM Symposium on Theory of Computing,
pages 151-158, 1971.
[50] Stephen Cook, Cynthia Dwork, and Ri.idiger Reischuk. Upper and !ower
time bounds for parallel random access machines without simultaneous
writes. SIAM Journal on Computing, 15(1):87-97, 1986.
[51) James W. Cooley and John W. Tukey. An algorithm for the machine cal-
culation of complex Fourier series. Mathematics of Computation, 19(90):
297-301, April 1965.
[52] Don Coppersmith and Shmuel Winograd. Matrix multiplication via arith-
metic progressions. In Proceedings of the Nineteenth Annual ACM Sympo-
sium on Theory of Computing, pages 1-6, 1987.
(53) George B. Dantzig. Linear Programming and Extensions. Princeton Uni-
versity Press, 1963.
[54] Whitfield Diffie and Martin E. Hellman. New directions in cryptography.
IEEE Transactions on lnformation Theory, IT-22(6):644-654, 1976.
[55] E. W. Dijkstra. A note on two problems in connexion with graphs. Nu-
merische Mathematik, 1:269-271, 1959.
[56) John D. Dixon. Factorization and primality tests. The American Mathe-
matical Monthly, 91(6):333-352, 1984.
[57] Alvin W. Drake. Fundamenta/s of Applied Probability Theory. McGraw-
Hill, 1967.
(58] James R. Driscoll, Harold N. Gabow, Ruth Shrairman, and Robert E. Tar~
jan. Relaxed heaps: An alternative to Fibonacci heaps with applications
to parali el computation. Communications of the ACM, 31 ( 11): 1343-1354,
1988.
[59] James R. Driscoll, Neil Sarnak, Daniel D. Sieator, and Robert E. Tarjan.
Making data structures persistent. In Proceedings of the Eighteenth Annual
ACM Symposium on Theory ofComputing, pages 109-121, 1986.
160] Herbert Edelsbrunner. Algorithms in Combinatorial Geometry, volume IO
of EATCS Monographs on Theoreticaf Computer Science. Springer-Verlag,
1987,
[61] Jack Edmonds. Paths, trees, and flowers. Canadian Journal of Mathemat-
ics, 17:449-467, I 965.
[62] Jack Edmonds. Matroids and the greedy algorithm. Mathematical Pro-
gramming, 1:126-136, 1971.
[63] Jack Edmonds and Richard M. Karp. Theoretical improvements in the
algorithmic effi.ciency for network flow problems. Journal of the ACM,
19:248-264, 1972.
[64] G. Estrin, B. Gilchrist, and J. H. Pomerene. A note on high-speed digital
multiplication. /RE Transactions on Electronic Computers, 5(3): 140, 1956.
[65] Shimon Even. Graph Algorithms. Computer Science Press, 1979.
[66] William Feller. An Introduction to Probabi/ity Theory and lts Applications.
John Wiley & Sons, third edition, 1968.
[67] M. J. Fischer and A. R. Meyer. Boolean matrix multiplication and transi-
tive closure. In Proceedings of the Twe/fthAnnual Symposium on Switching
and Automata Theory, pages 129-131. IEEE Computer Society, 1971.
[68] Robert W. Aoyd. Algorithm 97 (SHORTEST PATH). Communications of
theACM, 5(6):345, 1962.
[69] Robert W. Floyd. Algorithm 245 (TREESORT). Communications o/the
ACM, 7:701, 1964.
[70] Robert W. Floyd and Ronald L. Rivest. Expected time bounds for selec-
tion. CommunicatiorlS of the ACM, 18(3):165-172, 1975.
[71] Lestor R. Ford, Jr., and D. R. Fulkerson. Flows in Networks. Princeton
University Press, 1962.
[72] Lestor R. Ford, Jr., and Selmer M. Johnson. A tournament problem. The
American Mathematical Monthly, 66:387-389, I 959.
(73) Steven Fortune and James Wyllie. Parallelism in random access machines.
In Proceedings of the Tenth Annual ACM Symposium on Theory of Com-
puting, pages 114-118, 1978.
[74] Michael L. Fredman and Michael E. Saks. The cell probe complexity of
dynamie data structures. In Proceedings of the Twenty First Annual ACM
Symposium on Theory of Computing, 1989.
[75] Michael L. Fredman and Robert E. Tarjan. Fibonacci heaps and their
uses in improved network optimization algorithms. Journal of the ACM,
34(3):596-615, 1987.
[76} Harold N. Gabow and Robert E. Tarjan. A linear-time algorithm for a
special case of disjoint set union. Journal of Computer and System Sciences,
30(2),209-221, 1985.
[77] Harold N. Gabow and Robert E. Tarjan. Faster scaling algorithms for
network problems. SIAM Journal on Computing, 18(5):1013-1036, 1989.
[78] Zvi Galii and Joel Seiferas. Time-space-optima! string matching. Journal
ofComputer and System Sciences, 26(3):280-294, 1983.
[79] Michael R. Garey and David S. Johnson. Computers and Jntractability: A
G_uideto the Theory of NP-Completeness. W. H. Freeman, 1979.
[80) Fa.nica Gavril. Algorithms for minimum coloring, maximum clique, min-
imum covering by cliques, and maximum independent set of a chordal
graph. SIAM Journal on Computing, 1(2):180-187, 1972.
[81] Alan George and Joseph W-H Liu. Computer Solution of Large Sparse
Positive Definite Systems. Prentice-Hall, I 981.
[82] Andrew V. Goldberg. Efficient Graph Algorithms for Sequentia/ and Par-
a/le/ Computers. PhD thesis, Department of Electrical Engineering and
Computer Science, MIT, 1987.
[83] Andrew V. Goldberg, Eva Tardos, and Robert E. Tarjan. Network flow
algorithms. Technical Report STAN..CS-89-1252, Computer Science De-
partment, Stanford University, I 989.
[84] Andrew V. Goldberg and Serge A. Plotkin. Parallel (ó + I) coloring of
constant-degree graphs. Information Processing Letters, 25(4):241-245,
1987.
[85] Andrew V. Goldberg and Robert E. Tarjan. A new approach to the max-
imum flow problem. In Proceedingsof the Eighteenth Annua/ ACM Sym-
posium on Theory ofComputing, pages 136-146, 1986.
[86J Shafi Goldwasser and Silvio Micali. Probabilistic encryption. Journal of
Computer and System Sciences, 28(2):270-299, 1984.
[87] Shafi Goldwasser, Silvio Micali, and Charles Rackoff. The knowledge
complexity of interactive proof systems. SIAM Journal on Computing,
I 8( I )c186-208, 1989.
[88] Shafi Goldwasser, Silvio Micali, and Ronald L. Rivest. A digital signature
scheme secure against adaptive chosen-message attacks. SIAM Journal on
Compu'ting, 17(2):281-308, 1988.
[89] Gene H. Golub and Charles F. Van Loan. Matrix Computations. The
Johns Hopkins University Press, 1983.
[90] G. H. Gonnet. Handbook of Algorithms and Data Structures. Addison-
Wesley, 1984.
[91] R. L. Graham. An efficient algorithm for determining the convex bull of a
finite planar set. Information ProcessingLetters, 1: 132-133, 1972.
[92] R. L. Graham and Pavol Heli. On the bistory of the minimum spanning
tree problem. Anna/sof the History of Computing, 7(1):43-57, 1985.
(93] Leo J. Guibas and Robert Sedgewick. A diochromatic framework for bal~
anced trees. In Proceedingsof the 19th Annual Symposium on Foundations
ofComputer Science, pages 8-21. IEEE Computer Society, 1978.
{94] Frank Harary. Graph Theory. Addison-Wesley, 1969.
[95] J. Hartmanis and R. E. Steams. On the computationa1 complexity of algo-
rithms. Transactions of the American Mathematica/ Society, l I 7:285-306,
1965.
[96] Frederick J. Hill and Gerald R. Peterson. lntroduction to Switching Theory
and Logical Design. John Wiley & Sons, second edition, 1974.
[97] C. A. R. Hoare. Algorithm 63 (partition) and algorithm 65 (find). Com-
munications of the ACM, 4(7):321-322, 1961.
[98] C. A. R. Hoare. Quicksort. Computer Journal, 5( 1): 10-15, 1962.
[99] W. Hoeffding. On the distribution of the number of successes in indepen-
dent trials. Anna/s of Mathematical Statistics, 27:713- 721, 1956.
[I 00] Micha Hofri. ProbabilisticAnalysis of Algorithms. Springer-Verlag, 1987.
[101) John E. Hopcroft and Richard M. Karp. An n512 algorithm for maximum
matchings in bipartite graphs. SIAM Journal on Computing, 2(4):225-231,
1973.
[102) John E. Hopcroft and Robert E. Tarjan. Efficient algorithms for graph
manipulation. Communications of the ACM, 16(6):372-378, 1973.
[103] John E. Hopcroft and Jeffrey D. Ullman. Set merging algorithms. SIAM
Journal on Computing, 2(4):294-303, 1973.
[104] John E. Hopcroft and Jeffrey D. Ullman. lntroduction toAutomata Theory,
Languages, and Computation. Addison-Wesley, 1979.
(105] Ellis Horowitz and Sartaj Sahni. Fundamentals ofComputer Algorithms.
Computer Science Press, 1978.
[106] T. C. Hu and M. T. Shing. Some theorems about matrix multiplication,
In Proceedingso/the 21st Annua/ Symposium on Foundations ofComputer
Science, pages 28-35. IEEE Computer Society, 1980.
(107] David A. Huffman. A method for the construction of minimum-redun-
dancy codes. Proceedingsof the !RE, 40(9):1098-1101, 1952,
(108] Kai Hwang. Computer Arithmetic: Principles, Architecture, and Design.
John Wiley & Sons, 1979.
[109] Kai Hwang and Faye A. Briggs. Computer Architecture and Para/lei Prt.r
cessing. McGraw-Hill, 1984.
[ 11OJ Kai Hwang and Doug DeGroot. Paraf/el Processingfor Supercomputers
and Artificial Intelligence. McGraw-Hill, 1989.
[ 111) Oscar H. lbarra and Chul E. Kim. Fast approximation algorithms for the
knapsack and sum of subset problems. Journal of the ACM, 22( 4):463-468,
1975.
[112] R. A. Jarvis. On the identification of the convex bull of a finite set of
points in the plane. Information ProcessingLetters, 2: 18-21, 1973.
[113] D. S. Johnson. Approximation algorithms for combinatorial problems.
Journal ofComputer and System Sciences, 9:256-278, 1974.
[114] Donald 8. Johnson. Efficient algorithms for shortest paths in sparse net-
works. Journal o/the ACM, 24(1):1-13, 1977.
[ 115] N. Kannar kar. A new polynomial-time algorithm for linear programming.
Combinatorica, 4(4):373-395, 1984.
(116] Richard M. Karp. Reducibility among combinatorial problems. In Ray-
mond E. Miller and James W. Thatcher, editors, Complexity ofComputer
Computations, pages 85-103. Plenum Press, 1972.
( 117] Richard M. Karp and Michael O. Rabin. Efficient randomized pattem-
matching algorithms. Tecbnical Report TR-31-81, Aiken Computation
Laboratory, Harvard University, 1981.
[118] Richard M. Karp and Vijaya Ramachandran. A survey of parallel algo-
rithms for shared-memory machines. Technical Report UCB/CSD 88/408,
Computer Science Division (EECS), University of Califomia, Berkeley,
1988.
(119) A. V. K.arzanov. Determining the maxirnal Oowin a network by the method
of preffows. Soviet Mathematics Doklady, 15:434-437, 1974.
{120) D. G. Kirkpatrick and R, Seidel. The ultimate planar convex hull algo-
rithm? SIAM Journal on Computing, 15(2):287-299, 1986.
{121] Donald E. Knuth. Fundamental Algorithms, volume I of The Art ofCom-
puter Programming. Addison-Wesley, 1968. Second edition, 1973.
[122) Donald E. Knuth. Seminumerical Algorithms, volume 2 of The Art of
Computer Programming. Addison-Wesley, 1969. Second edition, 1981.
[123] Donald E. Knuth. Sorting and Searching, volume 3 of The Art ofComputer
Programming. Addison-Wesley, 1973.
[124) Donald E. Knuth. Big omicron and big omega and big theta. ACM SJGACT
News, 8{2):18-23, 1976.
{125] Donald E. K.nuth, James H. Morris, Jr., and Vaughan R. Pratt. Fast pattem
matching in strings. SIAM Journal on Computing, 6(2):323-350, 1977.
[ 126] Zvi Kohavi. Switching and Finite Automata Theory. McGraw-Hill, 1970.
[127] Bernhard Korte and Llszlo Lovisz. Mathematical structures underlying
greedy algorithms. In F. Gecseg, editor, Fundamentals of Computation
Theory, number 117 in Lecture Notes in Computer Science, pages 205-
209. Springer-Verlag, 198 I.
[ 128] Bernhard Korte and Llszlo Lovisz. Structural properties of greedoids.
Combinatorica, 3:359-374, 1983.
( 129] Bernhard Korte and Llszlo Lovśsz. Greedoids-a structural framework
for the greedy algorithm. In W. Pulleybank, editor, Progressin Combina-
torial Optimization, pages 221-243. Academic Press, I 984.
[ 130) Bernhard Korte and Li.szlo Lovasz. Greedoids and linear objective func-
tions. SIAM Journal on Algebraic and Discrete Methods, 5(2):229-238,
1984.
[131] J. B. K.ruskal. On the shortest spanning subtree of a graph and the travel-
ing salesman problem. Proceedingsof the American Mathematical Society,
7:48-50, 1956.
[132] Eugene L. Lawler. Combinatorial Optimization: Networks and Matroids.
Holt, Rinehart, and Winston, 1976.
[133] Eugene L. Lawler, J. K. Lenstra, A. H. G. Rinnooy Kan, and D. B. Shmoys,
editoi's. The TravelingSalesman Problem. John Wiley & Sons, 1985.
[134] C. Y. Lee. An algorithm for path connection and its applications. /RE
Transactions on Electronic Computers, EC-10(3):346-365, 1961.
[135] F. Thomson Leighton. lntroduction to Parallel Algorilhms and Ar:chitec-
tures: Networks and Algorithms. Morgan-Kaufmann, in preparation.
[136] Debra A. Lelewer and Daniel S. Hirschberg. Data compression. ACM
Computing Surveys, I 9(3):261-296, I 987.
[137) H. W. Lenstra, Jr. Factoring integers with elliptic curves. Annals of Math-
ematics, 126:649-673, 1987.
[138] L. A. Levin. Universal sorting problems. Problemy PeredachiInformatsii,
9{3):265-266, 1973. In Russian.
[ 139] Harry R. Lewis and Christos H. Papadimitriou. Elements of the Theory of
Computation. Prentice-Hall, I 981.
{140] C. L. Liu. Introduction to Combinatoria/ Mathematics. McGraw-Hill,
I 968.
[141] Li.szlo Lovśsz. On the ratio of optima! integral and fractional covers.
DiscreteMathematics, 13:383-390, 1975.
[142] Udi Manber. Introduction to Algorithms: A Creative Approach. Addison-
Wesley, 1989.
[143] William J. Masek and Michael S. Paterson. A faster algorithm computing
string edit di stan ces. Journal of Computer and System &iences, 20( I): I 8-
31, 1980.
[144] Kurt Mehlhom. Sorting and Searching, volume I of Data Structures and
Algorithms. Springer-Verlag, 1984.
[145] Kurt Mehlhom. Graph Algorithms and NP-Completeness, volume 2 of Data
Structures and Algorithms. Springer-Verlag, I 984.
[ 146) Kurt Mehlhom. Multidimensiona/ Searching and Computationaf Geome-
try, volume 3 of Data Structures and Algorithms. Springer-Verlag, 1984.
[147] Gary L. Miller. Riemann's hypothesis and tests for primality. Journal of
Computer and System Sciences, 13(3):300-317, 1976.
(148] Louis Monier. Algorithmes de Factorisation D'Entiers. PhD thesis, L'Uni-
versite Paris-Sud, Centre D'Orsay, 1980.
[149] Louis Monier. Evaluation and comparison of two efficient probabilistic
primality testing algorithms. Theoretical Computer Science, 12(1):97-108,
1980.
[ISO] Edward F. Moore. The shortest path through a maze. In Proceedings of
the International Symposium on the Theory of Switching, pages 285-292.
Harvard University Press, 1959.
[ 15 I J Ivan Niven and Herbert S. Zuckerman. An lntroduction to the Theory of
Numbers. John Wiley & Sons, fourth edition, 1980.
[152] Yu. Ofman. On the algorithmic complexity of discrete functions. Soviet
Physics Doklady, 7(7):589-591, I 963. English translation.
[153] Alan V, Oppenheim and Alan S. Willsky, with Ian T. Young. Signals and
Systems. Prentice-Hall, 1983.
[154] Christos H. Papadimitriou and Kenneth Steiglitz. Combinatorial Opti-
mization: Algorithms and Complexity. Prentice-Hall, 1982.
[ISS] Michael S. Paterson, 1974. Unpublished lecture, Ile de Berder, France.
[156] J. M. Pollard. A Monte Carlo method for factorization. BIT, 15:331-334,
I 975.
[157] Carl Pomerance. On the distribution of pseudoprirµes. Mathematics of
Computation, 37(156):587-593, 1981.
[158] Carl Pomerance. The quadratic sieve factoring algorithm. In T. Beth,
N. Cot, and I. Ingemarrson, editors, Advances in Cryptology, volume 209
of Lecture Notes in Computer Science, pages 169-182. Springer-Verlag,
1984.
[159] Carl Pomerance, editor. Proceedings of the AMS Symposia in Applied
Mathematics: Computational Number Theory and Cryptography. Ameri-
can Mathematical Society, to appear.
[ 160] Franco P. Pre para ta and Micheal Ian Shamos. Computational Geometry:
An lntroduction. Springer-Verlag, 1985.
[ I 6 1J William H. Press, Brian P. Plannery, Saul A. Teukolsky, and William T.
Vetterling. Numerical Recipes: The Art ofScientific Computing. Cambridge
University Press, 1986.
[162] William H. Press, Brian P. Plannery, Saul A. Teukolsky, and William T.
Vetterling. Numerical Recipes in C. Cambridge University Press, 1988.
{163] R. C. Prim. Shortest connection networks and some generalizations. Bell
System Technical Journal, 36:1389-1401, 1957.
[164] Paul W. Purdom, Jr., and Cynthia A. Brown. The Analysis of Algorithms.
Holt, Rinehart, and Winston, 1985.
{165] Michael O. Rabin. Probabilistic algorithms. In J. F. Traub, editor, Algo--
rithms and Complexity: New Directions and Recent Results, pages 21-39.
Academic Press, 1976.
[ 1661 Michael O. Rabin. Probabilistic algorithm for testing primality. Journal of
Number Theory, 12: I 28- I 38, 1980.
[167] Edward M. Reingold, Jiirg Nievergelt, and Narsingh Deo. Combinatorial
Algorithms: Theory and Practice. Prentice-Hall, 1977.
[ 168] Hans Riesel. Prime Nurnbers and Cornputer Methods for Factorization.
Progress in Mathematics. Birkhiiuser, 1985.
[ 169] Ronald L. Rivest, Adi Shamir, and Leonard M. Adleman. A method for ob-
taining digital signatures and public-key cryptosystems. Comrnunications
of the ACM, 21(2):120-126, 1978. See also U.S. Patent 4,405,829.
[170] D. J. Rosenkrantz, R. E. Steams, and P. M. Lewis. An analysis of severa!
heuristics for the traveling salesman problem. SIAM Journal on Comput-
ing, 6:563-581, 1977.
(171] Y. A. Rozanov. Probability Theory: A Concise Course. Dover, 1969.
[172] S. Sahni and T. Gonzalez. P-complete approximation problems. Journal
of the ACM, 23:555-565, 1976.
[173] John E. Savage. The Cornplexity of Computing. John Wiley & Sans, 1976.
[ I 74] Robert Sedgewick. lmplementing quicksort programs. Cornrnunicationsof
theACM, 21(10):847-857, 1978.
[175] Robert Sedgewick. Algorithrns. Addison-Wesley, second edition, 1988.
[176] Michael I. Shamos and Dan Hoey. Geometrie intersection problems. In
Proceedingsof the 16th Annual Syrnposiurn on Foundations of Cornputer
Science, pages 208-215. IEEE Computer Society, 1975.
[177] Daniel D. Sleator and Robert E. Tarjan. A data structure for dynamie
trees. Journal ofCornputer and System Sciences, 26(3):362-391, 1983.
[ I 78] Daniel D. Sleator and Robert E. Tarjan. Self-adjusting binary search trees.
Journal of the ACM, 32(3):652-686, 1985.
(179) Joel Spencer. Ten Lectures on the Probabi/isticMethod. Regional Confer-
ence Series on Applied Mathematics (No. 52). SIAM, 1987.
[180] Staff of the Computation Laboratory. Description of a Relay Calculator,
volume XXIV of The Annals of the Computation Laboratory of Harvard
University. Harvard University Press, 1949.
[181] Gilbert Strang. Introduction to Applied Mathernatics. Wellesley-Cambridge
Press, 1986.
(182) Gilbert Strang. Linear Algebra and Its Applications. Harcourt Brace Jo-
vanovich, third edition, 1988.
[183] Volker Strassen. Gaussian elimination is not optima!. NurnerischeMathe-
matik, 14(3):354-356, 1969.
[184] T. G. Szymanski. A special case of the maxima! common subsequence
problem. Technical Report TR-170, Computer Science Laboratory, Prince-
ton University, 1975.
[ 185] Robert E. Tarjan. Depth first search and linear graph algorithms. SIAM
Journal on Computing, l (2): 146-160, 1972.
( 186] Robert E. Tarjan. Effieien cy of a good but not linear set union algorithm.
Journal of the ACM, 22(2):215-225, 1975.
[187) Robert E. Tarjan. A class of algorithms which require nonlinear time to
maintain disjoint sets. Journal ofComputer and System Sciences, 18(2):
110-127, 1979.
[ 188] Robert E. Tarjan. Data Structures and Network Algorithms. Society for
Industrial and Applied Mathematics, 1983.
{189] Robert E. Tarjan. Amortized computational complexity. SIAM Journal on
Algebraicand DiscreteMethods, 6(2):306-3 I 8, I 985.
[190) Robert E. Tarjan and Jan van Leeuwen. Wont-case analysis of set union
algorithms. Journal of the ACM, 31(2):245-281, 1984.
(191] Robert E. Tarjan and Uzi Vishkin. An efficient parallel biconnectivity
algorithm. SIAM Journal on Computing, 14(4):862-874, 1985.
[192] George B. Thomas, Jr., and Ross L. Finney. Calcu/us and Analytic Geom-
etry. Addison.Wesley, seventh edition, 1988.
[193] Leslie G. Valiant. Parallelism in comparison problems. SIAM Journal on
Computing, 4(3):348-355, 1975.
(194) P. van Emde Boas. Preserving order in a forest in less than logarithmic
time. In Proceedingsof the I6th Annual Symposium on Foundations of
Computer Science, pages 75-84. IEEE Computer Society, 1975.
[195] Uzi Vishkin. lmplementation of simultaneous memory address access in
models that forbid it. Journal of Algorithms, 4( l ):45-50, 1983.
[196] Jean Vuillemin. A data structure for manipulating priority queues. Com-
munications of the ACM, 21(4):309-315, 1978.
[197] C. S. Wallace. A suggestion for a fast multiplier. IEEE Transactions on
Electronic Computers, EC.13( 1}:14-17, 1964.
[ 198) Stephen Wanhalt A theorem on boolean matrices. Journal of the ACM,
9(1):11-12, 1962.
[199] A. Weinberger and J. L. Smith. A one·microsecond adder using one·
megacycle circuitry. !RE Transactions on Electronic Computers, EC·5(2),
1956.
(200] Hassler Whitney. On the abstract properties of linear dependenc~. Ameri-
can Journal of Mathematics, 57:509-533, 1935.
(201] Herbert S. Wilf. Algorithms and Complexity. Prentice·Hall, 1986.
[202] J. W. J. Williams. Algorithm 232 (heapsort). Communications of the ACM,
7:347-348, I 964.
[203] S. Winograd. On the a1gebraic complexity of functions. In Actes du
Congri!sInternational des Mathematiciens, volume 3, pages 283-288, 1970.
[204] James C. Wyllie. The Complexity of Parallel Computations. PhD thesis,
Department of Computer Science, Cornell Univenity, I 979.
[205] Andrew C.-C. Yao. A !ower bound to finding convex hulls. Journal of the
ACM, 28(4):780-787, 1981.
Skorowidz
1107
SKOROWIDZ
B
B-drzewo 437 D
-, rozbijanie węzła 442 dag 116
-, tworzenie pustego 441 -, najkrótsza ścieżka 603
-, usuwanie klucza 447 dane wejściowe 21
-, wstawianie klucza 443 - wyjściowe 21
-, wyszukiwanie 440 DFf 876,882
bijekcja 112 diagram Venna 105
bit przeniesienia 740 digraf 113
- sumy 740 długość ścieżki wewnętrmej 123
błąd niedomiaru 237 - - zewnętrznej 124
- przepełnienia 237 DNF 1051
- przybliżenia 862 dodatni przepływ netto 652
- względny 1074 domknięcie przechodnie grafu 631
bracia węzła w drzewie 121 dopełnienie grafu 1058
bramka logicma 734 - zbioru 105
- -AND 734 - zdarzenia 133
- -, głębokość 738 drzewa 249, 250
- - NAND 734 - dwumianowe 456
- - NOR 734 - dynamiczne 431
- - NOT 734 - Sleatora-Tarjana 432
--OR734 - zrównoważone, zamortyzowane 426
- -, stopień wejściowy 737 drzewo a-zrównoważone 426
- - XOR 734 - binarne 121, 250
- -, regularne 122
- BST 285
C - -, losowo skonstruowane 295
certyfikat 937 - -, usuwanie węzła 292
chińskie twierdzenie o resztach 923 - -, wstawianie węzła 291
ciało 837 - czerwono-czarne 305
ciąg bitoniczny 721 - -, usuwanie węzła 315
- nieskończony 111 - -, wstawianie węzła 310
- skończony 111 - -, wzbogacanie 332
CNF 1050 - -, złączanie 322
CRCW PRAM, dowolny 772 - -, zrównoważone 305
- -, jednolity 772 - decyzyjne 207
- -, mieszany 772 - dwumianowe, nieuporządkowane 479
- -, priorytetowy 772 - najkrótszych ścieżek 582
1108
SKOROWIDZ
1109
SKOROWIDZ
111 O
SKOROWIDZ
1111
SKOROWIDZ
1112
SKOROWIDZ
minor 822 o
mnożenie macierzy 348
obliczanie prefiksów 742
moc zbioru 106 - rozkładu LUP 849
moneta symetryczna 134 obliczenia prefiksowe 778
monoid 834 - -, odcinkowe 810
most 560 - -, równolegle 778
multigraf 116 - -, -, rekurencyjne 798
obraz 111
N odchylenie standardowe 143
odcinek 991
najkrótsza ścieżka 533, 578 - skierowany 991
- - w dagu 603 odległość L ....1018
najkrótsze ścieżki, metoda zmieniają - redakcyjna (edycyjna) 372
cych się wag 634 odśmiccacz 247
- -, wielokrotne podnoszenie do kwad- odwrotność funkcji 112
ratu 625 - multiplikatywna 921
najmniejsza wspólna wielokrotność 911 ogon kolejki 238, 240
największy wspólny dzielnik 901 ograniczenia różnicowe 607
następnik lewy 121 ogranicz.enie błędu względnego 1074
- prawy 121 - prostokątne 994
- Wyzła w drzewie 121 - względne 1073
ojciec węzła w drzewie 121
nawiasowanie 347, 367
operacja motylkowa 888
niejawna notacja sumowania 655
operacje modyfikujące 233
nierówność Boole'a 138
- na drzewach rozłącznych 499
- Krafta 124
oszacowanie asymptotycmie dokładne
- Markowa 143
45
- trójkąta I 078 - wagi najkrótszej ścieżki 585
niezależny zbiór wierzchołków 805
otoczka wypukła 1003
notacja asymptotycma 45 owijanie 1011
- O 47
-
- O 62 p
- O' 62
- o 51 para uporządkowana 107
..- 0 45 paradoks dnia urodzin 157
-
- 0 62 permutacja 112, 127
- O 49 - Józefa 340
-
- O 62
- odwracająca bity 424
•
- O 62
pętla w grafie 113
pierścień 835
- w 52 pierwiastek pierwotny 927
NP-zupełność 1046 - z jedności, główny 879
numerycma niestabilność 840 - -, zespolony 879
NWD901 podciąg 361
n-zbiór 106 poddrzewo 121
1113
SKOROWIDZ
1114
SKOROWIDZ
1115
SKOROWIDZ
1116
SKOROWIDZ
1117
SKOROWIDZ
W PRZYGOTOWANIU
• Knuth D.E.: Sztuka programowania
T, 1-Algorytmy podstawowe
T. 2 -Algorytmy seminumeryczne
T. 3 - Sortowanie i wyszukiwanie
Ukaże się w czwartym kwartale 2001 roku
dam podpiszamawiaJące{Jo
Zamawiający:
..... ,,.................
, ..............
..
dam podpis
Wprowadzenie
do algorytmow