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