Analiza Algorytmow
Transkrypt
Analiza Algorytmow
Instytut Informatyki Politechnika lska Analiza Algorytmw Opracowal: Zbigniew Czech materiay dydaktyczne Gliwice, luty 1997 Spis tresci 1 Dowodzenie poprawnoci algorytmw 1.1 1.2 1.3 1.4 Aksjomaty arytmetyki liczb : : : : : Prawa rachunku zda : : : : : : : : : Reguy dowodzenia (wnioskowania) : Dowodzenie skoczonoci algorytmw : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 2 Zoono obliczeniowa algorytmw 2.1 2.2 2.3 2.4 2.5 2.6 Obliczanie wartoci wielomianu : : : : : : : : : : : : : : : : : : : Mnoenie liczb cakowitych : : : : : : : : : : : : : : : : : : : : : : Znajdowanie maksymalnego (minimalnego) elementu : : : : : : : Jednoczesne znajdowanie maksymalnego i minimalnego elementu : Mnoenie dwch n-bitowych liczb dwjkowych : : : : : : : : : : : Sortowanie przez czenie : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 4 5 5 6 9 9 9 10 11 11 12 13 3 Kopce i kolejki priorytetowe 13 4 Wyszukiwanie 17 3.1 Procedury operujce na kopcu : : : : : : : : : : : : : : : : : : : : : : 3.2 Operacje na kolejkach priorytetowych : : : : : : : : : : : : : : : : : : 3.3 Sortowanie przez kopcowanie : : : : : : : : : : : : : : : : : : : : : : : 4.1 Wyszukiwanie liniowe (proste) : : : : : : : : : : : : : : : : : : : : : : 4.2 Wyszukiwanie liniowe z zastosowaniem wartownika : : : : : : : : : : 4.3 Algorytm wyszukiwania liniowego realizowanego w tablicy rekordw uporzdkowanych rosnco wedug kluczy : : : : : : : : : : : : : : : : 4.4 Wyszukiwanie binarne (logarytmiczne) : : : : : : : : : : : : : : : : : 4.5 Drzewa poszukiwa binarnych : : : : : : : : : : : : : : : : : : : : : 4.6 Wyszukiwanie mieszajce : : : : : : : : : : : : : : : : : : : : : : : : 4.6.1 Mieszanie otwarte : : : : : : : : : : : : : : : : : : : : : : : : : 4.6.2 Mieszanie zamknite : : : : : : : : : : : : : : : : : : : : : : : 4.7 Minimalne, doskonae funkcje mieszajce : : : : : : : : : : : : : : : : 5 Operacje na tekstach 5.1 5.2 5.3 5.4 Wyszukiwanie naiwne" : : : : : : : : : : : Algorytm Knutha, Morrisa i Pratta (KMP) : Wyszukiwanie niezgodnociowe : : : : : : : Algorytm Boyera i Moora (BM) : : : : : : : : : : : : : : : Sortowanie przez proste wstawianie : : : : : : : : : : : : : : : : : : Algorytm Shella, czyli sortowanie za pomoc malejcych przyrostw Sortowanie przez proste wybieranie : : : : : : : : : : : : : : : : : : Sortowanie przez prosta zamian : : : : : : : : : : : : : : : : : : : Sortowanie szybkie { algorytm Quicksort : : : : : : : : : : : : : : : Inna wersja algorytmu Quicksort : : : : : : : : : : : : : : : : : : : : : : : : : 6 Sortowanie 6.1 6.2 6.3 6.4 6.5 6.6 2 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 13 15 15 17 17 18 18 18 23 23 25 27 29 29 30 31 32 33 33 36 37 39 41 44 6.7 Czasy wykonania programw sortowania : : : : : : : : : : : : : : : : 47 7 Selekcja 47 8 Algorytmy sortowania, w ktrych korzysta si ze szczeglnych wasnoci kluczy 48 8.1 Sortowanie kubekowe : : : : : : : : : : : : : : : : : : : : : : : : : : 8.2 Sortowanie pozycyjne : : : : : : : : : : : : : : : : : : : : : : : : : : : 49 50 9 Sortowanie plikw sekwencyjnych 52 10 Algorytmy zachanne (aroczne) 59 9.1 czenie proste : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 9.2 czenie naturalne : : : : : : : : : : : : : : : : : : : : : : : : : : : : 10.1 Kolorowanie zachanne : : : : : : : : : : : : : : : : : : : : : : : : : : 10.2 Problem komiwojaera : : : : : : : : : : : : : : : : : : : : : : : : : : 10.3 Znajdowanie najtaszych drg | Algorytm Dijkstry : : : : : : : : : 11 Algorytmy grafowe 11.1 11.2 11.3 11.4 11.5 Przeszukiwanie grafu w gb : : : : : : : : : : : : : : Przeszukiwanie grafu wszerz : : : : : : : : : : : : : : Wyznaczanie cykli podstawowych (fundamentalnych) Minimalne drzewa rozpinajce : : : : : : : : : : : : : Wyznaczanie cykli Eulera : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 52 56 59 59 60 60 60 62 64 65 66 12 Wyszukiwanie wyczerpujace. Algorytm z powrotami 13 Przeszukiwanie heurystyczne 67 67 14 Generowanie permutacji 15 Literatura 16 Pytania 17 Podzikowania 69 71 72 76 13.1 Przeszukiwanie wszerz : : : : : : : : : : : : : : : : : : : : : : : : : : 67 13.2 Przeszukiwanie w gb z iteracyjnym pogbianiem : : : : : : : : : : 68 13.3 Przeszukiwanie wedug strategii najlepszy wierzchoek jako pierwszy" 68 3 1 Dowodzenie poprawnoci algorytmw Przed dowodem poprawno ci f(n > 0) and (m > 0)g begin warunek wstpny (asercja wejciowa) iloczyn := 0 N := n repeat iloczyn := iloczyn + m N := N ; 1 until N = 0 end filoczyn = n mg warunek ostateczny (asercja wyjciowa) Po przeprowadzeniu dowodu f(n > 0) and (m > 0)g begin iloczyn := 0 N := n repeat fNiezmiennik: (iloczyn + N m = n m) and (N > 0)g iloczyn := iloczyn + m N := N ; 1 f(iloczyn + N m = n m) and (N 0)g until N = 0 f(iloczyn + N m = n m) and (N = 0)g end filoczyn = n mg Proces obliczeniowy Instrukcje n=5 m=8 iloczyn := 0 iloczyn := iloczyn + m iloczyn := iloczyn + m iloczyn := iloczyn + m iloczyn := iloczyn + m iloczyn := iloczyn + m N := n N := N ; 1 N := N ; 1 N := N ; 1 N := N ; 1 N := N ; 1 Wyniki oblicze Niezmiennik ptli iloczyn = 0 N = 5 m = 8 iloczyn = 8 N = 4 m = 8 iloczyn = 16 N = 3 m = 8 iloczyn = 24 N = 2 m = 8 iloczyn = 32 N = 1 m = 8 iloczyn = 40 N = 0 m = 8 ( 0 + 5 8 = 40) and (N > 0) ( 8 + 4 8 = 40) and (N > 0) (16 + 3 8 = 40) and (N > 0) (24 + 2 8 = 40) and (N > 0) (32 + 1 8 = 40) and (N > 0) (40 + 0 8 = 40) and (N = 0) 4 Procedura assert oraz przykad jej uycia procedure assert(b: Boolean t: string) if not b then write(t) assert((n > 0) and (m > 0), \not 1") begin iloczyn := 0 N := n repeat assert((iloczyn + N m = n m) and (N > 0), \not 2") iloczyn := iloczyn + m N := N ; 1 assert((iloczyn + N m = n m) and (N 0), \not 3") until N = 0 assert((iloczyn + N m = n m) and (N = 0), \not 4") end assert(iloczyn = n m, \not 5") 1.1 Aksjomaty arytmetyki liczb Przemienno dodawania i mnoenia x+y =y+x xy =yx czno dodawania i mnoenia (x + y) + z = x + (y + z) (x y ) z = x (y z ) Rozdzielno dodawania i odejmowania wzgldem mnoenia x (y + z) = x y + x z x (y ; z) = x y ; x z Inne x+0=x x0=0 x1=x 1.2 Prawa rachunku zda e1, e2, e3 | zdania 1. Prawa przemiennoci (e1 ^ e2) (e2 ^ e1) (e1 _ e2) (e2 _ e1) (e1 e2) (e2 e1) 5 2. Prawa acznoci e1 ^ (e2 ^ e3) (e1 ^ e2) ^ e3 e1 _ (e2 _ e3) (e1 _ e2) _ e3 3. Prawa rozdzielnoci e1 _ (e2 ^ e3) (e1 _ e2) ^ (e1 _ e3) e1 ^ (e2 _ e3) (e1 ^ e2) _ (e1 ^ e3) 4. Prawa De Morgana :(e1 ^ e2) :e1 _ :e2 :(e1 _ e2) :e1 ^ :e2 5. Prawo podwjnego przeczenia :(:e1) e1 6. Prawo wyl czonego rodka e1 _ :e1 true 7. Prawo zaprzeczenia e1 ^ :e1 false 8. Prawo implikacji e1 ) e2 :e1 _ e2 9. Prawo rwnowanoci (e1 e2) (e1 ) e2) ^ (e2 ) e1) 10. Prawa upraszczania alternatywy e1 _ e1 e1 e1 _ true true e1 _ false e1 e1 _ (e1 ^ e2) e1 11. Prawa upraszczania koniunkcji e1 ^ e1 e1 e1 ^ true e1 e1 ^ false false e1 ^ (e1 _ e2) e1 12. Prawo identycznoci e1 e1 1.3 Reguy dowodzenia (wnioskowania) F1 . . . Fn G 6 F1 ::: Fn oraz G sa predykatami (asercjami). Znaczenie: Jeli F1 . . . Fn s prawdziwe (zaoenia), to mona udowodni!, e G jest prawdziwe (teza). Instrukcja przypisania Instrukcja zloona fA(x E )g x := E fAg fAg P1 fB g fB g P2 fC g fAg begin P1 P2 end fC g Uoglniona regua dowodzenia dla instrukcji zloonej fAi;1g Pi fAig dla i = 1 . . . n fA0g begin P1 P2 . . . Pn end fAng Reguy dowodzenia wane dla kadej instrukcji g B ) C 1: fAg PfAfB g P fC g fB g P fC g 2: A ) fB Ag P fC g Jednoczesny zapis obu regul A ) B fB g P fC g C ) D fAg P fDg Instrukcja alternatywy fA ^ B g P 1 fC g fA ^ : B g P 2 fC g fAg if B then P 1 else P 2 end if fC g Instrukcja warunkowa fA ^ B g P fC g fA ^ : B ) C g fAg if B then P end if fC g Instrukcja iteracji \dopki" fA ^ B g P fAg fAg while B do P end while fA ^ : B g Instrukcja iteracji \powtarzaj" fAg P fC g fC ^ : B ) Ag fAg repeat P until B fC ^ B g Instrukcje iteracji \dla" 1. for x := a to b do S end for 7 o znaczeniu if a b then x := x1 S x := x2 S ::: x := xn S end if gdzie x1 = a, xn = b oraz xi = succ(xi;1) dla i = 2,. . . , n. 2. for x := b downto a do S end for o znaczeniu if b a then x := x1 S x := x2 S ::: x := xn S end if gdzie x1 = b, xn = a oraz xi = pred(xi;1) dla i = 2, . . . , n. Reguy dowodzenia f(a x b) ^ P ("a :: x))g S fP ("a :: x])g fP (" ])g for x := a to b do S end for fP ("a :: b])g f(a x b) ^ P ((x :: b])g S fP ("x :: b])g fP (" ])g for x := b downto a do S end for fP ("a :: b])g Przykad fAlgorytm dzielenia cakowitego: q = x div y.g f(x 0) and (y > 0)g begin q := 0 r := x while r y do f(x = q y + r) and (r 0) and (r y)g r := r ; y q := 1 + q end while end f(x = q y + r) and (0 r < y)g 8 1.4 Dowodzenie skoczono ci algorytmw Przykad 1 f(n > 0) and (m > 0)g begin iloczyn := 0 N := n repeat f0 < N = N0g iloczyn := iloczyn + m N := N ; 1 f0 N < N0g until N = 0 end Przykad 2 f(x 0) and (y > 0)g begin q := 0 r := x while r y do fr > 0g r := r ; y fr zmniejsza si pozostajc nieujemne bo r yg q := 1 + q fr 0g end while end 2 Zoono obliczeniowa algorytmw 2.1 Obliczanie warto ci wielomianu W (x) = an xn + an;1xn;1 + ::: + a2x2 + a1x + a0 Algorytm 1: Bezporedni (na podstawie wzoru) begin W := a"0] for i := 1 to n do p := x for j := 1 to i ; 1 do p := p x fPotgowanie zastpione mnoeniami.g end for 9 W := a"i] p + W end for end Algorytm 2: Hornera begin W (x) = (anxn;1 + an;1xn;2 + . . . + a2x + a1)x + a0 = = ((anxn;2 + an;1xn;3 + . . . + a2)x + a1)x + a0 = ... = ((. . .(anx + an;1)x + an;2)x + . . . + a2)x + a1)x + a0 W := a"n] for i := n ; 1 downto 0 do W := W x + a"i] end for end 2.2 Mnoenie liczb cakowitych Zadanie: Naley wymnoy! dwie liczby cakowite dodatnie: n m, n m Algorytm 1 begin iloczyn := 0 N := n repeat iloczyn := iloczyn + m N := N ; 1 until N = 0 end Algorytm 2 begin iloczyn := 0 N := n s := m while N > 0 do if odd (N ) then iloczyn := iloczyn + s end if N := N div 2 s := 2 s end while end 10 2.3 Znajdowanie maksymalnego (minimalnego) elementu Algorytm 1 begin Max := A"1] i := 1 while i < n do i := i + 1 if A"i] > Max then Max := A"i] end if end while end Algorytm 2 (z wartownikiem) begin i := 1 while i n do Max := A"i] A"n + 1] := Max fUstawienie wartownika.g i := i + 1 while A"i] < Max do i := i + 1 end while end while end 2.4 Jednoczesne znajdowanie maksymalnego i minimalnego elementu Zadanie: Naley znale$! jednoczenie maksymalny i minimalny element w n-elementowym zbiorze S Algorytm 1: Szukanie elementu maksymalnego i minimalnego oddzielnie begin Max := dowolny element zbioru S for pozostaych elementw x ze zbioru S do if x > Max then Max := x end if end for end 11 W podobny sposb mona znale$! element minimalny. Algorytm 2: Metoda dziel i zwyciaj" (ang. divide and conquer) Ograniczenie: Liczba elementw zbioru S winna by! potg liczby 2, tj. n = 2k dla pewnego k. procedure MaxMin (S ) begin if #S = 2 then Niech S = fa bg fa | element maksymalny b | element minimalny.g return(MAX (a b) MIN (a b)) else Podzieli! S na dwa rwne podzbiory S 1 i S 2 (max1 min1) := MaxMin (S 1) (max2 min2) := MaxMin (S 2) return(MAX (max1 max2) MIN (min1 min2)) end if end 2.5 Mnoenie dwch n-bitowych liczb dwjkowych function mult(x y n: integer): integer fx oraz y s liczbami cakowitymi ze znakiem (x y 2n ). n jest poteg liczby 2. Wartosci funkcji jest x y.g s: integer fs przechowuje znak x y.g m1, m2, m3: integer fWartoci iloczynw czeciowych.g a, b, c, d: integer fLewe i prawe powki x i y.g begin s :=sign(x) sign(y) x :=abs(x) y :=abs(y) fUczynienie x i y dodatnimi.g if n = 1 then if (x = 1) and (y = 1) then return(1) else return(0) end if else a := bardziej znaczce n2 bitw x b := mniej znaczce n2 bitw x c := bardziej znaczce n2 bitw y d := mniej znaczce n2 bitw y m1 := mult (a c n2 ) 12 m2 := mult (a ; b d ; c n2 ) m3 := mult (b d n2 ) return(s (m1 2n + (m1 + m2 + m3) 2 n2 + m3)) end if end fmultg 2.6 Sortowanie przez czenie procedure SORT (i j : integer ) begin if i = j then return(xi) else m := (i + j ; 1) = 2 return(CZENIE (SORT (i m) SORT (m + 1 j ))) end if end 3 Kopce i kolejki priorytetowe 3.1 Procedury operujce na kopcu procedure przemie w gr (p: integer) fElement A"p] przemieszczany jest w gr kopca. Warunek wstpny: kopiec(1 p ; 1) i p > 0. Warunek ostateczny: kopiec(1 p).g var d r: integer fd | dziecko, r | rodzicg begin d := p loop fNiezmiennik: kopiec (1 p) z wyjtkiem by! moe relacji pomidzy A"d] i jego rodzicem. 1 d p.g if d = 1 then break end if r := d div 2 if A"r] A"d] then break end if zamiana(A"r] A"d]) d := r end loop end fprzemie w greg Procedura przemie w gr z uyciem wartownika 13 procedure przemie w gr(p: integer) var d: integer x: ... fTyp zgodny z typem A.g begin x := A"p] A"0] := x fUstawienie wartownika.g d := p loop r := d div 2 if A"r] x then break end if A"d] := A"r] d := r end loop A"d] := x end fprzemie w grg procedure przemie w d(p: integer) fElement A"1] przemieszczany jest w d kopca. Warunek wstpny: kopiec (2 p) i p 0. Warunek ostateczny: kopiec (1 p).g var d r: integer begin r := 1 loop fNiezmiennik: kopiec (1 p) z wyjtkiem by! moe relacji pomidzy A"r] i jego dzie!mi. 1 r p.g d := 2 r if d > p then break end if fd jest dzieckiem lewym rg if (d + 1 p) cand (A"d + 1] < A"d]) then d := d + 1 end if fd jest najmniejszym dzieckiem rg if A"r] A"d] then break end if zamiana(A"r] A"d]) r := d end loop end fprzemie w dg 14 3.2 Operacje na kolejkach priorytetowych 1. Uczynienie kolejki pust n := 0 2. Operacja wstaw procedure wstaw(t) begin if n n max then bd else n := n + 1 A"n] := t fkopiec (1 n ; 1)g przemie w gr(n) fkopiec (1 n)g end if end fwstawg 3. Operacja usu min procedure usu min(t) begin if n < 1 then bd else t := A"1] A"1] := A"n] n := n ; 1 fkopiec (2 n)g przemie w d(n) fkopiec(1 n)g end if end fusu ming 3.3 Sortowanie przez kopcowanie type typ rekordowy = record klucz: typ klucza fTyp skalarny.g fPozostae skadowe rekordu.g end var A: array"1 :: n] of typ rekordowy fSortowana tablica.g 15 Zmodykowana procedura przemie w d procedure przemie w d(l p: integer ) fElement A"l] przemieszczany jest w d kopca. Warunek wstpny: kopiec (l + 1 p) i l p. Warunek ostateczny: kopiec(l p).g var d r: integer t: typ rekordowy begin r := l t := A"r] loop fNiezmiennik: kopiec(l p) z wyjtkiem by! moe relacji pomidzy r i jego dzie!mi. l r p.g d := 2 r if d > p then break end if fd jest dzieckiem lewym r.g if (d < p) cand (A"d + 1]:klucz > A"d]:klucz) then d := d + 1 end if fd jest najwikszym dzieckiem r.g if t:klucz A"d]:klucz then break end if A"r] := A"d] r := d end loop A"r] := t end fprzemie w dg procedure sortowanie przez kopcowanie fSortowana jest tablica A"1 :: n].g var i: integer begin fFaza 1: Budowanie kopca.g for i := n div 2 downto 1 do fNiezmiennik: kopiec (i + 1 n).g przemie w d (i n) fkopiec(i n).g end for fkopiec (1 n).g fFaza 2: Waciwe sortowanie.g for i := n downto 2 do fNiezmiennik: kopiec (1 i) i posortowane(i + 1 n) 16 i A"1 :: i]:klucz A"i + 1 :: n]:klucz.g zamiana(A"1] A"i]) fkopiec (2 i ; 1) i posortowane(i n) i A"1 :: i ; 1]:klucz A"i :: n]:klucz.g przemie w d (1 i ; 1) fkopiec(1 i ; 1) i posortowane(i n) i A"1 :: i ; 1]:klucz A"i :: n]:klucz.g end for fposortowane(1 n)g end fsortowanie przez kopcowanieg & 4 Wyszukiwanie 4.1 Wyszukiwanie liniowe (proste) procedure wyszukiwanie liniowe 1(x: typ klucza var jest: Boolean var i: 1 :: n + 1) begin i := 1 while (i n) cand (A"i]:klucz <> x) do i := i + 1 end while jest := i <> (n + 1) end 4.2 Wyszukiwanie liniowe z zastosowaniem wartownika procedure wyszukiwanie liniowe 2(x: typ klucza var jest: Boolean var i: 1 :: n + 1) begin A"n + 1]:klucz := x fWartownik.g i := 1 while A"i]:klucz <> x do i := i + 1 end while jest := i <> (n + 1) end 17 4.3 Algorytm wyszukiwania liniowego realizowanego w tablicy rekordw uporzdkowanych rosnco wedug kluczy procedure wyszukiwanie liniowe 3(x: typ klucza var jest: Boolean var i: 1 :: n + 1) begin i := 1 A"n + 1]:klucz := 1 f1 > xg while A"i]:klucz < x do i := i + 1 end while jest := A"i]:klucz = x end 4.4 Wyszukiwanie binarne (logarytmiczne) procedure wyszukiwanie binarne(x: typ klucza var jest: Boolean var m: 1 :: n) var lewy prawy: 0 :: n + 1 begin lewy := 1 prawy := n jest := false repeat m := (lewy + prawy) div 2 if A"m]:klucz = x then jest := true else if A"m]:klucz < x then lewy := m + 1 else prawy := m ; 1 end if end if until jest or (lewy > prawy) end fwyszukiwanie binarneg 4.5 Drzewa poszukiwa binarnych type wierzchoek drzewa = record klucz: typ klucza 18 lewy prawy: ^wierzchoek drzewa end odsyacz = ^wierzchoek drzewa procedure szukaj (x: klucz var t: odsyacz) fSzukanie klucza x w drzewie wskazanym przez t.g var v: odsyacz begin v := t while (v =6 nil) cand (v^.klucz =6 x) do if x < v^.klucz then v := v^.lewy else v := v^.prawy end if end while return(v) fjeli v = nil to x nie wystpuje w drzewieg end fszukajg procedure wstaw (x: klucz var t: odsyacz) fWstawianie klucza x do drzewa wskazanego przez t.g var v: odsyacz begin v := t while (v 6= nil) cand (v^.klucz 6= x) do fszukania klucza xg if x < v^.klucz then v := v^.lewy else v := v^.prawy end if end while if v 6= nil then fx jest w drzewieg return else Wstawienie x na koniec cieki end if end fwstawg procedure usu (x: klucz var t: odsyacz) fUsuwanie klucza x z drzewa wskazanego przez t.g var v w: odsyacz begin v := t while (v =6 nil) cand (v^.klucz =6 x) do fszukania klucza xg 19 if x < v^.klucz then v := v^.lewy else v := v^.prawy end if end while if v = nil then fx nie wystpuje w drzewieg return else if (v^:lewy = nil) or (v^:prawy = nil) then fbrak lewego lub prawego poddrzewag Usu wierzchoek v^ z drzewa else w := v^:prawy while w^ nie jest kocem cieki w drzewie do w := w^:lewy fszukanie minimalnego elementu w prawym poddrzewieg end while Wstaw w^:klucz do v^:klucz i usu wierzchoek w^ z drzewa end if end if end usu Analiza wyszukiwania w drzewach binarnych Wyznaczymy redni liczb porwna wymaganych dla wyszukania klucza w drzewie wyszukiwa binarnych. Zakadamy, e: 1. Dane jest n rnych kluczy o wartociach 1 2 ::: n. 2. Klucze pojawiaj si w losowej kolejnoci. 3. Pierwszy klucz (a wic korze tworzonego drzewa) ma warto! i z prawdopodobiestwem 1=n. Wwczas lewe poddrzewo bdzie zawiera! i ; 1 wierzchokw, a prawe poddrzewo n ; i wierzchokw. Oznaczmy: Pi;1 | rednia liczba porwna konieczna do wyszukania dowolnego klucza w lewym poddrzewie. Pn;i | ta sama wielko! dla prawego poddrzewa. Pn(i) | rednia liczba porwna wymagana dla wyszukania klucza w drzewie o n wierzchokach i o korzeniu i. Wobec tego Pn(i) = (Pi;1 + 1)pi;1 + 1 pi + (Pn;i + 1)pn;i 20 gdzie pi;1 , pi i pn;i to prawdopodobiestwa, e bdziemy szuka! odpowiednio klucza w lewym poddrzewie, klucza i-tego, oraz klucza w prawym poddrzewie. Zakadajc, e prawdopodobiestwa szukania poszczeglnych kluczy s rwne, otrzymujemy: pi;1 = i ;n 1 pi = n1 pn;i = n n; i : Wobec tego Pn(i) = (Pi;1 + 1) i ;n 1 + 1 n1 + (Pn;i + 1) n n; i = = n1 "(Pi;1 + 1)(i ; 1) + 1 + (Pn;i + 1)(n ; i)] : Wielko! Pn(i) jest wana tylko dla drzewa o korzeniu i. Naley j uredni!, tj. uwzgldni! przypadek, e dowolny klucz moe wystpi! w korzeniu. Oznaczmy t urednion warto! przez Pn . Wwczas n n X X Pn = n1 Pn(i) = n1 n1 "(Pi;1 + 1)(i ; 1) + 1 + (Pn;i + 1)(n ; i)] i=1 i=1 n X 1 = n2 "Pi;1(i ; 1) + i ; 1 + 1 + Pn;i (n ; i) + n ; i] i=1 n X = 1 + n12 "Pi;1 (i ; 1) + Pn;i (n ; i)] : i=1 Mamy X 1in X a wic 1in Pi;1(i ; 1) = Pn;i (n ; i) = X 0i+1n X 1n;in Pi+1;1 (i + 1 ; 1) = X 0in;1 Pn;n+i (n ; n + i) = Pi i X 0in;1 Pi i nX ;1 2 Pn = 1 + n2 i Pi : i=0 Mnoc obie strony rwnania przez n2 otrzymujemy n2Pn = n2 + 2 To samo rwnanie dla n ; 1 nX ;1 i=0 i Pi : (n ; 1)2Pn;1 = (n ; 1)2 + 2 21 nX ;2 i=0 (1) i Pi : (2) Odejmujc stronami (1) i (2) otrzymujemy n2Pn ; (n ; 1)2Pn;1 = n2 ; (n ; 1)2 + 2(n ; 1)Pn;1 n2Pn = Pn;1 ((n ; 1)2 + 2(n ; 1)) + (n2 ; n2 + 2n ; 1) n2Pn = Pn;1 (n ; 1)(n + 1) + (2n ; 1) (3) Zastosujemy metod czynnika sumacyjnego "11, str. 41] (ang. summation factor method), ktra mwi, e rozwizaniem rwnania rekurencyjnego o postaci anTn = bnTn;1 + cn gdzie ai bi 6= 0 dla i = 1 . . . n, jest n X Tn = a 1s (s1b1T0 + sk ck ) n n k=1 gdzie sn to wanie czynnik sumacyjny o wartoci sn = anb;1 ban;2 . .. .. . b a1 : n n;1 2 Rwnanie (3) ma posta! n2Pn = (n + 1)(n ; 1)Pn;1 + (2n ; 1) a wic an = n2 bn = (n + 1)(n ; 1) cn = 2n ; 1. Wyliczmy warto! sn: 2 2 3)2 . . . 32 22 12 sn = anb;1 ban;2 . .. .. . b a1 = (n + 1)((nn;;1)1) n(n(n;;2)2) ((nn ; ; 1)(n ; 3) . . . 4 2 3 1 n n;1 2 an;1 an;2 . . . a1 = (n ; 1)2 (n ; 2)2 . . . 32 22 12 = (n ; 1)! (n ; 1)! bn . . . b2 = (n + 1)(n ; 1) n(n ; 2) (n ; 1)(n ; 3) (n ; 2)(n ; 4) . . . 5 3 4 2 3 1 Warto! iloczynu bn bn;2 . . . b2 jest (n + 1)!=2, a warto! iloczynu bn;1bn;3 . . . b1 jest (n ; 1)!. Wobec tego otrzymujemy sn = (n(n;+1)!1)! (n ; 1)! = n(n2+ 1) : (n ; 1)! 2 Poniewa P0 = 0, to Pn = s 1a n X n n k=1 sk ck = n 2k ; 1 2 (2k ; 1) = n + 1 X 2 2 n k=1 k(k + 1) : n(n+1) n k=1 k (k + 1) 1 n X Rozkadajc wyraenie k2(kk;+1)1 na uamki proste otrzymujemy 2k ; 1 = 3 ; 1 : k(k + 1) k + 1 k 22 Wobec tego ! ! n n 1 n 1 X n 1 X X X n + 1 1 n + 1 1 Pn = n 3 k + 1 ; k = n 3 n + 1 ; 3 + 3 k ; k = k=1 k=1 k=1 k=1 n 1! X n + 1 3(1 ; n ; 1) n + 1 = n n + 1 + 2 k=1 k = 2 n Hn ; 3: 4.6 Wyszukiwanie mieszajce 4.6.1 Mieszanie otwarte const a = fOdpowiednia staa.g type sowo = array"1 :: 10] of char element listy = record r: sowo nast: ^element listy end typ listowy = ^element listy sownik = array"0 :: a ; 1] of typ listowy Funkcja mieszaj ca function h(x: sowo): 0 :: a ; 1 var i suma: integer begin suma := 0 for i := 1 to 10 do suma := suma + ord(x"i]) end for return(suma mod a) end Procedury operuj ce na sowniku procedure ZERUJ (var A: sownik) var i: integer begin for i := 0 to a ; 1 do A"i] := nil end for end function JEST (x: sowo var A: sownik): Boolean var bie cy: typ listowy begin 23 bie cy := A"h(x)] while bie cy <> nil do if bie cy ^:r = x then return(true) fSowo znaleziono.g else bie cy := bie cy ^:nast end end while return(false) fSowa nie znaleziono.g end procedure WSTAW (x: sowo var A: sownik) var kubeek : 0 :: a ; 1 stara gowa: typ listowy begin if not JEST (x A) then kubeek := h(x) stara gowa := A"kubeek] new(A"kubeek]) A"kubeek]^:r := x A"kubeek]^:nast :=stara gowa end if end procedure USU (x: sowo var A: sownik) var bie cy : typ listowy kubeek : 0 :: a ; 1 begin kubeek := h(x) if A"kubeek] <> nil then if A"kubeek]^:r = x then fSowo x jest w pierwszym elemencie.g A"kubeek] := A"kubeek]^:nast fUsunicie sowa z listy.g else fSowo x, jeli wystpuje, nie jest zawarte w pierwszym elemencie.g bie cy := A"kubeek] fZmienna bie cy wskazuje na poprzedni element.g while bie cy ^:nast <> nil do if bie cy ^:nast^:r = x then fUsunicie sowa z listy.g bie cy ^:nast :=bie cy ^:nast^:nast return fWyjcie z procedury.g else 24 fSowa x jeszcze nie znaleziono.g bie cy := bie cy ^:nast end if end while end if end if end Rozkad kluczy w tablicy i i+1 i+2 i+3 i+4 i+5 i+6 i+7 i+8 i+9 ... j j+1 j+2 j+3 j+4 j+5 j+6 j+7 j+8 j+9 j + 10 j + 11 j + 12 j + 13 j + 14 j + 15 j + 16 j + 17 A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 ... A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A30 A22 A31 A40 A23 A32 A41 A50 A24 A25 A26 A27 A28 A29 A33 A34 A35 A36 A37 A38 A39 A42 A43 A44 A45 A46 A47 A48 A49 A51 A52 A53 A54 A55 A56 A57 A58 A59 A60 A61 A62 A63 A64 A65 A66 A67 A68 A69 4.6.2 Mieszanie zamknite 0 f10 odstpwg const puste = 0 25 A70 A71 A72 A73 A74 A75 A76 A77 A78 A79 A80 A81 A82 A83 A84 A85 A86 A87 A88 A89 A90 A91 A92 A93 A94 A95 A96 A97 A98 A99 usunite = ' ' f10 gwiazdekg type sowo = packed array"1 :: 10] of char sownik = array"0 :: a ; 1] of sowo procedure ZERUJ (var A: sownik) var i: integer begin for i := 0 to a ; 1 do A"i] := puste end for end function szukaj (x: sowo var A: sownik): integer fPrzeszukiwana jest tablica A poczynajc od kubeka h0(x) do momentu, gdy x zostaje znalezione albo zostaje znaleziony kubeek pusty albo te caa tablica zostanie przeszukana. Wartoci funkcji jest numer kubeka, na ktrym szukanie zostaje zakoczone, wskutek jednego z wymienionych wyej powodw.g var pocz i: integer fZmienna pocz przechowuje warto! h0(x) zmienna i zawiera liczb dotychczas przeszukanych kubekw.g begin pocz := h0(x) i := 0 while (i < a) and (A"(pocz + i) mod a] <> x) and (A"(pocz + i) mod a] <> puste) do i := i + 1 end while return((pocz + i) mod a) end function szukaj 1 (x: sowo var A: sownik): integer fDziaanie podobne do funkcji szukaj , z t rnic, e przeszukiwanie tablicy A zostaje take zakoczone po napotkaniu kubeka z wartoci usunite.g function JEST (x: sowo var A: sownik): Boolean begin if A"szukaj (x A)] = x then return(true) else return(false) end if 26 end procedure WSTAW (x: sowo var A: sownik) var kubeek: 0 :: a ; 1 begin if A"szukaj (x A)] = x then return fx jest w tablicy.g end if kubeek := szukaj 1(x A) if (A"kubeek] = puste) or (A"kubeek] = usunite) then A"kubeek] := x else bd('bd w procedurze WSTAW : tablica jest pena') end if end procedure USU (x: sowo var A: sownik) var kubeek : 0 .. a ; 1 begin kubeek := szukaj (x A) if A"kubeek] = x then A"kubeek] := usunite end if end 4.7 Minimalne, doskonae funkcje mieszajce 1. Niech dany bdzie zbir skrtw angielskich nazw miesicy W = fJUN, SEP, DEC, AUG, JAN, FEB, JUL, APR, OCT, MAY, MAR, NOVg Wartoci liczbowe przyporzdkowane poszczeglnym literom: A B C D E F G H I J K L M N O P Q R 4 5 2 0 0 0 3 0 0 0 0 6 0 0 5 1 0 6 S T U V W X Y Z 0 6 0 6 0 0 5 0 Jeeli nazw kadego miesica uwaa! za cig trzech liter x1x2x3, to minimalna, doskonaa funkcja mieszajca ma posta!: hd(x1x2x3) = liczba przyporzdkowana literze x2 + liczba przyporzdkowana literze x3 27 hd(JUN ) = 0 hd(SEP ) = 1 hd (DEC ) = 2 ::: d h (NOV ) = 11 2. Niech dany bdzie zbir sw zastrzeonych jzyka Pascal W = fDO, END, ELSE, CASE, DOWNTO, GOTO, TO, OTHERWISE, TYPE, WHILE, CONST, DIV, AND, SET, OR, OF, MOD, FILE, RECORD, PACKED, NOT, THEN, PROCEDURE, WITH, REPEAT, VAR, IN, ARRAY, IF, NIL, FOR, BEGIN, UNTIL, LABEL, FUNCTION, PROGRAMg, card(W ) = 36. Wartoci liczbowe przyporzdkowane poszczeglnym literom: A B C D E F G H I J K L M N O P Q R 11 15 1 0 0 15 3 15 13 0 0 15 15 13 0 15 0 14 S T U V W X Y Z 6 6 14 10 6 0 13 0 hd(x1x2::: xn) = dugo! sowa n + liczba przyporzdkowana literze x1 + liczba przyporzdkowana literze xn Np.: hd (DO) = 2 + 0 + 0 = 2 hd (PROGRAM) = 7 + 15 + 15 = 37 Wartoci hd dla sw DO..PROGRAM s z zakresu 2..37. Funkcja jest wic doskonaa ale nie minimalna. 3. Minimalna, doskonaa funkcja mieszajca dla sw zastrzeonych jzyka Pascal 6000 sowa: var w : array"1 :: N ] of char fW = fw1 w2 . . . wN gg hd (w) = (h0(w) + g h1(w) + g h2(w)) mod N N = card(W ) h0(w) = dugo!(w) + (* ord (w"i]), i := 1 do dugo!(w) z krokiem 3) h1(w) = (* ord (w"i]), i := 1 do dugo!(w) z krokiem 2) mod 16 h2(w) = ((* ord (w"i]), i := 2 do dugo!(w) z krokiem 2) mod 16) + 16 g | funkcja zadana przy pomocy tablicy 28 Przyjto kod EBCDIC: ord ('A') = 193, ord ('B') = 194, ... , ord ('I') = 201 ord ('J') = 209, ord ('K') = 210, ... , ord ('R') = 217 ord ('S') = 226, ord ('T') = 227, ... , ord ('Z') = 233 Zbir sw zastrzeonych jzyka Pascal 6000 (card(W) = 36): W = f AND, ARRAY, BEGIN, CASE, CONST, DIV, DO, DOWNTO, ELSE, END, FILE, FOR, FUNCTION, GOTO, IF, IN, LABEL, MOD, NIL, NOT, OF, OR, PACKED, PROCEDURE, PROGRAM, RECORD, REPEAT, SEGMENTED, SET, THEN, TO, TYPE, UNTIL, VAR, WHILE, WITH g i 0 1 2 3 4 5 6 7 8 g(i) 0 0 0 31 12 12 15 33 11 i 9 10 11 12 13 14 15 16 17 g(i) 12 16 22 0 16 16 11 0 29 i 18 19 20 21 22 23 24 25 26 hd (NOT) = 0 hd (MOD) = 35 5 Operacje na tekstach tekst: array"1 :: n] of char wzorzec: array"1 :: m] of char fZwykle zachodzi 1 m n.g 5.1 Wyszukiwanie naiwne" function wyszukiwanie naiwne: integer var i j : integer begin i := 1 j := 1 repeat if tekst"i] = wzorzec"j ] then 29 g(i) 0 30 0 24 25 35 15 27 3 i 27 28 29 30 31 g(i) 28 28 3 26 30 i := i + 1 j := j + 1 else i := i ; j + 2 j := 1 end if until (j > m) or (i > n) if j > m then return(i ; m) else return(i) fWzorca nie znaleziono (i = n + 1).g end if end 5.2 Algorytm Knutha, Morrisa i Pratta (KMP) function wyszukiwanie KMP : integer var i j : integer begin i := 1 j := 1 repeat if (j = 0) cor (tekst"i] = wzorzec"j ]) then i := i + 1 j := j + 1 else j := nast"j ] end if until (j > m) or (i > n) if j > m then return(i ; m) else return(i) end if end procedure inicjacja nast var i j : integer begin i := 1 j := 0 nast"1] := 0 repeat if (j = 0) or (wzorzec"i] = wzorzec"j ]) then i := i + 1 30 j := j + 1 nast"i] := j else j := nast"j ] end if until i > m end Algorytm wyszukiwania KMP z wbudowanym wzorcem 10100111 i := 0 0: i := i + 1 1: if tekst"i] <> '1' then 2: if tekst"i] <> '0' then 3: if tekst"i] <> '1' then 4: if tekst"i] <> '0' then 5: if tekst"i] <> '0' then 6: if tekst"i] <> '1' then 7: if tekst"i] <> '1' then 8: if tekst"i] <> '1' then if i > n + 1 then return(n + 1) goto 0 i := i + 1 goto 1 i := i + 1 goto 1 i := i + 1 goto 2 i := i + 1 goto 3 i := i + 1 goto 1 i := i + 1 goto 2 i := i + 1 goto 2 i := i + 1 else return(i ; 8) end if 5.3 Wyszukiwanie niezgodno ciowe type znak = (' ', 'A', 'B', ... , 'Z') var skok1: array"znak] of integer function wyszukiwanie niezgodnociowe: integer var i, j : integer begin i := m j := m repeat if tekst"i] = wzorzec"j ] then i := i ; 1 j := j ; 1 else i := i + skok1"tekst"i]] j := m end if until (j < 1) or (i > n) 31 if j < 1 then return(i + 1) else return(n + 1) end if end procedure inicjacja skok1 var j : znak k: integer begin for j := ' ' to 'Z' do skok1"j ] := m end for for k := 1 to m do skok1"wzorzec"k]] := m ; k end for end Modykacja ptli repeat w algorytmie wyszukiwania niezgodnociowego repeat if tekst"i] = wzorzec"j ] then i := i ; 1 j := j ; 1 else i := i + max(skok1"tekst"i]] skok2"j ]) j := m end if until (j < 1) or (i > n) 5.4 Algorytm Boyera i Moora (BM) procedure wyszukiwanie BM var du y : integer := n + m fOglnie winno zachodzi!: duy n + m.g i, j , k: integer begin fm ng i := m loop repeat i := i + skok1"tekst"i]] until i > n if i du y then 32 return(n + 1) fWzorca nie znaleziono.g end if fZachodzi: tekst"i ; du y] = wzorzec"m].g i := (i ; du y) ; 1 j := m ; 1 loop if j = 0 then return(i + 1) fWzorzec znaleziono.g end if if tekst"i] = wzorzec"j ] then i := i ; 1 j := j ; 1 else break end if end loop k := skok1"tekst"i]] if k = du y then i := i + skok2"j ] else i := i + max(k skok2"j ]) end if end loop end 6 Sortowanie type typ rekordu = record klucz : typ klucza fW zbiorze wartoci typu typ klucza musi by! zde+niowana relacja liniowego porzdku.g end indeks = 0 .. n var A: array"1 .. n ] of typ rekordu fTablica podlegajca sortowaniu.g 6.1 Sortowanie przez proste wstawianie 33 klucze pocztkowe 44 55 12 42 94 18 06 67 i=2 44 55 12 42 94 18 06 67 i=3 12 18 06 67 18 06 67 18 06 67 94 06 67 55 94 67 55 67 ? i=7 ? 44 55 42 94 ? 12 42 44 55 94 ? 12 42 44 55 94 ? 12 18 42 44 55 ? 06 12 18 42 44 i=8 06 i=4 i=5 i=6 12 18 42 44 Abstrakcyjny zapis algorytmu for i := 2 to n do fNiezmiennik: A"1 .. i ; 1] jest posortowane.g x := A"i ] Wstaw x w odpowiednim miejscu w A"1 .. i ; 1] end for procedure proste wstawianie 1 var i, j : indeks x : typ rekordu begin for i := 2 to n do fNiezmiennik: A"1 .. i ; 1] jest posortowane.g x := A"i ] j := i ; 1 while (j > 0) cand (x :klucz < A"j ]:klucz ) do A"j + 1] := A"j ] j := j ; 1 end while A"j + 1] := x end for end procedure proste wstawianie 2 var 34 ? 94 i, j : indeks x : typ rekordu begin for i := 2 to n do fNiezmiennik: A"1 .. i ; 1] jest posortowane.g x := A"i ] A"0] := x fUstawienie wartownika.g j := i ; 1 while x:klucz < A"j ]:klucz do A"j + 1] := A"j ] j := j ; 1 end while A"j + 1] := x end for end Nieco lepsze ustawienie wartownika ... begin fA"0]:klucz := ;1g for i := 2 to n do fNiezmiennik: . . . g ... x := A"i ] j := i ; 1 while . . . procedure powkowe wstawianie var i, j, l, m, p : indeks x : typ rekordu begin for i := 2 to n do fNiezmiennik: A"1 .. i ; 1] jest posortowane.g x := A"i ] l := 1 p := i ; 1 while l p do m := (l + p) div 2 if x:klucz < A"m]:klucz then p := m ; 1 else l := m + 1 end if 35 end while for j := i ; 1 downto l do A"j + 1] := A"j ] end for A"l ] := x end for end 6.2 Algorytm Shella, czyli sortowanie za pomoc malejcych przyrostw type indeks : ;h "1] .. n var A: array";h "1] + 1 .. n ] of typ rekordu procedure sortowanie Shella const t = 4 var m : 1 .. t i, j, k, w : indeks h : array"1 .. t ] of integer fTablica przyrostw.g x : typ rekordu begin h "1] := 40 h "2] := 13 h "3] := 4 h "4] := 1 for m := 1 to 4 do k := h "m ] w := ;k fMiejsce wartownika.g for i := k + 1 to n do x := A"i ] if w = 0 then w := ;k end if w := w + 1 A"w ] := x fUstawienie wartownika.g j := i ; k while x:klucz < A"j ]:klucz do A"j + k] := A"j ] j := j ; k end while A"j + k ] := x end for end for end 36 Prosta wersja sortowania Shella procedure sortowanie Shella 1 var i, j, przyr : integer x : typ rekordu begin przyr := n div 2 while przyr > 0 do for i := przyr + 1 to n do j := i ; przyr while j > 0 do if A"j ]:klucz > A"j + przyr].klucz then zamiana (A"j ], A"j + przyr]) j := j ; przyr else j := 0 fWyjcie z ptli.g end if end while end for przyr := przyr div 2 end while end 6.3 Sortowanie przez proste wybieranie 44 55 12 42 94 18 06 67 06 55 12 42 94 18 44 67 06 12 06 12 18 42 94 55 44 67 06 12 18 42 94 55 44 67 06 12 18 42 44 55 94 67 06 12 18 42 44 55 94 67 06 12 18 42 44 55 67 94 6 6 6 6 55 42 94 18 44 67 6 6 for i := 1 to n ; 1 do fNiezmiennik: A"1 .. i ; 1] jest posortowane.g 37 6 6 6 6 Przypisz zmiennej k indeks rekordu o najmniejszym kluczu spord rekordw A"i .. n ] Wymie A"i ] z A"k ] end for procedure proste wybieranie var i, j, k : indeks x : typ rekordu begin for i := 1 to n ; 1 do fNiezmiennik: A"1 .. i ; 1] jest posortowane.g k := i x := A"i ] for j := i + 1 to n do if A"j ]:klucz < x :klucz then k := j x := A"j ] end if end for A"k ] := A"i ] A"i ] := x end for end procedure sortowanie przez wybieranie 2 var i, j, k, m, M, p, q : 1 .. n min, Max : typ rekordu begin i := 1 j := n while i < j do min := Max := A"j ] fm i M s wska$nikami,g m := M := j fodpowiednio, elementu g k := i fminimalnego i maksymalnego.g repeat if A"k ].klucz A"k + 1].klucz then p := k q := k + 1 else p := k + 1 q := k 38 end if if A"p ]:klucz < min .klucz then min := A"p ] m := p end if if A"q]:klucz > Max :klucz then Max := A"q ] M := q end if k := k + 2 until k j if M = i then A"m ] := A"j ] else A"m ] := A"i ] A"M ] := A"j ] end if A"i ] := min A"j ] := Max i := i + 1 j := j ; 1 end while end for i := n downto 2 do fNiezmiennik: A"i + 1 .. n ] jest posortowane.g Przypisz zmiennej k indeks rekordu o najwikszym kluczu spord rekordw A"1 .. i ] Wymie A"i ] z A"k ] end for 6.4 Sortowanie przez prosta zamian 39 klucze pocztkowe 44 55 12 42 94 numer przejcia k=1 k=2 k=3 k=4 k=5 k=6 k=7 - 06 06 06 06 44 - 12 12 12 55 44 - 18 18 12 55 44 - 42 42 - 18 55 44 18 94 42 42 55 06 18 94 - 67 67 67 67 67 94 94 procedure sortowanie bbelkowe var i , j : indeks t : typ rekordu begin for i := 2 to n do for j := n downto i do if A"j ]:klucz < A"j ; 1]:klucz then t := A"j ] A"j ] := A"j ; 1] A"j ; 1] := t end if end for end for end procedure sortowanie mieszane var j, k, l, p : indeks t : typ rekordu begin l := 2 p := n k := n fPozycja ostatniej zamiany.g repeat 40 06 06 06 12 12 12 18 18 18 42 42 42 44 44 44 55 55 55 67 67 67 94 94 94 for j := p downto l do if A"j ]:klucz < A"j ; 1]:klucz then t := A"j ] A"j ] := A"j ; 1] A"j ; 1] := t k := j end if end for l := k + 1 for j := l to p do if A"j ]:klucz < A"j ; 1]:klucz then t := A"j ] A"j ] := A"j ; 1] A"j ; 1] := t k := j end if end for p := k ; 1 until l > p end 6.5 Sortowanie szybkie { algorytm Quicksort procedure Quicksort (i , j : integer) 1. if A"i ] do A"j ] zawieraj co najmniej dwa rne klucze then 2. 3. 4. 5. 6. Niech v bdzie wikszym z dwch rnych kluczy najbardziej na lewo pooonych w cigu Dokona! permutacji A"i ], . . . , A"j ] tak, e dla pewnego k 2 "i + 1, j ] podcig A"i ], . . . , A"k ; 1] skada si z kluczy mniejszych od v , a podcig A"k ], . . . , A"j ] | z kluczy wikszych lub rwnych v Quicksort (i , k ; 1) Quicksort (k , j ) end if function znajd klucz osiowy (i , j : integer): integer fWartoci funkcji jest indeks wikszego z dwch najbardziej na lewo pooonych, rnych kluczy cigu A"i ], . . ., A"j ], bd$ 0, gdy cig skada si z identycznych kluczy.g var pierwszy : typ klucza k : integer begin pierwszy := A"i].klucz 41 for k := i + 1 to j do if A"k ]:klucz > pierwszy then return(k) else if A"k ]:klucz < pierwszy then return(i ) end if end if end for return(0) fNie znaleziono rnych kluczy.g end function podzia (i , j : integer klucz osiowy : typ klucza): integer fDokonuje si podziau cigu A"i ], . . . , A"j ] tak, e klucze < klucz osiowy znajd si po lewej stronie, a klucze klucz osiowy po prawej stronie cigu. Wartoci funkcji jest pocztek prawej grupy kluczy.g var l, p : integer begin l := i p := j repeat zamiana (A"l ], A"p ]) while A"l ].klucz < klucz osiowy do l := l + 1 end while while A"p ].klucz klucz osiowy do p := p ; 1 end while until l > p return(l ) end procedure Quicksort (i , j : integer) fSortowana jest tablica A"i ], . . ., A"j ].g var klucz osiowy : typ klucza indeks klucza osiowego : integer k : integer fPocztek grupy kluczy klucz osiowy.g begin indeks klucza osiowego := znajd klucz osiowy (i , j ) if indeks klucza osiowego 6= 0 then 42 klucz osiowy := A"indeks klucza osiowego ].klucz k := podzia (i , j, klucz osiowy ) Quicksort (i , k ; 1) Quicksort (k , j ) end if end procedure quicksort procedure sort (l, p : indeks ) var i , j : indeks x, t : typ rekordu begin i := l j := p Wybierz losowo rekord x fnp. x := A"(l + p) div 2]g repeat while A"i ]:klucz < x:klucz do i := i + 1 end while while x :klucz < A"j ]:klucz do j := j ; 1 end while if i j then t := A"i ] A"i ] := A"j ] A"j ] := t i := i + 1 j := j ; 1 end if until i > j if l < j then sort (l, j ) end if if i < p then sort (i , p ) end if end begin sort (1, n ) end 43 procedure Quicksort 1 (i, j : integer) fSortowana jest tablica A"i .. j ].g var klucz osiowy : typ klucza indeks klucza osiowego : integer k : integer fPocztek grupy kluczy klucz osiowy.g x : typ rekordu l, m : integer begin if j ; i + 1 9 then for l := i + 1 to j do fNiezmiennik: A"i .. l ; 1] jest posortowane.g x := A"l ] m := l ; 1 while (m > i ; 1) cand (x:klucz < A"m]:klucz ) do A"m + 1] := A"m ] m := m ; 1 end while A"m + 1] := x end for else indeks klucza osiowego := znajd klucz osiowy (i, j ) if indeks klucza osiowego 6= 0 then klucz osiowy := A"indeks klucza osiowego ].klucz k := podzia (i , j , klucz osiowy) Quicksort 1 (i , k ; 1) Quicksort 1 (k, j ) end if end if end 6.6 Inna wersja algorytmu Quicksort Dana jest nastpujca wersja algorytmu sortowania szybkiego procedure qsort (g, d : indeks ) var i, s : indeks t : typ rekordu begin if d < g then t := A"d] ft.klucz jest kluczem osiowymg s := d for i := d + 1 to g do fNiezmiennik: A"d + 1 :: s] < t A"s + 1 :: i ; 1] g 44 if A"i]:klucz < t:klucz then s := s + 1 Zamie (A"s] A"i]) end if end for Zamie (A"d] A"s]) fNiezmiennik: A"d :: s ; 1] < A"s] A"s + 1 :: g] g qsort (d s ; 1) qsort (s + 1 g) end if end Wyznaczymy zoono! redni tego algorytmu. W tym celu zaoymy, e: 1. Cig kluczy rekordw w tablicy A jest losow permutacj liczb cakowitych 1 . . . n. 2. Wystpienie kadej permutacji jest jednakowo prawdopodobne. 3. Pierwsze wywoanie procedury ma posta! qsort (1 n). 4. Operacj dominujc jest porwnanie kluczy rekordw. Zauwamy, e dla d g wykonuje si 0 porwna. Wobec tego Ts r (0) = Ts r (1) = 0: Porwnania kluczy rekordw wykonywane s g ; d razy, wobec tego przy wywoaniu qsort (1 n) porwna wykonanych bdzie n ; 1. Zamy, e kluczem osiowym zostaje warto! i. Wwczas na lewo od klucza osiowego tra+ i ; 1 rekordw, a na prawo od klucza osiowego n ; i rekordw. Wobec tego wykonamy wwczas n ; 1 + T (i ; 1) + T (n ; i) porwna. Warto! t musimy uredni! po wszystkich wartociach i z przedziau 1::n. Poniewa kada permutacja jest jednakowo prawdopodobna, to prawdopodobiestwo, e kluczem osiowym bdzie warto! i wynosi n1 . Wobec tego n 1 X (n ; 1 + Ts r (i ; 1) + Ts r (n ; i)) = Ts r (n) = i=1 n X X = n ; 1 + n1 Ts r (i ; 1) + n1 Ts r (n ; i) 1in Poniewa X 1in X 1in Ts r (i ; 1) = Ts r (n ; i) = X 1i+1n X 1n;in 1in Ts r (i + 1 ; 1) = X 0in;1 Ts r (n ; (n ; i)) = 45 Ts r (i) X 0in;1 Ts r (i) otrzymujemy nX ;1 Ts r (n) = n ; 1 + n2 Ts r (i): (4) i=0 Mnoc obie strony rwnania (4) przez n otrzymujemy nTs r (n) = n2 ; n + 2 nX ;1 i=0 Ts r (i): (5) Rwnanie (5) dla n ; 1 ma posta! (n ; 1)Ts r (n ; 1) = (n ; 1)2 ; (n ; 1) + 2 nX ;2 i=0 Ts r (i): (6) Odejmujc stronami (5) i (6) otrzymujemy nTs r (n) ; (n ; 1)Ts r (n ; 1) = n2 ; n ; (n ; 1)2 + n ; 1 + 2 nTs r (n) = (n + 1)Ts r (n ; 1) + 2(n ; 1): nX ;1 i=0 Ts r (i) ; 2 nX ;2 i=0 Ts r (n) (7) Do znalezienia rozwizania (6) zastosujemy metod czynnika sumacyjnego "11, str. 41]. Z (7) wynika, i an = n bn = n + 1 cn = 2(n ; 1). Wobec tego n ; 2) 3 2 1 = 2 sn = anb;1ban;2 b a1 = (n(n+;1)1)( n(n ; 1)(n ; 2) 3 (n + 1)n n n;1 2 Poniewa Ts r (0) = 0, otrzymujemy Ts r (n) = = = = = = = n 1 X sncn k=1 sk ck = n 2 2(k ; 1) = 1 X 2 n(n+1) n k=1 k (k + 1) n X 2(n + 1) k(kk;+11) = ! k=1 X n n 1 X 1 2(n + 1) ; k + 2 k + 1 = k=1 =1 kX ! n 1 n 1 X 2 2(n + 1) ; k + 2 k + n + 1 ; 2 = k=1 k=1! X n 1 2n = 2(n + 1) ; k=1 k n + 1 2(n + 1)Hn ; 4n: 2 46 6.7 Czasy wykonania programw sortowania Tabela I. Metoda sortowania Cigi uporzdk. Wstawianie proste 12 Wstawianie powkowe 56 Wybieranie proste 489 Sortowanie bbelkowe 540 Sortowanie bbelkowe ze znacznikiem 5 Sortowanie mieszane 5 Sortowanie metod Shella 58 Sortowanie stogowe 116 Sortowanie szybkie 31 Sortowanie przez czenie 99 Tabela II. 23 125 1907 2165 8 9 116 253 69 234 Cigi odwrot. Cigi uporzdk. losowe 366 1444 704 2836 373 1327 662 2490 509 1956 695 2675 1026 4054 1492 5931 1104 4270 1645 6542 961 3642 1619 6520 127 349 157 492 110 241 104 226 60 146 37 79 102 242 99 232 (klucze wraz ze zwizanymi z nimi danymi) Metoda sortowania Cigi uporzdk. Wstawianie proste 12 Wstawianie powkowe 46 Wybieranie proste 489 Sortowanie bbelkowe 540 Sortowanie bbelkowe ze znacznikiem 5 Sortowanie mieszane 5 Sortowanie metod Shella 58 Sortowanie stogowe 116 Sortowanie szybkie 31 Sortowanie przez czenie 99 46 76 547 610 5 5 186 264 55 196 Cigi odwrot. Cigi uporzdk. losowe 366 1129 704 2150 373 1105 662 2070 509 607 695 1430 1026 3212 1492 5599 1104 3237 1645 5762 961 3071 1619 5757 127 373 157 435 110 246 104 227 60 137 37 75 102 195 99 187 7 Selekcja A: array"1 .. n] of typ klucza function selekcja (i, j, k : integer): typ klucza fZnajdowany jest k -ty najmniejszy klucz w tablicy A"i .. j ].g var klucz osiowy : typ klucza 47 indeks klucza osiowego : integer m : integer fPocztek grupy kluczy klucz osiowy.g begin indeks klucza osiowego := znajd klucz osiowy (i, j ) if indeks klucza osiowego 6= 0 then klucz osiowy := A"indeks klucza osiowego ] m := podzia (i, j, klucz osiowy ) if k m ; i then return(selekcja (i , m ; 1, k )) else return(selekcja (m, j, k ; m + i)) end if else return(A"i ]) end if end 8 Algorytmy sortowania, w ktrych korzysta si ze szczeglnych wasnoci kluczy type typ rekordu = record klucz : 1 .. n ... end var A, B : array"1 .. n] of typ rekordu Algorytm 1 for i := 1 to n do B "A"i ].klucz ] := A"i ] end for Algorytm 2 for i := 1 to n do while A"i]:klucz 6= i do zamiana (A"i ], A"A"i ].klucz ]) end while end for 48 8.1 Sortowanie kubekowe type typ klucza = 1 .. m flub znakowy oglnie typ dyskretny, w zbiorze wartoci ktrego istnieje relacja porzdkug typ rekordu = record klucz : typ klucza ... end element listy = record r : typ rekordu nast : ^element listy end typ listowy = ^element listy var A: array"1 .. n ] of typ rekordu fTablica rekordw do sortowania.g B : array"typ klucza ] of typ listowy fTablica kubekw. W kubeku rekordy sa poczone w list.g C : array"typ klucza ] of typ listowy fTablica odsyaczy do kocw list w kubekach.g procedure sortowanie kubekowe var i : integer p, v : typ klucza begin for v := niski klucz to wysoki klucz do B "v ] := nil C "v ] := nil end for for i := 1 to n do WSTAW (A"i], B "A"i].klucz ], C "A"i].klucz ]) end for p := niski klucz while B "p ] = nil do p := succ (p) end while if p =6 wysoki klucz then for v := succ (p) to wysoki klucz do if B "v] =6 nil then POCZ (C "p], B "v], C "v]) end if 49 end for end if end procedure WSTAW (x : typ rekordu var l, m : typ listowy ) var temp : typ listowy begin temp := l new (l ) l^.r := x l^.nast := temp if temp = nil then m := l end if end fWSTAW g procedure POCZ (var lC1 : typ listowy lB2, lC2 : typ listowy ) fParametry s odsyaczami do pocztkw i kocw czonych list.g begin lC1 ^.nast := lB2 lC1 := lC2 end fPOCZ g 8.2 Sortowanie pozycyjne procedure sortowanie pozycyjne fSortowana jest lista A o n rekordach, kt,orych klucze skadaj si z p,ol f1, f2, . . . , fk o typach odpowiednio t1, t2, . . . , tk .g begin for i := k downto 1 do for kadej warto,sci v typu ti do Bi"v] := nil fOpr,onianie kubek,ow.g end for for kadego rekordu r na li,scie A do przesu,n r z A na koniec listy kubeka Bi "v], gdzie v jest warto,sci pola fi klucza rekordu r end for for kadej warto,sci v typu ti, od najmniejszej do najwikszej do docz Bi"v] na koniec listy A 50 end for end for end Praktyczna implementacja algorytmu sortowania pozycyjnego Sortowanie listy rekordw A wedug dat: type typ rekordu = record dzie : 1 .. 31 mies : (sty, ..., gru) rok : 1900 .. 1999 fInne pola rekordu.g end element listy = record r : typ rekordu nast : ^element listy end typ listowy = ^element listy var A: typ listowy procedure sortowanie wg dat fSortowana jest lista A o n rekordach, ktrych klucze s datami.g var p3, v3 : 1900 .. 1999 p2, v2 : (sty , . . . , gru ) p1, v1 : 1 .. 31 B3, C3 : array"1900 .. 1999] of typ listowy B2, C2 : array "(sty, . . . , gru)] of typ listowy B1, C1 : array"1 .. 31] of typ listowy begin fSortowanie rekordw wedug dni.g for v1 := 1 to 31 do B1 "v1 ] := nil C1 "v1 ] := nil end for while A =6 nil do fWstawienie rekordu A^.r na koniec listy kubeka okrelonego przez klucz rekordu.g DOCZ (A^.r, B1 "A^.r.dzie ], C1 "A^.r.dzie ]) A := A^.nast end while 51 p1 := 1 while B1 "p1 ] = nil do p1 := succ (p1) end while if p1 6= 31 then for v1 := succ (p1) to 31 do fPrzyczenie list wszystkich kubekw do koca listy wskazanej przez B1 "p1 ].g if B 1"v1 ] 6= nil then POCZ (C1 "p1], B1 "v1 ], C1 "v1 ]) end if end for end if A := B1 "p1 ] fDokona! podobnie sortowania kubekowego listy A wedug pl A^.r.mies oraz A^.r.rok.g end procedure DOCZ (x : typ rekordu var lB , lC : typ listowy ) var temp : typ listowy begin if lB = nil then new (lC ) lC ^.r := x lC ^.nast := nil lB := lC else temp := lC new (lC ) lC ^.r := x lC ^.nast := nil temp^.nast := lC end if end fDOCZg 9 Sortowanie plikw sekwencyjnych 9.1 czenie proste procedure sortowanie przez czenie proste var i j k l: indeks 52 begin gra : Boolean p : integer fdugo! czonych podcigwg gra := true p := 1 repeat if gra then fInicjowanie indeksw.g i := 1 j := n k := n + 1 l := 2 n else i := n + 1 j := 2 n k := 1 l := n end if \cz p{tki z i{cigu oraz j {cigu do k{cigu oraz l{cigu." gra := not gra p := 2 p until p = n end L czenie p-tek mona zapisa nastpuj co: h := 1 m := n repeat fm okrela liczb rekordw do poczenia.g q := p r := p m := m ; 2 p Pocz q rekordw z i{cigu oraz r rekordw z j {cigu k jest indeksem cigu wynikowego z przyrostem h h := ; h Zamie k z l until m = 0 while (q <> 0) and (r <> 0) do fWybieranie rekordu z i{cigu lub j {cigu.g if A"i]:klucz < A"j ]:klucz then Przemie! rekord z i do k, zwiksz i oraz uaktualnij k q := q ; 1 else Przemie! rekord z j do k, zmniejsz j oraz uaktualnij k r := r ; 1 end if end while 53 Skopiuj koniec i{cigu Skopiuj koniec j {cigu Ci g instrukcji: q := p r := p m := m ; 2 p przyjmuje posta: fq wyznacza dugo! i{cigu, za r | j {cigu.g if m p then q := p else q := m end if m := m ; q if m p then r := p else r := m end if m := m ; r Peny algorytm sortowania procedure sortowanie przez czenie proste var i j k l t: indeks begin h m p q r: integer gra : Boolean gra := true p := 1 repeat if gra then fInicjowanie indeksw.g i := 1 j := n k := n + 1 l := 2 n else i := n + 1 j := 2 n k := 1 l := n end if h := 1 m := n repeat fczenie p-tki z i{cigu oraz j {cigu do k{cigu.g 54 if m p then q := p else q := m end if m := m ; q if m p then r := p else r := m end if m := m ; r while (q <> 0) and (r <> 0) do if A"i]:klucz < A"j ]:klucz then fczenie cigw.g A"k] := A"i] i := i + 1 k := k + h q := q ; 1 else A"k] := A"j ] j := j ; 1 k := k + h r := r ; 1 end if end while fKopiowanie koca i{cigu.g while q <> 0 do A"k] := A"i] i := i + 1 k := k + h q := q ; 1 end while fKopiowanie koca j {cigu.g while r <> 0 do A"k] := A"j ] j := j ; 1 k := k + h r := r ; 1 end while h := ; h fZamiana k z l.g t := k k := l l := t until m = 0 fKoniec fazy (przebiegu).g 55 gra := not gra p := 2 p until p n fKoniec sortowania.g if not gra then for i := 1 to n do A"i] := A"i + n] end for end if end 9.2 czenie naturalne c: Przebieg 1. a: b: = c: Przebieg 2. a: b: = c: Przebieg 3. a: b: = c: 22 22 06 06 06 13 06 06 16 06 36 06 36 ' 26 79 ' 13 22 36 22 36 26 31 13 22 13 22 27 33 13 16 79 26 45 75 13 45 75 ' 27 76 ' 16 31 62 ' 33 ' 47 79 ' 13 26 31 45 79 ' 27 33 76 ' 45 62 75 ' 16 47 26 31 36 45 62 26 31 36 45 62 47 62 76 22 26 27 31 33 31 62 27 76 33 16 62 47 62 ' 62 75 ' 27 33 76 ' 16 47 62 62 75 79 ' 16 27 33 47 62 76 75 79 ' 36 45 47 62 62 75 76 79 type tama = le of typ rekordu var c: tama fPlik do sortowania.g procedure sortowanie przez czenie naturalne var l: integer fOznacza liczb serii w pliku c.g a b: tama begin repeat rewrite (a) fUczynienie plikwg rewrite (b) fa i b pustymi.g reset (c) fPrzygotowanie pliku c do czytania.g rozdzielanie reset (a) reset (b) rewrite (c) l := 0 czenie until l = 1 end procedure rozdzielanie begin repeat fZ c na a i b.g 56 kopiuj seri (c a) if not eof (c) then kopiuj seri (c b) end if until eof (c) end procedure czenie begin repeat fZ a i b na c.g cz serie l := l + 1 until eof (b) if not eof (a) then kopiuj seri (a c) l := l + 1 end if end procedure kopiuj seri (var x y: tama) fKopiowanie jednej serii z pliku x do y. ks jest globaln zmienn boolowsk okrelajc, czy osignito koniec serii.g begin repeat kopiuj (x y ) until ks end procedure kopiuj (var x y: tama) fKopiowanie jednego elementu z pliku x do y.g var buf : typ rekordu begin read (x buf ) write (y buf ) if eof (x) then ks := true else ks := buf.klucz > x^:klucz end if end procedure cz serie fczenie po jednej serii z a i b oraz przesanie serii wynikowej do c.g 57 begin repeat if a^:klucz < b^:klucz then kopiuj (a c) if ks then kopiuj seri (b c) end if else kopiuj (b c) if ks then kopiuj seri (a c) end if end if until ks end Przykad 1 c: a: b: c: 03 02 03 ' 07 02 05 02 03 05 11 07 13 19 ' 29 11 ' 17 23 05 07 11 13 37 31 13 19 17 43 ' 23 31 29 37 43 17 19 23 29 31 37 43 59 23 61 ' 29 07 61 Przykad 2 c: a: b: c: 13 13 17 13 57 17 57 ' 11 19 ' 23 17 19 19 11 59 ' 07 29 ' 23 29 57 Poprawiona procedura czenia procedure czenie fZ a i b na c.g begin repeat cz serie l := l + 1 until eof (a) or eof (b) while not eof (a) do kopiuj seri (a c) l := l + 1 end while while not eof (b) do 58 11 59 kopiuj seri (b c) l := l + 1 end while end 10 Algorytmy zachanne (aroczne) 10.1 Kolorowanie zachanne procedure kolorowanie zachanne (G : graf var nowy kolor : zbir) fProcedura docza do zbioru nowy kolor te wierzchoki grafu, ktrym mona przyporzdkowa! ten sam kolor.g var jest : Boolean v w: integer begin nowy kolor := v := pierwszy niepokolorowany wierzchoek w G while v <> null do jest := false w := pierwszy wierzchoek w zbiorze nowy kolor while w <> null cand not jest do if istnieje krawd$ pomidzy v i w w G then jest := true end if w := nastpny wierzchoek w zbiorze nowy kolor end while if jest = false then Oznacz v jako pokolorowany Docz v do zbioru nowy kolor end if v := nastpny niepokolorowany wierzchoek w G end while end 10.2 Problem komiwojaera procedure komiwoja er (G : graf var droga : cig krawdzi) fWyznacza si drog o minimalnym koszcie w gra+e G.g var i: integer min : real 59 begin min := 1 for i := 1 to (n ; 1)! do p := i{ta permutacja wierzchokw v1 v2 ::: vn;1 fNiech d(p) jest drog w gra+e G odpowiadajc permutacji p jego wierzchokw.g if koszt(d(p)) < min then droga := d(p) min := koszt(d(p)) end if end for end 10.3 Znajdowanie najtaszych drg | Algorytm Dijkstry procedure Dijkstra fObliczane s koszty najtaszych drg z wierzchoka 1 do kadego innego wierzchoka w gra+e zorientowanym.g begin S := f1g for i := 2 to n do D"i] := C "1 i] fInicjalizacja tablicy D.g end for for i := 1 to n ; 1 do Wybra! wierzchoek w ze zbioru V ; S taki, e D"w] jest minimalne Doczy! w do S for kadego wierzchoka v w zbiorze V ; S do D"v] := min(D"v] D"w] + C "w v]) end for end for end 11 Algorytmy grafowe 11.1 Przeszukiwanie grafu w gb procedure wg(v) fPrzeszukiwanie w gb z wierzcholka v.g begin znacznik"v] := odwiedzony for u 2 listy incydencji"v] do 60 if znacznik"u] = nieodwiedzony then fKrawd$ (v w) wstawiana jest do drzewa rozpinajcego.g wg(u) end if end for end begin fPrzeszukiwanie grafu G = (V E ) w gb.g for v 2 V do znacznik"v] := nieodwiedzony end for for v 2 V do if znacznik"v] = nieodwiedzony then wg(v) end if end for end Zastosowanie metody przeszukiwania w g b | wyszukiwanie skadowych spjnoci var compnum : array "1 :: jV j] of integer fcompnum"v] jest numerem skadowej spjnoci, do ktrej naley wierzchoek vg for v 2 V do compnum"v] := 0 end for c := 0 for v 2 V do if compnum"v] = 0 then c := c + 1 COMP (v) end if end for procedure COMP (x: wierzchoek) begin compnum(x) := c for w 2 adj "x] do if compnum"w] = 0 then COMP (w) 61 end if end for end Nierekursywna wersja procedury przeszukiwania w g b procedure wg1 (v) fNa pocztku procesu przeszukiwania P "t] = wska$nik do pierwszego rekordu listy adj "t] dla kadego u.g begin stos ( stos ( v odwied$ v nowy"v] := false while stos <> do t := top(stos) fodczytaj szczytowy element stosug while (P "t] <> nil) cand (not nowy"P "t]^:wierzch]) do P "t] := P "t]^:nast fznajd$ \nowy" wierzchoek na licie adj "t]g end while if P "t] <> nil then fnowy wierzchoek znalezionyg t := P "t]^:wierzch stos ( t odwied$ t nowy"t] := false else fwierzchoek t zosta wykorzystanyg t ( stos fzdejmij szczytowy wierzchoek ze stosug end if end while end 11.2 Przeszukiwanie grafu wszerz procedure wsz(v) fPrzeszukiwanie wszerz z wierzchoka v.g var K : kolejka wierzchokw (typu FIFO) begin znacznik"v] := odwiedzony wstaw do kolejki (v K ) while not pusta kolejka (K ) do x := pierwszy(K ) usu pierwszy z kolejki (K ) for y 2 listy incydencji"x] do if znacznik"y] = nieodwiedzony then znacznik"y ] := odwiedzony wstaw do kolejki (y K ) fKrawed$ (x y) wstawiana jest do drzewa 62 rozpinajcego.g end if end for end while end begin fPrzeszukiwanie grafu G = (V E ) wszerz.g for v 2 V do znacznik"v] := nieodwiedzony end for for v 2 V do if znacznik"v] = nieodwiedzony then wsz(v) end if end for end Alternatywna wersja BFS kolejka ( kolejka ( v nowy"v] := false while kolejka <> do p ( kolejka fpobierz p z kolejki (tj. z usuniciem)g for n 2 adj "p] do if nowy"n] then kolejka ( u nowy"u] := false end if end for end while Zastosowanie przeszukiwania grafu wszerz | znajdowanie najkrtszej drogi pomidzy wierzchokami v i x w grae var pred : array"1 :: jV j] of 1 :: jV j fwierzchoki poprzedzajce na najkrtszej drodzeg odl: array"1 :: jV j] of integer fdugo! najkrtszej drogig begin for v 2 V do nowy"v] := true end for kolejka := pusta kolejka kolejka ( v0 nowy"v0] := false pred "v0] := ;1 odl"v0] := 0 63 while nowy"x] do p ( kolejka for u 2 adj "p] do if nowy"u] then kolejka ( u nowy"u] := false pred"u] := p odl"u] := odl"p] + 1 end if end for end while end 11.3 Wyznaczanie cykli podstawowych (fundamentalnych) begin for x 2 V do num"x] := 0 end for finicjacja numeracji wierzchokwg flicznik do numeracji kolejnych wierzchokw odwiedzanych w gbg j := 0 flicznik cykli fundamentalnychg k := 0 fwska$nik stosug for x 2 V do if num"x] = 0 then i := 0 k := k + 1 stos"k] := x ZNAJD CYKLE (x 0) k := k ; 1 end if end for end procedure ZNAJD CYKLE (v u) fv | wierzchoek aktualny, u | wierzchoek poprzednig begin i := i + 1 fOdwiedzone wierzchoki zostaj ponumerowaneg num"v] := i frosnco zgodnie z licznikiem i.g for w 2 adj "v] do if num"w] = 0 then k := k + 1 stos"k] := w ZNAJD CYKLE (w v) k := k ; 1 else 64 if num"w] < num"v] cand w <> u then j := j + 1 flicznik cyklig \sj jest cyklem (w stos"k] stos"k ; 1] ::: stos"t]) gdzie stos"t] = w stos"k] = v" end if end if end for end 11.4 Minimalne drzewa rozpinajce Algorytm Kruskala T { zbir krawdzi minimalnego drzewa rozpinajcego VS { rodzina (zbir) rozcznych zbiorw wierzchokw begin T := VS := Skonstruuj kolejk priorytetow Q zawierajc wszystkie krawdzie ze zbioru E for v 2 V do Dodaj fvg do VS end for while jVS j > 1 do Wybierz z kolejki Q krawd$ (v w) o najmniejszym koszcie Usu (v w) z Q if v i w nale do rnych zbiorw W 1 i W 2 nalecych do VS then Zastp W 1 i W 2 w VS przez W 1 W 2 Dodaj (v w) do T end if end while end Algorytm najbliszego s siedztwa (Prima i Dijkstry) (n = jV j) var near: array"1 :: n] of 1 :: n fdla kadego wierzchoka v, ktry nie znalaz si jeszcze w drzewie, element near"v] zapamituje najbliszy mu wierzchoek drzewag dist: array"1 :: n] of 1 :: n fdist"v] zapamituje odlego! v od najbliszego mu wierzchoka drzewag 65 W = "wij ] fmacierz kosztwg begin Wybierz arbitralnie v0 for v 2 V do dist"v] := W "v v0] fkoszt krawdzi (v0 v)g near"v] := v0 end for Vt := fv0g fwierzchoki drzewag Et := fkrawdzie drzewag Wt := 0 fsumaryczny koszt drzewag while Vt <> V do v := wierzchoek z V ; Vt o najmniejszej wartoci dist"v] Vt := Vt fvg Et := Et f(v near(v))g Wt := Wt + dist"v] for x 2 V ; Vt do if dist"x] > W "v x] then dist"x] := W "v x] near"x] := v end if end for end while end 11.5 Wyznaczanie cykli Eulera begin STOS ( foprnianieg CE ( fstoswg v := dowolny wierzchoek grafu STOS ( v while STOS 6= do v := szczyt(STOS ) fv jest szczytowym elementem stosug if inc"v] 6= then flista incydencji v jest niepustag u := pierwszy wierzchoek listy inc "v] STOS ( u fusuwanie krawdzi (u v) z grafug inc "v] := inc "v ] ; fug inc "u] := inc "u] ; fv g else flista incydencji v jest pustag v ( STOS fprzeniesienie szczytowego wierzchoka stosu STOS g CE ( v fdo stosu CE g 66 end if end while end 12 Wyszukiwanie wyczerpujace. Algorytm z powrotami procedure wyszukiwanie z powrotami begin Wyznacz S1 fna podstawie A1 i ograniczeg k := 1 while k > 0 do while Sk <> do ak := element z Sk Sk := Sk { fak g if (a1, a2, ... , ak ) jest rozwizaniem then write((a1, a2, ... , ak )) end if k := k + 1 Wyznacz Sk fna podstawie Ak i ogranicze,ng end while k := k ; 1 fpowrtg end while end 13 Przeszukiwanie heurystyczne 13.1 Przeszukiwanie wszerz procedure BFS begin Q ( fzerowanie kolejkig Q ( s0 fstan pocztkowy do kolejkig loop if kolejka Q pusta then return(poraka) end if s ( Q fpobranie stanu z kolejkig Wygenerowanie nastpnikw sj stanu s na podstawie operatora dla stanu s Wstawienie stanw sj do kolejki 67 if dowolny stan sj jest stanem kocowym then return(sukces) end if end loop end BFS 13.2 Przeszukiwanie w gb z iteracyjnym pogbianiem procedure DFS (s, gboko, odcicie) fPrzeszukiwanie w gb z odciciem. s | biecy stan, gboko | bieca gboko!.g begin for sj 2 nastpniki (s) do if sj jest stanem kocowym then return(sukces) fznaleziono rozwizanieg end if if gboko + 1 < odcicie then DFS (sj , gboko + 1, odcicie) end if end for end DFS for odcicie := 1 to odcicie max do DFS (s0, 0, odcicie ) end for return(poraka) 13.3 Przeszukiwanie wedug strategii najlepszy wierzchoek jako pierwszy" OTWARTE ( (s f^(s)) fwierzchoek pocztkowy na listg while lista OTWARTE nie pusta do (*) Pobranie z listy OTWARTE wierzchoka i o minimalnej wartoci f^(i) ZAMKNITE ( (i f^(i)) if i jest wierzchokiem kocowym then return(sukces) end if Rozszerzenie wierzchoka i przez wyznaczenie wszystkich jego nastpnikw j i obliczenie f^(j ) if j nie wystpuje na listach OTWARTE i ZAMKNITE then OPEN ( (j f^(j )) 68 Ustanowienie wska$nika od wierzchoka j do jego poprzednika i (aby umoliwi! odtworzenie rozwizania kocowego) (**) else if j wystpuje na licie OTWARTE lub ZAMKNITE then if nowe f^(j ) < stare f^(j ) then stare f^(j ) := nowe f^(j ) Ustanowienie wska$nika od j do nowego poprzednika i end if if wierzchoek j jest na licie ZAMKNITE then Przesunicie (j f^(j )) na list OTWARTE end if end if end if end while return(poraka) 14 Generowanie permutacji procedure PERMUTACJE (n, m) begin (p1 p2 . . . pm ) := (1 2 . . . m) Wyprowad$ (p1 p2 . . . pm) na wyjcie u1, u2, . . ., un := (1 1 . . . 1) for i := 1 to nPm ; 1 do NAST.PNA PERMUTACJA(n, m, p1 , p2 , . . . , pm ) end for end procedure NASTPNA PERMUTACJA(n, m, p1, p2, . . . , pm ) begin for i := 1 to m do u"pi] := 0 fzaznaczenie, ktre elementy s w permutacjig end for fZnalezienie najwikszego, nieuywanego elementu w zbiorze f1, 2, . . . , ng.g f := n while u"f ] <> 1 do f := f ; 1 end while fZnalezienie najbardziej na prawo pooonego, mody+kowalnego elementu permutacji.g k := m + 1 i := 0 fIndeks elementu permutacji, ktry zostanie zmody+kowany.g 69 while i = 0 do k := k ; 1 u"pk ] := 1 if pk < f then fuaktualnij pk g Znajd$ najmniejsze j takie, e pk < j n oraz u"j ] = 1 i := k pi := j fzmody+kowanie permutacjig u"pi] := 0 else f := pk fnajwikszy, nieuywany element jest ustawiany na warto! pk g end if end while fUaktualnienie elementw lecych na prawo od pi g for k := 1 to m ; i do if u"s] jest k-t pozycj w tablicy u rwn 1 then pi+k := s end if end for fPrzywr! 1-ki w tablicy u.g for k := 1 to i do u"pk ] := 1 end for Wyprowad$ (p1 p2 . . . pm) na wyjcie end procedure RZD (n, m, p1, p2, . . . , pm , d) begin for i := 1 to m do d := 0 for j := 1 to i ; 1 do if pi < pj then d := d + 1 end if end for ri := pi ; i + d end for d := rm + 1 waga := 1 for k := m ; 1 downto 1 do waga := (n ; k ) waga d := d + rk waga end for end RZD 70 procedure RZD ODWR (n, m, d, p1, p2, . . . , pm) begin d := d ; 1 for i := 1 to n do si := 0 end for a := 1 fobliczenie (n ; m + 1)(n ; m + 2) . . . (n ; 1)g for i := m ; 1 downto 1 do a := a (n ; m + i) end for fwyznaczanie pi, i = 1, 2, . . ., mg for i := 1 to m do r := bd=ac d := d ; r a if n > i then a := a=(n ; i) end if k := 0 j := 0 fszukanie (r + 1)-ego elementu tablicy s rwnego 0g while k < r + 1 do j := j + 1 if sj = 0 then felement = j nie wystpi jeszcze w permutacjig k := k + 1 end if end while pi := j felement permutacji = j g sj := 1 fw permutacji wystpi element = j g end for end RZD ODWR 15 Literatura "1] Wirth, N., Algorytmy + Struktury Danych = Programy, WNT, Warszawa, 1980. "2] Banachowski, L., Kreczmar, A., Elementy Analizy Algorytmw, WNT, Warszawa, 1982. "3] Alagi!, S., Arbib, M.A., Projektowanie Programw Poprawnych i Dobrze Zbudowanych, WNT, Warszawa, 1982. "4] Aho, A.V., Ullman, J.D., Projektowanie i Analiza Algorytmw Komputerowych, PWN, Warszawa, 1983. "5] Reingold, E.M., Nievergelt, J., Deo, N., Algorytmy Kombinatoryczne, PWN, Warszawa, 1985. 71 "6] Bentley, J., Pereki Oprogramowania, WNT, Warszawa, 1986. "7] Lipski, W., Kombinatoryka dla Programistw, WNT, Warszawa, 1987. "8] Banachowski, L., Kreczmar, A., Rytter, W., Analiza Algorytmw i Struktur Danych, WNT, Warszawa, 1987. "9] Harel, D., Rzecz o Istocie Informatyki. Algorytmika, WNT, Warszawa, 1992. "10] Banachowski, L., Diks, K., Rytter, W., Algorytmy i Struktury Danych, WNT, Warszawa, 1996. "11] Graham, R.L., Knuth, D.E., Patashnik, O., Matematyka Konkretna, PWN, Warszawa, 1996. "12] Cormen, T.H., Leiserson, C.E., Rivest, R.L., Wprowadzenie do Algorytmw, WNT, Warszawa, 1997. 16 Pytania 1. Metody empirycznego testowania programw. Dlaczego testowanie empiryczne jest niedoskonae? Co sdzi Dijkstra o testowaniu empirycznym? 2. Co to s: aksjomat, asercja, regua dowodzenia? Poda! aksjomaty liczb cakowitych i rzeczywistych. Co to s: zdanie, predykat. Poda! kilka aksjomatw rachunku zda. 3. Poda! i omwi! na wybranych przykadach reguy dowodzenia dla instrukcji przypisania oraz instrukcji zoonej. 4. Poda! i omwi! na wybranych przykadach reguy dowodzenia dla instrukcji alternatywy oraz instrukcji warunkowej. 5. Poda! i omwi! na wybranym przykadzie regu dowodzenia dla instrukcji iteracji \dopki". Co to jest niezmiennik ptli? 6. Poda! i omwi! na wybranym przykadzie regu dowodzenia dla instrukcji itracji \powtarzaj". Co to jest niezmiennik ptli? 7. Poda! i omwi! na wybranym przykadzie reguy dowodzenia dla instrukcji iteracji \dla". Co to jest niezmiennik ptli? 8. Czciowa oraz pena poprawno! algorytmu. Jak dowodzi si dochodzenie oblicze algorytmu do punktu kocowego (wasno! stopu)? 9. Poda! de+nicje poj!: rozmiar danych, dziaanie dominujce, zoono! czasowa algorytmu, zoono! pamiciowa algorytmu. Wymieni! typowe funkcje okrelajce zoonoci obliczniowe algorytmw. Po co wyznacza si zoono! obliczeniow algorytmu? 72 10. Co rozumiesz przez: zoono! pesymistyczn algorytmu, zoono! redni algorytmu? Udowodnij, e W (n) = amnm + . . . + a1n + a0 = O(nm ) dla n > 0. 11. Jak brzmi de+nicja O-notacji? Poda! i udowodni! trzy dowolne wasnoci rzdu funkcji. 12. Okreli! zoono! obliczeniow algorytmu wyznaczania wartoci wielomianu dla przypadkw: (a) korzystajc bezporednio ze wzoru, (b) korzystajc ze schematu Hornera. 13. Poda! dwa algorytmy znajdowania maksymalnego elementu w tablicy. Wyznaczy! i porwna! ich zoonoci. 14. Poda! algorytmy znajdowania elementu maksymalnego i minimalnego w zadanym zbiorze dla przypadkw: (a) kolejne znajdowanie elementu maksymalnego a nastpnie minimalngo, (b) dzielenie zadania na podzadania. Okreli! zoono! obliczniow algorytmw. 15. Poda! algorytm mnoenia dwch n -bitowych liczb dwjkowych z zastosowaniem metody dzielenia zadania na podzadania. Okreli! zoono! obliczeniow algorytmu. 16. Wyprowadzi! rozwizania rwna rekurencyjnych: T (n) = b dla n = 1 oraz T (n) = aT ( nc ) + bn dla n > 1. Poda! interpretacj rozwiza. 17. Omwi! zasad rwnowaenia rozmiarw podzada na przykadzie zadania sortowania, rozwaajc algorytm sortowania przez wybr prosty oraz rekursywny algorytm sortowania przez czenie. Okreli! zoonoci obliczeniowe algorytmw. 18. Sformuowa! zadanie sortowania. Poda! ogln klasy+kacj algorytmw sortowania oraz klasy+kacj algorytmw sortowania wewntrznego. Poda! de+nicje poj!: drzewo decyzyjne sortowania, gboko! i wysoko! wierzchoka w drzewie, wysoko! drzewa. Okreli! kres dolny zoonoci obliczeniowej algorytmw sortowania wewntrznego z pomoc porwna. 19. Poda! wasnoci kopca oraz omwi! sposb jego implementacji. Poda! i wyjani! dziaanie procedur: przemie w gr i przemie w d . 20. Poda! abstrakcyjny opis kolejki priorytetowej. Poda! i wyjani! dziaanie procedur wstaw i usu min dla kolejki implementowanej z pomoc kopca. Jakie s inne moliwe implementacje kolejki? Porwna! je ze sob pod ktem zoonoci obliczeniowej. 21. Poda! algorytm budowania kopca (faza 1. sortowania przez kopcowanie). Wyznaczy! jego zoono! pesymistyczn. 22. Poda! algorytm sortowania przez kopcowanie oraz okreli! jego pesymistyczn zoono! obliczeniow. 73 23. Poda! algorytm sortowania liczb naturalnych z zakresu "1::n] o zoonoci liniowej. Czy przy sortowaniu niezbdna jest dodatkowa tablica? 24. Poda! algorytm sortowania kubekowego. Jaka jest jego zoono!? Co to jest porzdek leksykogra+czny? Poda! algorytm sortowania pozycyjnego. Jaka jest jego zoono!? 25. Poda! algorytm sortowania przez proste wstawianie (z wartownikiem). Okreli! jego zoono! pesymistyczn oraz redni. 26. Poda! algorytm sortowania metod Shella. Jak naley dobiera! przyrosty? Jaka jest zoono! algorytmu? 27. Poda! algorytm sortowania przez proste wybieranie. Okreli! jego zoono! pesymistyczn oraz redni. Jakie s moliwoci ulepszania algorytmu? 28. Poda! algorytm sortowania bbelkowego. Jaka jest jego zozono!? Jakie s moliwoci ulepszania algorytmu? 29. Poda! algorytm sortowania szybkiego (Quicksort). Co warunkuje jego szybkie dziaanie. 30. Wyznaczy! zoono! pesymistyczn i redni algorytmu sortowania szybkiego. 31. Omwi! dwie metody wyznaczania k-tego co do wielkoci klucza w tablicy: a) mody+kacja algorytmu sortowania przez kopcowanie b) algorytm rekursywny. Jakie s zoonoci tych metod? 32. Poda! algorytm sortowania plikw sekwencyjnych przez czenie proste (na \rednim" poziomie abstrakcji). Jaka jest zoono! algorytmu? 33. Poda! algorytm sortowania plikw sekwencyjnych przez czenie naturalne (na \rednim" poziomie abstrakcji). Jaka jest zoono! algorytmu? 34. Omwi! idee sortowania przez wielokierunkowe czenie wywaone oraz sortowania polifazowego. Jakie s zoonoci tych metod? 35. Sformuowa! zadanie wyszukiwania. Poda! algorytmy wyszukiwania liniowego (bez wartownika i z wartownikiem) oraz okreli! ich zoonoci rednie i pesymistyczne. 36. Poda! algorytm wyszukiwania binarnego. Okreli! jego zoono! pesymistyczn. 37. Porwna! algorytmy wyszukiwania liniowego i binarnego pod ktem pesymistycznej zoonoci obliczeniowej oraz narzutu zwizanego z koniecznoci reorganizacji pliku rekordw. 38. Poda! wasnoci drzewa poszukiwa binarnych oraz procedury szukaj i wstaw operujce na drzewie. Jaki jest koszt wyszukiwania klucza w drzewie? 74 39. Poda! i omwi! procedur usuwania klucza z drzewa poszukiwa binarnych. 40. Dla metody mieszania otwartego poda! procedury wyszukiwania, wstawiania i usuwania elementu z tablicy mieszajcej. Jaka jest rednia zoono! obliczeniowa kadej z procedur? 41. Dla metody mieszania zamknitego poda! procedury wyszukiwania, wstawiania i usuwania elementu z tablicy mieszajcej. 42. Poda! wymagania jakie powinna spenia! podstawowa funkcja mieszajca. Wymieni! i omwi! czsto stosowane podstawowe funkcje mieszajce. 43. Omwi! metody przezwyciania kolzji w metodzie mieszania zamknitego. Jakie s wady i zalety wyszukiwania i wstawiania mieszajcego? 44. Okreli! zoono! obliczeniow mieszania zamknitego. Jak naley dobra! objto! tablicy mieszajcej? 45. Na czym polega restrukturyzacja tablic mieszajcych? Co to jest minimalna doskonaa funkcja mieszajca? Poda! przykad takiej funkcji. 46. Poda! algorytm naiwny" wyszukiwania wzorca w tekcie. Jaka jest jego zoono!? 47. Poda! algorytm wyszukiwania Knutha, Morrisa i Pratta. Jak wyznacza si wartoci elementw tablicy nast ? 48. Dla wybranego przykadu poda! algorytm wyszukiwania Knutha, Morrisa i Pratta z \wbudowanym" wzorcem. Co to jest kompilator procedur wyszukiwania? 49. Poda! algorytm wyszukiwania niezgodnociowego. Omwi! jego dziaanie na przykadzie. Jak wyznacza si wartoci elementw tablicy skok 1. 50. Poda! algorytm wyszukiwania Boyera i Moora. Czy jest on bardziej efektywny od algorytmu wyszukiwania niezgodnociowego. 51. Omwi! ide algorytmu zachannego na przykadzie projektowania sekwencji zmiany wiate dla skrzyowania. Na czym polega problem kolorowania grafu? 52. Sformuowa! problem komiwojaera. Poda!: a) algorytm typu \sprawd$ wszystkie moliwoci" b) algorytm heurystyczny oparty na postpowaniu zachannym. Jakie s zoonoci algorytmw? 53. Sformuowa! i porwna! problemy znalezienia marszruty komiwojaera , cyklu Eulera i cyklu Hamiltona. 54. Poda! algorytm Dijkstry znajdowania najkrtszych drg z ustalonego wierzchoka. Objani! jego dziaanie na wybranym przykadzie. 75 55. Omwi! przeszukiwanie grafu wgb. Poda! zastosowanie tego przeszukiwania dla problemu znajdowania skadowych spjnoci. 56. Omwi! przeszukiwanie grafu wszerz. Poda! zastosowanie tego przeszukiwania dla problemu znajdowania najkrtszej cieki w gra+e (dugo! cieki liczona liczb krawdzi). 57. Poda! i omwi! algorytm znajdowania cykli fundamentalnych w gra+e. Jaka jest jego zoono!? 58. Poda! i omwi! algorytm Kruskala znajdowania minimalnego drzewa rozpinajcego. Jaka jest jego zoono!? 59. Poda! i omwi! algorytm Prima i Dijkstry znajdowania minimalnego drzewa rozpinajcego. Jaka jest jego zoono!? 60. Poda! i omwi! algorytm wyznaczania cykli Eulera. Jaka jest jego zoono!? 61. Poda! i omwi! algorytm wyznaczania nPm permutacji. Jaka jest jego zoono!? 17 Podzikowania W przygotowaniu pierwszej wersji niniejszych materiaw uczestniczyy Beata Bartkowiak i Beata Gawlik, za drug wersj przygotowali Magdalena Biedzka i Zdzisaw Koch. Kolejn wersj przygotoway Zo+a Imiela oraz Boena Bartoszek. Wersje nastpne przygotowali Mohamed Daghestani oraz Ilona Bargie, Wojciech Mikanik i Joanna Sim0cak. Wszystkim tym osobom skadam serdeczne podzikowania. 76