Datov´e struktury
Obsah ´ 1 Uvod
6
2 Haˇ sov´ an´ı
7
2.1
Slovn´ıkov´ y probl´em . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.2
Haˇsov´an´ı obecnˇe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.3
Haˇsov´an´ı se separovan´ ymi ˇretˇezci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.3.1
Algoritmy operac´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.3.2
Nejhorˇs´ı pˇr´ıpady . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.3.3
Oˇcek´avan´e pˇr´ıpady - pˇredpoklady . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.3.4
Jednoduch´e d˚ usledky pˇredpoklad˚ u. . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.3.5
Oˇcek´avan´a d´elka ˇretˇezc˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.3.6
Oˇcek´avan´ y nejdelˇs´ı ˇretˇezec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
2.3.7
Oˇcek´avan´ y poˇcet test˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
Haˇsov´an´ı s uspoˇra´dan´ ymi separovan´ ymi ˇretˇezci . . . . . . . . . . . . . . . . . . . . . . . . .
16
2.4.1
Oˇcek´avan´ y poˇcet test˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
2.4.2
Algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
2.5
Motivace pro neseparovan´e ˇretˇezce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.6
Haˇsov´an´ı s pˇrem´ıst’ov´an´ım . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.6.1
Nepˇresn´ y popis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.6.2
Ilustrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
2.6.3
Algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
2.6.4
Oˇcek´avan´ y poˇcet test˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
2.6.5
Diskuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
Haˇsov´an´ı s dvˇema ukazateli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
2.7.1
Nepˇresn´ y popis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
2.7.2
Ilustrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
2.4
2.7
1
2.8
2.9
2.7.3
Algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
2.7.4
Oˇcek´avan´ y poˇcet test˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
Sr˚ ustaj´ıc´ı haˇsov´an´ı - pˇrehled . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
2.8.1
Nepˇresn´ y popis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
2.8.2
Pˇrehled . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
Metody EISCH a LISCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
2.9.1
Popis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
2.9.2
Ilustrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
2.9.3
Algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
2.9.4
Oˇcek´avan´ y poˇcet test˚ u ne´ uspˇeˇsn´eho vyhled´av´an´ı (sn+1 ∈ / S) . . . . . . . . . . . . .
25
´ eˇsn´ Uspˇ y pˇr´ıpad (sj ∈ S) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
2.10 Metody LICH, EICH, VICH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
2.10.1 Popis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
2.10.2 Ilustrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
2.10.3 Algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
2.10.4 Oˇcek´avan´ y poˇcet test˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
2.11 Haˇsov´an´ı s line´arn´ım pˇrid´av´an´ım . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
2.11.1 Popis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
2.11.2 Algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
2.11.3 Ilustrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
2.11.4 Oˇcek´avan´ y poˇcet test˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
2.12 Dvojit´e haˇsov´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
2.12.1 Popis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
2.12.2 Algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
2.12.3 Ilustrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
2.12.4 Oˇcek´avan´ y poˇcet test˚ u - ne´ uspˇeˇsn´ y pˇr´ıpad . . . . . . . . . . . . . . . . . . . . . . .
38
´ eˇsn´ 2.12.5 Uspˇ y pˇr´ıpad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
2.13 Porovn´an´ı efektivity haˇsovac´ıch algoritm˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
2.13.1 Ne´ uspˇeˇsn´e vyhled´av´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
´ eˇsn´e vyhled´av´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.13.2 Uspˇ
41
2.13.3 Oˇcek´avan´ y poˇcet test˚ u pˇri u ´plnˇe zaplnˇen´e tabulce . . . . . . . . . . . . . . . . . . .
41
2.9.5
2.13.4 Vliv β =
m m′
pˇri sr˚ ustaj´ıc´ım haˇsov´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . .
42
2.13.5 Koment´aˇr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
2.14 Dalˇs´ı ot´azky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
2
2.14.1 Jak nal´ezt voln´ y ˇra´dek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
2.14.2 Jak ˇreˇsit pˇreplnˇen´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
2.14.3 Jak ˇreˇsit DELETE v metod´ach, kter´e ho nepodporuj´ı . . . . . . . . . . . . . . . . .
42
2.14.4 Otevˇren´e probl´emy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
2.14.5 Pˇredpoklady a jejich splnitelnost . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
2.15 Univerz´aln´ı haˇsov´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
2.15.1 Z´akladn´ı idea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
2.15.2 Modifikace ideje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
2.15.3 Form´aln´ı definice c-univerz´aln´ıch syst´em˚ u . . . . . . . . . . . . . . . . . . . . . . .
44
2.15.4 Existence univerz´aln´ıch syst´em˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
2.15.5 Vlastnosti univerz´aln´ıho haˇsov´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
2.15.6 Markovova nerovnost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
2.15.7 V´ ybˇer funkce ze syst´emu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
2.15.8 Doln´ı odhady na velikost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
2.15.9 Mal´ y univerz´aln´ı syst´em - definice . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
2.15.10 Univerzalita mal´eho syst´emu H1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
2.15.11 Odhad na velikost c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
2.15.12 Probl´emy univerz´aln´ıho haˇsov´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
2.16 Perfektn´ı haˇsov´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
2.16.1 Idea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
2.16.2 Poˇzadavky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
2.16.3 (N, m, n)-perfektn´ı syst´em - definice . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
2.16.4 Doln´ı odhady na velikost (N, m, n)-perfektn´ıho souboru . . . . . . . . . . . . . . . .
55
2.16.5 Existence (N, m, n)-perfektn´ıho souboru . . . . . . . . . . . . . . . . . . . . . . . .
56
2.16.6 Konstrukce perfektn´ıch haˇsovac´ıch funkc´ı A, B . . . . . . . . . . . . . . . . . . . . .
58
2.16.7 Konstrukce perfektn´ı haˇsovac´ı funkce C
. . . . . . . . . . . . . . . . . . . . . . . .
61
2.16.8 Konstrukce perfektn´ı haˇsovac´ı funkce D . . . . . . . . . . . . . . . . . . . . . . . .
62
2.16.9 Konstrukce perfektn´ı haˇsovac´ı funkce E . . . . . . . . . . . . . . . . . . . . . . . . .
64
2.16.10 Univerz´aln´ı a perfektn´ı haˇsov´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
2.16.11 Dynamick´e perfektn´ı haˇsov´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
2.16.12 Algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
2.17 Extern´ı haˇsov´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
2.17.1 Algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
3
3 Vyhled´ av´ an´ı v uspoˇ r´ adan´ em poli
73
3.1
Zad´an´ı u ´lohy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
73
3.2
Metaalgoritmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
73
3.3
Typy funkce next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
74
3.3.1
74
Zobecnˇen´e kvadratick´e vyhled´av´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . .
4 Stromy
76
4.1
Uspoˇra´dan´ y slovn´ıkov´ y probl´em . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
4.2
(a, b)-stromy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
4.2.1
Obecn´a definice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
4.2.2
Speci´aln´ı pˇr´ıpad – definice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
4.2.3
Vlastnosti – velikost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
4.2.4
Vlastnosti – uspoˇra´d´an´ı na listech . . . . . . . . . . . . . . . . . . . . . . . . . . . .
78
4.2.5
Jak reprezentujeme mnoˇzinu? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
78
4.2.6
Algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
78
4.2.7
Korektnost algoritm˚ u. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
4.2.8
ˇ Casov´ a anal´ yza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
4.2.9
Poˇra´dkov´a statistika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
4.2.10 Hodnoty a, b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
84
4.2.11 Paraleln´ı verze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
84
4.2.12 A-sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
84
4.2.13 A-sort – sloˇzitost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
86
4.2.14 Propojen´e stromy s prstem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
87
4.2.15 Omezen´ı ˇstˇepen´ı, spojov´an´ı a pˇresun˚ u. . . . . . . . . . . . . . . . . . . . . . . . . .
87
4.2.16 Omezen´ı ˇstˇepen´ı, spojov´an´ı a pˇresun˚ u – diskuze . . . . . . . . . . . . . . . . . . . .
93
Bin´arn´ı vyhled´avac´ı stromy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
94
4.3.1
Form´aln´ı definice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
94
4.3.2
Algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
95
4.3.3
Korektnost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
97
4.3.4
ˇ Casov´ a sloˇzitost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
98
4.3.5
Poˇra´dkov´a statistika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
98
4.3.6
Diskuze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
98
4.3.7
Rotace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
99
4.3
4.4
AVL-stromy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
4
4.5
4.4.1
Definice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
4.4.2
Odhad v´ yˇsky stromu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.4.3
Algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
ˇ Cerveno-ˇ cern´e stromy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 4.5.1
Definice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
4.5.2
Vyv´aˇzenost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
4.5.3
Popis algoritm˚ u (kromˇe vyvaˇzov´an´ı)
4.5.4
Vyvaˇzovac´ı operace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
4.5.5
Popis nevyvaˇzovac´ıch operac´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
4.5.6
Korektnost a sloˇzitost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
. . . . . . . . . . . . . . . . . . . . . . . . . . 109
4.6
V´ahovˇe vyv´aˇzen´e stromy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
4.7
Historick´ y pˇrehled: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
5 Haldy 5.1
5.2
5.3
120
´ Uvodn´ ı definice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 5.1.1
Motivace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
5.1.2
Zad´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
5.1.3
Definice haldy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Regul´arn´ı haldy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 5.2.1
d-regul´arn´ı strom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
5.2.2
V´ yˇska . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
5.2.3
Reprezentace pomoc´ı pole . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
5.2.4
Algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
5.2.5
Korektnost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
5.2.6
Sloˇzitost operac´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
5.2.7
Aplikace – heapsort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
5.2.8
Aplikace – Dijkstra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Leftist haldy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 5.3.1
´ Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
5.3.2
Defince . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
5.3.3
Z´akladn´ı vlastnost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
5.3.4
Algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
5.3.5
ˇ Casov´ a sloˇzitost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
5.3.6
Efektivn´ı DECREASE a INCREASE . . . . . . . . . . . . . . . . . . . . . . . . 128
5
5.4
5.5
5.6
Amortizovan´a sloˇzitost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 5.4.1
Idea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
5.4.2
Definice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Binomi´aln´ı haldy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 5.5.1
Motivace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
5.5.2
Definice binomi´aln´ıho stromu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
5.5.3
Vlastnosti binomi´aln´ıho stromu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
5.5.4
Definice binomi´aln´ı haldy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
5.5.5
Algoritmy, korektnost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
5.5.6
Sloˇzitost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
5.5.7
L´ın´a binomi´aln´ı halda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Fibonacciho haldy
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
5.6.1
Motivace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
5.6.2
Velmi neform´aln´ı definice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
5.6.3
M´enˇe neform´aln´ı definice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
5.6.4
Algoritmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
5.6.5
Sloˇzitost operac´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
5.6.6
Aplikace
5.6.7
Historick´ y pˇrehled . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
6 Tˇ r´ıdic´ı algoritmy
142
6.0.8
HEAPSORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
6.0.9
MERGESORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
6.0.10 QUICKSORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 6.0.11 Porovn´an´ı tˇr´ıdic´ıch algoritm˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 6.0.12 Sl´ev´an´ı nestejnˇe dlouh´ ych posloupnost´ı . . . . . . . . . . . . . . . . . . . . . . . . . 148 6.1
Rozhodovac´ı stromy
6.2
Pˇrihr´adkov´e tˇr´ıdˇen´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
6.3
Poˇra´dkov´e statistiky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 6.3.1
1
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Historick´ y pˇrehled . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
´ Uvod
Z´akladn´ı probl´em: Reprezentace mnoˇzin a operace s nimi. V ˇradˇe u ´loh a algoritm˚ u je tento podprobl´em rozhoduj´ıc´ı pro sloˇzitost ˇreˇsen´ı, protoˇze tyto operace se mnohokr´at opakuj´ı. Proto je tˇreba navrhnout
6
pro tyto u ´lohy co nejefektivnˇejˇs´ı algoritmy (kaˇzd´ y uˇsetˇren´ y ˇcas mnohon´asobn´ ym opakov´an´ım zaˇcne hr´at d˚ uleˇzitou roli). To vede k detailn´ı anal´ yze sloˇzitosti v z´avislosti na vnˇejˇs´ıch okolnostech. Nelze ˇr´ıct, ˇze nˇekter´ y algoritmus je nejlepˇs´ı, protoˇze za urˇcit´ ych okolnost´ı m˚ uˇze b´ yt ‘m´enˇe efektivn´ı’ algoritmus v´ yhodnˇejˇs´ı. C´ılem t´eto pˇredn´aˇsky nen´ı pouze sezn´amit v´as s algoritmy pro ˇreˇsen´ı tˇechto probl´em˚ u, protoˇze s tˇemi jste se sezn´amili uˇz v pˇredn´aˇsce ‘Algoritmy a datov´e struktury’. Hlavn´ım c´ılem je uk´azat v´am prostˇredky a metody, jak mˇeˇrit a zjiˇst’ovat jejich efektivitu, a t´ım v´am uk´azat prostˇredky, kter´e v´am umoˇzn´ı rozhodnout se v dan´e situaci pro urˇcit´ y algoritmus. Proto hlavn´ı n´apln´ı t´eto pˇredn´aˇsky bude poˇc´ıt´an´ı efektivity algoritm˚ u. Budeme poˇc´ıtat za zjednoduˇsen´ ych pˇredpoklad˚ u, protoˇze neum´ım ˇr´ıct (a ani to nelze, protoˇze vˇzdy z´aleˇz´ı na konkr´etn´ıch okolnostech), kter´e sofistikovanˇejˇs´ı metody budou v praxi vhodn´e pro ˇreˇsen´ı vaˇseho probl´emu. C´ılem pˇredn´aˇsky je sezn´amit v´as s moˇznostmi, jak ˇreˇsit tyto probl´emy, a se z´akladn´ımi metodami pro jejich ˇreˇsen´ı. Skripta byla naps´ana profesorem Koubkem; pan profesor je dal k dispozici Karlovi B´ılkovi a Markovi Vaˇsutovi, kteˇr´ı z nich sv´evolnˇe“ udˇelali tuto upravenou verzi v LaTeXu. Nˇekter´e ˇca´sti tedy nemus´ı ” b´ yt spr´avn´e. Delˇs´ı d˚ ukazy, ve kter´ ych mi v p˚ uvodn´ıch skriptech chybˇela struktura, jsem pˇrepsal na s´erii drobnˇejˇs´ıch lemmat, douf´am, ˇze to bude jasnˇejˇs´ı.
2 2.1
Haˇ sov´ an´ı Slovn´ıkov´ y probl´ em
Nejprve si zadefinujeme asi nejz´akladnˇejˇs´ı probl´em, kter´ y ˇreˇs´ıme v datov´ ych struktur´ach. ˇ s´ıme tzv. slovn´ıkov´ Reˇ y probl´em: D´ano univerzum U , m´ame reprezentovat S ⊆ U a navrhnout algoritmy pro n´asleduj´ıc´ı operace MEMBER(x) – zjist´ı, zda x ∈ S, a nalezne jeho uloˇzen´ı INSERT(x) – kdyˇz x ∈ / S, pak vloˇz´ı x do struktury reprezentuj´ıc´ı S DELETE(x) – kdyˇz x ∈ S, pak odstran´ı x ze struktury reprezentuj´ıc´ı S. Efektivita algoritmu: ˇcasov´a sloˇzitost, prostorov´a sloˇzitost; vyˇsetˇren´e bud’ v nejhorˇs´ım pˇr´ıpadˇe nebo v pr˚ umˇern´em pˇr´ıpadˇe nebo amortizovanˇe. Literatura: K. Mehlhorn: Data Structures and Algorithms 1: Sorting and Searching, Springer 1984 http://www.mpi-sb.mpg.de/~mehlhorn/DatAlgbooks.html J. S. Vitter, W.-Ch. Chen: Design and Analysis of Coalesced Hashing, Oxford Univ. Press, 1987
2.2
Haˇ sov´ an´ı obecnˇ e
Pomoc´ı bitov´eho pole m˚ uˇzeme rychle implementovat operace MEMBER, INSERT a DELETE. Nev´ yhoda: kdyˇz je velk´e univerzum, pak je prostorov´a sloˇzitost v nejlepˇs´ım pˇr´ıpadˇe ohromn´a, ve ˇspatn´em pˇr´ıpadˇe nelze pole zadat do poˇc´ıtaˇce. Haˇsov´an´ı chce zachovat rychlost operac´ı, ale odstranit pamˇet’ovou n´aroˇcnost. Prvn´ı publikovan´ y ˇcl´anek o haˇsov´an´ı je od Dumney z roku 1956, prvn´ı anal´ yza haˇsov´an´ı poch´az´ı od Petersona z roku 1957, ale existuje technick´a zpr´ava od IBM o haˇsov´an´ı z roku 1953. Z´akladn´ı idea: D´ano univerzum U a mnoˇzina S ⊆ U tak, ˇze |S| << |U |. M´ame funkci h : U → {0, 1, . . . , m− 1} (taky heˇsovac´ı funkce) a mnoˇzinu S reprezentujeme tabulkou (polem) s m ˇra´dky tak, ˇze s ∈ S je uloˇzen na ˇra´dku h(s). 7
m (jako memory) si tedy budeme znaˇcit velikost tabulky; n je velikost |S|. Nev´ yhoda: mohou existovat r˚ uzn´a s, t ∈ S takov´a, ˇze h(s) = h(t) - tento jev se naz´ yv´a kolize. Hlavn´ı probl´em, kter´emu se vˇenuje zbytek kapitoly: ˇreˇsen´ı koliz´ı.
2.3
Haˇ sov´ an´ı se separovan´ ymi ˇ retˇ ezci
Z´akladn´ı ˇreˇsen´ı: pouˇzijeme pole o velikosti [0..m − 1] a i-t´a poloˇzka pole bude spojov´ y seznam obsahuj´ıc´ı vˇsechny prvky s ∈ S takov´e, ˇze h(s) = i. Toto ˇreˇsen´ı se naz´ yv´a haˇsov´an´ı se separovan´ymi ˇretˇezci. Pˇr´ıklad: U = {1, 2, . . . , 1000}, S = {1, 7, 11, 53, 73, 141, 161} a funkce je h(x) = x mod 10. Pak P (0) = P (2) = P (4) = P (5) = P (6) = P (8) = P (9) = ∅, P (7) =< 7 >, P (3) =< 53, 73 >, P (1) =< 1, 141, 11, 161 > . Seznamy nemus´ı b´ yt uspoˇra´dan´e. 2.3.1
Algoritmy operac´ı
MEMBER(x) Spoˇc´ıt´ame i := h(x), t := N IL if i-t´ y seznam je nepr´azdn´ y then t :=prvn´ı prvek i-t´eho seznamu while t 6= x a t 6=posledn´ı prvek i-t´eho seznamu do t :=n´asleduj´ıc´ı prvek i-t´eho seznamu enddo endif if t = x then V´ ystup: x ∈ S else V´ ystup: x ∈ / S endif INSERT(x) Spoˇc´ıt´ame i := h(x), t := N IL if i-t´ y seznam je nepr´azdn´ y then t :=prvn´ı prvek i-t´eho seznamu while t 6= x a t 6=posledn´ı prvek i-t´eho seznamu do t :=n´asleduj´ıc´ı prvek i-t´eho seznamu enddo endif if t 6= x then vloˇz´ıme x do i-t´eho seznamu endif DELETE(x) Spoˇc´ıt´ame i := h(x), t := N IL if i-t´ y seznam je nepr´azdn´ y then t :=prvn´ı prvek i-t´eho seznamu while t 6= x a t 6=posledn´ı prvek i-t´eho seznamu do t :=n´asleduj´ıc´ı prvek i-t´eho seznamu enddo endif if t = x then odstran´ıme x z i-t´eho seznamu endif
8
2.3.2
Nejhorˇ s´ı pˇ r´ıpady
V n´asleduj´ıc´ı anal´ yze pˇredpokl´ad´ame, ˇze hodnota funkce h(x) je spoˇcitateln´a v ˇcase O(1). V nejhorˇs´ım pˇr´ıpadˇe operace vyˇzaduj´ı ˇcas O(|S|) (vˇsechny prvky jsou v jednom seznamu). Poˇzadovan´a pamˇet’ov´a n´aroˇcnost O(m+|S|) (pˇredpokl´ad´ame, ˇze reprezentace prvku s ∈ S vyˇzaduje pamˇet’ O(1)) Pamˇet’ nen´ı efektivnˇe vyuˇzit´a. Dalˇs´ı kapitoly 2.3 jsou vˇenov´any oˇ cek´ avan´ ym pˇ r´ıpad˚ um 2.3.3
Oˇ cek´ avan´ e pˇ r´ıpady - pˇ redpoklady
Pro v´ ypoˇcet oˇcek´avan´ ych pˇr´ıpad˚ u si zavedeme pˇredpoklady: 1. h je rychle spoˇcitateln´a (tj. O(1)) a nemˇenn´a bˇehem v´ ypoˇctu; 2. vˇsechny h−1 (i) jsou stejnˇe velk´e, tj. h rozdˇeluje univerzum U rovnomˇernˇe (tj. −1 ≤ |h−1 (i)| − |h−1 (j)| ≤ 1 pro i, j ∈ {0, 1, . . . , m − 1} – rozd´ıl 1 kv˚ uli tomu, ˇze jde o cel´a ˇc´ısla); 3. S je n´ahodnˇe vybran´a z univerza U (tj. pro dan´e n = |S| jsou vˇsechny podmnoˇziny U o velikosti n reprezentovanou mnoˇzinou S se stejnou pravdˇepodobnost´ı); 4. kaˇzd´ y prvek z U m´a stejnou pravdˇepodobnost b´ yt argumentem operace INSERT, DELETE, MEMBER 5. velikost reprezentovan´e mnoˇziny je v´ yraznˇe menˇs´ı neˇz velikost univerza. Pouˇzit´e znaˇcen´ı: |S| = n (number ), m =poˇcet ˇretˇezc˚ u (memory), |U | = N , n ℓ(i) =d´elka i-t´eho ˇretˇezce, α = m faktor naplnˇen´ı (load factor) 2.3.4
Jednoduch´ e d˚ usledky pˇ redpoklad˚ u
1. Prob(h(x) = i) = m1 pro vˇsechna x ∈ U a vˇsechna i = 0, 1, . . . , m − 1 – tj. prvky jsou rovnomˇernˇe rozloˇzeny do slot˚ u“ ” u maj´ı 2. Prob(ℓ(i) = l) = pn,l = nl ( m1 )l (1 − m1 )n−l pro vˇsechna i = 0, 1, . . . , m − 1 – tj. d´elky ˇretˇezc˚ binomi´aln´ı rozdˇelen´ı. Vysvˇetlen´ı: i-t´ y ˇretˇezec m´a d´elku l, pr´avˇe kdyˇz je l prvk˚ u z S zaheˇ sov´ano do i a zbytek ne – tj. exisn tuje podmnoˇzina A ⊆ S takov´a, ˇze |A| = l (tˇechto moˇznost´ı je l ), pro kaˇzd´e x ∈ A plat´ı h(x) = i (pravdˇepodobnost tohoto jevu je ( m1 )l ) a pro kaˇzd´e x ∈ S \ A plat´ı h(x) 6= i (pravdˇepodobnost tohoto jevu je (1 − m1 )n−l ). To znamen´a, ˇze jev m´a binomi´aln´ı rozdˇelen´ı. Zde jsme nepˇresn´ı kv˚ uli moˇzn´emu rozd´ılu 1 ve velikostech mnoˇzin. Obecnˇe pro n´ahodnˇe zvolen´e x ∈ U a −1 dan´e i je Prob(h(x) = i) = |h |U(i)| a kdyˇz existuj´ı dvˇe r˚ uzn´a i, j ∈ {0, 1, . . . , m − 1} takov´a, ˇze |h−1 (i)| 6= | −1
|h−1 (j)|, pak obecnˇe |h |U(i)| 6= m1 . Toto nastane i v pˇr´ıpadˇe, kdyˇz jsme jiˇz zvolili nˇejak´ y prvek v h−1 (i). | Protoˇze vˇsak pˇredpokl´ad´ame, ˇze n, m << |U | tak ve vˇsech uvaˇzovan´ ych pˇr´ıpadech je P rob(h(x) = i) 1 1 pˇribliˇznˇe m , a m˚ uˇzeme tuto pravdˇepodobnost aproximovat hodnotou m .
9
2.3.5
Oˇ cek´ avan´ a d´ elka ˇ retˇ ezc˚ u
Vˇ eta. Oˇcek´avan´ a d´elka ˇretˇezc˚ u je
n . m
D˚ ukaz. E(l) =
n X
l=0 n X
lpn,l l
l=0
n
n X 1 n 1 l = l ( ) (1 − )n−l = m l m l=0
1 1 n! ( )l (1 − )n−l = l!(n − l)! m m
n X (n − 1)! 1 1 ( )l−1 (1 − )n−l = m l=1 (l − 1)!(n − l)! m m n 1 n X n − 1 1 l−1 ( ) (1 − )(n−1)−(l−1) = m l=1 l − 1 m m n−1 n X n−1 1 l 1 ( ) (1 − )n−1−l = l m l=0 m m 1 n n 1 ( + 1 − )n−1 = . m m m m
Toto je standardn´ı element´arn´ı v´ ypoˇcet oˇcek´avan´e hodnoty binomi´aln´ıho rozdˇelen´ı.
Lemma (Druh´ y moment). E(l2 ) =
n (1 m
+
n−1 ) m
D˚ ukaz. E(l2 ) =E(l(l − 1)) + E(l), n X n 1 l 1 E(l(l − 1)) = l(l − 1) ( ) (1 − )n−l = l m m l=0 n 1 (n−2)−(l−2) n(n − 1) X n − 2 1 l−2 ) (1 − ) = ( l − 2 m2 m m l=2 n−2 n(n − 1) X n − 2 1 l 1 ( ) (1 − )n−2−l = 2 l m m m l=0 n(n − 1) , m2 n(n − 1) n n n−1 E(l2 ) = + = (1 + ). 2 m m m m
Vˇ eta. Rozptyl ˇretˇezc˚ u je nm(1 −
1 ). m
10
D˚ ukaz. var(l) =E(l − E(l))2 = E(l2 ) − (E(l))2 = n n−1 n n 1 (1 + ) − ( )2 = (1 − ). m m m m m
Shrneme v´ ysledky:
Oˇcek´avan´a d´elka ˇretˇezc˚ u je
n m
a rozptyl d´elky ˇretˇezc˚ u je
n m (1
− m1 ).
Toto jsou standardn´ı element´arn´ı odvozen´ı druh´eho momentu a rozptylu binomi´aln´ıho rozdˇelen´ı. 2.3.6
Oˇ cek´ avan´ y nejdelˇ s´ı ˇ retˇ ezec
Spoˇc´ıt´ame E(N P ) oˇcek´avanou d´elku maxim´aln´ıho ˇretˇezce (N P jako nejhorˇs´ı pˇr´ıpad :)) P Lemma. E(N P ) = j Prob(maxi ℓ(i) ≥ j), kde ℓ(i) je d´elka i-t´eho ˇretˇezce. D˚ ukaz. Plat´ı, ˇze
Prob(max ℓ(i) = j) = Prob(max ℓ(i) ≥ j) − Prob(max ℓ(i) ≥ j + 1). i
i
i
Pak m˚ uˇzeme poˇc´ıtat: E(N P ) =
X
j Prob(max ℓ(i) = j) = i
j
X j
X j
X j
X j
X j
j(Prob(max ℓ(i) ≥ j) − Prob(max ℓ(i) ≥ j + 1)) = i
i
j Prob(max ℓ(i) ≥ j) − i
j Prob(max ℓ(i) ≥ j) − i
X j
X j
j Prob(max ℓ(i) ≥ j + 1) = i
(j − 1) Prob(max ℓ(i) ≥ j) = i
(j − j + 1) Prob(max ℓ(i) ≥ j) = i
Prob(max ℓ(i) ≥ j). i
Vysvˇetlen´ı: Pˇri ˇctvrt´e rovnosti se v druh´e sumˇe zvˇetˇsil index, pˇres kter´ y sˇc´ıt´ame, o 1, v p´at´e rovnosti se k sobˇe daly koeficienty pˇri stejn´ ych pravdˇepodobnostech ve dvou sum´ach.
11
n j−1 1 Lemma. Prob(maxi (ℓ(i)) ≥ j) ≤ min{1, n( m ) j! }.
D˚ ukaz. Prob(max(ℓ(i)) ≥ j) = i
Prob(ℓ(1) ≥ j ∨ ℓ(2) ≥ j ∨ · · · ∨ ℓ(m − 1) ≥ j) ≤ X n 1 j Prob(ℓ(i) ≥ j) ≤ m ( ) = j m i Qj−1 n 1 k=0 (n − k) 1 j−1 ( ) ≤ n( )j−1 . j! m m j! Vysvˇetlen´ı: Prvn´ı nerovnost plyne z toho, ˇze pravdˇepodobnost disjunkce jev˚ u je menˇs´ı neˇz souˇcet pravdˇepodobnost´ı jev˚ u, druh´a nerovnost plyne z toho, ˇze i-t´ y ˇretˇezec m´a d´elku alespoˇ n j, jakmile existuje podmnoˇzina A ⊆ S takov´a, ˇze |A| = j (tˇechto moˇznost´ı je nj ) a pro kaˇzd´e x ∈ A plat´ı h(x) = i (pravdˇepodobnost tohoto jevu je ( m1 )j ). Protoˇze pravdˇepodobnost je pro vˇsechna i stejn´a a i nab´ yv´a m hodnot, dost´av´ame druhou nerovnost. N´asleduj´ıc´ı rovnost plyne z rozeps´an´ı binomick´ ych koeficient˚ u. Posledn´ı nerovnost dostaneme nahrazen´ım n − k hodnotou n. ˇ pravdˇepodobnost je menˇs´ı neˇz 1 je trivi´aln´ı. Ze
Lemma (Stirling˚ uv vzorec pro faktori´aly (bez d˚ ukazu)). j! =
√ 2jπ
Lemma (Pomocn´e lemma). Kdyˇz ( qe )q ≤ n, pak q ≤ (1 + o(1)) lnlnlnnn .
j j e
1+
1 12j
+
1 288j 2
D˚ ukaz. Vˇsimnˇeme si nejdˇr´ıv, ˇze plat´ı ln n ln n ln n (ln( )−1 =(ln ln n − ln ln ln n − 1) = ln ln n ln ln n ln ln n ln n(ln ln ln n) ln n ln n − − = ln ln n ln ln n 1 ln ln ln n − ) = (1 + o(1)) ln n, ln n(1 − ln ln n ln ln n protoˇze limn7→∞
ln ln ln n ln ln n
= 0 = limn7→∞
1 . ln ln n
lim
n7→∞
Odtud plyne !
ln n ln ln n
e
= e(1+o(1)) ln n = n.
Protoˇze ( qe )q je rostouc´ı funkce, tak dost´av´ame, ˇze q ≤ (1 + o(1))( lnlnlnnn ).
n j−1 1 Oznaˇcme si j0 = min{j | n( m ) j! ≤ 1}
Lemma (Omezen´ı j0 ). Pokud α =
n m
≤ 1, pak j0 ≤
(1+o(1)) log n log log n
12
+ O(j −3 )
D˚ ukaz. j0 = min{j | n(
n j−1 1 j ln n ) ≤ 1} ≤ min{j | n ≤ j!} ≤ min{j | n ≤ ( )j } ≤ (1 + o(1)) . m j! e ln ln n
Prvn´ı nerovnost je jen pˇreveden´ı na druhou stranu a ignorov´an´ı zlomku menˇs´ıho neˇz 1, druh´a nerovnost plyne ze Stirlingova vzorce, tˇret´ı plyne z pomocn´eho lemmatu.
Vˇ eta. Pokud α =
n m
≤ 1, horn´ı odhad odhad oˇcek´avan´e d´elky maxim´ aln´ıho ˇretˇezce je O( logloglogn n )
D˚ ukaz. E(N P ) =
X
Prob(max(ℓ(i)) ≥ j) ≤
X
min{1, n(
j
i
n j−1 1 ) }= m j!
j
j0 X
1+
j=1
∞ X
j=j0 +1 ∞ X
j0 +
n j0 ! j=j
j0 +
1 j0 +1 − j01+1 +
0
∞ X n n j−1 1 = ≤ j0 + n( ) m j! j! j=j +1 0
X j0 ! 1 j−j0 ≤ j0 + ( ) = j! j +1 +1 j=j +1 0 1
0
= j0 +
1 = O(j0 ). j0
n j−1 1 Vysvˇetlen´ı: Pˇri druh´e rovnosti jsme pouˇzili, ˇze n( m ) j! ≤ 1, pr´avˇe kdyˇz j ≤ j0 . Pˇri druh´e nerovnosti n jsme pouˇzili, ˇze m ≤ 1, pˇri tˇret´ı nerovnosti jsme pouˇzili, ˇze jn0 ! ≤ 1 a
1 1 j−j0 j0 ! . = Qj ) ≤( j! j + 1 k 0 k=j +1 0
aroveˇ n i doln´ı odhad E(N P ). Vˇ eta (bez d˚ ukazu). Kdyˇz 0.5 ≤ α ≤ 1, je O( logloglogn n ) z´ Shrneme z´ıskan´ y v´ ysledek
n ≤ 1 je pˇri haˇsov´an´ı se separovan´ ymi ˇretˇezci Za pˇredpokladu α = m log n horn´ı odhad oˇcek´avan´e d´elky maxim´aln´ıho ˇretˇezce O( log log n ). Kdyˇz 0.5 ≤ α ≤ 1, je to z´aroveˇ n i doln´ı odhad.
13
2.3.7
Oˇ cek´ avan´ y poˇ cet test˚ u
Test je porovn´an´ı argumentu operace s prvkem na dan´em m´ıstˇe ˇretˇezce nebo zjiˇstˇen´ı, ˇze vyˇsetˇrovan´ y ˇretˇezec je pr´azdn´ y. Budeme rozliˇsovat dva pˇr´ıpady: u ´spˇeˇsn´e vyhled´av´ an´ı – argument operace je mezi prvky reprezentovan´e mnoˇziny, ne´ uspˇeˇsn´e vyhled´av´ an´ı – argument operace nen´ı mezi prvky reprezentovan´e mnoˇziny. Vˇ eta (Ne´ uspˇeˇsn´e vyhled´av´an´ı). Pˇri haˇsov´an´ı se separovan´ymi ˇretˇezci je oˇcek´avan´y poˇcet test˚ u pˇri ne´ uspeˇs−α n´em vyhled´avan´ı pˇribliˇznˇe e + α D˚ ukaz. Oˇcek´avan´ y poˇcet test˚ u: E(T ) = Prob(ℓ(i) = 0) +
X
l Prob(ℓ(i) = l) =
l
pn,0 +
X
lpn,l =
l
(1 −
1 n n ) + ≈ e−α + α. m m
Vysvˇetlen´ı: Zjiˇstˇen´ı, zda ˇretˇezec je pr´azdn´ y, vyˇzaduje jeden test, tj. Prob(ℓ(i) = 0) nen´ı s koeficientem 0, ale 1. Protoˇze pravdˇepodobnosti y P jsou stejn´e pro vˇsechny ˇretˇezce, nemus´ıme specifikovat ˇretˇezec, kter´ vyˇsetˇrujeme, staˇc´ı ps´at obecnˇe i. l lpn,l jsme spoˇc´ıtali pˇri v´ ypoˇctu oˇcek´avan´e d´elky ˇretˇezce. ´ eˇsn´e vyhled´av´an´ı). Pˇri haˇsov´an´ı se separovan´ymi ˇretˇezci je oˇcek´avan´y poˇcet test˚ Vˇ eta (Uspˇ u pˇri u ´speˇsn´em α vyhled´avan´ı pˇribliˇznˇe 1 + 2 D˚ ukaz. Zvolme jeden ˇretˇezec prvk˚ u o d´elce l. Poˇcet test˚ u pˇri vyhled´an´ı vˇsech prvk˚ u v tomto ˇretˇezci je l+1 1 + 2 + ··· + l = . 2 Oˇcek´avan´ y poˇcet test˚ u pˇri vyhled´an´ı vˇsech prvk˚ u v nˇejak´em ˇretˇezci je X l + 1 X l+1 pn,l . Prob(ℓ(i) = l) = 2 2 l l Oˇcek´an´ y poˇcet test˚ u pˇri vyhled´an´ı vˇsech prvk˚ u v tabulce je m
P
l
l+1 2
pn,l .
Oˇcek´avan´ y poˇcet test˚ u pro vyhled´an´ı jednoho prvku je n n n X mX l+1 m X 2 pn,l = l pn,l + lpn,l = 2 n l=0 2n l=0 l=0
n n X m X l(l − 1)pn,l + 2 lpn,l = 2n l=1 l=1
m n(n − 1) 2n n−1 ( + )= +1≈ 2 2n m m 2m α 1+ . 2
14
Jin´ y postup. D˚ ukaz. Pˇredpokl´adejme, ˇze poˇcet test˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı prvku x ∈ S je 1+poˇcet porovn´an´ı kl´ıˇc˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı x v operaci INSERT(x). Pak poˇcet porovn´an´ı kl´ıˇc˚ u je d´elka ˇretˇezce, a proto oˇcek´avan´ y poˇcet porovn´an´ı kl´ıˇc˚ u je oˇcek´avan´a d´elka ˇretˇezce. Tedy oˇcek´avan´ y poˇcet test˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı x je 1+oˇcek´avan´a d´elka ˇretˇezce v okamˇziku vkl´ad´an´ı x, neboli n−1
1X n−1 i . (1 + ) = 1 + n i=0 m 2m
Pˇri haˇsov´an´ı se separovan´ ymi ˇretˇezci je oˇcek´avan´ y poˇcet test˚ u pˇri −α ne´ uspeˇsn´em vyhled´avan´ı pˇribliˇznˇe e + α a pˇri u ´spˇeˇsn´em vyhα led´av´an´ı pˇribliˇznˇe 1 + 2 .
N´asleduj´ıc´ı tabulka d´av´a pˇrehled oˇcek´avan´eho poˇctu test˚ u pro r˚ uzn´e hodnoty α α ne´ usp. vyh. u ´spˇeˇs. vyh. α ne´ usp. vyh. u ´spˇeˇs. vyh.
0 0.1 0.2 0.3 0.4 0.5 0.6 1 1.005 1.019 1.041 1.07 1.107 1.149 1 1.05 1.1 1.15 1.2 1.25 1.3 0.7 0.8 0.9 1 2 3 1.196 1.249 1.307 1.368 2.135 3.05 1.35 1.4 1.45 1.5 2 2.5
Vˇsimnˇete si, ˇze oˇcek´avan´ y poˇcet test˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı je menˇs´ı neˇz oˇcek´avan´ y poˇcet test˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı, kdyˇz α ≤ 1. Na prvn´ı pohled vypad´a tento v´ ysledek nesmyslnˇe, ale d˚ uvod je, ˇze poˇcet test˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı pr˚ umˇerujeme proti n, kdeˇzto pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı proti m. Ilustrujeme to na n´asleduj´ıc´ım pˇr´ıkladu: ych ˇretˇezc˚ u m´a d´elku 1 a polovina m´a d´elku 2. Necht’ n = m2 a necht’ polovina nepr´azdn´ Oˇcek´avan´ y poˇcet test˚ u pˇri ne´ uspˇeˇsn´em vyhled´avan´ı: • 1 test pro pr´azdn´e ˇretˇezce a ˇretˇezce d´elky 1 – tˇechto pˇr´ıpad˚ u je • 2 testy pro ˇretˇezce d´elky 2 – tˇechto pˇr´ıpad˚ u je
5m 6
m . 6
Oˇcek´avan´ y poˇcet test˚ u je m1 (1 5m + 2 m6 ) = 67 . 6 Oˇcek´avan´ y poˇcet test˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı: • 1 test pro prvky na prvn´ım m´ıstˇe ˇretˇezce – tˇechto pˇr´ıpad˚ u je
2n 3
• 2 testy pro prvky, kter´e jsou na druh´em m´ıstˇe ˇretˇezce – tˇechto pˇr´ıpad˚ u je n3 . Oˇcek´avan´ y poˇcet test˚ u je n1 (1 2n + 2 n3 ) = 34 . 3 Velikost α je doporuˇcov´ana menˇs´ı neˇz 1, ale nem´a b´ yt hodnˇe mal´a, protoˇze by pamˇet’ nebyla efektivnˇe vyuˇzita. 15
2.4
Haˇ sov´ an´ı s uspoˇ r´ adan´ ymi separovan´ ymi ˇ retˇ ezci
Vylepˇsen´ı metody: haˇsov´an´ı s uspoˇra´dan´ ymi ˇretˇezci. Rozd´ıl proti p˚ uvodn´ı metodˇe – ˇretˇezce jsou uspoˇra´dan´e ve vzr˚ ustaj´ıc´ım poˇrad´ı. Protoˇze ˇretˇezce obsahuj´ı tyt´eˇz prvky, je poˇcet oˇcek´avan´ ych test˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı stejn´ y jako u neuspoˇra´dan´ ych ˇretˇezc˚ u. Pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı konˇc´ıme, kdyˇz argument operace je menˇs´ı neˇz vyˇsetˇrovan´ y prvek v ˇretˇezci, tedy konˇc´ıme dˇr´ıv. 2.4.1
Oˇ cek´ avan´ y poˇ cet test˚ u
2.4.2
Oˇcek´avan´ y poˇcet test˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı pro haˇsov´an´ı s uspoˇra´dan´ ymi ˇretˇezci je pˇribliˇznˇe e−α + 1 + α2 − α1 (1 − e−α ). Oˇcek´avan´ y poˇcet test˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı pro haˇsov´an´ı s uspoˇra´dan´ ymi ˇretˇezci je pˇribliˇznˇe 1 + α2 .
Algoritmy
MEMBER(x) Spoˇc´ıt´ame i := h(x), t := N IL if i-t´ y seznam je nepr´azdn´ y then t :=prvn´ı prvek i-t´eho seznamu while t < x a t 6=posledn´ı prvek i-t´eho seznamu do t :=n´asleduj´ıc´ı prvek i-t´eho seznamu enddo endif if t = x then x ∈ S else x ∈ / S endif INSERT(x) Spoˇc´ıt´ame i := h(x), t := N IL if i-t´ y seznam je nepr´azdn´ y then t :=prvn´ı prvek i-t´eho seznamu while t < x a t 6=posledn´ı prvek i-t´eho seznamu do t :=n´asleduj´ıc´ı prvek i-t´eho seznamu enddo endif if t 6= x then if x < t then vloˇz´ıme x do i-t´eho seznamu pˇred prvek t else vloˇz´ıme x do i-t´eho seznamu za prvek t endif endif
16
DELETE(x) Spoˇc´ıt´ame i := h(x), t := N IL if i-t´ y seznam je nepr´azdn´ y then t :=prvn´ı prvek i-t´eho seznamu while t < x a t 6=posledn´ı prvek i-t´eho seznamu do t :=n´asleduj´ıc´ı prvek i-t´eho seznamu enddo endif if t = x then odstran´ıme x z i-t´eho seznamu endif
2.5
Motivace pro neseparovan´ eˇ retˇ ezce
Nev´ yhody haˇsovan´ı se separovan´ ymi ˇretˇezci – nevyuˇzit´ı alokovan´e pamˇeti (nehospod´arn´e) pouˇz´ıv´an´ı ukazatel˚ u (cache). ˇ sen´ı: vyuˇz´ıt pro ˇretˇezce p˚ Reˇ uvodn´ı tabulku. Pak ˇra´dky tabulky mus´ı m´ıt strukturu, kter´a umoˇzn ˇuje prohled´avat ˇretˇezce, a velikost reprezentovan´e mnoˇziny m˚ uˇze b´ yt nejv´ yˇse rovna velikosti tabulky. Poloˇzky tabulky: • key, • odkaz na uloˇzen´a data, • poloˇzky pro pr´aci s tabulkou. Pˇredpokl´ad´ame, ˇze data jsou velk´a, v tom pˇr´ıpadˇe se ukl´adaj´ı mimo tabulku. V tabulce je jen odkaz na uloˇzen´a data. Pˇri popisu pr´ace s tabulkou tuto ˇca´st budeme vynech´avat (tj. data budou pouze kl´ıˇc). Podle ˇreˇsen´ı kolize dˇel´ıme d´al haˇsov´an´ı: • haˇsov´an´ı s pˇrem´ıst’ov´an´ım • haˇsov´an´ı s dvˇema ukazateli, • sr˚ ustaj´ıc´ı haˇsov´an´ı, • dvojit´e haˇsov´an´ı, • haˇsov´an´ı s line´arn´ım pˇrid´av´an´ım.
2.6 2.6.1
Haˇ sov´ an´ı s pˇ rem´ıst’ov´ an´ım Nepˇ resn´ y popis
(pozn.: sekce nepˇresn´y popis“ jsou opravdu nepˇresn´e) ” V tabulce na ˇra´dku i bud’ nic nen´ı (= do i se nic nezaheˇsovalo), nebo tam zaˇc´ın´a ˇretˇezec od nˇeˇceho, co koliduje v h(i), nebo je tam prostˇredek nˇejak´eho jin´eho ˇretˇezce (taky jenom tehdy, pokud se do i nic nezaheˇsovalo). 17
Pokud tam pˇri vkl´ad´an´ı nic neni, d´am to tam. Pokud tam je prostˇredek jin´eho ˇretˇezce, pˇrem´ıst´ım ten prostˇredek (od toho n´azev metody) do jin´eho voln´eho m´ısta a vkl´adan´ y prvek d´am do novˇe uvolnˇen´eho m´ısta. Pokud tam je zaˇca´tek spr´avn´eho ˇretˇezce, dojedu na konec a d´am to za nˇej. 2.6.2
Ilustrace
Poloˇzky pro pr´aci s tabulkou: next, previous poloˇzka next – ˇc´ıslo ˇra´dku tabulky obsahuj´ıc´ı n´asleduj´ıc´ı poloˇzku seznamu poloˇzka previous – ˇc´ıslo ˇra´dku tabulky obsahuj´ıc´ı pˇredch´azej´ıc´ı poloˇzku seznamu. Protoˇze velikost tabulky omezuje velikost reprezentovan´e mnoˇziny, m˚ uˇze nastat pˇreplnˇen´ı. O ˇreˇsen´ı pˇr´ıpadn´eho pˇreplnˇen´ı pojedn´ame pozdˇeji na str. 29. Stejn´ y zp˚ usob ˇreˇsen´ı pˇreplnˇen´ı se pouˇz´ıv´a i v dalˇs´ıch metod´ach, kde velikost tabulky omezuje velikost reprezentovan´e mnoˇziny. Pˇr´ıklad: U = {1, 2, . . . , 1000}, h(x) = x mod 10, uloˇzen´a mnoˇzina S = {1, 7, 11, 53, 73, 141, 161}, ˇretˇezce: P (1) = (1, 141, 11, 161), P (3) = (73, 53), P (7) = (7). Haˇsovac´ı tabulka: ˇra´dek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
key
next previous
1
9
73
6
161 53 7 11 141
8 3 5 8
9 1
Tabulka vznikla n´asleduj´ıc´ı posloupnost´ı operac´ı: INSERT(1), INSERT(141), INSERT(11), INSERT(73), INSERT(53), INSERT(7), INSERT(161). 2.6.3
Algoritmy
MEMBER(x) Spoˇc´ıt´ame i := h(x) if i.previous 6=pr´azdn´e nebo i.key =pr´azdn´e then V´ ystup: x ∈ / S, stop endif while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo if i.key = x then V´ ystup: x ∈ S else V´ ystup: x ∈ / S endif
18
DELETE(x) Spoˇc´ıt´ame i := h(x) if i.previous 6=pr´azdn´e nebo i.key =pr´azdn´e then stop endif while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo if i.key = x then if i.previous 6=pr´azdn´e then (i.previous).next := i.next if i.next 6=pr´azdn´e then (i.next).previous := i.previous endif i.key := i.next := i.previous := pr´azdn´e else if i.next 6=pr´azdn´e then i.key := (i.next).key, i.next := (i.next).next if ((i.next).next) 6=pr´azdn´e then ((i.next).next).previous := i endif (i.next).key := (i.next).next := (i.next).previous := pr´azdn´e else i.key := pr´azdn´e endif endif endif INSERT(x) Spoˇc´ıt´ame i := h(x) if i.key = N IL then i.key := x, stop endif if i.previous 6= N ILthen if neexistuje pr´azdn´ y ˇra´dek tabulky then V´ ystup: pˇreplnˇen´ı else necht’ j je voln´ y ˇra´dek tabulky j.key := i.key, j.previous := i.previous, j.next := i.next, (j.previous).next := j if j.next 6= N IL then (j.next).previous := j endif i, key := x, i.next := i.previous :=pr´azdn´e endif endif else while i.next 6= N IL a i.key 6= x do i := i.next enddo if i.key 6= x then if neexistuje pr´azdn´ y ˇra´dek tabulky then V´ ystup: pˇreplnˇen´ı else necht’ j je voln´ y ˇra´dek tabulky i.next := j, j.key := x, j.previous := i endif endif endif V pˇr´ıkladu provedeme INSERT(28), nov´ y ˇra´dek je 4. ˇra´dek
19
– v´ ysledn´a haˇsovac´ı tabulka ˇra´dek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9) 2.6.4
next previous
1
9
73 11 161 53 7 28 141
6 5
4
9 4 3
1
Oˇ cek´ avan´ y poˇ cet test˚ u
2.6.5
key
Oˇcek´avan´ y poˇcet test˚ u je stejn´ y jako pro haˇsov´an´ı se separovan´ ymi ˇretˇezci: α u ´spˇeˇsn´e vyhled´av´an´ı: n−1 2m + 1 ≈ 1 + 2 n ≈ e−α + α, ne´ uspˇeˇsn´e vyhled´av´an´ı: (1 − m1 )n + m kde m = velikost tabulky, n = velikost S, tj. poˇcet uloˇzen´ ych prvk˚ u, n α = m = faktor zaplnˇen´ı.
Diskuse
Nev´ yhodou haˇsov´an´ı s pˇrem´ıst’ov´an´ım je v operaci INSERT pˇr´ıpad, ˇze previous h(i)-t´eho ˇra´dku je nepr´azdn´ y. Pak pˇrem´ıst’ujeme poloˇzku na h(i)-t´em ˇra´dku na voln´ y ˇra´dek a to vyˇzaduje v´ıce ˇcasu – operace s pˇrem´ıstˇen´ım poloˇzky. Toto odstraˇ nuje dalˇs´ı implementace haˇsov´an´ı se separuj´ıc´ımi ˇretˇezci.
2.7 2.7.1
Haˇ sov´ an´ı s dvˇ ema ukazateli Nepˇ resn´ y popis
V ˇra´dku i je u ´plnˇe jedno, co je v poloˇzce key, resp. nijak to nesouvis´ı s v´ ysledkem heˇsovac´ı funkce – co souvis´ı je poloˇzka begin, co ˇr´ık´a, kde ˇretˇezec k dan´emu ˇc´ıslu zaˇc´ın´a. Nemus´ıme nic pˇrem´ıst’ovat, staˇc´ı ukazovat na spr´avn´ y zaˇca´tek. 2.7.2
Ilustrace
Poloˇzky pro pr´aci s tabulkou – next, begin Poloˇzka next – ˇc´ıslo ˇra´dku tabulky obsahuj´ıc´ı n´asleduj´ıc´ı poloˇzku seznamu Poloˇzka begin – ˇc´ıslo ˇra´dku tabulky obsahuj´ıc´ı prvn´ı poloˇzku seznamu s touto adresou Stejn´a data jako v minul´em pˇr´ıpadˇe
20
Haˇsovac´ı tabulka: ˇra´dek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
key
next begin
1
9
1
73
7
3
161 7 53 11 141
6 5 8
Tabulka vznikla n´asleduj´ıc´ı posloupnost´ı operac´ı: INSERT(1), INSERT(141), INSERT(11), INSERT(73), INSERT(53), INSERT(7), INSERT(161). 2.7.3
Algoritmy
MEMBER(x) Spoˇc´ıt´ame i := h(x) if i.begin =pr´azdn´e then V´ ystup: x ∈ / S, stop else i := i.begin endif while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo if i.key = x then V´ ystup: x ∈ S else V´ ystup: x ∈ / S endif DELETE(x) Spoˇc´ıt´ame i := h(x) if i.begin =pr´azdn´e then stop else j := i, i := i.begin endif while i.next 6=pr´azdn´e a i.key 6= x do j := i, i := i.next enddo if i.key = x then if i = j.begin then if i.next 6=pr´azdn´e then j.begin := i.next else j.begin :=pr´azdn´e endif else j.next := i.next endif i.key := i.next :=pr´azdn´e endif
21
INSERT(x) Spoˇc´ıt´ame i := h(x) if i.begin =pr´azdn´e then if i.key =pr´azdn´e then i.key := x, i.begin := i else if neexistuje pr´azdn´ y ˇra´dek tabulky then V´ ystup: pˇreplnˇen´ı else necht’ j je voln´ y ˇra´dek tabulky j.key = x, i.begin := j endif endif else i := i.begin while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo if i.key 6= x then if neexistuje pr´azdn´ y ˇra´dek tabulky then V´ ystup: pˇreplnˇen´ı else necht’ j je voln´ y ˇra´dek tabulky i.next := j, j.key := x endif endif endif V pˇr´ıkladu provedeme INSERT(28), nov´ y ˇra´dek je 4. ˇra´dek – v´ ysledn´a haˇsovac´ı tabulka ˇra´dek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9) 2.7.4
key
next begin
1
9
1
73 28 161 7 53 11 141
7
3
5 8
6 4
Oˇ cek´ avan´ y poˇ cet test˚ u
Algoritmus pˇri pr´aci s poloˇzkami je rychlejˇs´ı neˇz pˇri haˇsov´an´ı s pˇrem´ıst’ov´an´ım, ale zaˇca´tek ˇretˇezce v jin´em m´ıstˇe tabulky pˇrid´av´a jeden test.
Oˇcek´avan´ y poˇcet test˚ u: n−1 α2 α + ≈ 1 + u ´spˇeˇsn´ y pˇr´ıpad: 1 + (n−1)(n−2) 2 6m 2m 6 + 2 2 ne´ uspˇeˇsn´ y pˇr´ıpad: ≈ 1 + α2 + α + e−α (2 + α) − 2. 22
2.8 2.8.1
Sr˚ ustaj´ıc´ı haˇ sov´ an´ı - pˇ rehled Nepˇ resn´ y popis
M´ame ˇretˇezce jako v minul´ ych dvou algoritmech, ale pokud se tref´ım doprostˇred ˇretˇezce, tak ho nepˇrem´ıst’uji, ale srostu s n´ım. Protoˇze nic nepˇrem´ıst’ujeme, nen´ı potˇreba previous. Typy: • Standardn´ı – norm´aln´ı tabulka. – LISCH - vkl´ad´am na konec ˇretˇezce – EISCH - vkl´ad´am hned za prvek • Nestandardn´ı“ – bez p´ısmene nav´ıc :) – tabulka rozˇs´ıˇrena o pomocnou tabulku, kam ukl´ad´am jako ” prvn´ı – LICH - vkl´ad´am na konec ˇretˇezce – EICH - vkl´ad´am hned za prvek – VICH - komplikovanost, viz d´al 2.8.2
Pˇ rehled
Sr˚ ustaj´ıc´ı haˇsov´an´ı se dˇel´ı podle pr´ace s pamˇet´ı na standardn´ı a na sr˚ ustaj´ıc´ı haˇsov´an´ı s pomocnou pamˇet´ı (kter´e se naz´ yv´a jen sr˚ ustaj´ıc´ı haˇsov´an´ı) a podle zp˚ usobu pˇrid´av´an´ı dalˇs´ıho prvku. Pop´ıˇseme metody: Standardn´ı sr˚ ustaj´ıc´ı haˇsov´an´ı: LISCH, EISCH, Sr˚ ustaj´ıc´ı haˇsov´an´ı: LICH, VICH, EICH. Vˇsechny metody pro pr´aci s tabulkou pouˇz´ıvaj´ı jen poloˇzku next – ˇc´ıslo ˇra´dku tabulky obsahuj´ıc´ı n´asleduj´ıc´ı poloˇzku seznamu. Z´akladn´ı idea: ˇretˇezec zaˇc´ın´a na sv´em m´ıstˇe, ale pokud uˇz tam byl uloˇzen nˇejak´ yu ´daj, pak ˇretˇezec tohoto u ´daje sroste s ˇretˇezcem zaˇc´ınaj´ıc´ım na tomto ˇra´dku. To znamen´a, ˇze prvky ˇretˇezce, kter´ y zaˇc´ın´a na tomto m´ıstˇe, budou uloˇzeny v ˇretˇezci, kter´ y uˇz je uloˇzen na tomto m´ıstˇe, ale jen od tohoto m´ısta d´al.
2.9 2.9.1
Metody EISCH a LISCH Popis
• EISCH – early-insertion standard coalesced hashing • LISCH – late-insertion standard coalesced hashing. Organizace tabulky je stejn´a jako v pˇredchoz´ıch pˇr´ıpadech. Z´akladn´ı ideje: LISCH pˇrid´av´a nov´ y prvek na konec ˇretˇezce, EISCH pˇrid´av´a nov´ y prvek x do ˇretˇezce na ˇra´dek h(x) (pokud je pr´azdn´ y) nebo hned za prvek na ˇra´dku h(x)
23
2.9.2
Ilustrace
U = {1, 2, . . . , 1000}, h(x) = x mod 10 mnoˇzina S = {1, 7, 11, 53, 73, 141, 171} je uloˇzena v haˇsovac´ı tabulce ˇra´dek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
key next 1
9
73
6
7 53 161 11 141
5 7 8
Tabulka pro metodu LISCH vznikla n´asleduj´ıc´ı posloupnost´ı operac´ı: INSERT(1), INSERT(141), INSERT(11), INSERT(73), INSERT(53), INSERT(161), INSERT(7). Pro metodu EISCH tabulka vznikla n´asleduj´ıc´ı posloupnost´ı operac´ı: INSERT(1), INSERT(161), INSERT(11), INSERT(73), INSERT(53), INSERT(7), INSERT(141). Provedeme INSERT(28), pˇrid´av´ame do ˇcvrt´eho r´adku, v´ ysledn´a tabulka vlevo je pro metodu LISCH, vpravo pro metodu EISCH. ˇra´dek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9) 2.9.3
key next 1
9
73 28 7 53 161 11 141
6
ˇra´dek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
4 5 7 8
Algoritmy
Algoritmus operace MEMBER je pro obˇe metody stejn´ y. MEMBER(x) Spoˇc´ıt´ame i := h(x) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo if i.key = x then V´ ystup: x ∈ S else V´ ystup: x ∈ / S endif
24
key next 1
9
73 28 7 53 161 11 141
6 7
5 4 8
Metoda LISCH: INSERT(x) Spoˇc´ıt´ame i := h(x) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo if i.key 6= x then if neexistuje pr´azdn´ y ˇra´dek tabulky then V´ ystup: pˇreplnˇen´ı else necht’ j je pr´azdn´ y ˇra´dek j.key := x, i.next := j endif endif Metoda EISCH: INSERT(x) Spoˇc´ıt´ame k := i := h(x) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo if i.key 6= x then if neexistuje pr´azdn´ y ˇra´dek tabulky then V´ ystup: pˇreplnˇen´ı else necht’ j je voln´ y ˇra´dek tabulky j.next := k.next, k.next := j, j.key := x endif endif Efektivn´ı operace DELETE nen´ı zn´am´a, ale i primitivn´ı algoritmy pro operaci DELETE maj´ı rozumnou oˇcek´avanou ˇcasovou sloˇzitost. 2.9.4
Oˇ cek´ avan´ y poˇ cet test˚ u ne´ uspˇ eˇ sn´ eho vyhled´ av´ an´ı (sn+1 ∈ / S)
Popis situace: Uloˇzena mnoˇzina S = {s1 , s2 , . . . , sn } do tabulky velikosti m, je d´an prvek sn+1 a m´ame zjistit, zda sn+1 ∈ S. Oznaˇcme ai = h(si ) pro i = 1, 2, . . . , n + 1, kde h je pouˇzit´a haˇsovac´ı funkce. Pˇredpoklad: vˇsechny posloupnosti a1 , a2 , . . . , an+1 jsou stejnˇ e pravdˇ epodobn´ e. V´ ybˇer pr´azdn´eho ˇra´dku je pevnˇe dan´ y, to znamen´a, ˇze pˇri stejnˇe obsazen´ ych ˇradc´ıch dostaneme vˇzdy stejn´ y pr´azdn´ y ˇra´dek. Definice. C(a1 , a2 , . . . , an ; an+1 ) oznaˇcuje poˇcet test˚ u pro zjiˇstˇen´ı, ˇze sn+1 ∈ / S – tj. to, co chceme spoˇc´ıtat, pro konkr´etn´ı posloupnost an . Lemma. Oˇcek´avan´y poˇcet test˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı v mnoˇzinˇe S je P a1 ,a2 ,...,an+1 C(a1 , a2 , . . . , an ; an+1 ) mn+1
D˚ ukaz. Sˇc´ıt´a se pˇres vˇsechny posloupnosti a1 , a2 , . . . , an+1 – a tˇech je mn+1 .
ˇ ezec d´elky l v mnoˇzinˇe S je maxim´ Definice. Retˇ aln´ı posloupnost adres (b1 , b2 , . . . , bl ) takov´ a, ˇze bi .next = bi+1 pro i = 1, 2, . . . , l − 1. Existence ˇretˇezce je d´ana posloupnost´ı a (pˇri jin´em poˇrad´ı by vzniknul jinak, naopak dvˇe mnoˇziny se stejnou posloupnost´ı a maj´ı stejn´y ˇretˇezec).
25
Lemma. Jeden ˇretˇezec d´elky l > 0 v jedn´e dan´e posloupnosti {an } pˇrispˇel k souˇctu poˇctem test˚ u 1 + 2 + · · · + l = l + 2l .
P
C(a1 , a2 , . . . , an ; an+1 )
D˚ ukaz. Kdyˇz v mnoˇzinˇe {an } tento ˇretˇezec existuje a adresa an+1 je i-t´ y prvek v ˇretˇezci, pak poˇcet test˚ u je l − i + 1 – poˇcet test˚ u znamen´a projet“ kompletn´ı zbytek ˇretˇezce. ”
Definice. cn (l) = poˇcet vˇsech ˇretˇezc˚ u d´elky l ve vˇsech reprezentac´ıch n-prvkov´ych mnoˇzin (ztotoˇzn ˇujeme dvˇe mnoˇziny, kter´e mˇely stejnou posloupnost adres pˇri ukl´ adan´ı prvk˚ u). P P P Lemma. C(a1 , a2 , . . . , an ; an+1 ) = cn (0) + nl=1 lcn (l) + nl=1 2l cn (l) D˚ ukaz.
X
n X
l C(a1 , a2 , . . . , an ; an+1 ) = cn (0) + (l + )cn (l) 2 l=1 n n X X l cn (l), = cn (0) + lcn (l) + 2 l=1 l=1
kde cn (0) je poˇcet pr´azdn´ ych ˇra´dk˚ u ve vˇsech reprezentac´ıch. cn (0) je zde proto, ˇze test na pr´azdnost je O(1).1 Sˇc´ıt´ame vˇsechny moˇzn´e C jako souˇcet pˇres vˇsechny moˇzn´e ˇretˇezce v˚ ubec, ve vˇsech mnoˇzin´ach.
Lemma. cn (0) = (m − n)mn D˚ ukaz. Reprezentace S m´a m − n pr´azdn´ ych ˇra´dk˚ u, vˇsech posloupnost´ı n-adres je mn , proto cn (0) = (m − n)mn . (pozor, opravdu poˇc´ıt´ame vˇsechny moˇzn´e pr´azdn´e ˇretˇezce v˚ ubec)
Lemma.
Pn
l=1
lcn (l) = nmn
Pn D˚ ukaz. a d´elka vˇsech ˇretˇezc˚ u ve vˇsech tabulk´ach reprezentuj´ıc´ıch vˇsechny n-prvkov´e l=1 lcn (l) je celkov´ mnoˇziny, a proto n X lcn (l) = nmn . l=1
1
pozn´ amka studenta - tohle mi nen´ı trochu jasn´e :(
26
Lemma (Rekurentn´ı vztah pro cn (l)). cn+1 (l) = (m − l)cn (l) + (l − 1)cn (l − 1). D˚ ukaz. Pˇrid´av´ame prvek s adresou an+1 . Pak ˇretˇezec d´elky l v reprezentaci S z˚ ustal stejn´ y, kdyˇz adresa an+1 neleˇzela v tomto ˇretˇezci, v opaˇcn´em pˇr´ıpadˇe se d´elka ˇretˇezce zvˇetˇsila na l + 1. Proto pˇrid´an´ı jednoho prvku vytvoˇrilo z ˇretˇezce d´elky l celkem m − l ˇretˇezc˚ u d´elky l a l ˇretˇezc˚ u d´elky l + 1. Vysˇc´ıt´an´ım pˇres vˇsechny n-prvkov´e posloupnosti adres dost´av´ame cn+1 (l) = (m − l)cn (l) + (l − 1)cn (l − 1).
Lemma (souˇcet binomick´ ych hodnot). (m − l) D˚ ukaz.
l 2
+l
l+1 2
= (m + 2)
l 2
+l
l 1 l+1 (m − l) +l = (l2 m − lm − l3 + l2 + l3 + l2 ) = 2 2 2 1 2 (l m − lm + 2l2 ) = 2 1 2 (l m − lm + 2(l2 − l)) + l = 2 l (m + 2) + l. 2
Oznaˇcme Sn =
Pn
l l=1 2
cn (l) posledn´ı sˇc´ıtanec.
Lemma (Rekurentn´ı vztah pro Sn ). Sn = (m + 2)Sn−1 + (n − 1)mn−1 D˚ ukaz. Sn =
n X l
cn (l) = 2 l l (m − l)cn−1 (l) + (l − 1)cn−1 (l − 1) = 2 2 l=1 n−1 n X X l+1 l lcn−1 (l) = (m − l)cn−1 (l) + 2 2 l=0 l=1 n (m − n)cn−1 (n)+ 2 n−1 X l l+1 1 ( (m − l) + l)cn−1 (l) + 0cn−1 (0) = 2 2 2 l=1 n−1 n−1 X X l (m + 2)cn−1 (l) + lcn−1 (l) = 2 l=1 l=1 l=1 n X
(m + 2)Sn−1 + (n − 1)mn−1 ,
kde jsme pouˇzili, ˇze cn−1 (n) = 0 a lemma o souˇctu binomick´ ych hodnot. 27
Lemma (Prvn´ı vztah pro Sn ). Sn = (m + 2)n−1 D˚ ukaz. Rekurence pro Sn d´av´a
Pn−1 i=1
i
i m m+2
Sn =(m + 2)Sn−1 + (n − 1)mn−1 = (m + 2)2 Sn−2 + (m + 2)(n − 2)mn−2 + (n − 1)mn−1 = (m + 2)3 Sn−3 + (m + 2)2 (n − 3)mn−3 + (m + 2)(n − 2)mn−2 + (n − 1)mn−1 = n−1 X
(m + 2)n−1 S0 +
i=0
(m + 2)n−1 (m + 2)n−1
n−1 X
(m + 2)i (n − 1 − i)mn−1−i =
(n − 1 − i)
i=0 n−1 X i=1
i
m i , m+2
m n−1−i = m+2
kde jsme vyuˇzili, ˇze S0 = 0.
Definice. Tcn =
Pn
i=1
ici pro n = 1, 2, . . . a c 6= 1
Lemma (Vztah pro Tcn ). Tcn = D˚ ukaz. Z cTcn =
Pn
i=1
ncn+2 − (n + 1)cn+1 + c c−1
ici+1 plyne (c − 1)Tcn =cTcn − Tcn =
n+1 X i=2
(i − 1)ci −
n X
ici =
i=1
n X n+1 nc + ((i − 1)ci − ici ) − c = i=2
ncn+1 +
n X i=2
ncn+1 −
n X i=1
−ci − c =
ci = ncn+1 −
ncn+2 − (n + 1)cn+1 + c . c−1 Tedy plat´ı Tcn =
cn+1 − c = c−1
ncn+2 − (n + 1)cn+1 + c . (c − 1)2
28
Lemma (Druh´ y vztah pro Sn ). Sn = D˚ ukaz. Protoˇze
m m+2
1 4
m(m + 2)n − mn+1 − 2nmn
6= 1, dost´av´ame dosazen´ım vztahu pro Tcn do prvn´ıho vztahu pro Sn , ˇze
Sn =(m + 2)
(n − 1) n−1
n+1 n m m − n m+2 m+2 2 m −1 m+2
+
m m+2
=
m n m m n+1 1 −n + = (m + 2)n+1 (n − 1) 4 m+2 m+2 m+2 1 (n − 1)mn+1 − n(m + 2)mn + m(m + 2)n = 4 1 m(m + 2)n − mn+1 − 2nmn . 4
Vˇ eta (Odhad nejhorˇs´ıho pˇr´ıpadu). Oˇcek´avan´y poˇcet test˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı je 41 (e2α − 1 − 2α) D˚ ukaz. Z pˇredchoz´ıch lemmat P
a1 ,a2 ,...,an+1
C(a1 , a2 , . . . , an ; an+1 )
mn+1 (m − n)mn + nmn +
=
1 4
m(m + 2)n − mn+1 − 2nmn = mn+1 mn+1 + 41 m(m + 2)n − mn+1 − 2nmn = mn+1 1 2n 2 1 1 + (1 + )n − 1 − ∼ 1 + (e2α − 1 − 2α). 4 m m 4
Tento odhad je stejn´ y pro obˇe metody – LISCH i EISCH, protoˇze maj´ı stejn´e posloupnosti adres (liˇs´ı se jen poˇrad´ım prvk˚ u v jednotliv´ ych ˇretˇezc´ıch).
2.9.5
Oˇcek´avan´ y poˇcet test˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı je 14 (e2α −1−2α)
´ eˇ Uspˇ sn´ y pˇ r´ıpad (sj ∈ S)
Oˇcek´avan´ y poˇcet test˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı v modelu LISCH spoˇc´ıt´ame stejnou metodou jako pro haˇsov´an´ı se separuj´ıc´ımi ˇretˇezci. Lemma. Pro u ´spˇeˇsn´e vyhled´an´ı prvku sj ∈ S je poˇcet test˚ u roven 1+poˇcet porovn´an´ı kl´ıˇc˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´ an´ı pˇri operaci INSERT(sj ). 29
D˚ ukaz. Pˇri u ´spˇeˇsn´em vyhled´av´an´ı proch´az´ım stejn´e prvky, jako pˇri vkl´ad´an´ı. Jedniˇcka je za posledn´ı porovn´an´ı sj , kter´e jsem pˇri vkl´ad´an´ı dˇelat nemusel.
Lemma (verze 0). Kdyˇz sj je vloˇzen na m´ısto h(sj ), nebyl porovn´av´ an ˇza´dn´y kl´ıˇc a test pro u ´spˇeˇsn´e vyhled´av´ an´ı bude 1. D˚ ukaz. Plyne jednoduˇse z pˇredchoz´ıho lemmatu. Pozor, v pˇredchoz´ı ˇca´sti jsem mˇel 1 test na pr´azdnost, zde beru v u ´vahu pouze porovn´an´ı kl´ıˇc˚ u .2
Lemma (verze > 0). Kdyˇz h(sj ) byl na na i-t´em m´ıstˇe v ˇretˇezci d´elky l, pak bylo pˇri operaci INSERT(sj ) pouˇzito l − i + 1 porovn´an´ı kl´ıˇc˚ u a ted’ se pouˇzije l − i + 2 test˚ u. D˚ ukaz. Pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı jsem musel projet cel´ y zbytek ˇretˇezce.
Lemma. Oˇcek´avan´y poˇcet porovn´an´ı kl´ıˇc˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´ an´ı je pro i-prvkovou mnoˇzinu 2i 2 i ) − 1 + . m m
1 4
(1 +
D˚ ukaz. Stejnˇe, jako v pˇredchoz´ı sekci (s t´ım rozd´ılem, ˇze u pr´azdn´ ych ˇra´dk˚ u nepoˇc´ıt´am 13 ) dostaneme, ˇze oˇcek´avan´ y poˇcet porovn´an´ı kl´ıˇc˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı je i 1 X l )ci (l)) = ( (l + i+1 m 2 l=1
1 1 i i i+1 i (im + m(m + 2) − m − 2im )= mi+1 4 2 2i 1 (1 + )i − 1 + . 4 m m
Lemma. Tedy oˇcek´avan´y poˇcet test˚ u pˇri u ´spˇeˇsn´em vyhled´av´ an´ı v n-prvkov´e mnoˇzinˇe je roven 1 + n-tina souˇctu oˇcek´avan´eho poˇctu porovn´an´ı kl´ıˇc˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´ an´ı v i-prvkov´e mnoˇzinˇe, kde i prob´ıh´a ˇc´ısla 0, 1, . . . , n − 1. D˚ ukaz. Skuteˇcnˇe, kaˇzd´ y prvek z n-prvkov´e mnoˇziny, podle kter´ ych pr˚ umˇeruji u ´spˇeˇsn´e vyhled´av´an´ı, tam musel b´ yt vloˇzen, tj. Pn−1 cek´avan´ y poˇcet test˚ u v i-prvkov´e mnoˇzinˇe i=0 1 + oˇ n a jedniˇcku m˚ uˇzu strˇcit dopˇredu. 2 3
pozn´ amka studenta - toto mi opˇet nen´ı jasn´e jak p´ıˇsu v´ yˇse, nen´ı mi jasn´e proˇc
30
Lemma. Souˇcet oˇcek´avan´ych poˇct˚ u porovn´an´ı kl´ıˇc˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´ an´ı v i-prvkov´e mnoˇzinˇe, kde i prob´ıh´a ˇc´ısla 0, 1, . . . , n − 1, je 2 2n n2 − n m (1 + )n − 1 − + 8 m m 4m
. D˚ ukaz. n−1 X 1 i=0
n 2i 1 (1 + m2 )n − 1 n 2 i − + 2 = (1 + ) −1 + = 4 m m 4 1 + m2 − 1 4 2m 2n n2 − n 2 m . (1 + )n − 1 − + 8 m m 4m
Vˇ eta. Oˇcek´avan´y poˇcet test˚ uvu ´spˇeˇsn´em pˇr´ıpadˇe pro n-prvkovou mnoˇzinu je 1+ D˚ ukaz. 1+
α 1 2α (e − 1 − 2α) + 8α 4
m 2 2n n − 1 1 2α α (1 + )n − 1 − + ∼1+ (e − 1 − 2α) + . 8n m m 4m 8α 4
Pro LISCH oˇcek´avan´ y poˇcet test˚ uvu ´spˇeˇsn´em pˇr´ıpadˇe pro n-prvko1 2α vou mnoˇzinu je 1 + 8α (e − 1 − 2α) + α4 .
Vˇ eta. Pro metodu EISCH je oˇcek´av´ an´y poˇcet test˚ uvu ´spˇeˇsn´em pˇr´ıpadˇe m 1 1 (1 + )n − 1 ∼ (eα − 1). n m α V´ ypoˇcet je komplikovanˇejˇs´ı, mus´ı se pouˇz´ıt sloˇzitˇejˇs´ı metoda (metoda EISCH d´av´a nov´ y prvek hned za m´ısto, kde m´a b´ yt uloˇzen). Chyba aproximace pro tyto odhady je O( m1 ).
31
2.10
Metody LICH, EICH, VICH
2.10.1
Popis
• LICH – late-insertion coalesced hashing • EICH – early-insertion coalesced hashing • VICH – varied-insertion coalesced hashing. Z´akladn´ı idea: Metody pouˇz´ıvaj´ı pomocnou pamˇet’. Tabulka je rozdˇelen´a na adresovac´ı ˇca´st a na pomocnou pamˇet’, kter´a nen´ı dostupn´a pomoc´ı haˇsovac´ı funkce, ale pom´ah´a pˇri ˇreˇsen´ı koliz´ı. Metody se liˇs´ı operac´ı INSERT. Vˇsechny metody pˇri kolizi nejprve pouˇzij´ı ˇra´dek tabulky z pomocn´e ˇca´sti a teprve, kdyˇz je pomocn´a ˇca´st zaplnˇena, pouˇz´ıvaj´ı adresovac´ı ˇca´st. Metoda LICH: pˇri INSERTu vkl´ad´a prvek vˇzdy na konec ˇretˇezce. Metoda EICH: pˇri INSERTu vkl´ad´a prvek x do ˇretˇezce vˇzdy na m´ısto hned za ˇra´dkem h(x). Metoda VICH: Pˇri INSERTu, kdyˇz nov´ y ˇra´dek je z pomocn´e ˇca´sti, tak je vloˇzen s nov´ ym prvkem na konec ˇretˇezce, kdyˇz je pomocn´a ˇca´st pamˇeti vyˇcerp´ana, tak se ˇra´dek s nov´ ym prvkem vkl´ad´a do ˇretˇezce za posledn´ı ˇra´dek z pomocn´e ˇca´sti tabulky. Kdyˇz ˇretˇezec neobsahuje ˇza´dn´ y ˇra´dek z pomocn´e pamˇeti, tak se ˇra´dek s nov´ ym prvkem x vkl´ad´a hned za ˇra´dek h(x). Idea: pomocn´a ˇca´st m´a zabr´anit rychl´emu sr˚ ust´an´ı ˇretˇezc˚ u. Tyto metody nepodporuj´ı pˇrirozen´e efektivn´ı algoritmy pro operaci DELETE. 2.10.2
Ilustrace
U = {1, 2, . . . , 1000}, h(x) = x mod 10, S = {1, 7, 11, 53, 73, 141, 161}. Tabulka m´a 12 ˇra´dk˚ u a m´a tvar ˇra´dek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9) P(10) P(11)
key next 1
10
73
11
7 161 11
5 7
141 53
8
Haˇsovac´ı tabulka vznikla posloupnostmi operac´ı: Pro metodu LICH: INSERT(1), INSERT(73), INSERT(141), INSERT(53), INSERT(11), INSERT(161), INSERT(7). Pro metodu EICH: 32
INSERT(1), INSERT(73), INSERT(161), INSERT(53), INSERT(11), INSERT(141), INSERT(7), ale nedodrˇzovalo se, ˇze se nejdˇr´ıv zaplˇ nuj´ı ˇra´dky z pomocn´e ˇca´sti. Pˇri dodrˇzov´an´ı tohoto pravidla takov´ato tabulka nem˚ uˇze vzniknout. Pro metodu VICH: INSERT(1), INSERT(73), INSERT(141), INSERT(53), INSERT(161), INSERT(11), INSERT(7). Aplikujeme operace INSERT(28) a INSERT(31), nov´e ˇra´dky budou ˇra´dky ˇc´ıslo 4 a 9. Tabulka vytvoˇren´a pomoc´ı metody LICH je na lev´e stranˇe, metodou VICH je v prostˇredku a metodou EICH je na prav´e stranˇe. ˇra´dek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9) P(10) P(11) 2.10.3
key next 1
10
73 28 7
11 9 4
161 11 31 141 53
5 7 8
ˇra´dek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9) P(10) P(11)
key next 1
10
73 28 7
11 7
161 11 31 141 53
5 4 8 9
ˇra´dek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9) P(10) P(11)
key next 1
9
73 28 7
11 7
161 11 31 141 53
5 4 10 8
Algoritmy
Algoritmus operace MEMBER je pro tyto metody stejn´ y jako pro LISCH a EISCH MEMBER(x) Spoˇc´ıt´ame i := h(x) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo if i.key = x then V´ ystup: x ∈ S else V´ ystup: x ∈ / S endif Algoritmus operace INSERT je pro metodu LICH stejn´ y jako pro metodu LISCH a pro metodu EICH je stejn´ y jako pro metodu EISCH s jedin´ ym doplˇ nkem, pokud existuje pr´azdn´ y ˇra´dek v pomocn´e ˇca´sti, tak j-t´ y ˇra´dek je z pomocn´e ˇca´sti. Tento pˇredpoklad je i pro algoritmus INSERT pro metodu VICH. Metoda LICH INSERT(x) Spoˇc´ıt´ame i := h(x) if i.next = N IL then i.next = x, stop endif while i.next 6= N IL a i.key 6= x do i := i.next enddo if i.key 6= x then if neexistuje pr´azdn´ y ˇra´dek tabulky then V´ ystup: pˇreplnˇen´ı else necht’ j je pr´azdn´ y ˇra´dek, j.key := x, i.next := j endif endif
33
Metoda EICH Insert(x) Spoˇc´ıt´ame k := i := h(x) if i.next = N IL then i.next = x, stop endif while i.next 6= N IL a i.key 6= x do i := i.next enddo if i.key 6= x then if neexistuje pr´azdn´ y ˇra´dek tabulky then V´ ystup: pˇreplnˇen´ı else necht’ j je voln´ y ˇra´dek tabulky j.next := k.next, k.next := j, j.key := x endif endif Metoda VICH INSERT(x) Spoˇc´ıt´ame i := h(x) if i.next = N IL then i.next = x, stop endif while i.next 6= N IL a i.key 6= x do if k nen´ı definov´ano a i.next < m then k := i endif Pozn´ amka: Podm´ınka pro k je splnˇena, kdyˇz jsme byli na zaˇca´tku nebo v pomocn´e ˇca´sti, podm´ınka na i.next je splnˇena, kdyˇz i.next nen´ı v pomocn´e ˇca´sti. i := i.next enddo if i.key 6= x then if neexistuje pr´azdn´ y ˇra´dek then V´ ystup: pˇreplnˇen´ı else necht’ j je voln´ y ˇra´dek, j.key := x if k nen´ı definov´ano then i.next := j else j.next := k.next, k.next := j endif endif endif 2.10.4
Oˇ cek´ avan´ y poˇ cet test˚ u
(pozn. studenta - opravdu nev´ım, jestli je nutn´e se tohle uˇcit.) Znaˇcen´ı: n – velikost uloˇzen´e mnoˇziny, m – velikost adresovac´ı ˇca´sti tabulky, m′ – velikost tabulky, α = mn′ – faktor zaplnˇen´ı, m β=m ı faktor, ′ – adresovac´ λ – jedin´e nez´aporn´e ˇreˇsen´ı rovnice e−λ + λ = β1 . Oˇcek´avan´ y poˇcet test˚ u pro metodu LICH ne´ uspˇ eˇsn´ y pˇr´ıpad: α e− β + αβ , kdyˇz α ≤ λβ, 34
α
+ 14 (e2( β −λ) − 1)(3 − u ´spˇeˇsn´ y pˇr´ıpad: α 1 + 2β , kdyˇz α ≤ λβ, 1 β
1+
α β (e2( β −λ) 8α
2 β
+ 2λ) − 12 ( αβ − λ), kdyˇz α ≥ λβ
− 1 − 2( αβ − λ))(3 −
2 β
+ 2λ) + 14 ( αβ + λ) + λ4 (1 −
Oˇcek´avan´ y poˇcet test˚ u pro metodu EICH ne´ uspˇ e ˇ s n´ y pˇ r ´ ıpad: α e− β + αβ , kdyˇz α ≤ λβ, α
α
1 ) + e β −λ ( β1 − 1) + ( 14 − e2( β −λ) ( 34 + λ2 − 2β u ´spˇeˇsn´ y pˇr´ıpad: α 1 + 2β , kdyˇz α ≤ λβ,
1+
α 2β
α 2β
+
α
+ αβ ((e β −λ − 1)(1 + λ) − ( αβ − λ))(1 +
λ 2
1 ), 2β
+
λβ ), α
kdyˇz α ≥ λβ.
kdyˇz α ≥ λβ
α )), 2β
kdyˇz α ≥ λβ.
Oˇcek´avan´ y poˇcet test˚ u pro metodu VICH ne´ uspˇ e ˇ s n´ y pˇ r ´ ıpad: α e− β + αβ , kdyˇz α ≤ λβ, α
+ 14 (e2( β −λ) − 1)(3 − u ´spˇeˇsn´ y pˇr´ıpad: α , kdyˇz α ≤ λβ, 1 + 2β 1 β
1+
α 2β
2 β
+ 2λ) − 12 ( αβ − λ), kdyˇz α ≥ λβ
α
+ αβ ((e β −λ − 1)(1 + λ) − ( αβ − λ))(1 +
λ 2
+
α )) 2β
+
1−β α (β α
α
− λ − e β −λ + 1), kdyˇz α ≥ λβ.
′
Chyba aproximace pro tyto odhady je O(log √mm′ ).
2.11
Haˇ sov´ an´ı s line´ arn´ım pˇ rid´ av´ an´ım
2.11.1
Popis
Tabulka m´a jedinou poloˇzku – key Z´akladn´ı idea: Pˇri operaci INSERT(x) vloˇz´ıme x na ˇra´dek h(x), kdyˇz je pr´azdn´ y, v opaˇcn´em pˇr´ıpadˇe nalezneme nejmenˇs´ı i takov´e, ˇze ˇra´dek h(x) + i mod m je pr´azdn´ y, a tam vloˇz´ıme x. Tato metoda byla motivov´ana snahou o co nejvˇetˇs´ı vyuˇzit´ı pamˇeti. Koment´aˇr: Metoda vyˇzaduje minim´aln´ı velikost pamˇeti. V tabulce se vytv´aˇrej´ı shluky pouˇzit´ ych ˇra´dk˚ u, a proto pˇri velk´em zaplnˇen´ı metoda vyˇzaduje velk´ y poˇcet test˚ u. Metoda nepodporuje efektivn´ı implementaci operace DELETE. Pˇri vyhled´av´an´ı je tˇreba testovat, zda nevyˇsetˇrujeme podruh´e prvn´ı vyˇsetˇrovan´ y ˇra´dek, a pro zjiˇstˇen´ı pˇreplnˇen´ı je vhodn´e m´ıt uloˇzen poˇcet vyplnˇen´ ych ˇra´dk˚ u v tabulce. Pro standarn´ı pamˇeti nen´ı v´ yhodn´a. Pˇri pouˇzit´ı cache-pamˇeti se v´ yraznˇe mˇen´ı jej´ı hodnocen´ı. D˚ uvodem je, ˇze v tomto pˇr´ıpadˇe hraje kl´ıˇcovou roli nikoliv poˇcet test˚ u, ale poˇcet pˇrechod˚ u mezi r˚ uzn´ ymi u ´rovnˇemi pamˇeti. Protoˇze tabulka je reprezentovan´a polem, tak je tento poˇcet menˇs´ı neˇz u jin´ ych metod. Proto se tato metoda doporuˇcuje pro poˇc´ıtaˇce s cachepamˇet´ı.
35
2.11.2
Algoritmy
MEMBER(x) Spoˇc´ıt´ame i := h(x), h := i if i.key = x then V´ ystup x ∈ S, stop endif if i.key =pr´azdn´ y then V´ ystup: x ∈ / S, stop endif i := i + 1 while i.key 6=pr´azdn´ y a i.key 6= x a i 6= h do i := i + 1 mod m enddo if i.key = x then V´ ystup: x ∈ S else V´ ystup: x ∈ / S endif INSERT(x) Spoˇc´ıt´ame i := h(x), j := 0 while i.key 6=pr´azdn´ y a i.key 6= x a j < m do i := i + 1 mod m, j := j + 1 enddo if j = m then V´ ystup: pˇreplnˇen´ı, stop endif if i.key =pr´azdn´ y then i.key := x endif 2.11.3
Ilustrace
M´ame universum U = {1, 2, . . . , 1000}, haˇsovac´ı funkci h(x) = x mod 10 a mnoˇzinu S = {1, 7, 11, 53, 73, 141, 161}. Tato mnoˇzina je uloˇzena v lev´e tabulce. Provedeme operaci INSERT(35). V´ ysledek je uloˇzen v prav´e tabulce. ˇra´dek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
key
ˇra´dek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
1 11 73 141 161 53 7
key 1 11 73 141 161 53 7 35
Tabulka vznikla posloupnost´ı operac´ı: INSERT(1), INSERT(11), INSERT(73), INSERT(141), INSERT(161), INSERT(53), INSERT(7). 2.11.4
Oˇ cek´ avan´ y poˇ cet test˚ u
1 2 ). Oˇcek´avan´ y poˇcet test˚ u pro ne´ uspˇeˇsn´ y pˇr´ıpad: ≈ 12 (1 + 1−α 1 1 Oˇcek´avan´ y poˇcet test˚ u pro u ´spˇeˇsn´ y pˇr´ıpad: ≈ 2 (1 + 1−α ).
36
2.12
Dvojit´ e haˇ sov´ an´ı
2.12.1
Popis
Z´akladn´ı nev´ yhoda pˇredchoz´ı metody je zp˚ usob v´ ybˇeru dalˇs´ıho ˇra´dku. Je velmi determinov´an a d˚ usledkem je vznik shluku ˇra´dk˚ u, kter´ y vede k v´ yrazn´emu zpomalen´ı metody. Idea jak odstranit tuto nev´ yhodu: Pouˇzijeme dvˇe haˇsovac´ı funkce h1 a h2 a pˇri operaci INSERT(x) nalezneme nejmenˇs´ı i = 0, 1, . . . takov´e, ˇze (h1 (x) + ih2 (x)) mod m je pr´azdn´ y ˇra´dek, a tam uloˇz´ıme prvek x. Tabulka m´a jedinou poloˇzku – key. Poˇzadavky na korektnost: Pro kaˇzd´e x mus´ı b´ yt h2 (x) a m nesoudˇeln´e (jinak prvek x nem˚ uˇze b´ yt uloˇzen na libovoln´em ˇra´dku tabulky). m−1 Pˇredpoklad pro v´ ypoˇcet oˇcek´avan´eho poˇctu test˚ u: posloupnost {h1 (x) + ih2 (x)}i=0 je n´ahodn´a permutace mnoˇziny ˇra´dk˚ u tabulky.
Nev´ yhoda: Uveden´a metoda nepodporuje operaci DELETE. Pozn´amka: Metoda haˇsov´an´ı s line´arn´ım pˇrid´av´an´ım je speci´aln´ı pˇr´ıpad dvojit´eho haˇsov´an´ı, kde h2 (x) = 1 pro kaˇzd´e x ∈ U . 2.12.2
Algoritmy
MEMBER(x) Spoˇc´ıt´ame i := h1 (x), h := h2 (x), j := 0 while i.key 6=pr´azdn´ y a i.key 6= x a j < m do i := i + h mod m, j := j + 1 enddo if i.key = x then V´ ystup: x ∈ S else V´ ystup: x ∈ / S endif INSERT(x) Spoˇc´ıt´ame i := h1 (x), h := h2 (x), j := 0 while i.key 6=pr´azdn´ y a i.key 6= x a j < m do i := i + h mod m, j := j + 1 enddo if j = m then V´ ystup: pˇreplnˇen´ı, stop endif if i.key =pr´azdn´ y then i.key := x endif 2.12.3
Ilustrace
Mˇejme universum U = {1, 2, . . . , 1000}. Haˇsovac´ı funkce jsou h1 (x) = x mod 10 a h2 (x) = 1 + 2(x mod 4), kdyˇz x mod 4 ∈ {0, 1}, h2 (x) = 3+2(x mod 4), kdyˇz x mod 4 ∈ {2, 3}. Mnoˇzina je S = {1, 7, 11, 53, 73, 141, 161}. Tato mnoˇzina je uloˇzena v lev´e tabulce. Aplikujme INSERT(35). Pak h2 (35) = 9, tedy posloupnost pro x = 35 je (5, 4, 3, 2, 1, 0, 9, 8, 7, 6).
37
V´ ysledek je uloˇzen v prav´e tabulce. ˇra´dek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
key 11 1
ˇra´dek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
73 141 7 53 161
key 11 1 35 73 141 7 53 161
Tabulka vznikla posloupnost´ı operac´ı: INSERT(1), INSERT(73), INSERT(53), INSERT(141), INSERT(161), INSERT(11), INSERT(7). 2.12.4
Oˇ cek´ avan´ y poˇ cet test˚ u - ne´ uspˇ eˇ sn´ y pˇ r´ıpad
Definice. qi (n, m) – kdyˇz tabulka m´a m ˇr´adk˚ u a je v n´ı obsazeno n ˇr´adk˚ u, tak je to pravdˇepodobnost, ˇze pro kaˇzd´e j = 0, 1, . . . , i − 1 je ˇr´adek h1 (x) + jh2 (x) obsazen. Pozorov´ an´ı. q0 (n, m) = 1 D˚ ukaz. Krajn´ı pˇr´ıpad - je urˇcitˇe obsazen pro j = 0 . . . − 1
Pozorov´ an´ı. q1 (n, m) =
n m
D˚ ukaz. Bez druh´e heˇsovac´ı funkce, tj. zkus´ım jen jednou.
Pozorov´ an´ı. q2 (n, m) =
n(n−1) m(m−1)
D˚ ukaz. Prvn´ı heˇsovac´ı funkce se nestref´ı, druh´a tak´e ne (a druh´a funkce je nesoudˇeln´a s m a je n´ahodn´a)
Lemma (Obecn´ y odhad qi ). Obecnˇe plat´ı Qi−1
j=0 (n
qi (n, m) = Qi−1
j=0 (m
D˚ ukaz. Zobecnˇen´ı pˇredchoz´ıch pozorov´an´ı.
38
− j)
− j)
Definice. C(n, m) – oˇcek´avan´y poˇcet test˚ u v ne´ uspˇeˇsn´em vyhled´av´ an´ı, kdyˇz tabulka m´a m ˇr´adk˚ u a n jich je obsazeno (tj. to, co chci spoˇc´ıtat) P Lemma. C(n, m) = nj=0 (j + 1)(qj (n, m) − qj+1 (n, m))
D˚ ukaz. Pro kaˇzd´e j vezmu pravdˇepodobnost, ˇze jen pro i ≤ j je h1 (x) + jh2 (x) obsazen, pro vˇsechny dalˇs´ı je voln´ y; pro kaˇzd´e takov´e j je poˇcet test˚ u j+1
Lemma. C(n, m) =
Pn
j=0 qj (n, m)
D˚ ukaz. Pˇredchoz´ı lemma + u ´prava index˚ u
Lemma. C(0, m) = 1 pro kaˇzd´e m D˚ ukaz. Vypl´ yv´a z pˇredchoz´ıho lemmatu + q0 (0, m) = 1
Lemma. qj (n, m) =
n q (n m j−1
− 1, m − 1) pro vˇsechna j, n > 0 a m > 1
D˚ ukaz. Z obecn´eho odhadu qi Qi−1 qi (n, m) =
Lemma. C(n, m) = 1 + D˚ ukaz. C(n, m) =
j=0 (n − j) Qi−1 j=0 (m − j)
n C(n m
n X j=0
=
n m
Qi−1
j=0 ((n
Qi−1
− 1) − j)
j=0 ((m
− 1) − j)
=
n qj−1 (n − 1, m − 1) m
− 1, m − 1)
qj (n, m) = 1 +
n−1 n n X ( qj (n − 1, m − 1)) = 1 + C(n − 1, m − 1). m j=0 m
Lemma. Oˇcek´avan´y poˇcet dotaz˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´ an´ı v tabulce s m ˇr´adky, z nichˇz n je obsazeno, m+1 je C(n, m) = m−n+1
39
D˚ ukaz. Indukc´ı. Kdyˇz n = 0, pak C(0, m) =
m+1 m−0+1
= 1 a tvrzen´ı plat´ı.
Pˇredpokl´ad´ame, ˇze tvrzen´ı plat´ı pro n − 1 ≥ 0 a pro kaˇzd´e m ≥ n − 1 a dok´aˇzeme tvrzen´ı pro n a m ≥ n. Plat´ı n C(n, m) =1 + C(n − 1, m − 1) = m n((m − 1) + 1) 1+ = m((m − 1) − (n − 1) + 1) m+1 n = . 1+ m−n+1 m−n+1
1 1−α
Vˇ eta. Oˇcek´avan´y poˇcet dotaz˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´ an´ı je pˇribliˇznˇe D˚ ukaz. Z pˇredchoz´ıho lemmatu C(n, m) =
2.12.5
m+1 m−n+1
∼
1 . 1−α
Oˇcek´avan´ y poˇcet dotaz˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı je pˇribliˇznˇe 1 1−α .
´ eˇ Uspˇ sn´ y pˇ r´ıpad
Pouˇzijeme opˇet stejnou metodu ze separuj´ıc´ıch ˇretˇezc˚ u, proto jen struˇcnˇe. Vˇ eta. Oˇcek´avan´y poˇcet dotaz˚ u pˇri u ´spˇeˇsn´em vyhled´av´ an´ı je pˇribliˇznˇe
1 α
1 ln( 1−α )
D˚ ukaz. Poˇcet dotaz˚ u pˇri vyhled´av´an´ı x pro x ∈ S je stejn´ y jako byl poˇcet dotaz˚ u pˇri vkl´ad´an´ı x do tabulky. Tedy oˇcek´avan´ y poˇcet dotaz˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı v tabulce s m ˇra´dky, z nichˇz n je obsazeno, je n−1
n−1
1 X m+1 1X = C(i, m) = n i=0 n i=0 m − i + 1
m+1 m−n+1 X 1 m+1 X 1 − ≈ n j j j=1 j=1
m+1 1 1 1 ln( ) ≈ ln( ). α m−n+1 α 1−α
Oˇcek´avan´ y poˇcet dotaz˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı je pˇribliˇznˇe 1 1 α ln( 1−α . 40
N´asleduj´ıc´ı tabulka ukazuje tyto hodnoty v z´avislosti na velikosti α. hodnota α 1 α
1 1−α
1 ln( 1−α )
0.5 2 1.38
0.7 3.3 1.70
0.9 10 2.55
0.95 20 3.15
0.99 0.999 100 1000 4.65 6.9
2.13
Porovn´ an´ı efektivity haˇ sovac´ıch algoritm˚ u
2.13.1
Ne´ uspˇ eˇ sn´ e vyhled´ av´ an´ı
• • • • • • • •
Haˇsov´an´ı s uspoˇra´dan´ ymi ˇretˇezci Haˇsov´an´ı s ˇretˇezci=Haˇsov´an´ı s pˇrem´ıst’ov´an´ım Haˇsov´an´ı s dvˇema ukazateli VICH=LICH EICH LISCH=EISCH Dvojit´e haˇsov´an´ı Haˇsov´an´ı s line´arn´ım pˇrid´av´an´ım
2.13.2
´ eˇ Uspˇ sn´ e vyhled´ av´ an´ı
Poˇrad´ı metod haˇsov´an´ı podle oˇcek´avan´eho poˇctu test˚ u: • • • • • • • • •
Haˇsov´an´ı s uspoˇra´dan´ ymi ˇretˇezci=Haˇsov´an´ı s ˇretˇezci=Haˇsov´an´ı s pˇrem´ıst’ov´an´ım Haˇsov´an´ı s dvˇema ukazateli, VICH LICH EICH EISCH LISCH Dvojit´e haˇsov´an´ı Haˇsov´an´ı s line´arn´ım pˇrid´av´an´ım
Pozn´amka: Metoda VICH pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı pro α < 0.72 a pˇri u ´spˇeˇsn´em vyhled´av´an´ı pro α < 0.92 vyˇzaduje menˇs´ı oˇcek´avan´ y poˇcet test˚ u neˇz metoda s dvˇema ukazateli. Pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı jsou metody VICH a LICH stejn´e a jsou o 8% lepˇs´ı neˇz EICH a o 15% neˇz metody LISCH a EISCH. Pˇri u ´spˇeˇsn´em vyhled´av´an´ı je VICH nepatrnˇe lepˇs´ı neˇz LICH a EICH o 3% lepˇs´ı neˇz EISCH a o 7% lepˇs´ı neˇz LISCH. 2.13.3 • • • • • •
Oˇ cek´ avan´ y poˇ cet test˚ u pˇ ri u ´ plnˇ e zaplnˇ en´ e tabulce
Metoda s pˇrem´ıst’ov´an´ım: ne´ uspˇeˇsn´e vyhled´av´an´ı 1.5, u ´spˇeˇsn´e vyhled´av´an´ı 1.4. Metoda s dvˇema ukazateli: u ´spˇeˇsn´e i ne´ uspˇeˇsn´e vyhled´av´an´ı 1.6. VICH: ne´ uspˇeˇsn´e vyhled´av´an´ı 1.79, u ´spˇeˇsn´e vyhled´av´an´ı 1.67. LICH: ne´ uspˇeˇsn´e vyhled´av´an´ı 1.79, u ´spˇeˇsn´e vyhled´av´an´ı 1.69. EICH: ne´ uspˇeˇsn´e vyhled´av´an´ı 1.93, u ´spˇeˇsn´e vyhled´av´an´ı 1.69. EISCH: ne´ uspˇeˇsn´e vyhled´av´an´ı 2.1, u ´spˇeˇsn´e vyhled´av´an´ı 1.72. 41
• LISCH: ne´ uspˇeˇsn´e vyhled´av´an´ı 2.1, u ´spˇeˇsn´e vyhled´av´an´ı 1.8. Metodu s line´arn´ım pˇrid´av´an´ım je dobr´e pouˇz´ıt jen pro α < 0.7, metodu s dvojit´ ym haˇsov´an´ım pro α < 0.9, pak ˇcas pro ne´ uspˇeˇsn´e vyhled´av´an´ı rychle nar˚ ust´a. 2.13.4
Vliv β =
m m′
pˇ ri sr˚ ustaj´ıc´ım haˇ sov´ an´ı
Pˇri u ´spˇeˇsn´em vyhled´av´an´ı je optim´aln´ı hodnota β = 0.85, pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı je optim´aln´ı hodnota β = 0.78. V praxi se doporuˇcuje pouˇz´ıt hodnotu β = 0.86 (uveden´e v´ ysledky byly pro tuto hodnotu β). 2.13.5
Koment´ aˇ r
Metody se separuj´ıc´ımi ˇretˇezci a sr˚ ustaj´ıc´ı haˇsov´an´ı pouˇz´ıvaj´ı v´ıce pamˇeti (pˇri sr˚ ustaj´ıc´ım haˇsov´an´ı souˇcet adresovac´ı a pomocn´e ˇca´sti). Metoda s pˇrem´ıst’ov´an´ım a metoda dvojit´eho haˇsov´an´ı vyˇzaduj´ı v´ıce ˇcasu – na pˇrem´ıstˇen´ı prvku a na v´ ypoˇcet druh´e haˇsovac´ı funkce.
2.14
Dalˇ s´ı ot´ azky
2.14.1
Jak nal´ ezt voln´ yˇ r´ adek
Za nejlepˇs´ı metodu se povaˇzuje m´ıt seznam (z´asobn´ık) voln´ ych ˇra´dk˚ u a z jeho vrcholu br´at voln´ y ˇra´dek a po u ´spˇeˇsn´e operaci DELETE tam zase ˇra´dek vloˇzit (pozor pˇri operaci DELETE ve struktur´ach, kter´e nepodporuj´ı DELETE). 2.14.2
Jak ˇ reˇ sit pˇ replnˇ en´ı
Standardn´ı model: D´ana z´akladn´ı velikost tabulky m a pracuje se s tabulkami s 2i m ˇra´dky pro vhodn´e i = 0, 1, . . . . Vhodn´e i znamen´a, ˇze faktor zaplnˇen´ı α je v intervalu < 14 , 1 > (s v´ yjimkou i = 0, kde se uvaˇzuje pouze horn´ı mez). Pˇri pˇrekroˇcen´ı meze se zvˇetˇs´ı nebo zmenˇs´ı i a vˇsechna data se pˇrehaˇsuj´ı do nov´e tabulky. V´ yhoda: Po pˇrehaˇsov´an´ı do nov´e tabulky je poˇcet operac´ı, kter´e vedou k nov´emu pˇrehaˇsov´av´an´ı, roven alespoˇ n polovinˇe velikosti uloˇzen´e mnoˇziny. Praktick´e pouˇzit´ı: Nedrˇzet se striktnˇe mez´ı, pouˇz´ıvat mal´e pomocn´e tabulky pˇri pˇreplnˇen´ı a posunout velk´e pˇrehaˇsov´an´ı na dobu klidu (aby syst´em nenechal uˇzivatele v norm´aln´ı dobˇe ˇcekat). 2.14.3
Jak ˇ reˇ sit DELETE v metod´ ach, kter´ e ho nepodporuj´ı
Pouˇz´ıt ideu tzv. ‘faleˇsn´eho DELETE’. Odstranit prvek, ale ˇra´dek neuvolnit (i v kl´ıˇci nechat nˇejakou hodnotu, kter´a bude znamenat, ˇze ˇra´dek je pr´azdn´ y, poloˇzky podporuj´ıc´ı pr´aci s tabulkami nemˇenit). ˇ R´adek nebude v seznamu voln´ ych ˇra´dk˚ u, ale operace INSERT, kdyˇz testuje tento ˇra´dek, tam m˚ uˇze vloˇzit nov´ y prvek. Kdyˇz je alespoˇ n polovina pouˇzit´ ych ˇra´dk˚ u takto blokov´ana, je vhodn´e celou strukturu pˇrehaˇsovat. Pravdˇepodobnostn´ı anal´ yzu tohoto modelu nezn´am.
42
2.14.4
Otevˇ ren´ e probl´ emy
Jak vyuˇz´ıt ideje z haˇsov´an´ı s uspoˇra´dan´ ymi ˇretˇezci pro ostatn´ı metody ˇreˇsen´ı koliz´ı (jmenovitˇe pro sr˚ ustaj´ıc´ı haˇsov´an´ı). Jakou metodu pouˇz´ıt pro operaci DELETE ve sr˚ ustaj´ıc´ım haˇsov´an´ı (probl´em je zachovat n´ahodnost uloˇzen´e mnoˇziny a t´ım platnost odhadu na sloˇzitost operac´ı). Jak nal´ezt druhou haˇsovac´ı funkci pro metodu dvojit´eho haˇsov´an´ı, aby vznikl´e posloupnosti adres pˇri operaci INSERT se chovaly jako n´ahodn´e. 2.14.5
Pˇ redpoklady a jejich splnitelnost
Pˇripomeˇ nme si pˇredpoklady pro pˇredchoz´ı uveden´e v´ ysledky o haˇsov´an´ı: 1. Haˇsovac´ı funkce se rychle spoˇc´ıt´a (v ˇcase O(1)); 2. Haˇsovac´ı funkce rovnomˇernˇe rozdˇeluje univerzum (to znamen´a, ˇze pro dvˇe r˚ uzn´e hodnoty i a j −1 −1 haˇsovac´ı funkce plat´ı −1 ≤ |h (i)| − |h (j)| ≤ 1); 3. Vstupn´ı data jsou rovnomˇernˇe rozdˇelen´a. Diskutujme splnitelnost tˇechto pˇredpoklad˚ u. Pˇredpoklad 1) je jasn´ y. Pˇredpoklad 2) – je v´ yhodn´e, kdyˇz rozdˇelen´ı univerza haˇsovac´ı funkc´ı kop´ıruje zn´am´e rozdˇelen´ı vstupn´ıch dat. Toto se pouˇzilo pˇri n´avrhu pˇrekladaˇce pro FORTRAN (Lum 1971). V pˇrekladaˇci byla pouˇzita metoda separovan´ ych ˇretˇezc˚ u a haˇsovac´ı funkce, kter´a preferovala obvykl´e n´azvy identifik´ator˚ u. V´ ysledky byly mˇeˇreny, kdyˇz se pˇrekladaˇc FORTRANu pouˇzil pro standardn´ı v´ ypoˇcet. Z´ıskan´e v´ ysledky se porovn´avaly s teoretick´ ymi v´ ypoˇcty za naˇsich pˇredpoklad˚ u. V n´asleduj´ıc´ı tabulce m˚ uˇzete porovnat v´ ysledky z´ıskan´e teoretick´ ymi v´ ypoˇcty a namˇeˇren´e hodnoty. Porovn´an´ı v´ ysledk˚ u:
hodnota α experiment teorie
0.5 1.19 1.25
0.6 1.25 1.30
0.7 1.28 1.35
0.8 0.9 1.34 1.38 1.40 1.45
Z´avˇer: Podm´ınky 1) a 2) m˚ uˇzeme splnit, kdyˇz zn´ame rozloˇzen´ı vstupn´ıch dat, m˚ uˇzeme dos´ahnout jeˇstˇe lepˇs´ıch v´ ysledk˚ u. Nev´ yhoda: Rozloˇzen´ı vstupn´ıch dat nem˚ uˇzeme ovlivnit a obvykle ho ani nezn´ame. Je re´aln´e, ˇze rozdˇelen´ı vstupn´ıch dat bude nevhodn´e pro pouˇzitou haˇsovac´ı funkci. D˚ usledek – na poˇca´tku 70. let se zaˇcalo ustupovat od haˇsov´an´ı. Hledal se postup, kter´ y by se vyhnul uveden´emu probl´emu s bodem 3). ˇ sen´ı navrhli Carter a Wegman (1977), kdyˇz pˇriˇsli s metodou univerz´aln´ıho haˇsov´an´ı, kter´a obch´az´ı Reˇ poˇzadavek 3). To vedlo k nov´emu rozs´ahl´emu pouˇz´ıv´an´ı haˇsov´an´ı. Nalezen´emu ˇreˇsen´ı je vˇenov´an n´asleduj´ıc´ı text.
43
2.15
Univerz´ aln´ı haˇ sov´ an´ı
2.15.1
Z´ akladn´ı idea
M´ısto jedn´e funkce m´ame mnoˇzinu H funkc´ı z univerza do tabulky velikosti m takov´ ych, ˇze pro kaˇzdou mnoˇzinu S ⊆ U , |S| ≤ m se vˇetˇsina funkc´ı chov´a dobˇre v˚ uˇci S (tj. haˇsovac´ı funkce m´a jen m´alo koliz´ı v mnoˇzinˇe S). Haˇsovac´ı funkci zvol´ıme n´ahodnˇe z H (s rovnomˇern´ ym rozdˇelen´ım) a haˇsujeme pomoc´ı takto zvolen´e funkce. Tedy jeˇstˇe jednou – nem´am jednu haˇsovac´ı funkci, ale m´am v´ıce haˇsovac´ıch funkc´ı, pro kaˇzdou mnoˇzinu S se mi vˇetˇsina z nich chov´a rozumnˇe – a z nich n´ ahodnˇe jednu vyberu; tedy nen´ı nutn´e n´ahodn´e rozloˇzen´ı S. 2.15.2
Modifikace ideje
Ovˇeˇrov´an´ı vlastnost´ı vyˇzaduje znalost velikosti mnoˇziny H. M´am ale probl´em - rychl´a vyˇc´ıslitelnost h(x) vyˇzaduje analytick´e zad´an´ı funkc´ı v H, ale zjiˇstˇen´ı rovnosti ˇ sen´ım probl´emu je pouˇzit´ı indexov´e dvou analyticky zadan´ ych funkc´ı na univerzu U je problematick´e. Reˇ mnoˇziny I, kterou si oindexuji funkce v H. To znamen´a, ˇze H = {hi | i ∈ I} a dvˇe funkce jsou r˚ uzn´e, kdyˇz maj´ı r˚ uzn´e indexy. Pak velikost syst´emu, tj. velikost H, bude velikost indexov´e mnoˇziny. M´ısto zvolen´ı haˇsovac´ı funkce budeme volit n´ahodnˇe index s rovnomˇern´ ym rozloˇzen´ım a kdyˇz zvol´ıme index i, pak budeme pracovat s haˇsovac´ı funkc´ ı h . Oˇ c ek´ a van´ a hodnota n´ a hodn´ e promˇenn´e f z mnoˇziny I i P i∈I f (i) do re´aln´ ych ˇc´ısel bude pr˚ umˇer pˇres I, tj. . |I| 2.15.3
Form´ aln´ı definice c-univerz´ aln´ıch syst´ em˚ u
Necht’ U je univerzum. Soubor funkc´ı H = {hi | i ∈ I} z univerza U do mnoˇziny {0, 1, . . . , m − 1} se naz´ yv´a c-univerz´ aln´ı (c je kladn´e re´aln´e ˇc´ıslo), kdyˇz ∀x, y ∈ U, x 6= y plat´ı |{i ∈ I | hi (x) = hi (y)}| ≤
c|I| . m
Omezuji tedy poˇcet kolizn´ıch funkc´ı pro libovolnou mnoˇzinu. Jako ekvivalentn´ı definici lze pouˇz´ıt toto tvrzen´ı: syst´em funkc´ı H z univerza U do mnoˇziny {0, 1, . . . , m−1} je c-univerz´aln´ı, kdyˇz vybereme-li h ∈ H s rovnomˇern´ ym rozdˇelen´ım, pak pro kaˇzd´a dvˇe r˚ uzn´a x, y ∈ U plat´ı c Prob(h(x) = h(y)) ≤ . m Probl´emy: existence c-univerz´aln´ıch syst´em˚ u, vlastnosti c-univerz´aln´ıch syst´em˚ u (zda splˇ nuj´ı poˇzadovan´e ideje). 2.15.4
Existence univerz´ aln´ıch syst´ em˚ u
Bez u ´jmy na obecnosti m˚ uˇzu vz´ıt univerzum U , kter´e bude vypadat U = {0, 1, . . . , N − 1} pro prvoˇc´ıslo N . (Staˇc´ı si uvˇedomit, ˇze kaˇzd´e univerzum m˚ uˇzeme povaˇzovat za univerzum tvaru {0, 1, . . . , N − 1} pro nˇejak´e N a ˇze mezi ˇc´ısly N a 2N vˇzdy existuje nˇejak´e prvoˇc´ıslo.) 44
Definujme si mnoˇzinu funkc´ı H pro univerzum U pro nˇejak´e m. Definice. H = {ha,b | (a, b) ∈ U × U }, kde ha,b (x) = ((ax + b) mod N ) mod m (tj. indexov´ a mnoˇzina je U × U a jej´ı velikost je N 2 ). V´ yhoda: funkce z mnoˇziny H um´ıme rychle vyˇc´ıslit. Nev´ yhoda: indexov´a mnoˇzina je velikost univerza na druhou. 2 Lemma. Pro x, y ∈ U takov´ a, ˇze x 6= y, existuje maxim´ alnˇe m ⌈ N ⌉ dvojic (a, b) ∈ U × U takov´ych, ˇze m ha,b (x) = ha,b (y). D˚ ukaz. Zvolme x, y ∈ U takov´a, ˇze x 6= y. Chceme nal´ezt (a, b) ∈ U × U takov´e, ˇze ha,b (x) = ha,b (y).
Mus´ı existovat i ∈ {0, 1, . . . , m − 1} a r, s ∈ {0, 1, . . . , ⌈ N ⌉ − 1} tak, ˇze plat´ı m (ax + b ≡ i + rm) mod N (ay + b ≡ i + sm) mod N
(i je ono shodn´e modulo, r a s jsou zbytky po modulu, tedy ax + b mod N = i + rm a i + rm < N , podobnˇe s y) Kdyˇz x, y, i, r a s jsou konstanty a a a b jsou promˇenn´e, je to syst´em line´arn´ıch rovnic v tˇelese Z/ mod N , kde Z jsou cel´a ˇc´ısla. Matice soustavy x 1 y 1 je regul´arn´ı, protoˇze x 6= y. Jelikoˇz Z/ mod N je tˇeleso (protoˇze N je prvoˇc´ıslo), tak pro fixovan´a x, y, i, r a s existuje pr´avˇe jedno ˇreˇsen´ı t´eto soustavy. ⌉ hodnot. Tedy, pro dan´a x a y, i nab´ yv´a m hodnot, r a s nab´ yvaj´ı ⌈ N m Z´avˇer: pro kaˇzd´a x, y ∈ U takov´a, ˇze x 6= y, existuje maxim´alnˇe m ⌈ N ⌉ m ˇze ha,b (x) = ha,b (y).
Vˇ eta. Mnoˇzina H je c-univerz´aln´ı pro
2
dvojic (a, b) ∈ U × U takov´ ych,
2 ⌉ ⌈N c = m 2 . N m
D˚ ukaz. Skuteˇcnˇe, pro kaˇzd´e x, y ∈ U , x 6= y, je poˇcet (a, b) ∈ U × U takov´ ych, ˇze ha,b (x) = ha,b (y), nejv´ yˇse roven 2 2 ⌈N ⌈N ⌉ N2 ⌉ |I| N 2 m m m ⌈ ⌉ = = . N 2 m N 2 m m m
m
Pozorov´ an´ı. Dok´azali jsme existenci c-univerz´aln´ıch syst´em˚ u pro c bl´ızk´e 1.
45
2.15.5
Vlastnosti univerz´ aln´ıho haˇ sov´ an´ı
Pˇredpoklad: H = {hi | i ∈ I} je c-univerz´aln´ı syst´em funkc´ı. (nemus´ı b´ yt totoˇzn´ y s H z posledn´ı kapitoly) Definice. Pro i ∈ I a prvky x, y ∈ U oznaˇcme ( 1 kdyˇz x 6= y a hi (x) = hi (y), δi (x, y) = 0 kdyˇz x = y nebo hi (x) 6= hi (y). δi (x, y) je tedy 1, pokud x, y v hi koliduj´ı, jinak je 0. Definice. Pro mnoˇzinu S ⊆ U , x ∈ U a i ∈ I definujme X δi (x, S) = δi (x, y). y∈S
δi (x, S) tedy ˇr´ık´a, s kolika prvky v S x koliduje pˇri pouˇzit´ı funkce hi ; je to tedy horn´ı odhad ˇretˇezce, pokud S je reprezentovan´a mnoˇzina. P 1 Lemma. |I| cek´avan´ a d´elka ˇretˇezce pˇri pevn´em S pˇri n´ ahodn´em v´ybˇeru i. i∈I δi (x, S) je oˇ D˚ ukaz. Plyne jednoduˇse z definice.
Lemma. Oˇcek´avan´y poˇcet test˚ u u operac´ıMEMBER, INSERT a DELETE je O(1+oˇcek´avan´e d´elka ˇretˇezce) D˚ ukaz. Nen´ı mi zcela jasn´a +1, jinak ale opravdu mus´ıme projet cel´ y ˇretˇezec.
Lemma. Pro fixovanou mnoˇzinu S ⊆ U a pro fixovan´e x ∈ U plat´ı
P
i∈I δi (x, S) =
(
(|S| − 1)c |I| m |I| |S|c m
kdyˇz x ∈ S, kdyˇz x ∈ / S.
D˚ ukaz. V d˚ ukazu vtipnˇe“ pˇrehod´ıme, pˇres co vlastnˇe sˇc´ıt´ame, a pouˇzijeme definici c-univerz´aln´ıho syst´emu. ” Seˇcteme δi (x, S) pˇres vˇsechna i ∈ I: X XX XX δi (x, S) = δi (x, y) = δi (x, y) = i∈I
i∈I y∈S
X
y∈S,y6=x
y∈S i∈I
|{i ∈ I | hi (x) = hi (y)}| ≤
|I| = c m y∈S,y6=x X
(
46
(|S| − 1)c |I| m |S|c |I| m
kdyˇz x ∈ S, kdyˇz x ∈ / S.
Lemma. Oˇcek´avan´ a d´ elka ˇretˇezce pro fixovanou mnoˇzinu S ⊆ U a fixovan´e x ∈ U pˇres i ∈ I s rovnomˇern´ym ( c |S|−1 kdyˇz x ∈ S, m rozdˇelen´ım je nejv´yˇse |S| kdyˇz x ∈ / S. cm D˚ ukaz. Z pˇredchoz´ıch lemmat: δi (x, S) d´av´a odhad na velikost ˇretˇezce hi (x) pˇri reprezentaci mnoˇziny S pomoc´ı funkce hi , tedy oˇcek´avan´a d´elka ˇretˇezce pro fixovanou mnoˇzinu S ⊆ U a fixovan´e x ∈ U pˇres i ∈ I s rovnomˇern´ ym rozdˇelen´ım je nejv´ yˇse ( c |S|−1 kdyˇz x ∈ S, 1 X m δi (x, S) ≤ |S| |I| i∈I kdyˇz x ∈ / S. cm
Vˇ eta. Oˇcek´avan´y poˇcet test˚ u pˇri operac´ıch MEMBER, INSERT haˇsov´an´ı je O(1 + cα), kde α je faktor naplnˇen´ı (tj. α = |S| ). m
a DELETE pˇri c-univerz´aln´ım
D˚ ukaz. Plyne jednoduˇse z pˇredchoz´ıch lemmat.
Vˇ eta. Oˇcek´avan´y ˇcas pro pevnou posloupnost n operac´ı MEMBER, INSERT a DELETE aplikovan´ych n na pr´ azdnou tabulku pro c-univerz´aln´ı haˇsov´an´ı je O((1 + 2c α)n), kde α = m . D˚ ukaz. J´a (upravuj´ıc´ı student) nevid´ım, proˇc by to mˇelo platit :(
Oˇcek´avan´ y poˇcet test˚ u je O(1 + cα)
V´ yznam v´ ysledku Vzorec se jen o multiplikativn´ı konstantu c liˇs´ı od vzorce pro haˇsov´an´ı se separovan´ ymi ˇretˇezci. Pˇritom c m˚ uˇze b´ yt jen o m´alo menˇs´ı neˇz 1 a ve vˇsech zn´am´ ych pˇr´ıkladech je c ≥ 1. Takˇze, co jsme dos´ahli? Rozd´ıl je v pˇredpokladech. Zde je pˇredpoklad 3) nahrazen pˇredpokladem, ˇze index i ∈ I je vybr´an s rovnomˇern´ ym rozdˇelen´ım, a nen´ı ˇza´dn´ y pˇredpoklad na vstupn´ı data. V´ ybˇ er indexu i m˚ uˇ zeme ovlivnit, ale v´ ybˇ er vstupn´ıch dat nikoliv. M˚ uˇzeme zajistit rovnomˇern´e rozdˇelen´ı v´ ybˇeru i z I nebo se k tomuto rozdˇelen´ı hodnˇe pˇribl´ıˇzit. 2.15.6
Markovova nerovnost
Pˇredpoklady: Je d´ana mnoˇzina S ⊆ U , prvek x ∈ U . Oˇcek´avan´a velikost δi (x, S) je µ a t ≥ 1. Pˇredpokladejme, ˇze i je z I vybr´ano s rovnomˇern´ ym rozdˇelen´ım. Vˇ eta. Pro t > 1 plat´ı: pravdˇepodobnost, ˇze δi (x, S) ≥ tµ pro i ∈ I, je menˇs´ı neˇz 1t . . 47
D˚ ukaz. Oznaˇcme I ′ = {i ∈ I | δi (x, S) ≥ tµ}. Pak plat´ı P P P |I ′ | ′ tµ i∈I ′ δi (x, S) i∈I δi (x, S) > ≥ i∈I = tµ µ= |I| |I| |I| |I| Odtud |I ′ | <
|I| . t
Tedy pravdˇepodobnost, ˇze δi (x, S) ≥ tµ, je menˇs´ı neˇz 1t .
Pozn´amka: Toto tvrzen´ı plat´ı obecnˇe a naz´ yv´a se Markovova nerovnost. Uveden´ y d˚ ukaz ilustruje jednoduch´e tvrzen´ı pro koneˇcn´ y pˇr´ıpad. 2.15.7
V´ ybˇ er funkce ze syst´ emu
Hlavn´ı probl´em: Zajiˇstˇen´ı rovnomˇern´eho rozdˇelen´ı v´ ybˇeru i z I. Proveden´ı v´ ybˇeru: Budeme vyb´ırat index z mnoˇziny I, budeme ho vyb´ırat jako bin´arn´ı ˇc´ıslo tak, ˇze kaˇzdou pozici bin´arn´ıho ˇc´ısla n´ahodnˇe vybereme. Tot´eˇz form´alnˇeji: Zak´odovat indexy z mnoˇziny I do ˇc´ısel 0, 1, . . . , |I| − 1. Zvolit n´ahodnˇe ˇc´ıslo i z tohoto intervalu s rovnomˇern´ ym rozdˇelen´ım a pak pouˇz´ıt funkci s indexem, jehoˇz k´od je i. Abychom vybrali i, nalezneme nejmenˇs´ı j takov´e, ˇze 2j − 1 ≥ |I| − 1. Pak ˇc´ısla v intervalu {0, 1, . . . , 2j − 1} jednoznaˇcnˇe koresponduj´ı s posloupnostmi 0 a 1 d´elky j. Budeme vyb´ırat n´ahodnˇe posloupnost 0 a 1 d´elky j. Kdyˇz takto vybran´a posloupnost neodpov´ıd´a prvku z I, tak vygenerujeme jinou posloupnost (a tuto vynech´ame). Pokud pouˇzijeme n´ahodn´ y gener´ator 0 a 1, pak takto z´ısk´ame n´ahodn´ y prvek z I. Tedy k v´ ybˇeru n´ahodn´e funkce potˇrebujeme n´ahodn´ y gener´ator 0 a 1 s rovnomˇern´ ym rozdˇelen´ım. Z´avada: Skuteˇcn´ y n´ahodn´ y gener´ator pro rovnomˇern´e rozdˇelen´ı je prakticky nedosaˇziteln´ y (nˇekter´e fyzik´aln´ı procesy). K dispozici je pouze pseudogener´ator. ˇ ım je j vˇetˇs´ı, t´ım je posloupnost pravidelnˇejˇs´ı (tj. m´enˇe n´ahodn´a). Jeho nev´ yhoda: C´ D˚ usledky: Hled´ame co nejmenˇs´ı c-univerz´aln´ı syst´emy. Nejprve ale nalezneme doln´ı odhady na jejich velikost obecnˇe. (Velikost´ı je zde st´ale myˇsleno poˇcet funkc´ı v |H|, vˇse ostatn´ı – c, |S|, m – je fixov´ano!) 2.15.8
Doln´ı odhady na velikost
Pˇredpoklady: Necht’ U je univerzum velikosti N a necht’ H = {hi | i ∈ I} je c-univerz´aln´ı syst´em funkc´ı haˇsuj´ıc´ıch do tabulky velikosti m. M˚ uˇzeme pˇredpokl´adat, ˇze I = {0, 1, . . . , |I| − 1}. Vˇ eta. Kdyˇz H = {hi | i ∈ I} je c-univerz´aln´ı syst´em pro univerzum U o velikosti N haˇsuj´ıc´ı do tabulky s m ˇr´adky, pak m |I| ≥ (⌈logm N ⌉ − 1). c D˚ ukaz. Indukc´ı definujme mnoˇziny U0 , U1 , . . . tak, ˇze: U0 = U . Necht’ U1 je nejvˇetˇs´ı podmnoˇzina U0 vzhledem k poˇctu prvk˚ u takov´a, ˇze h0 (U1 ) je jednoprvkov´a mnoˇzina. 48
Necht’ U2 je nejvˇetˇs´ı podmnoˇzina U1 vzhledem k poˇctu prvk˚ u takov´a, ˇze h1 (U2 ) je jednoprvkov´a mnoˇzina. Necht’ U3 je nejvˇetˇs´ı podmnoˇzina U2 vzhledem k poˇctu prvk˚ u takov´a, ˇze h2 (U3 ) je jednoprvkov´a mnoˇzina. ’ Obecnˇe, necht Ui je nejvˇetˇs´ı podmnoˇzina Ui−1 vzhledem k poˇctu prvk˚ u takov´a, ˇze hi−1 (Ui ) je jednoprvkov´a mnoˇzina. i−1 | Protoˇze haˇsujeme do tabulky velikosti m, plat´ı |Ui | ≥ ⌈ |Um ⌉. Protoˇze |U0 | = N , dost´av´ame indukc´ı, ˇze |Ui | ≥ ⌈ mNi ⌉ pro kaˇzd´e i. Zvolme i = ⌈logm N ⌉ − 1. Pak i je nejvˇetˇs´ı pˇrirozen´e ˇc´ıslo takov´e, ˇze mNi > 1. Tedy Ui m´a aspoˇ n dva prvky, zvolme x, y ∈ Ui takov´a, ˇze x 6= y. Pak hj (x) = hj (y) pro j = 0, 1, . . . , i − 1. Tedy
i ≤ |{j ∈ I | hj (x) = hj (y)}| ≤
c|I| . m
Kdyˇz H = {hi | i ∈ I} je c-univerz´aln´ı syst´em pro univerzum U o velikosti N haˇsuj´ıc´ı do tabulky s m ˇra´dky, pak |I| ≥ mc (⌈logm N ⌉−1).
Pozorov´ an´ı. Posloupnosti 0 a 1 pˇri n´ ahodn´e volbˇe i z I mus´ı m´ıt d´elku alespoˇ n ⌈(log m−log c+log log N − log log m)⌉ (zde vˇsechny logaritmy jsou o z´ akladu 2). 2.15.9
Mal´ y univerz´ aln´ı syst´ em - definice
Zkonstruujeme c-univerz´aln´ı syst´em takov´ y, ˇze logaritmus z velikosti jeho indexov´e mnoˇziny pro velk´a univerza je aˇz na aditivn´ı konstantu menˇs´ı neˇz 4(log m + log log N ), kde N je velikost univerza a m je poˇcet ˇra´dk˚ u v tabulce. Mˇejme velikost tabulky m a univerzum U = {0, 1, . . . , N − 1} pro nˇejak´e pˇrirozen´e ˇc´ıslo N (nemus´ı b´ yt prvoˇc´ıslo). Definice. Necht’ p1 , p2 , . . . je rostouc´ı posloupnost vˇsech prvoˇc´ısel. Definice. Necht’ t je nejmenˇs´ı ˇc´ıslo takov´e, ˇze t ln pt ≥ m ln N . Lemma. t < m ln N , kdyˇz pt > 3. D˚ ukaz. Pokud pt > 3, je ln pt ≥ 1.
Definice. Definujme H1 = {gc,d (hℓ ) | t < ℓ ≤ 2t, c, d ∈ {0, 1, . . . , p2t − 1}},
kde hℓ (x) = x mod pℓ a gc,d (x) = ((cx + d) mod p2t ) mod m.
V dalˇs´ı sekci uk´aˇzeme, ˇze kdyˇz m(ln m + ln ln m) < N , pak H1 je 3.25-univerz´aln´ı syst´em. Nejdˇr´ıve ale uk´aˇzeme, ˇze indexov´a mnoˇzina je dostateˇcnˇe mal´a. Pˇripomeneme si zn´amou vˇetu o velikosti prvoˇc´ısel, bez d˚ ukazu (zde ln je pˇrirozen´ y logaritmus, tj. o z´akladu e). Vˇ eta. Pro kaˇzd´e i = 1, 2, . . . plat´ı pi > i ln i a pro i ≥ 6 plat´ı pi < i(ln i + ln ln i). 49
Pozorov´ an´ı. Pro i ≥ 6 plat´ı pi < 2i ln i. (z dosazen´ı do vˇety o velikosti prvoˇc´ısel) Vˇ eta. |I| < 16m4 log4 N pro dostateˇcnˇe velk´e t. D˚ ukaz. (pozn. studenta - d´ıky logaritm˚ um je tento d˚ ukaz dost nepˇrehledn´ y :( logaritmy jsou dvojkov´e) Indexov´a mnoˇzina H1 je I = {(c, d, ℓ) | c, d ∈ {0, 1, . . . , p2t − 1, t < ℓ ≤ 2t}. Tedy |I| = tp22t . Odtud plyne |I| ≤ 16t3 ln2 2t a tedy log(|I|) ≤ 4 + 3 log t + 2 log log t. Pro dostateˇcnˇe velk´e t (takov´e, ˇze log t ≥ 2 log log t, tj. t ≥ 16)4 plat´ı, ˇze log(|I|) ≤ 4 + 4 log t. t ≤ m ln N , kdyˇz pt ≥ 3 (viz v´ yˇse). Po dosazen´ı log(|I|) ≤ 4 + 4(log m + log log N ), coˇz uˇz uprav´ıme na poˇzadovanou nerovnost.
Pozorov´ an´ı. Logaritmus z d˚ ukazu, tj. log(|I|) ≤ 4+4(log m+log log N ), n´ am d´av´ a horn´ı omezen´ı velikosti bin´ arn´ıho z´ apisu funkce, tj. poˇcet nutn´ych n´ ahodn´ych v´ybˇer˚ u. 2.15.10
Univerzalita mal´ eho syst´ emu H1
Zvolme r˚ uzn´a x a y z univerza U . Definice. Oznaˇcme G1 = {(c, d, ℓ) | gc,d (hℓ (x)) = gc,d (hℓ (y)), hℓ (x) 6= hℓ (y)}, G2 = {(c, d, ℓ) | gc,d (hℓ (x)) = gc,d (hℓ (y)), hℓ (x) = hℓ (y)} Budeme odhadovat G1 , G2 . Vˇ eta. G1 ≤
|I| (1 m
+
m 2 ) p2t
D˚ ukaz. Pouˇzijeme podobn´ y trik, jako v kapitole s d˚ ukazem existence univerz´aln´ıch syst´em˚ u. Kdyˇz (c, d, ℓ) ∈ G1 , pak existuj´ı r, s ∈ {0, 1, . . . , ⌈ pm2t ⌉ − 1} a i ∈ {0, 1, . . . , m − 1} takov´a, ˇze (c(x mod pℓ ) + d ≡ i + rm) mod p2t (c(y mod pℓ ) + d ≡ i + sm) mod p2t . Kdyˇz c a d povaˇzujeme za nezn´am´e, pak je to soustava line´arn´ıch rovnic s regul´arn´ı matic´ı (protoˇze x mod pℓ 6= y mod pℓ ), a tedy pro kaˇzd´e ℓ, i, r a s existuje pr´avˇe jedna takov´a dvojice (c, d) (pˇripom´ın´ame, ˇze Z/ mod p2t je tˇeleso). Proto |G1 | ≤ tm(⌈ 4
p2t 2 tp22t m 2 |I| m 2 ⌉) ≤ (1 + (1 + ) = ). m m p2t m p2t
Nejsem si jist, proˇc plat´ı, ale asi ano
50
Vˇ eta. G2 ≤
|I| m
Q D˚ ukaz. Oznaˇcme L = {ℓ | t < ℓ ≤ 2t, x mod pℓ = y mod pℓ } a P = ℓ∈L pℓ . Protoˇze P dˇel´ı |x − y|, |L| ln N ≤ mt z dost´av´ame, ˇze P ≤ N . Protoˇze pt < pℓ pro kaˇzd´e ℓ ∈ L, dost´av´ame, ˇze P > pt . Tedy |L| ≤ ln pt definice t. Protoˇze (c, d, ℓ) ∈ G2 , pr´avˇe kdyˇz ℓ ∈ L a c, d ∈ {0, 1, . . . , p2t − 1}, shrneme, ˇze |G2 | ≤
|L|p22t
tp22t |I| ≤ = . m m
Lemma (Pomocn´e lemma). Kdyˇz t ≥ 6 a m(ln m + ln ln m) < N , pak m <
pt . ln t
D˚ ukaz. Pˇredpokl´adejme, ˇze tvrzen´ı neplat´ı. Pak m ≥ lnptt . Z Vˇety o velikosti prvoˇc´ısel plyne m ≥ t ln t = t. Kdyˇz pouˇzijeme, ˇze m(ln m + ln ln m) < N , tak dostaneme, ˇze ln t
pt ln t
>
ln m + ln(ln m + ln ln m) < ln N, a odtud plyne, ˇze t ln pt < t ln(t(ln t + ln ln t)) ≤ m(ln m + ln(ln m + ln ln m)) < m ln N a to je spor s definic´ı t. Tedy m <
Pozorov´ an´ı. ln 2t ≥ ln t ≥ ln ln t Lemma.
m p2t
pt . ln t
pro vˇsechna t ≥ 1
je menˇs´ı, neˇz 12 , a pokud t konverguje k +∞, tak konverguje k 0.
D˚ ukaz. Zkombinujeme Vˇetu o odhadu velikosti prvoˇc´ısel, Pomocn´e lemma a pˇredchoz´ı pozorov´an´ı a dostaneme, ˇze pt t(ln t + ln ln t) 1 ln ln t m ln t < < (1 + ). ≤ p2t 2t ln 2t 2t ln t ln 2t ln 2t ln t yraz konverguje k 0. Je zˇrejm´e, ˇze tento v´ yraz je menˇs´ı neˇz 21 , a kdyˇz t konverguje k +∞, pak tento v´
Lemma. (1 +
m 2 ) p2t
≤ 1.52 = 2.25
D˚ ukaz. Plyne jednoduˇse z pˇrechoz´ıho lemmatu.
Vˇ eta. H1 je 3.25-univerz´ aln´ı
51
D˚ ukaz. Z pˇredchoz´ıho plyne: |{i ∈ I | hi (x) = hi (y)}| = |G1 | + |G2 | ≤ |I| m 2 |I| |I| |I| (1 + ≤ (1 + 2.25) = 3.25 . ) + m p2t m m m
Kdyˇz t ≥ 6 a m ln m ln ln m < N , pak H1 je 3.25-univerz´aln´ı.
Bez jak´ ychkoliv pˇredpoklad˚ u lze uk´azat, ˇze H1 je 5-univerz´aln´ı. 2.15.11
Odhad na velikost c
Lemma (Technick´e lemma). Mˇejme re´aln´ a ˇc´ısla bi pro i = 0, 1, . . . , m − 1 a necht’ b = m−1 X i=0
b − 1). m
bi (bi − 1) ≥ b(
Pm−1 i=0
bi . Pak
D˚ ukaz. Z Cauchyho-Schwarzovy nerovnosti (
m−1 X i=0
plyne (
Pm−1 i=0
bi )2 = b2 ≤ m( m−1 X i=0
Pm−1 i=0
xi yi ) 2 ≤ (
m−1 X
x2i )(
i=0
m−1 X
yi2 )
i=0
b2i ), staˇc´ı poloˇzit xi = bi a yi = 1, a tedy
bi (bi − 1) =
m−1 X i=0
b2i −
m−1 X i=0
bi =
m−1 X i=0
b2i − b ≥
b2 m
≤
Pm−1 i=0
b2i . Odtud
b b2 − b = b( − 1) m m
a lemma je dok´az´ano.
Lemma (O obecn´e funkci). Pokud f : U → T je libovoln´a haˇsovac´ı funkce (tj. ne z H), poˇcet dvojic u, v −m takov´ych, ˇze u 6= v a f (u) = f (v) (tj. koliduj´ıc´ı dvojice) je vˇetˇs´ı, neˇz N ( Nm ), kde N je velikost U a m je velikost T . D˚ ukaz. Kdyˇz pro t ∈ T oznaˇc´ıme kt = |f −1 (t)|, pak |A| = |A| = protoˇze
P
t∈T
X t∈T
kt (kt − 1) ≥ N (
kt = N .
Nerovn´ıtko plyne z technick´eho lemmatu.
52
P
t∈T
kt (kt − 1). Z lemmatu plyne, ˇze
N −m N − 1) = N ( ), m m
Vˇ eta. Kdyˇz H je c-univerz´aln´ı syst´em univerza U o velikosti N haˇsuj´ıc´ı do tabulky s m ˇr´adky, pak c ≥ m 1− N . D˚ ukaz. Pouˇzijeme pˇredchoz´ı lemma o obecn´e funkci a pˇri sˇc´ıt´an´ı si vtipnˇe“ pˇrehod´ıme, pˇres co vlastnˇe ” sˇc´ıt´ame, a pot´e vyuˇzijeme toho, ˇze H je c-univerz´aln´ı. Kdyˇz H = {hi | i ∈ I} je c-univerz´aln´ı syst´em funkc´ı z univerza U o velikosti N do tabulky o velikosti m, pak pomoc´ı lemmatu dost´av´ame N −m |I|N ( )≤ m X |{(x, y) ∈ U × U | hi (x) = hi (y), x 6= y}| = i∈I
X
|{i ∈ I | hi (x) = hi (y)}| ≤
X
c
(x,y)∈U ×U, x6=y
(x,y)∈U ×U,x6=y
|I| |I| = N (N − 1)c . m m
Odtud plyne, ˇze N − m ≤ c(N − 1), a tedy c≥
2.15.12
N −m N −m m > =1− . N −1 N N
Kdyˇz H je c-univerz´aln´ı, c ≥ 1 −
m N.
Probl´ emy univerz´ aln´ıho haˇ sov´ an´ı
Pouˇz´ıt jin´e metody na ˇreˇsen´ı koliz´ı neˇz separovan´e ˇretˇezce. Jak to ovlivn´ı pouˇzitelnost univerz´aln´ıho haˇsov´an´ı? Plat´ı podobn´e vztahy jako pro pevnˇe danou haˇsovac´ı funkci? Jak´ y vliv na efektivnost m´a nepˇr´ıtomnost operace DELETE? Existuje c-univerz´aln´ı haˇsovac´ı syst´em pro c < 1? Jak´ y je vztah mezi velikost´ı c-univerz´aln´ıho haˇsovac´ıho syst´emu a velikost´ı c? Lze zkonstruovat mal´ y c-univerz´aln´ı syst´em pro c < 3.25? Zde hraje roli fakt, ˇze pˇri c = 3.25 se oˇcek´avan´a d´elka ˇretˇezce m˚ uˇze pohybovat aˇz kolem hodnoty 7. ˇ Pouˇzit´ı Cebyˇ sevovy nerovnosti m´ısto Markovovy nerovnosti d´av´a kvadratick´ y odhad pravdˇepodobnosti, ˇze d´elka ˇretˇezce je o t vˇetˇs´ı neˇz oˇcek´avan´a hodnota. Za jak´ ych okolnost´ı d´av´a lepˇs´ı odhad? Lze pouˇz´ıt i vyˇsˇs´ıch moment˚ u? Jak pouˇz´ıt Markovou nerovnost a oˇcek´avanou d´elku maxim´aln´ıho ˇretˇezce pro odhad oˇcek´avan´eho poˇctu voleb haˇsovac´ı funkce? Pro jak´e parametry lze pouˇz´ıt n´asleduj´ıc´ı model?5 Je d´ana z´akladn´ı velikost tabulky m a d´ale pro j = 0, 1, . . . ˇc´ısla (parametry) lj a c-univerz´aln´ı haˇsovac´ı syst´emy Hj = {hi | i ∈ Ij } z univerza do tabulky s m2j ˇra´dky. 5
pozn.studenta - v˚ ubec nev´ım, o co jde :(
53
Mnoˇzina S ⊆ U je reprezentov´ana n´asledovnˇe: je d´ano j takov´e, ˇze kdyˇz j > 0, pak m2j−2 ≤ |S| ≤ m2j , kdyˇz j = 0, pak |S| ≤ m, a je zvolen index i ∈ Ij . D´ale m´ame prost´e ˇretˇezce r0 , r1 , . . . , rm2j −1 , jejichˇz d´elky jsou nejv´ yˇse lj , a ˇretˇezec rk obsahuje prvky {s ∈ S | hi (s) = k}. Operace INSERT(x) prohled´a ˇretˇezec rhi (x) a kdyˇz tento ˇretˇezec neobsahuje prvek x, pak ho pˇrid´a. Kdyˇz m2j−2 ≤ |S| ≤ m2j a d´elka ˇretˇezce rhi (x) je nejv´ yˇse lj , pak operace konˇc´ı. Kdyˇz |S| > m2j , tak se nejdˇr´ıve zvˇetˇs´ı j o 1. Pak se n´ahodnˇe zvol´ı i ∈ Ij a zkonstruuj´ı se ˇretˇezce reprezentuj´ıc´ı S. Kdyˇz nˇekter´ y z nich m´a d´elku vˇetˇs´ı neˇz lj , tak se volba a konstrukce ˇretˇezc˚ u opakuje tak dlouho, dokud se nepovede zvolit i ∈ Ij takov´e, ˇze vˇsechny zkonstruovan´e ˇretˇezce maj´ı d´elku nejv´ yˇse lj . Operace DELETE se ˇreˇs´ı analogicky. Probl´em: Jak volit parametry li ? V pˇr´ıpadˇe ˇreˇsen´ı koliz´ı dvojit´ ym haˇsov´an´ım nebo haˇsov´an´ım s line´arn´ım pˇrid´av´an´ım je tˇreba d´at silnˇejˇs´ı podm´ınky na velikost |S|. V posledn´ı dobˇe se t´eto t´ematice vˇenuje pozornost a byla dosaˇzena ˇrada zaj´ımav´ ych v´ ysledk˚ u.
2.16
Perfektn´ı haˇ sov´ an´ı
2.16.1
Idea
Jde o dalˇs´ı ˇreˇsen´ı koliz´ı. Idea je nal´ezt pro pˇredem danou mnoˇzinu haˇsovac´ı funkci, kter´a nevytv´aˇr´ı ˇza´dn´e kolize. Nev´ yhoda: Metoda nepˇripouˇst´ı operaci INSERT (pro nov´ y vstup nem˚ uˇzeme zaruˇcit, ˇze nevznikne kolize). Metodu lze prakticky pouˇz´ıt pro u ´lohy, kde lze oˇcek´avat hodnˇe operac´ı MEMBER a operace INSERT se t´emˇeˇr nevyskytuje (kolize se ˇreˇs´ı pomoc´ı mal´e pomocn´e tabulky, kam se ukl´adaj´ı koliduj´ıc´ı data). Tato metoda se pouˇz´ıv´a pˇri navrhov´an´ı kompil´ator˚ u. 2.16.2
Poˇ zadavky
Pro danou mnoˇzinu S ⊆ U chceme nal´ezt haˇsovac´ı funkci h takovou, ˇze 1. pro s, t ∈ S takov´e, ˇze s 6= t, plat´ı h(s) 6= h(t) (tj. h je perfektn´ı haˇsovac´ı funkce pro S); 2. h haˇsuje do tabulky s m ˇra´dky, kde m je pˇribliˇznˇe stejnˇe velk´e jako |S| (nen´ı praktick´e haˇsovat do pˇr´ıliˇs velk´ ych tabulek – ztr´ac´ı se jeden ze z´akladn´ıch d˚ uvod˚ u pro haˇsov´an´ı); 3. h mus´ı b´ yt rychle spoˇcitateln´a – jinak haˇsov´an´ı nen´ı rychl´e; 4. uloˇzen´ı h nesm´ı vyˇzadovat moc pamˇeti, nejv´ yhodnˇejˇs´ı je analytick´e zad´an´ı (kdyˇz zad´an´ı h bude vyˇzadovat moc pamˇeti, napˇr. kdyˇz by byla d´ana tabulkou, pak se ztr´ac´ı d˚ uvod k pouˇzit´ı stejnˇe jako v bodˇe 2). Kompenzace: Nalezen´ı haˇsovac´ı funkce m˚ uˇze spotˇrebovat v´ıce ˇcasu. Prov´ad´ı se jen na zaˇca´tku u ´lohy. 2.16.3
(N, m, n)-perfektn´ı syst´ em - definice
Mˇejme univerzum U = {0, 1, . . . , N − 1}. Definice. Soubor funkc´ı H z U do mnoˇziny {0, 1, . . . , m − 1} se naz´yv´ a (N, m, n)-perfektn´ı, kdyˇz pro kaˇzdou S ⊆ U takovou, ˇze |S| = n, existuje h ∈ H perfektn´ı pro S (tj. h(s) 6= h(t) pro kaˇzd´a dvˇe r˚ uzn´ a s, t ∈ S). 54
Protoˇze nev´ıme, zda takov´a h existuj´ı, nejprve vyˇsetˇr´ıme mnoˇziny perfektn´ıch haˇsovac´ıch funkc´ı. Vyˇsetˇr´ıme vlastnosti (N, m, n)-perfektn´ıch soubor˚ u funkc´ı. 2.16.4
Doln´ı odhady na velikost (N, m, n)-perfektn´ıho souboru
Pˇredpokl´adejme, ˇze H je (N, m, n)-perfektn´ı syst´em pro U = {0, 1, . . . , N − 1} a nejprve nalezneme doln´ı odhady na velikost |H|. N n ( m ) mnoˇzin. Lemma. Libovoln´a funkce h z U do mnoˇziny {0, 1, . . . , m−1} je perfektn´ı pro maxim´ alnˇe m n D˚ ukaz. Jeˇstˇe jednou – zjiˇst’ujeme poˇcet mnoˇzin S ⊆ U takov´ ych, ˇze h je perfektn´ı funkce pro S a |S| = n.
Funkce h je perfektn´ı pro S ⊆ U , pr´avˇe kdyˇz pro kaˇzd´e i = 0, 1, . . . , m − 1 je |h−1 (i) ∩ S| ≤ 1. (pokud by bylo vˇetˇs´ı, nebyla by perfektn´ı) Odtud poˇcet tˇechto mnoˇzin je n−1 Y
X
0≤i0
|h−1 (ij )|
Vysvˇetlen´ı: vzali jsme si vˇsechny moˇzn´e podmnoˇziny m, velk´e n – tahle mnoˇzina n´am ˇr´ık´a, na kter´ ych m´ıstech v´ ysledn´e tabulky je nˇeco zaheˇsov´ano – a reprezentovali jsme si ji pˇres rostouc´ı posloupnost. Pro kaˇzd´e m´ısto v tabulce, kde je nˇeco zaheˇsov´ano, jsem si vzal vˇsechny moˇznosti, co tam m˚ uˇzou b´ yt (to je −1 |h (ij )|). Jinak ˇreˇceno, h(S) = {ij | j = 0, 1, . . . , n − 1}.
Hled´ame horn´ı odhad t´eto sumy; je maxim´ aln´ı, kdyˇz |h−1 (i)| = m N n h m˚ uˇze b´ yt perfektn´ı nejv´ yˇse pro n ( m ) mnoˇzin. Vˇ eta.
N n m N n. (m) n
N m
pro kaˇzd´e i. Posloupnost´ı i je
m n
, tedy
|H| ≥ D˚ ukaz. V´ıme, ˇze n-prvkov´ ych podmnoˇzin universa je (Nn ) m N n ( ) mnoˇ z in, tedy skuteˇ c nˇ e |H| ≥ N n. n m ) (mn)( m
N n
, a kaˇzd´a z funkc´ı v H je perfektn´ı pro maxim´alnˇe
Jin´ y odhad velikosti (N, m, n)-perfektn´ıho souboru. Vˇ eta. |H| ≥
log N log m
D˚ ukaz. Velikost souboru funkc´ı nazvˇeme t, H = {h1 , . . . , ht }. Definujme indukc´ı soubor mnoˇzin Ui : • U0 = U 55
• pro i > 0 je Ui nejvˇetˇs´ı podmnoˇzina Ui−1 , co do poˇctu prvk˚ u, takov´a, ˇze hi je konstantn´ı na Ui . Pak |Ui | ≥
|Ui−1 | m
pro vˇsechna i > 0; z |U0 | = N plyne |Ui | ≥
N . mi
Pro kaˇzd´e i = 1, 2, . . . , t je hj (Ui ) jednobodov´a mnoˇzina pro kaˇzd´e j ≤ i (z definice mnoˇzin U – je tam konstantn´ı). Tedy, jakmile bychom pro nˇejak´e i mˇeli mnoˇzinu S, pro kterou |S ∩ Ui | ≥ 2, tak ˇza´dn´e j ≤ i nen´ı perfektn´ı (protoˇze pro tyto dva prvky by byla shodn´a). Protoˇze H je (N, m, n)-perfektn´ı, mus´ı b´ yt |Ut | ≤ 1 (vzali-li bychom si mnoˇzinu, co by v sobˇe mˇela v´ıce, neˇz 2 prvky z Ut , ani jedna z funkc´ı by tam nemohla b´ yt perfektn´ı), a tedy mNt ≤ 1. Proto t ≥
log N . log m
Z obou vˇet potom plat´ı:
2.16.5
Kdyˇz H je (N, m, n)-perfektn´ı soubor funkc´ı, pak N log N }. |H| ≥ max{ m nN n , log m ) ( n m
Existence (N, m, n)-perfektn´ıho souboru
Mˇejme univerzum U = {0, 1, . . . , N − 1} a soubor funkc´ı H = {h1 , h2 , . . . , ht } z univerza U do mnoˇziny {0, 1, . . . , m − 1}. (funkce jsou libovoln´e) Definice. Reprezentujeme tento soubor pomoc´ı matice M (H) typu N × t s hodnotami {0, 1, . . . , m − 1} tak, ˇze pro x ∈ U a i = 1, 2, . . . , t je v x-t´em ˇr´adku a i-t´em sloupci matice M (H) hodnota hi (x). (Jedna matice je tedy rovna jednomu souboru funkc´ı. Pokud m´am jedinou mnoˇzinu, pro kterou neexistuje perfektn´ı funkce, uˇz to nen´ı (N, m, n)-perfektn´ı syst´em.) Lemma. Pro pevnou mnoˇzinu S = {s1 , s2 , . . . , sn } ⊆ U je matic bez perfektn´ı funkce nejv´yˇse n
(m −
n−1 Y i=0
(m − i))t m(N −n)t .
ˇ adn´a funkce z H nen´ı perfektn´ı pro mnoˇzinu S = {s1 , s2 , . . . , sn } ⊆ U , pr´avˇe kdyˇz podmatice D˚ ukaz. Z´ M (H) tvoˇren´a ˇra´dky s1 , s2 , aˇz sn a vˇsemi sloupci nem´a prost´ y sloupec. Takov´ ych matic je nejv´ yˇse n
(m −
n−1 Y i=0
(m − i))t m(N −n)t .
Qn−1 (m − i) je poˇcet prost´ ych funkc´ı z S Vysvˇetlen´ı: mn je poˇcet vˇsech funkc´ı z S do {0, 1, . . . , m − 1}, i=0 do {0, 1, . Q . . , m − 1}, a tedy poˇcet vˇsech podmatic s n ˇra´dky takov´ ych, ˇze ˇza´dn´ y jejich sloupec nen´ı prost´ y, n−1 n t je (m − i=0 (m − i)) . Tyto podmatice m˚ uˇzeme libovolnˇe doplnit na matici typu N × n a pro kaˇzdou (N −n)t matici je tˇechto doplnˇen´ı m . 56
Lemma. Poˇcet matic, kter´e nereprezentuj´ı (N, m, n)-perfektn´ı syst´em, je menˇs´ı nebo roven n−1 Y N n (m − (m − i))t m(N −n)t . n i=0 D˚ ukaz. Podmnoˇzin U velikosti n je Nn , tedy poˇcet vˇsech matic, kter´e nereprezentuj´ı (N, m, n)-perfektn´ı Qn−1 (m − i))t m(N −n)t (podle posledn´ıho lemmatu) syst´em, je menˇs´ı nebo roven Nn (mn − i=0 Lemma (Postaˇcuj´ıc´ı podm´ınka). Kdyˇz n−1 Y N (mn − (m − i))t m(N −n)t < mN t , n i=0 pak nutnˇe existuje (N, m, n)-perfektn´ı syst´em. Qn−1 D˚ ukaz. Vˇsech matic je mN t , a tedy kdyˇz Nn (mn − i=0 (m − i))t m(N −n)t < mN t , pak nutnˇe existuje (N, m, n)-perfektn´ı syst´em, protoˇze nˇejak´a matice, co ho reprezentuje, se najde“. ”
n2
Vˇ eta. Pokud t ≥ n(ln N )e m , tak existuje (N, m, n)-perfektn´ı soubor funkc´ı. D˚ ukaz. N´asleduj´ıc´ı v´ yrazy jsou ekvivalentn´ı s postaˇcuj´ıc´ı podm´ınkou: Qn−1 ln Nn N i=0 (m − i) t <1 ⇔ t≥ . 1− Qn−1 (m−i) mn n − ln(1 − i=0mn ) Zlomek vpravo odhadneme shora – protoˇze se jedn´a o postaˇcuj´ıc´ı podm´ınku, pokud bude t vˇetˇs´ı, neˇz tento horn´ı odhad, pak (N, m, n) syst´em bude existovat. ˇ Citatel odhadneme shora – ln Nn ≤ n ln N . Jmenovatel odhadneme zdola – protoˇze − ln(1 − x) ≥ x pro x ∈ (0, 1), dost´av´ame − ln(1 −
n−1 Y Pn−1 i (m − i) i ) ≥ (1 − ) = e i=0 ln(1− m ) ≥ n m m i=0
Qn−1 i=0
e
Rn 0
x )dx ln(1− m
,
kde integr´al m˚ uˇzeme odhadnout m[(1 −
n n n n n2 )(1 − ln(1 − )) − 1] ≥ m[(1 − )(1 + ) − 1] = − . m m m m m n2
Horn´ı odhad zlomku je tedy n(ln N )e m . n2
Odtud dost´av´ame, ˇze kdyˇz t ≥ n(ln N )e m , pak plat´ı postaˇcuj´ıc´ı podm´ınka, a tedy existuje (N, m, n)perfektn´ı soubor funkc´ı. 57
Existence (N, m, n)-perfektn´ıho souboru funkc´ı ale nezaruˇcuje splnˇen´ı poˇzadavk˚ u 2), 3) a 4) ze sekce 2.16.2. Abychom uspˇeli, pouˇzijeme ideu z metody univerz´aln´ıho haˇsov´an´ı. Pozn. studenta – v n´asleduj´ıc´ıch nˇekolika kapitol´ach jsem si dovolil r˚ uzn´e funkce, kter´e stav´ıme, nazvat p´ısmeny A, B, C, D, E, abych v nich s´am mˇel poˇra´dek. P˚ uvodnˇe ˇslo o jednu kapitolu, ale ztr´acel jsem se v tom. 2.16.6
Konstrukce perfektn´ıch haˇ sovac´ıch funkc´ı A, B
Pˇredpoklady: U = {0, 1, . . . , N − 1}, kde N je prvoˇc´ıslo. Mˇejme pevn´e S ⊆ U o velikosti n. Definice. hk (x) = (kx mod N ) mod m
pro k = 1, 2, . . . , N − 1.
Definice. Pro i = 0, 1, . . . , m − 1 a k = 1, 2, . . . , N − 1 oznaˇcme bki = |{x ∈ S | (kx mod N ) mod m = i}|. ˇ ıkaj´ı, kolik V´ yznam bki : Hodnoty bki lze povaˇzovat za veliˇciny, kter´e ukazuj´ı odchylku od perfektnosti. R´ prvk˚ u koliduje v k-t´e funkci do i-t´eho slotu. Pozorov´ an´ı. kdyˇz bki ≥ 2, pak (bki )2 − bki ≥ 2, protoˇze a2 − a ≥ 2, kdyˇz a ≥ 2. Na druhou stranu bki ≤ 1 implikuje (bki )2 − bki = 0. Lemma (Podm´ınka perfektnosti). Funkce hk je perfektn´ı, pr´ avˇe kdyˇz D˚ ukaz. Plyne z
Pm−1 i=0
bki = n.
Lemma. Existuje k takov´e, ˇze D˚ ukaz. Odhadneme v´ yraz
Pm−1 i=0
PN −1 k=1
N −1 X k=1
(
(
i=0
N −1 X
k=1 N −1 X k=1
i=0
(bki )2 − n < 2.
(bki )2 ≤ 2 n(n−1) + n. m
Pm−1 i=0
m−1 X
Pm−1
(bki )2 ) − n .
(bki )2 ) − n = (
m−1 X i=0
|{x ∈ S | hk (x) = i}|2 ) − n =
|{(x, y) | x, y ∈ S, x 6= y, hk (x) = hk (y)}| =
X
x,y∈S,x6=y
|{k | 1 ≤ k < N, hk (x) = hk (y)}|. 58
Prvn´ı rovn´ıtko je z definice; druh´e plat´ı proto, ˇze umocnˇen´ y v´ yraz je poˇcet vˇsech koliduj´ıc´ıch dvojic a n je takov´ ych, ˇze se rovnaj´ı; tˇret´ı je opˇet pˇrehozen´ı sumy. Ted’ pouˇzijeme podobn´ y trik“ s modulem, jako pˇredt´ım. ” Zvolme x, y ∈ S takov´a, ˇze x 6= y.
Pak hk (x) = hk (y), pr´avˇe kdyˇz existuje i = 0, 1, . . . , m − 1 a r, s = 0, 1, . . . , ⌊ N ⌋ takov´a, ˇze m (kx ≡ i + rm) mod N (ky ≡ i + sm) mod N a i + rm, i + sm < N (i je opˇet zbytek po modulu). Odtud odeˇcten´ım dost´av´ame, ˇze hk (x) = hk (y) implikuje kx − ky ≡ (r − s)m mod N . Protoˇze 0 < k < n a x 6= y, plat´ı, ˇze kx − ky 6= 0; tedy hk (x) = hk (y) implikuje existenci (r − s) = q = −⌊
N N N ⌋, −⌊ ⌋ + 1, . . . , −1, 1, 2, . . . , ⌊ ⌋ m m m
takov´eho, ˇze k(x − y) = kx − ky ≡ qm mod N .
⌋ existuje pr´avˇe jedno k takov´e, ˇze k(x − y) ≡ Necht’ napˇr. q > 0; pro x > y a pro jedno q = 1, 2, . . . , ⌊ N m qm mod N , protoˇze ZN je tˇeleso (tato rovnice m´a jedin´e ˇreˇsen´ı – ˇreˇs´ıme k, protoˇze x, y, q, m, N jsou zafixov´any). Naopak pro q = −⌊ N ⌋, . . . , −2, −1 je rovnice k(x − y) ≡ qm mod N ekvivalentn´ı s rovnic´ı k(x − y) ≡ m N + qm mod N , opˇet je pr´avˇe jedno ˇreˇsen´ı. ⌋ = 2⌊ Nm−1 ⌋ r˚ uzn´ ych k = 1, 2, . . . , N − 1, ˇze Dost´av´ame, ˇze pro x, y ∈ S, x > y, existuje nejv´ yˇse 2⌊ N m hk (x) = hk (y) (jedno k pro kaˇzd´e moˇzn´e q). Stejn´ y odhad analogicky dostaneme, kdyˇz x < y (ale dost´av´ame jin´a ˇreˇsen´ı). Odtud
N −1 X k=1
(
m−1 X i=0
(bki )2 ) − n ≤
Tedy plat´ı, ˇze existuje k takov´e, ˇze
Pm−1 i=0
Lemma. Uk´aˇzeme, ˇze existuje v´ıce neˇz
X
2(
x,y∈S,x6=y
n(n − 1) N −1 ) = 2(N − 1) . m m
+ n. (bki )2 ≤ 2 n(n−1) m
N −1 4
m−1 X i=0
takov´ych k, ˇze plat´ı
(bki )2 < 3
n(n − 1) + n. m
D˚ ukaz. Sporem.
59
V opaˇcn´em pˇr´ıpadˇe dost´av´ame, ˇze N −1 X k=1
(
m−1 X
3(N − 1) 3n(n − 1) (bki )2 ) − n ≥ = 4 m i=0 9(N − 1)n(n − 1) > 4m 2(N − 1)n(n − 1) , m
a to je spor s pˇredchoz´ım v´ ysledkem. Tedy pˇri n´ahodn´em rovnomˇern´em v´ ybˇeru k je m−1 X
Prob{
i=0
(bki )2 <
3n(n − 1) 1 + n | k ∈ {1, 2, . . . , N − 1}} ≥ . m 4
Vˇ eta. Kdyˇz n = m, pak (a) (nazvu funkce AD ) existuje deterministick´y algoritmus, jenˇz v ˇcase O(nN ) nalezne k takov´e, ˇze m−1 X
(bki )2 < 3n;
i=0
(b) (nazvu AN ) existuje pravdˇepodobnostn´ı algoritmus, kter´y nalezne v ˇcase O(n) takov´e k, ˇze Pm−1 funkce k 2 (b ) < 4n – oˇcek´avan´y poˇcet iterac´ı v´ypoˇctu je nejv´yˇse 4. i i=0
D´ ale
(c) (nazvu funkce BD ) existuje deterministick´y algoritmus, jenˇz v ˇcase O(nN ) pro m = n(n − 1) + 1 nalezne takov´e k, ˇze hk je perfektn´ı; (d) (nazvu funkce BN ) existuje pravdˇepodobnostn´ı algoritmus, kter´y pro m = 2n(n − 1) v ˇcase O(n) nalezne k takov´e, ˇze hk je perfektn´ı – oˇcek´avan´y poˇcet iterac´ı v´ypoˇctu je nejv´yˇse 4. D˚ ukaz. Neform´alnˇe: ˇ Casy jsou jednoduch´e – pro deterministick´e mus´ıme zkusit vˇsechny moˇzn´e k, pro nedeterministick´e zkus´ıme v pr˚ umˇeru jen ˇctyˇrikr´at. Zbytek v podstatˇe jen dosad´ıme do pˇredchoz´ıch dvou lemmat r˚ uzn´e velikosti m. Form´alnˇe: Pm−1 k 2 Mˇejme n = m. Protoˇze spoˇc´ıt´an´ı i=0 (bi ) pro pevn´e k vyˇzaduje ˇcas O(n), prohled´an´ım vˇsech moˇznost´ı nalezneme k takov´e, ˇze m−1 X 2n(n − 1) (bki )2 ≤ + n = 3n − 2 < 3n, n i=0
v ˇcase O(nN ). T´ım je dok´az´ano a). Pravdˇepodobnostn´ı algoritmus dokazuj´ıc´ı b) vol´ı n´ahodnˇe k a v ˇcase Pm−1 k 2 O(n) ovˇeˇr´ı, zda i=0 (bi ) ≤ 3 n(n−1) + n = 4n − 3 < 4n. Tuto akci opakuje, dokud poˇzadavek nen´ı splnˇen. n y poˇcet iterac´ı akce je nejv´ yˇse Protoˇze pravdˇepodobnost, ˇze k splˇ nuje poˇzadavek, je alespoˇ n 14 , tak oˇcek´avan´ ∞ X 3 1 1 1 i( )i−1 = 3 2 = 4 4 4 4 (1 − ) 4 i=0
60
a odtud plyne b). Kdyˇz m = n(n − 1) + 1, pak prohled´an´ım vˇsech moˇznost´ı nalezneme k takov´e, ˇze m−1 X i=0
(bki )2 ≤
2n(n − 1) + n < n + 2, n(n − 1) + 1
v ˇcase O(nN ) a c) plyne z pˇredchoz´ı vˇety. Kdyˇz m = 2n(n − 1), pak pro n´ahodnˇe zvolen´e k plat´ı s pravdˇepodobnost´ı ≤ 14 , ˇze m−1 X 3n(n − 1) (bki )2 ≤ + n < n + 2. 2n(n − 1) i=0 Algoritmus splˇ nuj´ıc´ı tvrzen´ı d) je stejn´ y jako v pˇr´ıpadˇe b) (jen m = 2n(n − 1)).
Haˇsovac´ı funkce A nejsou perfektn´ı. Haˇsovac´ı funkce B jsou perfektn´ı, ale nesplˇ nuj´ı poˇzadavek 2) z 2.16.2 (plat´ı m = Θ(n2 )). Pro ten nalezneme funkci C 2.16.7
Konstrukce perfektn´ı haˇ sovac´ı funkce C
Neform´alnˇe: Pouˇziji funkce A, ty mi budou nˇekde kolidovat. Na kaˇzd´e z kolizn´ıch mnoˇzin pak pouˇziji funkce B, kaˇzdou extra v extra tabulce a pak je vˇsechny d´am za sebe. Poˇcet koliz´ı v A je omezen. Form´alnˇe, deterministick´a verze: 1. Nalezneme k takov´e, ˇze pro m = n plat´ı Si = {s ∈ S | hk (s) = i}
Pm−1 i=0
(bki )2 < 3n. Pro i = 0, 1, . . . , m − 1 nalezneme mnoˇziny
2. Pro kaˇzd´e i = 0, 1 . . . , m − 1 takov´e, ˇze Si 6= ∅, nalezneme pro m = 1 + |Si |(|Si | − 1) takov´e ki , ˇze hki je perfektn´ı na Si . Definujme ci = 1 + |Si |(|Si | − 1), kdyˇz Si 6= ∅, a ci = 0, kdyˇz Si = ∅. Pi−1 3. Pro i = 0, 1, . . . , m definujme di = j=0 cj a pro x ∈ U oznaˇcme hk (x) = l. Pak poloˇz´ıme g(x) = dl + hkl (x). Form´alnˇe, nedeterministick´a verze, rozd´ıly podtrˇzeny: 1. Nalezneme k takov´e, ˇze pro m = n plat´ı Si = {s ∈ S | hk (s) = i}
Pm−1 i=0
(bki )2 < 4n. Pro i = 0, 1, . . . , m − 1 nalezneme mnoˇziny
2. Pro kaˇzd´e i = 0, 1 . . . , m − 1 takov´e, ˇze Si 6= ∅, nalezneme pro m = 1 + 2|Si |(|Si | − 1) takov´e ki , ˇze hki je perfektn´ı na Si . Definujme ci = 2|Si |(|Si | − 1), kdyˇz Si 6= ∅, a ci = 0, kdyˇz Si = ∅. 3. Pro i = 0, 1, . . . , m definujme di = dl + hkl (x).
Pi−1
j=0 cj
a pro x ∈ U oznaˇcme hk (x) = l. Pak poloˇz´ıme g(x) =
61
Vˇ eta. • Zkonstruovan´ a funkce g je perfektn´ı. • Hodnota g(x) se pro kaˇzd´e x ∈ U spoˇc´ıt´ a v ˇcase O(1). • V deterministick´em pˇr´ıpadˇe haˇsuje do tabulky velikosti < 3n a je nalezena v ˇcase O(nN ), v pravdˇepodobnostn´ım pˇr´ıpadˇe haˇsuje do tabulky velikosti < 6n a je nalezena v ˇcase O(n). • Pro jej´ı zak´odov´an´ı jsou tˇreba hodnoty k a ki pro i = 0, 1, . . . , m − 1. Tyto hodnoty jsou v rozmez´ı 1, 2, . . . , N − 1, a tedy vyˇzaduj´ı O(n log N ) pamˇeti. D˚ ukaz. • Protoˇze g(Si ) pro i = 0, 1, . . . , m − 1 jsou navz´ajem disjunktn´ı a hki je perfektn´ı na Si , dost´av´ame, ˇze g je perfektn´ı. • Pro v´ ypoˇcet hodnoty g(x) jsou tˇreba dvˇe n´asoben´ı, dvoj´ı v´ ypoˇcet zbytku pˇri dˇelen´ı a jedno sˇc´ıt´an´ı (hodnoty di jsou uloˇzeny v pamˇeti). Proto v´ ypoˇcet g(x) vyˇzaduje ˇcas O(1). • D´ale dm je horn´ı odhad na poˇcet ˇra´dk˚ u v tabulce. Protoˇ ze pro SP ame |Si |(|Si |−1)+1 ≤ |Si |2 = i 6= ∅ m´ Pm−1 m−1 k 2 k 2 (bi ) , dost´av´ame v deterministick´em pˇr´ıpadˇe dm = i=0 ci ≤ i=0 (bi ) < 3n a k nalezneme v ˇcase Pm−1 O(nN ). Protoˇ ze ki nalezneme v ˇcase O(|Si |N ), lze g zkonstruovat v ˇcase O(nN + i=0 |Si |N ) = Pm−1 O(nN + N i=0 |Si |) = O(2nN ) = O(nN ). V pravdˇepodobnostn´ım pˇr´ıpadˇe je dm =
m−1 X i=0
ci ≤
m−1 X i=0
2
(2|Si | − 2|Si |) = 2
m−1 X
(bki )2
i=0
−2
m−1 X i=0
bki < 8n − 2n = 6n
Pm−1 k bi = n). (protoˇze |Si | = bki a i=0 • Protoˇze k nalezneme v ˇcase O(n) a ki v ˇcase O(|Si |), dostaneme, ˇze ˇze g nalezneme v ˇcase O(n). • Zbytek je jasn´ y.
Tedy zkonstruovan´a haˇsovac´ı funkce splˇ nuje poˇzadavky 1), 2) a 3) z 2.16.2, ale poˇzadavek 4) nen´ı splnˇen. 2.16.8
Konstrukce perfektn´ı haˇ sovac´ı funkce D
Lemma. Necht’ q =poˇcet prvoˇc´ısel, kter´ a dˇel´ı m. Pak q = O( logloglogmm ). D˚ ukaz. Mˇejme pˇrirozen´e ˇc´ıslo m a necht’ q je poˇcet vˇsech prvoˇc´ısel dˇel´ıc´ıch m (p1 , p2 , . . . je rostouc´ı posloupnost vˇsech prvoˇc´ısel). Pak m≥
q Y i=1
pi > q! = e
Pq
i=1
ln i
≥e
Rq 1
ln xdx
q q = eq ln( e )+1 ≥ ( )q . e
Proto existuje konstanta c, ˇze q ≤ c lnlnlnmm (viz Pomocn´e lemma v sekci 2.3.6).
Vˇ eta. Pro kaˇzdou n-prvkovou mnoˇzinu S ⊆ U existuje prvoˇc´ıslo p o velikosti O(n2 ln N ) takov´e, ˇze funkce φp (x) = x mod p je perfektn´ı pro S. (nazvu funkce D) D˚ ukaz. Mˇejme opˇet pevnˇe danou S = {s1 < s2 < · · · < sn } ⊆ U . Oznaˇcme di,j = sj − si pro 1 ≤ i < j ≤ n. Pak si mod p 6= sj mod p, pr´avˇe kdyˇz di,j 6= 0 mod p. 62
Oznaˇcme D =
Q
2
1≤i<j≤n
di,j ≤ N (n ) .
Pak poˇcet prvoˇc´ıseln´ ych dˇelitel˚ u ˇc´ısla D je nejv´ yˇse c lnlnlnDD (z minul´eho lemmatu). Tedy mezi prvn´ımi 1 + c lnlnlnDD prvoˇc´ısly existuje prvoˇc´ıslo p takov´e, ˇze si mod p 6= sj mod p pro kaˇzd´e 1 ≤ i < j ≤ n. Existuje proto, ˇze jsme vzali o 1 vˇetˇs´ı neˇz nejvˇetˇs´ı moˇzn´e prvoˇc´ıslo, kter´e to dˇel´ı; nerovn´a se proto, ˇze to nesm´ı dˇelit ani jeden rozd´ıl. To znamen´a, ˇze funkce φp (x) = x mod p je perfektn´ı pro S. Podle vˇety o velikosti prvoˇc´ısel pt ≤ 2t ln t pro kaˇzd´e t ≥ 6, tedy ln D ln D p ≤2(1 + c ) ln(1 + c )≤ ln ln D ln ln D ln D ln D ln(2c )≤ 4c ln ln D ln ln D ln D ln D ln D 4c(ln 2c) + 4c ln( )= ln ln D ln ln D ln ln D 4c ln D + o(ln D) = O(ln D) = O(n2 ln N ).
Vˇ eta. Pro danou mnoˇzinu S ⊆ U takovou, ˇze |S| = n, deterministick´y algoritmus nalezne prvoˇc´ıslo p = O(n2 log N ) takov´e, ˇze φp (x) = x mod p je perfektn´ı pro S, a pracuje v ˇcase O(n3 log n log N ). D˚ ukaz. Test, zda funkce φp (x) = x mod p je perfektn´ı pro S, vyˇzaduje ˇcas O(n log n). Tedy systematick´e hled´an´ı nejmenˇs´ıho p, ˇze φp je perfektn´ı pro S, vyˇzaduje ˇcas O(n3 log n log N ).
Vˇ eta. Pravdˇepodobnostn´ı algoritmus nalezne prvoˇc´ıslo p = O(n2 log N ) takov´e, ˇze φp je perfektn´ı, v oˇcek´avan´em ˇcase O(n log n(log n + log log N )). D˚ ukaz. Nejmenˇs´ı p takov´e, ˇze φp je perfektn´ı pro S, je prvoˇc´ıslo. Navrhneme pravdˇepodobnostn´ı algoritmus pro nalezen´ı p. Pro dostateˇcnˇe velk´e n mezi prvn´ımi 9c ln D ˇc´ısly je alespoˇ n polovina takov´ ych prvoˇc´ısel p, ˇze φp je perfektn´ı pro S. Algoritmus pak opakuje n´asleduj´ıc´ı krok, dokud nenalezne perfektn´ı funkci • vyberme n´ahodnˇe ˇc´ıslo p mezi prvn´ımi 9cn2 ln N ˇc´ısly a otestujme, zda p je prvoˇc´ıslo a φp je perfektn´ı Odhadneme oˇcek´avan´ y poˇcet ne´ uspˇeˇsn´ ych krok˚ u. N´ahodnˇe zvolen´e ˇc´ıslo p ≤ 9cn2 ln N je prvoˇc´ıslo s pravdˇepodobnost´ı Θ( ln(9cn12 ln N ) ) (pouˇzijeme RabinMiller˚ uv pravdˇepdobnostn´ı algoritmus na testov´en´ı prvoˇc´ısel) a pro prvoˇc´ıslo p je φp perfektn´ı s pravdˇepodobnost´ı ≥ 21 . Tedy n´ahodnˇe zvolen´e ˇc´ıslo p ≤ 9cn2 ln N splˇ nuje test s pravdˇepodobnost´ı Θ( ln(9cn12 ln N ) ), a proto oˇcek´avan´ y poˇcet ne´ uspˇeˇsn´ ych test˚ u je O(ln(9cn2 ln N )). Tedy oˇcek´avan´ y ˇcas algoritmu je O(n log n(log n+ log log N )).
Pozorov´ an´ı. Deterministick´y algoritmus nalezne nejmenˇs´ı prvoˇc´ıslo s poˇzadovanou vlastnost´ı. Pravdˇepodobnostn´ı algoritmus nalezne prvoˇc´ıslo, kter´e m˚ uˇze b´yt podstatnˇe vˇetˇs´ı, ale jeho velikost je omezena 9cn2 log N . 63
2.16.9
Konstrukce perfektn´ı haˇ sovac´ı funkce E
Neform´alnˇe: Nyn´ı vˇsechny funkce A, B, C, D zkombinujeme“ dohromady. ” 1. Prvn´ı vezmeme funkci DD . 2. Na zaheˇsovan´e mnoˇzinˇe najdeme funkci BD s nˇejak´ ym prvoˇc´ıslem jako velikost´ı tabulky. 3. Na zaheˇsovan´e mnoˇzinˇe najdeme funkci CD . Podobnˇe nedeterministicky. Pokud to ch´apu spr´avnˇe, pouˇzijeme B jakoby dvakr´at; jednou v B a jednou v C. Vˇsechno jsme to takhle zkombinovali, protoˇze: • C se n´am l´ıb´ı, protoˇze je perfektn´ı a m´a malou tabulku; ale potˇrebuje moc pamˇeti na uloˇzen´ı. Tak si zmenˇs´ıme prostor, ve kter´em se pohybujeme. • Pokud si pˇredt´ım omez´ıme prostor pomoc´ı B, tak je pamˇet’, nutn´a k C, o nˇeco menˇs´ı, ale zase trv´a pˇr´ıliˇs dlouho nal´ezt parametr k B a je moc velk´ y • Proto si jeˇstˇe pom˚ uˇzu na zaˇca´tku D, kter´a n´am prostor zmenˇs´ı. Form´alnˇe: 1. Nalezneme prvoˇc´ıslo q0 ∈ O(n2 log N ) takov´e, ˇze φq0 (x) = x mod q0 je perfektn´ı funkce pro S. Poloˇzme S1 = {φq0 (s) | s ∈ S}. 2. Nalezneme prvoˇc´ıslo q1 takov´e, ˇze n(n−1) < q1 ≤ 2n(n−1). Pak existuje l ∈ {1, 2, . . . , q0 −1} takov´e, ˇze hl (x) = ((lx) mod q0 ) mod q1 je perfektn´ı pro S1 ⊆ {0, 1, . . . , q0 − 1}. Poloˇzme S2 = {hl (s) | s ∈ S1 }. 3. D´ale zkonstruujme perfektn´ı haˇsovac´ı funkci g pro mnoˇzinu S2 ⊆ {0, 1, . . . , q1 − 1} do tabulky s m´enˇe neˇz 3n ˇra´dky. Poloˇzme f (x) = g(hl (φq0 (x))). Konstruovan´a haˇsovac´ı funkce je f . V´ ysledek: f je perfektn´ı haˇsovac´ı funkce pro S, protoˇze sloˇzen´ı perfektn´ıch haˇsovac´ıch funkc´ı je zase perfektn´ı funkce, a tedy poˇzadavek 1) je splnˇen. f haˇsuje S do tabulky s m´enˇe neˇz 3n ˇra´dky, a tedy splˇ nuje poˇzadavek 2). Protoˇze kaˇzd´a z funkc´ı g, hl , φq0 se vyˇc´ısl´ı v ˇcase O(1), i vyˇc´ıslen´ı funkce f vyˇzaduje ˇcas O(1) a poˇzadavek 3) je splnˇen. Funkce φq0 je jednoznaˇcnˇe urˇcena ˇc´ıslem q0 ∈ O(n2 log N ). Funkce hl je urˇcena ˇc´ısly q1 ∈ O(n2 ) a l ∈ O(q0 ). Funkce g je urˇcena n + 1 ˇc´ısly velikosti O(q1 ). Tedy zad´an´ı f vyˇzaduje pamˇet’ o velikosti O(log n + log log N + n log n) = O(n log n + log log N ). Lze ˇr´ıct, ˇze poˇzadavek 4) je splnˇen. V´ ypoˇcet φq0 vyˇzaduje ˇcas O(n3 log n log N ). V´ ypoˇcet hl vyˇzaduje ˇcas O(n(n2 log N )) = O(n3 log N ) (pouˇzit´e univerzum je {0, 1, . . . , q0 }). V´ ypoˇcet g vyˇzaduje ˇcas O(nn2 ) = O(n3 ) (zde univerzum je {0, 1, . . . , q1 }). Celkovˇe v´ ypoˇcet f vyˇzaduje ˇcas O(n3 log n log N ). Lze pouˇz´ıt i pravdˇepodobnostn´ı algoritmy pro nalezen´ı g, hl a φq0 . Pak haˇsujeme do tabulky s m´enˇe neˇz 6n ˇra´dky, ale oˇcek´avan´ y ˇcas pro nalezen´ı f je O(n log n(log n + log log N )). Tuto metodu navrhli Fredman, Koml´os a Szemer´edi. 64
2.16.10
Univerz´ aln´ı a perfektn´ı haˇ sov´ an´ı
Pˇredchoz´ı hlavn´ı konstrukce perfektn´ı haˇsovac´ı funkce vych´azela z idej´ı pouˇzit´ ych v univerz´aln´ım haˇsov´an´ı. Uk´aˇzeme, ˇze to nen´ı n´ahodn´a shoda. Dok´aˇzeme, ˇze kaˇzd´ y c-univerz´aln´ı syst´em funkc´ı umoˇzn ˇuje z´akladn´ı konstrukci perfektn´ı haˇsovac´ı funkce. Pro kaˇzd´e m necht’ Hm = {hi | i ∈ I} je c-univerz´aln´ı syst´em funkc´ı haˇsuj´ıc´ıch do tabulky velikosti m. Pro libovolnou, ale pevnou podmnoˇzinu S ⊆ U o velikosti n definujme bij = {s ∈ S | hi (s) = j} pro kaˇzd´e j = 0, 1, . . . , m − 1 a i ∈ I. Kdyˇz bij ≥ 2, pak (bij )2 − bij ≥ 2, a kdyˇz bij ≤ 1, pak (bij )2 − bij = 0. Odtud dost´av´ame pˇrirozen´e zobecnˇen´ı d˚ usledku z pˇredchoz´ı sekce, kter´e vyuˇzijeme stejn´ ym zp˚ usobem jako v pˇredchoz´ı sekci: Pm−1 i 2 Pm−1 i 2 D˚ usledek. Kdyˇz j=0 (bj ) ≥ n + 2, pak hi nen´ı perfektn´ı pro S, kdyˇz j=0 (bj ) < n + 2, pak hi je perfektn´ı haˇsovac´ı funkce pro S. Stejnˇe jako v pˇredchoz´ı sekci spoˇc´ıt´ame X X m−1 i∈I
j=0
X (bij )2 − n = |{(s, t) | s, t ∈ S, s 6= t, hi (s) = hi (t)}| =
X
s,t∈S,s6=t
i∈I
|{i ∈ I | hi (s) = hi (t)}| ≤
c|I| cn(n − 1)|I| = . m m s,t∈S,s6=t X
Pm−1 i 2 Proto existuje i ∈ I takov´e, ˇze j=0 (bj ) ≤ cn(n−1) + n. Nyn´ı spoˇc´ıt´ame analogick´e odhady, kter´e tvoˇr´ı m z´aklad pro pravdˇepodobnostn´ı algoritmus. Mˇejme kladn´e ˇc´ıslo a > 0 a oznaˇcme I ′ mnoˇzinu tˇech i ∈ I, ˇze m−1 X
(bij )2 >
j=0
(c + a)n(n − 1) + n. m
D´ale pˇredpokl´adejme, ˇze |I ′ | ≥ b|I| pro nˇejak´e kladn´e ˇc´ıslo b. Pak plat´ı m−1 X X m−1 cn(n − 1)|I| X X i 2 (bij )2 − n > (bj ) − n ≥ ≥ m j=0 j=0 i∈I i∈I ′
X (c + a)n(n − 1) i∈I ′
m
≥
(c + a)n(n − 1)b|I| . m
c . Kdyˇz tedy vyb´ır´ame hi ∈ Hm n´ahodnˇe s rovnomˇern´ ym Odtud plyne, ˇze c > (c + a)b, a proto b < c+a Pm−1 i 2 (c+a)n(n−1) rozdˇelen´ım (vzhledem k i ∈ I), pak pravdˇepodobnost, ˇze bude platit j=0 (bj ) > + n, je menˇs´ı m c neˇz c+a . Stejnˇe jako v pˇredchoz´ı sekci shrneme tato fakta do tvrzen´ı
Tvrzen´ı. Pro pˇrirozen´e ˇc´ıslo m mˇejme c-univerz´aln´ı syst´em funkc´ı Hm = {hi | i ∈ I} haˇsuj´ıc´ıch do tabulky o velikosti m = n existuje deterministick´y algoritmus, kter´y v ˇcase O(|I|n) nalezne hi ∈ Hm Pm−1 m.i Pro 2 takovou, ˇze j=0 (bj ) ≤ c(n − 1) + n, a existuje pravdˇepodobnostn´ı algoritmus, kter´y pro kladn´e ˇc´ıslo a v ˇcase O(n) nalezne hi ∈ Hm takov´e, ˇze m−1 X j=0
(bij )2 < (c + a)(n − 1) + n,
a oˇcek´avan´y poˇcet iterac´ı pˇri hled´an´ı hi je menˇs´ı neˇz
c+a . a
Pro m = cn(n−1) + 1 existuje deterministick´y algoritmus, kter´y nalezne perfektn´ı haˇsovac´ı funkci h ∈ Hm 2 pro mnoˇzinu S velikosti n v ˇcase O(n|I|). +1 existuje pravdˇepodobnostn´ı algoritmus, kter´y nalezne perfektn´ı haˇsovac´ı Pro a > 0 a pro m = (c+a)n(n−1) 2 funkci h ∈ Hm pro mnoˇzinu S v ˇcase O(n) a oˇcek´avan´y poˇcet iterac´ı je menˇs´ı neˇz c+a . a 65
Pm−1 i 2 D˚ ukaz. Kdyˇz n = m, pak v ˇcase O(n) pro haˇsovac´ı funkci ovˇeˇr´ıme, zda j=0 (bj ) ≤ c(n − 1) + n, Pm−1 i 2 respektive j=0 (bj ) ≤ (c+a)(n−1)+n. V prvn´ım pˇr´ıpadˇe v´ıme, ˇze takov´a funkce v souboru Hm existuje, a systematick´ ym prohled´av´an´ım vˇsech funkc´ı v dan´em c-univerz´aln´ım syst´emu Hm ji nalezneme v ˇcase O(n|I|). Pro pravdˇepodobnostn´ı algoritmus budeme vyb´ırat funkci ze souboru Hm n´ahodnˇe s rovnomˇern´ ym rozdˇelen´ım. Pak oˇcek´avan´ y poˇcet iterac´ı neˇz uspˇejeme je ∞ X
∞
∞
X c i−1 c c i−1 X c i i( ) (1 − )≤ ) − ) = i( i( c+a c+a c+a c+a i=1 i=1 i=1 ∞ X i=0
(
c i 1 c+a ) = . c = c+a 1 − c+a a
Pro hled´an´ı perfektn´ı haˇsovac´ı funkce opˇet pouˇzijeme systematick´ av´an´ı c-univerz´aln´ıho syst´emu, Pm−1 i 2 e prohled´ cn(n−1) protoˇze v´ıme, ˇze existuje funkce hi ∈ Hm takov´a, ˇze j=1 (bj ) ≤ cn(n−1) + n < n + 2, a tedy je tato 2
funkce perfektn´ı. To vyˇzaduje ˇcas O(n|I|).
+1
Kdyˇz m´ame a > 1 a m = (c+a)n(n−1) + 1 a kdyˇz budeme volit funkce z Hm n´ahodnˇe s rovnomˇern´ ym 2 a rozdˇelen´ım, pak s pravdˇepodobnost´ı c+a dostaneme funkci hi takovou, ˇze m−1 X j=0
(bij )2 ≤
(c + a)n(n − 1) (c+a)n(n−1) 2
+1
+ n < 2 + n.
Z d˚ usledku plyne, ˇze hi je perfektn´ı. Anal´ yza oˇcek´avan´eho poˇctu iterac´ı je stejn´a jako u pˇredchoz´ıho tvrzen´ı pro pravdˇepodobnostn´ı algoritmus.
Dalˇs´ı postup konstrukce perfektn´ı haˇsovac´ı funkce uˇz nesouvis´ı s c-univerz´aln´ımi syst´emy. 2.16.11
Dynamick´ e perfektn´ı haˇ sov´ an´ı
Jedna z velk´ ych nev´ yhod perfektn´ıho haˇsovan´ı je neznalost efektivn´ıch aktualizaˇcn´ıch operac´ı. Existuj´ı sice obecn´e metody na dynamizaci deterministick´ ych operac´ı – viz letn´ı pˇredn´aˇska, ale tato metoda v tomto pˇr´ıpadˇe neposkytuje efektivn´ı dynamizaˇcn´ı operace, protoˇze deterministick´ y algoritmus pro ˇreˇsen´ı perfektn´ıho haˇsov´an´ı je pro aktualizaˇcn´ı operace pˇr´ıliˇs pomal´ y. To vedlo k n´avrhu, kter´ y kombinuje pravdˇepodobnostn´ı algoritmus pro perfektn´ı haˇsov´an´ı s obecnou metodou dynamizace a tyto metody jsou upraveny pro konkr´etn´ı situaci. Nejprve uvedeme modifikaci v´ ysledk˚ u z pˇredchoz´ı ˇca´sti, na kter´ ych je tato metoda zaloˇzena. Pˇredpokl´ad´ame, ˇze U = {0, 1, . . . , N − 1} je univerzum, kde N je prvoˇc´ıslo, a ˇze je d´ano ˇc´ıslo s < N . Oznaˇcme Hs = {hk | k = 1, 2, . . . , N − 1} mnoˇzinu funkc´ı z U do {0, 1, . . . , s − 1}, kde hk (x) = (kx mod N ) mod s pro kaˇzd´e x ∈ U . Kdyˇz zvol´ıme n´ahodnˇe k = 1, 2, . . . , N − 1, pak s pravdˇepodobnost´ı alespoˇ n 21 plat´ı s−1 X
(bki )2 <
i=0
Skuteˇcnˇe, kdyˇz pro m´enˇe neˇz
N −1 2
hodnot k plat´ı N −1 X k=1
(
m−1 X i=0
Pm
4n2 + n. s −1(bki )2 ≤ !
i=0
(bki )2 ) − n 66
4n , m
≥ 2(N − 1)
pak
n2 m
a to je spor. Budeme pˇredpokl´adat, ˇze takov´e k m´ame, a pak pro kaˇzd´e i = 0, 1, . . . , s − 1 pˇredpokl´ad´ame, ˇze n´ahodnˇe zvol´ıme ji ∈ H2(bki )2 takov´e, ˇze hji je prost´a na mnoˇzinˇe Si = {s ∈ S | hk (s) = i} (z pˇredchoz´ıho textu v´ıme, ˇze kdyˇz zvol´ıme n´ahodnˇe ji = 0, 1, . . . , N − 1, pak s pravdˇepodobnost´ı alespoˇ n 41 je hji prost´a na Si ). Pro jednoduchost pˇredpokl´ad´ame, ˇze mnoˇziny Si pro i = 0, 1, . . . , s − 1 uloˇz´ıme do tabulek Ti a tabulky T0 , T1 , . . . , Ts−1 budou uloˇzeny v tabulce T . Kdyˇz s = O(|S|), pak tato √ metoda vyˇzaduje O(|S|) 4 prostoru. Abychom urˇcili s, zvolme c > 1 a poloˇzme s = σ(|S|), kde σ(n) = 3 6(1 + c)n pro kaˇzd´e n. Nyn´ı pop´ıˇseme algoritmy. Zde n je velikost reprezentovan´e mnoˇziny, s = σ(n) a 2m(j) je velikost tabulky Tj pro j = 0, 1, . . . , s − 1. 2.16.12
Algoritmy
INSERT(x): n := n + 1 if n ≤ s then j := h(x), |Sj | := |Sj | + 1 if |Sj | ≤ m(j) a pozice hj (x) v Tj je pr´azdn´a then vloˇz´ıme x do tabulky Tj na pozici hj (x) else if |Sj | ≤ m(j) a pozice hj (x) v Tj je obsazen´a then vytvoˇr´ıme seznam Sj prvk˚ u v tabulce Tj vypr´azdn´ıme tabulku Tj zvol´ıme n´ahodnˇe funkci hj ∈ Hm(j)2 while hj nen´ı prost´a na mnoˇzinˇe Sj do zvol´ıme n´ahodnˇe funkci hj ∈ Hm(j)2 enddo for every y ∈ Sj do vloˇz´ıme y do Tj na pozici hj (y) enddo else m(j) := 2m(j) if nen´ı dost prostoru pro tabulku Tj nebo σ(m)−1
X i=0
(m(i))2 ≥
4n2 +n σ(n)
then RehashAll else alokujeme prostor pro novou pr´azdnou tabulku Tj vytvoˇr´ıme seznam Sj prvk˚ u ze star´e tabulky Tj a zruˇs´ıme ji zvol´ıme n´ahodnˇe funkci hj ∈ Hm(j)2 while hj nen´ı prost´a na mnoˇzinˇe Sj do zvol´ıme n´ahodnˇe funkci hj ∈ Hm(j)2 enddo for every y ∈ Sj do vloˇz´ıme y do Tj na pozici hj (y) enddo endif endif else RehashAll endif endif RehashAll: 67
projdeme tabulku T a tabulky Ti a vytvoˇr´ıme seznam prvk˚ u z mnoˇziny S s := σ(n) zvolme n´ahodnˇe h ∈ Hs for every i = 0, 1, . . . , s − 1 do Si := {x ∈ S | h(x) = i} enddo Ps−1 2 while i=0 2(|Si |)2 > 8ns + 2n do zvolme n´ahodnˇe h ∈ Hs for every i = 0, 1, . . . , s − 1 do Si := {x ∈ S | h(x) = i} enddo enddo Koment´aˇr: zde Si jsou mnoˇziny vytvoˇren´e n´ahodnˇe zvolenou funkc´ı h n := 0 for every i = 0, 1, . . . , s − 1 do m(i) := 2|Si | zvol´ıme n´ahodnˇe hi ∈ Hm(i)2 while hi nen´ı prost´a na mnoˇzinˇe Si do zvol´ıme n´ahodnˇe hi ∈ Hm(i)2 enddo enddo for every x ∈ S do INSERT(x) enddo DELETE(x): j := h(x), n := n − 1, |Sj | := |Sj | − 1 odstran´ıme x z pozice hj (x) v tabulce Tj , pozice bude pr´azdn´a m if n < 1+2c then RehashAll endif MEMBER(x): j := h(x) if x je na hj (x)-t´e pozici v tabulce Tj then V´ ystup: x je prvek S else V´ ystup: x nen´ı prvkem S endif Algoritmy pˇredpokl´adaj´ı, ˇze pˇri operaci INSERT(x) prvek x nepatˇr´ı do S a pˇri operaci DELETE(x) x je prvkem S. Velikost reprezentovan´e mnoˇziny je n. Uvedu sloˇzitost t´eto metody bez d˚ ukazu. Vˇ eta. Popsan´ a metoda vyˇzaduje line´ arn´ı pamˇet’ (neuvaˇzuje se pamˇet’ potˇrebn´ a pro zak´odov´an´ı haˇsovac´ıch funkc´ı), operace MEMBER v nejhorˇs´ım pˇr´ıpadˇe vyˇzaduje ˇcas O(1) a oˇcek´avan´ a amortizovan´ a sloˇzitost operac´ı INSERT a DELETE je tak´e O(1). Toto zobecnˇen´ı Fredman-Koml´os-Szemer´ediho metody navrhli Dietzfelbinger, Karlin, Mehlhorn, Meyer auf der Heide, Rohnert a Tarjan. Dalˇs´ı nev´ yhoda Fredman-Koml´os-Szemer´ediho metody: Navrˇzen´a metoda pracuje pro m < 3n, ale nezajist´ı m = n. Lze ˇr´ıct, ˇze pamˇet’ je efektivnˇe vyuˇzita? Existuje metoda, kter´a by umoˇznila n´avrh perfektn´ı haˇsovac´ı funkce pro m = n? Z v´ ysledk˚ u pro (N, m, n)N n+ln(n) perfektn´ı soubory funkc´ı plyne existence (N, n, n)-perfektn´ıho souboru pro n > e ln(N ). Zm´ın´ıme se orientaˇcnˇe o parametrizovan´e metodˇe, kter´a navrhuje perfektn´ı haˇsovac´ı funkci pro S ⊆ U a pro |S| = n. Parametr bude pˇrirozen´e ˇc´ıslo r, kter´e urˇcuje, jak´e hypergrafy jsou uˇzity pˇri konstrukci funkce. Proto nejdˇr´ıve pˇripomeneme nˇekolik definic. Dvojice (X, E), kde X je mnoˇzina a E je syst´em r-prvkov´ ych podmnoˇzin X, se naz´ yv´a r-hypergraf. Prvky v E se naz´ yvaj´ı hrany r-hypergrafu. Cyklus je hypergraf (X, E), kde kaˇzd´ y vrchol leˇz´ı alespoˇ n ve dvou 68
r˚ uzn´ ych hran´ach. Naopak r-hypergraf (X, E) se naz´ yv´a acyklick´y, kdyˇz ˇza´dn´ y jeho podhypergraf nen´ı cyklus. Nyn´ı pop´ıˇseme metodu, kter´a je rozdˇelena do dvou krok˚ u. Je d´ano S ⊆ U takov´e, ˇze |S| = n. Krok 1) Mˇejme r-hypergraf (V, E), kde |E| = n. Nalezneme zobrazen´ı g : V → {0, 1, . . . , n − 1} P takov´e, ˇze funkce h : E → {0, 1, . . . , n − 1} definovan´a h(e) = ri=1 g(vi ) mod n, kde e = {v1 , v2 , . . . , vr }, je prost´a (m´ısto sˇc´ıt´an´ı modulo n m˚ uˇzeme pouˇz´ıt libovolnou grupovou operaci na mnoˇzinˇe {0, 1, . . . , n − 1}). Pro acyklick´ y r-hypergraf lze funkci g zkonstruovat n´asleduj´ıc´ım postupem. Zvol´ıme bijekci h : E → {0, 1, . . . , n − 1} a pak definujeme g n´asledovnˇe: kdyˇz e = {v1 , v2 , . . . , vr } a g(vi ) je definov´ano pro i = 2, 3, . . . , r, pak r X g(v1 ) = h(e) − g(vi ) mod n. i=2
Protoˇze pro kaˇzd´ y acyklick´ y r-hypergraf existuje vrchol, kter´ y leˇz´ı v jedin´e hranˇe, lze tento postup pouˇz´ıt ke konstrukci g pomoc´ı indukce (a tedy m´ame algoritmus pro konstrukci g). Krok 2) Nalezneme r funkc´ı f1 , f2 , . . . , fr : U → V takov´ ych, ˇze (V, E), kde
E = {{f1 (x), f2 (x), . . . , fr (x)} | x ∈ S}, P je acyklick´ y r-hypergraf. Pak haˇsovac´ı funkce f je definov´ana f (x) = ri=1 g(fi (x)) pro kaˇzd´e x ∈ U . Z konstrukce vypl´ yv´a, ˇze je perfektn´ı na mnoˇzinˇe S. Autoˇri dok´azali, ˇze nejvhodnˇejˇs´ı alternativa je, kdyˇz zobrazen´ı f1 , f2 , . . . , fr jsou n´ahodn´a zobrazen´ı n´ahodnˇe zvolen´a. Bohuˇzel takov´a zobrazen´ı neum´ıme zkonstruovat, ale autoˇri uk´azali, ˇze pro tyto u ´ˇcely lze pouˇz´ıt n´ahodn´ y v´ ybˇer funkc´ı z nˇejak´eho c-univerz´aln´ıho souboru funkc´ı. Autoˇri uk´azali, ˇze jejich algoritmus vyˇzaduje O(rn + |V |) ˇcasu a O(n log n + r log |V |) pamˇeti. Tento metapostup navrhli Majewski, Wormald, Havas a Czech (1996). Pro praktick´e pouˇzit´ı je problematick´a reprezentace r-hypergrafu a i n´ahodn´a volba funkc´ı f1 , f2 , . . . , fr (viz pˇredchoz´ı diskuze o c-univerzalitˇe). Z poˇzadavk˚ u na perfektn´ı haˇsovac´ı funkci je opˇet probl´emem splnˇen´ı poˇzadavku 4). Nev´ım, jak je uveden´a metoda prakticky pouˇziteln´a a zda se nˇekde pouˇz´ıv´a.
2.17
Extern´ı haˇ sov´ an´ı
Navrˇzen´ y postup je tak´e zn´am pod n´azvem Fagin˚ uv algoritmus. T´ımto probl´emem se jako prvn´ı asi zab´ yval Larsson. ˇ s´ıme jin´ Reˇ y probl´em – uloˇzen´ı dat v extern´ı pamˇet’i. Hlavn´ı probl´em – minimalizovat pˇr´ıstupy na extern´ı pamˇet’. Pˇredpoklady: Extern´ı pamˇet’ je rozdˇelena na str´anky, kaˇzd´a str´anka obsahuje b poloˇzek (dat) (pˇredpokl´ad´ame, ˇze b > 1, jinak to nem´a smysl). Vˇzdy v jednom kroku naˇcteme celou str´anku do intern´ı pamˇeti nebo celou str´anku v intern´ı pamˇeti v jednom kroku zap´ıˇseme na extern´ı medium. Tyto operace jsou ˇra´dovˇe pomalejˇs´ı neˇz operace v intern´ı pamˇeti. Podobn´ y probl´em se tak´e ˇreˇs´ı pri pr´aci s cache-pamˇet´ı. V tom pˇr´ıpadˇe vˇsak neovlivˇ nujeme, kter´a str´anka se bude naˇc´ıtat, kdeˇzto v pˇr´ıpadˇe extern´ı pamˇeti to pr´avˇe mus´ıme ˇreˇsit. N´aˇs c´ıl: Nal´ezt zp˚ usob ukl´ad´an´ı dat do str´anek extern´ı pamˇeti, aby se minimalizoval poˇcet operac´ı s extern´ı pamˇet´ı. 69
Pˇredpokl´adejme, ˇze h : U → {0, 1}∗ je prost´e zobrazen´ı takov´e, ˇze d´elka h(u) je stejn´a pro vˇsechny prvky univerza U . Oznaˇcme k d´elku h(u) pro u ∈ U . Pak h je haˇsovac´ı funkce (to znamen´a, ˇze haˇsovac´ı funkce je pˇrejmenov´an´ı prvk˚ u). Necht’ S ⊆ U , pak pro slovo α d´elky menˇs´ı neˇz k definujme h−1 S (α) = {s ∈ S | α je prefix h(s)}.
ˇ Rekneme, ˇze α je kritick´e slovo, kdyˇz 0 < |h−1 zd´ y vlastn´ı prefix α′ slova α plat´ı S (α)| ≤ b a pro kaˇ −1 |hS (α′ )| > b. Pro kaˇzd´e s ∈ S existuje pr´avˇe jedno kritick´e slovo α, kter´e je prefixem h(s). Definujme d(s) pro s ∈ S jako d´elku kritick´eho slova, kter´e je prefixem h(s) a d(S) = max{d´elka(α) | α je kritick´e slovo} = max{d(s) | s ∈ S}. Mnoˇzinu S reprezentujeme tak, ˇze je jednoznaˇcn´a korespondence mezi kritick´ ymi slovy a str´ankami extern´ı pamˇeti slouˇz´ıc´ımi k reprezentaci S. Na str´ance pˇr´ısluˇsej´ıc´ı kritick´emu slovu α je reprezentov´an soubor h−1 S (α). Probl´em: jak nal´ezt str´anku kritick´eho slova α? ˇ sen´ı: Adres´aˇr je funkce, kter´a kaˇzd´emu slovu α o d´elce d(S) pˇriˇrad´ı adresu str´anky pˇredpisem Reˇ 1. kdyˇz kritick´e slovo β je prefixem α, pak k α je pˇriˇrazena str´anka koresponduj´ıc´ı s β, jinak je k α pˇriˇrazena str´anka N IL – speci´aln´ı pr´azdn´a str´anka. −1 Korektnost: Pro r˚ uzn´a kritick´a slova β a γ plat´ı h−1 zd´e slovo α d´elky d(S) S (β) ∩ hS (γ) = ∅, a tedy pro kaˇ existuje nejv´ yˇse jedno kritick´e slovo, kter´e je prefixem α. Kdyˇz α je slovo d´elky d(S), pak nastane jeden z tˇechto tˇr´ı pˇr´ıpad˚ u: −1 avˇe jedno kritick´e slovo β, kter´e je prefixem α; 1. h−1 S (α) 6= ∅, pak 0 < |hS (α)| ≤ b a existuje pr´ ′ ′ 2. h−1 y, ˇze 0 < |h−1 avˇe jedno kritick´e S (α) = ∅ a existuje prefix α slova α takov´ S (α )| ≤ b, pak existuje pr´ ′ slovo, kter´e je prefixem α (a tedy tak´e prefixem α); −1 ′ ′ 3. h−1 zd´ y prefix α′ slova α plat´ı bud’ h−1 S (α) = ∅ a pro kaˇ S (α ) = ∅ nebo |hS (α )| > b (pak k α je pˇriˇrazena str´anka N IL).
Mˇejme slovo α o d´elce d(S). Oznaˇcme c(α) nejkratˇs´ı prefix α′ slova α takov´ y, ˇze kaˇzd´emu slovu β o d´elce ′ d(S), kter´e m´a α za prefix, je pˇriˇrazen´a stejn´a str´anka jako slovu α. Vˇsimnˇeme si, ˇze kdyˇz h−1 S (α) 6= ∅, pak c(α) je kritick´e slovo. Plat´ı silnˇejˇs´ı tvrzen´ı, kter´e tvrd´ı, ˇze n´asleduj´ıc´ı podm´ınky jsou ekvivalentn´ı: 1. str´anka pˇriˇrazen´a slovu α je r˚ uzn´a od N IL; 2. c(α) je kritick´e slovo; 3. nˇejak´ y prefix α je kritick´e slovo. Vˇsimnˇeme si, ˇze znalost adres´aˇre umoˇzn ˇuje nal´ezt slovo c(α) pro kaˇzd´e slovo o d´elce d(S). Line´arn´ı uspoˇra´d´an´ı na slovech d´elky n nazveme lexikografick´e, kdyˇz α < β, pr´avˇe kdyˇz α = γ0α′ a β = γ1β ′ pro nˇejak´a slova γ, α′ a β ′ . Lexikografick´e uspoˇra´d´an´ı vˇzdy existuje a je jednoznaˇcn´e. Reprezentace adres´aˇre: Je to seznam adres str´anek o d´elce 2d(S) takov´ y, ˇze adresa na i-t´em m´ıstˇe odpov´ıd´a i-t´emu slovu d´elky d(S) v lexikografick´em uspoˇra´d´an´ı. Pˇr´ıklad: U je mnoˇzina vˇsech slov nad {0, 1} o d´elce 5, h je identick´a funkce a b = 2. Reprezentujme mnoˇzinu S = {00000, 00010, 01000, 10000}. Pak d(00000) = d(00010) = d(01000) = 2, d(10000) = 1, kritick´a slova jsou 00, 01 a 1 a adres´aˇr je (m´ısto adresy str´anky uvedeme mnoˇzinu, kter´a je na t´eto str´ance uloˇzena) 00 7→ {00000, 00010},
01 7→ {01000}, 70
10 7→ 11 7→ {10000}.
Tedy c(00) = 00, c(01) = 01 a c(10) = c(11) = 1. Kdyˇz odstran´ıme prvek 10000, pak 1 pˇrestane b´ yt kritick´e slovo a adres´aˇr bude m´ıt tvar 00 7→ {00000, 00010},
01 7→ {01000},
10 7→ 11 7→ N IL.
Opˇet plat´ı c(00) = 00, c(01) = 01 a c(10) = c(11) = 1. V adres´aˇri je tak´e uloˇzeno d(S). 2.17.1
Algoritmy
Uvedeme zde jen slovn´ı popis operac´ı. Pˇredpokl´ad´ame, ˇze adres´aˇr je uloˇzen v extern´ı pamˇeti na jedn´e str´ance. MEMBER(x) 1) Spoˇc´ıt´ame h(x) a naˇ cteme adres´aˇr do intern´ı pamˇeti. Vezmeme prefix α slova h(x) o d´elce d(S) a nalezneme adresu str´anky pˇr´ısluˇsej´ıc´ı k α. Kdyˇz je to str´anka N IL, pak x ∈ / S a konec, jinak pokraˇcujeme krokem 2). 2) Naˇ cteme str´anku pˇr´ısluˇsej´ıc´ı k α do intern´ı pamˇeti. Prohled´ame ji a pokud neobsahuje x, pak x ∈ /Sa konec. Kdyˇz obsahuje x, pak provedeme poˇzadovan´e zmˇeny a str´anku uloˇ z´ıme do extern´ı pamˇeti na jej´ı p˚ uvodn´ı m´ısto. Konec. INSERT(x) 1) Spoˇc´ıt´ame h(x) a naˇ cteme adres´aˇr do intern´ı pamˇeti. Vezmeme prefix α slova h(x) o d´elce d(S) a nalezneme adresu str´anky pˇr´ısluˇsej´ıc´ı k α a slovo c(α). Kdyˇz str´anka pˇriˇrazen´a k α je N IL, pokraˇcujeme krokem 3), v opaˇcn´em pˇr´ıpadˇe pokraˇcujeme krokem 2). 2) Naˇ cteme str´anku pˇriˇrazenou slovu α. Kdyˇz x je uloˇzeno na t´eto str´ance, pak skonˇc´ıme. Kdyˇz x nen´ı na t´eto str´ance, pak tam pˇrid´ame slovo x. Pokud na str´ance je nejv´ yˇse b prvk˚ u, pak uloˇ z´ıme str´anku na jej´ı p˚ uvodn´ı m´ısto a skonˇc´ıme. Kdyˇz na str´ance je v´ıce neˇz b prvk˚ u, pak nalezneme nov´a kritick´a slova, kter´a n´am str´anku rozdˇel´ı, a vytvoˇr´ıme dvˇe str´anky – jednu uloˇ z´ıme na m´ısto p˚ uvodn´ı str´anky a druhou uloˇ z´ıme na novou str´anku. Pokraˇcujeme krokem 4). 3) Vytvoˇr´ıme v intern´ı pamˇeti novou str´anku, kter´a obsahuje x, nalezneme novou str´anku v extern´ı pamˇeti a tam uloˇ z´ıme vytvoˇrenou str´anku (vˇsem slov˚ um, kter´a maj´ı c(α) za prefix, bude pˇriˇrazena tato str´anka) a pokraˇcujeme krokem 4). 4) Naˇ cteme opˇet adres´aˇr do intern´ı pamˇeti, aktualizujeme adresy pˇriˇrazen´ ych str´anek a pˇr´ıpadnˇe zvˇetˇs´ıme adres´aˇr (to nastane, kdyˇz nˇejak´e nov´e kritick´e slovo m´a d´elku vˇetˇs´ı neˇz d(S), pak nov´e d(S) je pr´avˇe d´elka tohoto slova – obˇe kritick´a slova vznikl´a v kroku 2) maj´ı stejnou d´elku). Aktualizovan´ y adres´aˇr uloˇ z´ıme do extern´ı pamˇeti. Konec. DELETE(x) 1) Spoˇc´ıt´ame h(x) a naˇ cteme adres´aˇr do intern´ı pamˇeti. Vezmeme prefix α slova h(x) o d´elce d(S) a nalezneme adresu str´anky pˇr´ısluˇsej´ıc´ı k α a slovo c(α). Kdyˇz str´anka pˇriˇrazen´a k α je N IL, pak skonˇc´ıme. Oznaˇcme β ′ slovo, kter´e m´a stejnou d´elku jako c(α) a liˇs´ı se od c(α) pouze v posledn´ım bitu. Kdyˇz existuje slovo β d´elky d(S) takov´e, ˇze c(β) = β ′ , pak str´anka pˇriˇrazen´a k β je kandid´at. 2) Naˇ cteme str´anku pˇr´ısluˇsnou k slovu α do intern´ı pamˇeti. Kdyˇz tato str´anka neobsahuje x, pak skonˇc´ıme. Kdyˇz tato str´anka obsahuje x, pak odstran´ıme x z t´eto str´anky. Kdyˇz neexistuje kandid´at nebo kdyˇz nov´a str´anka a str´anka kandid´ata dohromady obsahuj´ı v´ıce neˇz b prvk˚ u, pak novou str´anku uloˇ z´ıme na jej´ı p˚ uvodn´ı m´ısto a skonˇc´ıme. 3) Kdyˇz nov´a str´anka a str´anka kandid´ata maj´ı dohromady b prvk˚ u, pak naˇ cteme str´anku kandid´ata do intern´ı pamˇeti. V intern´ı pamˇeti tyto str´anky spoj´ıme do jedn´e a tuto str´anku pak uloˇ z´ıme do extern´ı pamˇeti. 4) Naˇ cteme adres´aˇr, kde zaktualizujeme adresy str´anek. Pokud jsme slouˇcili dvˇe str´anky, mus´ıme nal´ezt nov´e c(α) (je to nejkratˇs´ı prefix α′ slova α takov´ y, ˇze ke kaˇzd´emu slovu β o d´elce d(S), kter´e m´a α′ za prefix, je pˇriˇrazena jedna z tˇechto adres: adresa str´anky pˇriˇrazen´a k α, adresa str´anky kandid´ata, N IL) a 71
kaˇzd´emu slovu o d´elce d(S), kter´e m´a nov´e c(α) za prefix, bude pˇriˇrazena adresa nov´e (spojen´e) str´anky. Otestujeme, zda se adres´aˇr nem˚ uˇze zkr´atit (to nastane, kdyˇz adresy str´anek pˇriˇrazen´e (2i + 1)-´ımu slovu a (2i + 2)-´emu slovu o d´elce d(S) jsou stejn´e pro vˇsechna i, pak se tato slova spoj´ı a d(S) se zmenˇs´ı o 1). Upraven´ y adres´aˇr uloˇ z´ıme. Konec. N´asleduj´ıc´ı vˇeta ukazuje, ˇze jsme n´aˇs hlavn´ı c´ıl splnili. Pro jednoduchost pˇredpokl´ad´ame, ˇze adres´aˇr je tak´e uloˇzen na extern´ı pamˇeti a ˇze v intern´ı pamˇeti nem˚ uˇze b´ yt uloˇzen spolu s nˇejakou jinou str´ankou. Vˇ eta. Operace MEMBER vyˇzaduje nejv´yˇse tˇri operace s extern´ı pamˇet´ı. Operace INSERT a DELETE vyˇzaduj´ı nejv´yˇse ˇsest operac´ı s extern´ı pamˇet´ı. V naˇsem pˇr´ıkladu provedeme operaci INSERT(00001). Po pˇrid´an´ı prvku str´anka p˚ uvodnˇe pˇriˇrazen´a k slovu 00 vypad´a takto {00000, 00001, 00010}. Tuto str´anku rozdˇel´ıme na str´anky {00000, 00001} a {00010}. Pˇritom kritick´e slovo prvn´ı str´anky je 0000 a druh´e str´anky je 0001. Takˇze d(S) = 4 a adres´aˇr vypad´a 0000 7→ {00000, 00001}, 0001 7→ {00010}, 0010 7→ 0011 7→ N IL, 0100 7→ 0101 7→ 0110 7→ 0111 7→ {0100}, 1000 7→ 1001 7→ 1010 7→ 1011 7→ {10000}, 1100 7→ 1101 7→ 1110 7→ 1111 7→ {10000}. To znamen´a, ˇze kromˇe adresy 00 se ostatn´ı slova rozdˇelila na ˇctyˇri slova, ale adresy z˚ ustaly stejn´e. Jen u slova 00 vznikl´a slova dostala r˚ uzn´e adresy. V p˚ uvodn´ım pˇr´ıkladu provedeme operaci DELETE(01000). Pak kandid´at je 00 a po odstranˇen´ı prvku 01000 nastane spojen´ı tˇechto dvou str´anek. Po aktualizaci adres dostane adres´aˇr tvar 00 7→ 01 7→ {00000, 00010}, 10 7→ 11 7→ {10000}, tj. k prvn´ımu a druh´emu slovu je pˇriˇrazena stejn´a str´anka a stejnˇe tak k tˇret´ımu a ˇctvrt´emu slovu. Takˇze m˚ uˇzeme adres´aˇr zmenˇsit. Pak d(S) = 1 a adres´aˇr m´a podobu 0 7→ {00000, 00010}, 1 7→ {10000}. Vznik´a ot´azka, jak je tato metoda efektivn´ı. Hlavnˇe jak efektivnˇe vyuˇz´ıv´a pamˇet’. Plat´ı Vˇ eta. Kdyˇz velikost reprezentovan´e mnoˇziny je n, pak oˇcek´avan´y poˇcet pouˇzit´ych str´ anek je e 1+ 1b n´ a velikost adres´ aˇre je b ln 2 n .
n b ln 2
a oˇcek´ava-
Prvn´ı tvrzen´ı ˇr´ık´a, ˇze oˇcek´avan´ y poˇcet prvk˚ u na str´ance je b ln 2 ≈ 0.69b. Tedy zaplnˇeno je asi 69% m´ıst. Tento v´ ysledek nen´ı pˇrekvapuj´ıc´ı a je akceptovateln´ y. Horˇs´ı je to s adres´aˇrem, jak ukazuje n´asleduj´ıc´ı tabulka
velikost S 2 10 50 100
105 6.2 · 107 1.2 · 105 9.8 · 103 4.4 · 103
106 1.96 · 108 1.5 · 106 1.0 · 106 4.5 · 104
108 1.96 · 1011 2.4 · 108 1.1 · 108 4.7 · 106
1010 1.96 · 1014 3.9 · 1010 1.2 · 1010 4.9 · 108
kde jednotliv´e ˇra´dky odpov´ıdaj´ı hodnot´am b uveden´ ym v prvn´ım sloupci. Protoˇze oˇcek´avan´a velikost adres´aˇre se zvˇetˇsuje rychleji neˇz line´arnˇe (exponent u n je 1 + 1b ), tak nelze oˇcek´avat, ˇze tuto metodu lze vˇzdy pouˇz´ıt. V´ ypoˇcty i experimenty ukazuj´ı, ˇze pouˇziteln´a je do velikosti |S| = 1010 , kdyˇz b ≈ 100. V tomto rozmez´ı je n´ar˚ ust adres´aˇre jen kolem 5%. Pro vˇetˇs´ı n je tˇreba, aby b bylo jeˇstˇe vˇetˇs´ı. 72
3
Vyhled´ av´ an´ı v uspoˇ r´ adan´ em poli
pozn studenta - tato kapitola byla uprostˇred strom˚ u, ale tam mi ned´avala smysl, takˇze jsem si j´ı dovolil pˇresunout sem.
3.1
Zad´ an´ı u ´ lohy
M´ame podmnoˇzinu S line´arnˇe uspoˇra´dan´eho univerza a S je uloˇzena v poli A[1..|S|] tak, ˇze pro i < j je A(i) < A(j). Pro dan´e x ∈ U m´ame zjistit, zda x ∈ S (operace MEMBER(x)).
3.2
Metaalgoritmus
Pokud x < A(1) nebo A(|S|) < x, pak x nen´ı prvkem S. V opaˇcn´em pˇr´ıpadˇe bud’ x = A(1) nebo x = A(|S|) nebo m´ame dvˇe hodnoty d a h takov´e, ˇze 1 ≤ d < d + 1 < h ≤ |S| a A(d) < x < A(h). Pak najdeme n takov´e, ˇze d < n < h, a dotazem zjist´ıme, zda x = A(n) (pak konˇc´ıme a x ∈ S) nebo x < A(n) (pak poloˇz´ıme h = n) nebo x > A(n) (pak poloˇz´ıme d = n) a proces opakujeme. Konˇc´ıme, kdyˇz d + 1 ≥ h, pak x ∈ / S. Na zaˇca´tku poloˇz´ıme d = 1 a h = |S|. Form´aln´ı z´apis algoritmu: MEMBER(x) if x = A(1) then V´ ystup: x ∈ S stop else if x < A(1) then V´ ystup: x ∈ / S stop else d=1 endif endif if x = A(|S|) then V´ ystup: x ∈ S stop else if x > A(|S|) then V´ ystup: x ∈ / S stop else h = |S| endif endif while d + 1 < h do n := next(d, h) if x = A(n) then V´ ystup: x ∈ S stop else if x < A(n) then h := n else d := n endif endif enddo V´ ystup: x ∈ / S stop V tomto metaalgoritmu je next(d, h) funkce, kter´a nalezne hodnotu n takovou, ˇze d < n < h. Korektnost 73
plyne z pozorov´an´ı, ˇze kdyˇz d + 1 = h, pak A(d) < x < A(h) implikuje, ˇze neexistuje i takov´e, ˇze x = A(i), a tedy x ∈ / S. Efektivita algoritmu z´aleˇz´ı na fukci next. Zpracov´an´ı dotazu vyˇzaduje ˇcas O(1) a poˇcet dotaz˚ u je poˇcet vol´an´ı funkce next.
3.3
Typy funkce next
Un´arn´ı vyhled´av´an´ı: next(d, h) = d + 1, pak kaˇzd´ y dotaz zvˇetˇs´ı d o 1, a tedy nejvˇetˇs´ı poˇcet dotaz˚ u je |S|. Algoritmus v nejhorˇs´ım pˇr´ıpadˇe vyˇzaduje ˇcas O(|S|) a oˇcek´avan´ y poˇcet dotaz˚ u pˇri rovnomˇern´em rozloˇzen´ı |S| mnoˇziny S a prvku x je 2 (tedy oˇcek´avan´ y ˇcas je O(|S|)). Pozn´amka: Du´aln´ı pˇr´ıstup je, kdyˇz next(d, h) = h − 1, v´ ysledky se nezmˇen´ı. Pˇri aplikac´ıch je nˇekdy v´ yhodn´e pouˇz´ıt funkci next(d, h) = min{d + c, h − 1}, kde c je nˇejak´a konstanta (pak krok nen´ı 1, ale c). Jak uvid´ıme pozdˇeji, jsou situace, kdy je v´ yhodn´e takov´eto un´arn´ı vyhled´av´an´ı pouˇz´ıt. Bin´arn´ı vyhled´av´an´ı: next(d, h) = ⌈ d+h ⌉, pak kaˇzd´ y dotaz zmenˇs´ı rozd´ıl h − d pˇribliˇznˇe na polovinu. Poˇcet 2 dotaz˚ u je nejv´ yˇse 3+ log(|S| − 2), algoritmus tedy v nejhorˇs´ım pˇr´ıpadˇe vyˇzaduje ˇcas O(log |S|) a oˇcek´avan´ y ˇcas pˇri rovnomˇern´em rozloˇzen´ı mnoˇziny S a x ∈ U je tak´e O(log |S|). x−A(d) (h − d)⌉. V nejhorˇs´ım pˇr´ıpadˇe mus´ıme poloˇzit v´ıce Interpolaˇcn´ı vyhled´av´an´ı: next(d, h) = d + ⌈ A(h)−A(d)
dotaz˚ u, a proto ˇcas v nejhorˇs´ım pˇr´ıpadˇe je O(|S|), ale pˇri rovnomˇern´em rozloˇzen´ı mnoˇziny S a neˇz |S| 2 x ∈ U je oˇcek´avan´ y ˇcas O(log log |S|). To je zaloˇzeno na faktu, ˇze hodnota next z´avis´ı i na velikosti x. Kdyˇz x je velk´e, tak hodnota next je posunuta do vˇetˇs´ıch hodnot, kdyˇz x je mal´e, pak je posunuta do menˇs´ıch hodnot. Pozn´amka: Kdyˇz rozloˇzen´ı prvk˚ u nen´ı rovnomˇern´e, ale je zn´am´e, pak podle toho m˚ uˇzeme upravit funkci next a oˇcek´avan´ y ˇcas algoritmu se nezmˇen´ı. Pro n´asleduj´ıc´ı funkci next bude jednoduˇsˇs´ı spoˇc´ıtat oˇcek´avan´ y poˇcet dotaz˚ u neˇz pro interpolaˇcn´ı vyhled´av´an´ı, ale v´ ysledek je asymptoticky stejn´ y. 3.3.1
Zobecnˇ en´ e kvadratick´ e vyhled´ av´ an´ı
Pozn. studenta: Tohle v˚ ubec nech´apu a m´am to jako TODO, jestli to stihnu. Funkce next je zde definov´ana sloˇzitˇejˇs´ı procedurou, jej´ıˇz v´ ysledek z´avis´ı i na pˇredchoz´ıch situac´ıch a na v´ ysledku dotazu. Procedura zad´av´a dotazy v bloc´ıch. Prvn´ı dotaz v bloku je interpolaˇcn´ı a procedura pˇritom zjist´ı velikost kroku a zda x je menˇs´ı nebo vˇetˇs´ı neˇz prvn´ı dotaz v bloku. Pak stˇr´ıd´a un´arn´ı a bin´arn´ı vyhled´av´an´ı. Blok konˇc´ı, kdyˇz rozd´ıl mezi h a d je nejv´ yˇse velikost kroku. Krok v n´asleduj´ıc´ım bloku klesne pˇribliˇznˇe na odmocninu velikosti kroku v tomto bloku. Procedura pouˇz´ıv´a boolsk´e promˇenn´e blok, typ, smer. Promˇenn´a blok je inicializov´ana hodnotou f alse a urˇcuje, zda se dotaz zad´av´a v r´amci stejn´eho bloku nebo nikoliv. Promˇenn´a typ urˇcuje, zda pˇr´ıˇst´ı dotaz je un´arn´ı (kdyˇz typ = true) nebo bin´arn´ı. Promˇenn´a smer urˇcuje, zda dotazy jsou menˇs´ı neˇz prvn´ı dotaz v bloku (smer = true) nebo vˇetˇs´ı. D´ale procedura pouˇz´ıv´a promˇennou krok typu integer, kter´a obsahuje velikost kroku v r´amci bloku. Hodnoty tˇechto promˇenn´ ych se pˇred´avaj´ı z jednoho vol´an´ı procedury do dalˇs´ıho vol´an´ı (tj. jsou to glob´aln´ı promˇenn´e, kter´e se neinicializuj´ı vol´an´ım procedury next). next(d, h) if blok then if typ then if smer then next(d, h) := h − krok if A(next(d, h)) < x then 74
blok := f alse endif else next(d, h) := d + krok if A(next(d, h)) > x then blok := f alse endif endif typ := f alse else if min{h − ⌈ d+h ⌉, ⌈ d+h ⌉ − d} < krok then 2 2 blok := f alse endif next(d, h) := ⌈ d+h ⌉, typ := true 2 endif else √ x−A(d) (h − d)⌉, krok := ⌊ h − d⌋, next(d, h) := d + ⌈ A(h)−A(d) if A(next(d, h)) > x then smer := true else smer := f alse endif typ := true, blok := true endif √ Po dvou dotazech klesne h − d bud’ pod h − d nebo pod h+d . Proto procedura v nejhorˇs´ım pˇr´ıpadˇe 2 pouˇzije nejv´ yˇse 8 + 2 log(|S| − 1) + 2 log log |S| dotaz˚ u, a tedy v nejhorˇs´ım pˇr´ıpadˇe vyˇzaduje ˇcas O(log |S|). Nyn´ı spoˇc´ıt´ame oˇcek´avan´ y poˇcet dotaz˚ u bˇehem jednoho bloku za pˇredpokladu rovnomˇern´eho rozdˇelen´ı dat. Necht’ pi je pravdˇepodobnost, ˇze v r´amci bloku se poloˇz´ı alespoˇ n i dotaz˚ u. Pak oˇcek´avan´ y poˇcet dotaz˚ u v r´amci bloku je X X E(C) = i(pi − pi+1 ) = pi . i≥1
i≥1
Nyn´ı odhadneme pi . Oznaˇcme n + d argument prvn´ıho dotazu (interpolaˇcn´ı vyhled´avan´ı) v r´amci bloku a necht’ krok = k v r´amci bloku. Oznaˇcme X = |{i | i > d, A(i) ≤ x}| na zaˇca´tku bloku, pak X je n´ahodn´a promˇenn´a z´avisl´a na argumentu operace a bloku. Kdyˇz se v bloku poloˇz´ı alespoˇ n i dotaz˚ u pro i > 2, pak i−2 |X − n| ≥ ⌊ 2 ⌋k, protoˇze kaˇzd´ y un´arn´ı dotaz, jehoˇz poloˇzen´ı nezmˇen´ı blok, nalezne dalˇs´ıch k hodnot i v rozd´ılu |X − n|. Tedy i−2 ⌋k). pi ≤ Prob(|X − n| ≥ ⌊ 2 ˇ Pouˇzijeme Cebyˇ sevovu nerovnost pro n´ahodnou promˇennou X. Kdyˇz Y je n´ahodn´a promˇenn´a s oˇcek´avanou ˇ (stˇredn´ı) hodnotou µ a rozptylem σ 2 , pak Cebyˇ sevova nerovnost ˇr´ık´a, ˇze Prob(|Y − µ| ≥ t) ≤
σ2 t2
pro kaˇzd´e t > 0.
Uvaˇzujme okamˇzik, kdy jsme na zaˇca´tku nˇejak´eho bloku. Protoˇze S je vybran´a s rovnomˇern´ ym rozdˇelen´ım, x−A(d) je pravdˇepodobnost, ˇze A(i) < x pro d < i < h, rovna p = A(h)−A(d) , a pak pravdˇepodobnost, ˇze X = j, je h−d j p (1 − p)h−d−j . To znamen´a, ˇze X je n´ahodn´a veliˇcina s binomick´ ym rozdˇelen´ım s rozsahem d − h a j
75
pravdˇepodobnost´ı p, a tedy jej´ı oˇcek´avan´a hodnota je h−d X h−d j p (1 − p)h−d−j = p(h − d) µ= j j j=0 a rozptyl m´a hodnotu h−d X
h−d j p (1 − p)h−d−j = p(1 − p)(h − d). σ = (j − µ) j j=0 2
2
√ Kdyˇz si uvˇedom´ıme, ˇze k = ⌊ h − d⌋ a n = p(h − d), pak dost´av´ame pi , pi+1 ≤ Prob(|X − n| ≥ ⌊
i−2 4p(1 − p)(h − d) ⌋k) ≤ ≤ 2 (i − 2)2 k 2
1 4p(1 − p) ≤ , (i − 2)2 (i − 2)2
protoˇze pro 0 ≤ p ≤ 1 je p(1 − p) ≤ 41 . Kdyˇz shrneme tato pozorov´an´ı, dost´av´ame, ˇze E(C) =
X i≥1
pi ≤ 2 + 2
2+2
2
X i≥3 2
X1 1 = 2 + 2 = (i − 2)2 i2 i≥1
π π =2+ ≈ 5.3 6 3
Z´avˇer: oˇcek´avan´ y poˇcet dotaz˚ u v bloku je menˇs´ı neˇz 6. Kdyˇz E(T (n)) je oˇcek´avan´ y poˇcet dotaz˚ u pro operaci MEMBER a kdyˇz |S| = n, pak plat´ı √ E(T (n)) ≤ E(C) + E(T ( n)). Protoˇze E(T (1)) = 1 a E(T (2)) ≤ 2, dost´av´ame z rekurentn´ıho vzorce, ˇze E(T (n)) ≤ 2 + E(C) log log n
pro n ≥ 2.
ˇ operace MEMBER v uspoˇr´adan´em poli d´elky n pˇri zobecnˇen´em kvadratick´em vyhled´av´ Vˇ eta. Cas an´ı je v nejhorˇs´ım pˇr´ıpadˇe O(log n). Kdyˇz rozdˇelen´ı vstupn´ıch dat je rovnomˇern´e, pak oˇcek´avan´y ˇcas je O(log log n). Nev´ yhoda t´eto datov´e struktury spoˇc´ıv´a v neexistenci pˇrirozen´ ych efektivn´ıch implementac´ı operac´ı INSERT, DELETE, SPLIT a JOIN. Pˇrirozen´e implementace tˇechto operac´ı vyˇzaduj´ı ˇcas O(|S|), zhruba ˇreˇceno mus´ıme pohybovat s t´emˇeˇr kaˇzd´ ym prvkem. Pokusem o ˇreˇsen´ı tohoto probl´emu byl n´avrh bin´arn´ıch vyhled´avac´ıch strom˚ u.
4 4.1
Stromy Uspoˇ r´ adan´ y slovn´ıkov´ y probl´ em
Jedn´a se o rozˇs´ıˇren´ı z´akladn´ıho slovn´ıkov´eho probl´emu. Je d´ano tot´alnˇe uspoˇra´dan´e univerzum U (tj. pro kaˇzd´e dva r˚ uzn´e prvky u, v ∈ U plat´ı bud’ u < v nebo v < u). C´ılem je reprezentovat mnoˇzinu S ⊆ U a navrhnout algoritmy pro tyto operace: MEMBER, INSERT, DELETE MIN – nalezne nejmenˇs´ı prvek v S, 76
MAX – nalezne nejvˇetˇs´ı prvek v S, SPLIT(x) – zkonstruuje reprezentace dvou mnoˇzin S1 = {s ∈ S | s < x} a S2 = {s ∈ S | s > x} a ozn´am´ı, zda x ∈ S, JOIN – pouˇz´ıvaj´ı se dvˇe verze t´eto operace: JOIN2(S1 , S2 ) – jsou d´any reprezentace mnoˇzin S1 a S2 , kter´e splˇ nuj´ı max S1 < min S2 , vytvoˇr´ı se reprezentace mnoˇziny S = S1 ∪ S2 , JOIN3(S1 , x, S2 ) – jsou d´any reprezentace mnoˇzin S1 a S2 a prvek x ∈ U tak, ˇze je splnˇeno max S1 < x < min S2 , vytvoˇr´ı se reprezentace mnoˇziny S = S1 ∪ {x} ∪ S2 . Je vidˇet, ˇze operace JOIN2 a JOIN3 lze pomoc´ı operac´ı INSERT a DELETE pˇrev´est jednu na druhou. Proto ˇcasto budeme popisovat pro danou strukturu jen jednu z nich. Obˇcas se tak´e pouˇz´ıv´a operace ord(k) – pˇredpok´ad´ame, ˇze k ≤ |S|, a operace nalezne k-t´ y nejmenˇs´ı prvek v S. Zˇrejmˇe operace MIN a MAX jsou speci´aln´ım pˇr´ıpadem operace ord(k), pˇresnˇe MIN je operace ord(1) a MAX je operace ord(|S|).
4.2 4.2.1
(a, b)-stromy Obecn´ a definice
D˚ uleˇzitou datovou strukturou vhodnou pro ˇreˇsen´ı uspoˇra´dan´eho slovn´ıkov´eho probl´emu jsou (a, b)-stromy. Tuto datovou strukturu lze pouˇz´ıt pro intern´ı i pro extern´ı pamˇet’. Je to struktura zaloˇzen´a na stromech. Nejobecnˇejˇs´ı grafov´a definice (a, b)-stromu je: Necht’ 1 ≤ a < b jsou kladn´a pˇrirozen´a ˇc´ısla. Pak koˇrenov´ y strom (T, t) se naz´ yv´a (a, b)-strom, kdyˇz 1. kdyˇz v je vnitˇrn´ı vrchol stromu T r˚ uzn´ y od koˇrene t, pak m´a alespoˇ n a a nejv´ yˇse b syn˚ u; 2. vˇsechny cesty z koˇrene do libovoln´eho listu maj´ı stejnou d´elku. 4.2.2
Speci´ aln´ı pˇ r´ıpad – definice
Tato definice je pˇr´ıliˇs obecn´a a pro datov´e struktury se nehod´ı. Proto pouˇz´ıv´ame jej´ı speci´aln´ı pˇr´ıpad (zmˇeny podtrˇzeny). Datov´a struktura (a, b)-strom je definov´ana jen na tˇechto stromech: Necht’ a a b jsou pˇrirozen´a ˇc´ısla takov´a, ˇze 2 ≤ a a 2a − 1 ≤ b. Pak koˇrenov´ y strom (T, t) nazveme (a, b)-strom, kdyˇz plat´ı 1. kaˇzd´ y vnitˇrn´ı vrchol v stromu T r˚ uzn´ y od koˇrene t m´a alespoˇ n a a nejv´ yˇse b syn˚ u; 2. koˇren je bud’ list nebo m´a alespoˇ n dva syny a nejv´ yˇse b syn˚ u; 3. vˇsechny cesty z koˇrene do libovoln´eho listu maj´ı stejnou d´elku. 4.2.3
Vlastnosti – velikost
V´ yhody naˇsich (a, b)-strom˚ u: Kdyˇz m´a (a, b)-strom v´yˇsku h > 0 (tj. d´elka kaˇzd´e cesty z koˇrene do libovoln´eho listu je h), pak strom m´a alespoˇ n 2ah−1 list˚ u a nejv´ yˇse bh list˚ u. Z toho jednoduˇse plyne: Tvrzen´ı. Mˇejme pˇrirozen´a ˇc´ısla a a b takov´ a, ˇze a ≥ 2 a b ≥ 2a − 1. Pak pro kaˇzd´e kladn´e pˇrirozen´e ˇc´ıslo n existuje (a, b)-strom, kter´y m´a pˇresnˇe n list˚ u. Kdyˇz (a, b)-strom m´a pˇresnˇe n list˚ u, pak v´yˇska stromu je n nejv´yˇse 1 + loga ( 2 ) a je alespoˇ n logb n. Tedy v´yˇska stromu je O(log n). 77
4.2.4
Vlastnosti – uspoˇ r´ ad´ an´ı na listech
Mˇejme koˇrenov´ y strom (T, t) takov´ y, ˇze pro kaˇzd´ y vnitˇrn´ı vrchol v plat´ı: ˇ kdyˇz v m´a ρ(v) syn˚ u, pak jsou oˇc´ıslov´any od 1 do ρ(v). Rekneme, ˇze vrchol v je v hloubce h, kdyˇz cesta z koˇrene t do v m´a d´elku h. Mnoˇzina vˇsech vrchol˚ u v hloubce h se naz´ yv´a h-t´ a hladina. Lexikografick´e uspoˇr´ad´ an´ı na h-t´e hladinˇe je definov´ano rekurzivnˇe: v ≤ w, pr´avˇe kdyˇz bud’ otec(v) < otec(w) nebo otec(v) = otec(w) a kdyˇz v je i-t´ y syn otec(v) a w je j-t´ y syn otec(v), pak i ≤ j. Pˇredpokl´ad´ame, ˇze v (a, b)-stromu synov´e kaˇzd´eho vnitˇrn´ıho vrcholu jsou uspoˇra´d´any. Listy tvoˇr´ı hladinu h, kde h je hloubka (a, b)-stromu, a je na nich definov´ano lexikografick´e uspoˇra´d´an´ı. Mˇejme line´arnˇe uspoˇra´dan´e univerzum U a mnoˇzinu S ⊆ U . Pak (a, b)-strom (T, t) reprezentuje mnoˇzinu S, kdyˇz m´a pˇresnˇe |S| list˚ u a je d´an izomorfismus mezi lexikografick´ ym uspoˇra´d´an´ım list˚ u stromu T a uspoˇra´danou mnoˇzinou S (tj. bijekce key : list(T ) → S, kter´a pro s, t ∈ S splˇ nuje s ≤ t v U , pr´avˇe kdyˇz key−1 (s) ≤ key−1 (t) v lexikografick´em uspoˇra´d´an´ı na mnoˇzinˇe list˚ u stromu T ). 4.2.5
Jak reprezentujeme mnoˇ zinu?
Co je uloˇzeno ve vnitˇrn´ıch vrcholech (a, b)-stromu (T, t) reprezentuj´ıc´ıho mnoˇzinu S ⊆ U ? • ρ(v) – poˇcet syn˚ u vrcholu v, • Sv (1..ρ(v)) – pole ukazatel˚ u na syny vrcholu v takov´e, ˇze Sv (i) je i-t´ y syn vrcholu v pro i = 1, 2 . . . , ρ(v), • Hv (1..ρ(v) − 1) – pole prvk˚ u z U takov´e, ˇze Hv (i) je nejvˇetˇs´ı prvek z S reprezentovan´ y v podstromu i-t´eho syna vrcholu v alternativa: Hv (i) je prvek z U takov´ y, ˇze nejvˇetˇs´ı prvek reprezentovan´ y v podstromu i-t´eho syna vrcholu v je menˇs´ı nebo roven Hv (i) a to je menˇs´ı neˇz nejmenˇs´ı prvek reprezentovan´ y v podstromu (i + 1)-n´ıho syna vrcholu v Struktura list˚ u: listu v je pˇriˇrazen prvek key(v) ∈ S. Nˇekdy je ve struktuˇre kaˇzd´eho vrcholu v (a, b)-stromu r˚ uzn´eho od koˇrene jeˇstˇe ukazatel otec(v) na otce vrcholu v. Pozorov´ an´ı. Kdyˇz Hv (i) jsou prvky z reprezentovan´e mnoˇziny, pak pro kaˇzd´y prvek s ∈ S kromˇe nejvˇetˇs´ıho existuje pr´ avˇe jeden vnitˇrn´ı vrchol v (a, b)-stromu a jedno i, ˇze Hv (i) = s, a nejvˇetˇs´ı prvek v S nen´ı prvek Hv pro ˇza´dn´y vrchol v. Tento fakt se pouˇz´ıv´a pˇri implementaci, kde se vynech´avaj´ı listy. Prvky z S jsou reprezentov´any v pol´ıch Hv vnitˇrn´ıch vrchol˚ u stromu a nejvˇetˇs´ı prvek je uloˇzen zvl´aˇst’ nebo je k mnoˇzinˇe S pˇrid´an form´aln´ı nejvˇetˇs´ı prvek (a ten je pak uloˇzen“ zvl´aˇst’). Je to prostorovˇe efektivnˇejˇs´ı reprezentace mnoˇziny S, ale je technicky ” nepˇrehledn´a. Proto pˇri pr´aci s (a, b)-stromy pouˇz´ıv´am verzi s listy. Nyn´ı uvedeme algoritmy pro (a, b)-stromy. 4.2.6
Algoritmy
Pomocn´ y algoritmus 78
Vyhledej(x) t :=koˇren stromu T , w := N IL while t nen´ı list do i := 1 while Ht (i) < x a i < ρ(t) do i := i + 1 enddo if Ht (i) = x then w := t endif t := St (i) enddo V´ ystup: t a w. MEMBER(x) Vyhledej(x) if key(t) = x then V´ ystup: x ∈ S else V´ ystup: x ∈ / S endif INSERT(x) Vyhledej(x) if key(t) 6= x then vytvoˇr nov´ y list t′ , key(t′ ) := x, u := otec(t) if key(t) < x then (koment´aˇr: x > max S) Su (ρ(u) + 1) := t′ , Hu (ρ(u)) := key(t), ρ(u) := ρ(u) + 1 else najdi i, ˇze Su (i) = t Su (ρ(u) + 1) := S(ρ(u)), j := ρ(u) − 1 while j ≥ i do Su (j + 1) := Su (j), Hu (j + 1) := Hu (j), j := j − 1 enddo Su (i) := t′ , Hu (i) := x, ρ(u) := ρ(u) + 1 endif t := u ˇ epen´ı(t) enddo while ρ(t) > b do Stˇ endif ˇ epen´ı(t) Stˇ if t je koˇren stromu then vytvoˇr nov´ y koˇren u s jedin´ ym synem t endif u := otec(t), najdi i, ˇze Su (i) = t, vytvoˇr nov´ y vnitˇrn´ı vrchol t′ , j := 1 while j < ⌊ b+1 ⌋ do 2 St′ (j) := St (j + ⌈ b+1 ⌉), Ht′ (j) := Ht (j + ⌈ b+1 ⌉), j := j + 1 2 2 enddo ⌋) := St (b + 1), ρ(t) := ⌈ b+1 ⌉, ρ(t′ ) := ⌊ b+1 ⌋, St′ (⌊ b+1 2 2 2 if i < ρ(u) then Su (ρ(u) + 1) := Su (ρ(u)) endif j := ρ(u) − 1, ρ(u) := ρ(u) + 1, while j > i do Su (j + 1) := Su (j), Hu (j + 1) := Hu (j), j := j − 1 enddo Su (i + 1) := t′ , Hu (i + 1) := Hu (i), Hu (i) := Ht (ρ(t)), t := u
79
DELETE(x) Vyhledej(x) if key(t) = x then u := otec(t), najdi i, ˇze Su (i) = t, a j, ˇze Hw (j) = x, k := i if w 6= u a w 6= N IL then Hw (j) := Hu (ρ(u) − 1) endif while k < ρ(u) − 1 do Hu (k) := Hu (k + 1), Su (k) := Su (k + 1), k := k + 1 enddo if i 6= ρ(u) then Su (ρ(u) − 1) := Su (ρ(u)) endif ρ(u) := ρ(u) − 1, odstraˇ n t, t := u while ρ(t) < a a t nen´ı koˇren do y je bezprostˇredn´ı bratr t if ρ(y) = a then Spojen´ı(t, y) else Pˇ resun(t, y) endif enddo endif Spojen´ı(t, y) u := otec(t), najdi i, ˇze Su (i) = t, j := 1 if Su (i − 1) = y then vymˇen ˇ t a y, i := i − 1 endif while j < ρ(y) do St (ρ(t) + j) := Sy (j), Ht (ρ(t) + j) := Hy (j), j := j + 1 enddo Ht (ρ(t)) := Hu (i), St (ρ(t) + ρ(y)) := Sy (ρ(y)), ρ(t) := ρ(t) + ρ(y), odstraˇ ny while i < ρ(u) − 1 do Su (i + 1) := Su (i + 2), Hu (i) := Hu (i + 1), i := i + 1 enddo ρ(u) := ρ(u) − 1 if u je koˇren a ρ(u) = 1 then odstraˇ nu else t := u endif Pˇ resun(t, y) u := otec(t), najdi i takov´e, ˇze Su (i) = t if Su (i + 1) = y then St (ρ(t) + 1) := Sy (1), Ht (ρ(t)) := Hu (i), Hu (i) := Hy (1), j := 1 while j < ρ(y) − 1 do Sy (j) := Sy (j + 1), Hy (j) := Hy (j + 1), j := j + 1 enddo Sy (ρ(y) − 1) := Sy (ρ(y)), ρ(t) := ρ(t) + 1, ρ(y) := ρ(y) − 1 else St (ρ(t) + 1) := St (ρ(t)), j := ρ(t) − 1 while j > 0 do St (j + 1) := St (j), Ht (j + 1) := Ht (j), j := j − 1 enddo ρ(t) := ρ(t) + 1, St (1) := Sy (ρ(y)), Ht (1) := Hu (i − 1), Hu (i − 1) := Hy (ρ(y) − 1), ρ(y) := ρ(y) − 1 endif
80
MIN t :=koˇren stromu while t nen´ı list do t := St (1) enddo key(t) je nejmenˇs´ı prvek S MAX t :=koˇren stromu while t nen´ı list do t := St (ρ(t)) enddo key(t) je nejvˇetˇs´ı prvek S JOIN2(T1 , T2 ) Pˇredpoklad Ti je (a, b)-strom reprezentuj´ıc´ı mnoˇzinu Si pro i = 1, 2, kter´e splˇ nuj´ı max S1 < min S2 (tento pˇredpoklad je silnˇejˇs´ı neˇz poˇzadavek, ˇze S1 a S2 jsou disjunktn´ı, ale algoritmus nekontroluje jeho splnˇen´ı) if v´ yˇska T1 je vˇetˇs´ı nebo rovna v´ yˇsce T2 then t :=koˇren T1 , k := v(T1 ) − v(T2 ) while k > 0 do t := St (ρ(t)), k := k − 1 enddo Spojen´ı(t,koˇren T2 ), t := otec(t) ˇ epen´ı(t) enddo while ρ(t) > b do Stˇ else t :=koˇren T2 , k := v(T2 ) − v(T1 ) while k > 0 do t := St (1), k := k − 1 enddo Spojen´ı(t,koˇren T1 ), t := otec(t) ˇ epen´ı(t) enddo while ρ(t) > b do Stˇ endif
81
SPLIT(T, x) Z1 , Z2 pr´azdn´e z´asobn´ıky, t :=koˇren T while t nen´ı list do i := 1 while Ht (i) < x a i < ρ(t) do i := i + 1 enddo t := St (i) if i = 2 then vloˇz podstrom vrcholu St (1) do Z1 endif if i > 2 then vytvoˇr nov´ y vrchol t1 , ρ(t1 ) = i − 1, for every j = 1, 2, . . . , i − 2 do St1 (j) := St (j), Ht1 (j) := Ht (j) enddo St1 (i − 1) := St (i − 1), vloˇz podstrom vrcholu t1 do Z1 endif if i = ρ(t) − 1 then vloˇz podstrom St (ρ(t)) do Z2 endif if i < ρ(t) − 1 then vytvoˇr nov´ y vrchol t2 , ρ(t2 ) := ρ(t) − i for every j = 1, 2, . . . , ρ(t) − i − 1 do St2 (j) := St (i + j), Ht2 (j) := Ht (i + j) enddo St2 (ρ(t) − i) := St (ρ(t)), vloˇz podstrom t2 do Z2 endif enddo if key(t) = x then V´ ystup: x ∈ S else V´ ystup: x ∈ /S if key(t) < x then vloˇz podstrom vrcholu t do Z1 else vloˇz podstrom vrcholu t do Z2 endif endif T1 := vrchol Z1 , odstraˇ n T1 ze Z1 while Z1 6= ∅ do T ′ :=vrchol Z1 , odstraˇ n T ′ ze Z1 , T1 :=JOIN(T ′ , T1 ) enddo T2 := vrchol Z2 , odstraˇ n T2 ze Z2 while Z2 6= ∅ do T ′ := vrchol Z2 , odstraˇ n T ′ ze Z2 , T2 :=JOIN(T2 , T ′ ) enddo 4.2.7
Korektnost algoritm˚ u
Odkaz na otce vrcholu: bud’ je v kaˇzd´em vrcholu v stromu T pˇr´ımo odkaz na otec(v), nebo se v proceduˇre Vyhledej vkl´adaj´ı vrcholy do z´asobn´ıku a otec(v) je vrchol v z´asobn´ıku pˇred vrcholem v. Pˇri operaci SPLIT se z´asobn´ıky pouˇz´ıvaj´ı jednopr˚ uchodovˇe – nejprve se napln´ı a v t´eto ˇca´sti algoritmu se nepouˇzije operace pop, pak se vypr´azdn´ı a v t´eto f´azi se nepouˇz´ıv´a operace push. V okamˇziku, kdyˇz jsou z´asobn´ıky naplnˇen´e, plat´ı: 82
• v z´asobn´ıc´ıch jsou uloˇzeny (a, b)-stromy reprezentuj´ıc´ı podmnoˇziny S; • kdyˇz (a, b)-stromy Ti a Ti+1 reprezentuj´ı mnoˇziny Si a Si+1 a jsou v z´asobn´ıku Z1 (nebo Z2 ) a strom Ti+1 n´asleduje po stromu Ti , pak plat´ı max Si < min Si+1 < x (nebo min Si > max Si+1 > x) a v´ yˇska Ti je vˇetˇs´ı nebo rovna v´ yˇsce Ti+1 ; • kdyˇz Ti a Ti+1 jsou dva po sobˇe n´asleduj´ıc´ı (a, b)-stromy v z´asobn´ıku Zj pro j = 1, 2, kter´e maj´ı stejnou v´ yˇsku, pak n´asleduj´ıc´ı strom v z´asobn´ıku Zj m´a ostˇre menˇs´ı v´ yˇsku. Toto plyne z prvn´ı f´aze algoritmu operace SPLIT a zajiˇst’uje korektnost druh´e f´aze algoritmu. 4.2.8
ˇ Casov´ a anal´ yza
ˇ epen´ı, Spojen´ı a Pˇ D´ale si vˇsimnˇeme, ˇze podprocedury Stˇ resun vyˇzaduj´ı ˇcas O(1), a proto algoritmy pro operace MEMBER, INSERT, DELETE, MIN, MAX, JOIN2 a pro prvn´ı f´azi algoritmu SPLIT vyˇzaduj´ı ˇcas O(1) pro pr´aci v dan´e hladinˇe. Protoˇze hladin je nejv´ yˇse loga |S|, m˚ uˇzeme shrnout:
Vˇ eta. Algoritmy pro operace MEMBER, INSERT, DELETE, MIN, MAX, JOIN2 a SPLIT v (a, b)-stromech vyˇzaduj´ı v nejhorˇs´ım pˇr´ıpadˇe ˇcas O(loga |S|), kde S je reprezentovan´a mnoˇzina. Je tˇreba jeˇstˇe odhadnout spotˇrebovan´ y ˇcas ve druh´e f´azi algoritmu pro operaci SPLIT. Nejprve si vˇsimnˇeme, ˇze algoritmus JOIN2(T1 , T2 ) vyˇzaduje ve skuteˇcnosti jen ˇcas rovn´ y O(rozd´ıl v´ yˇsek strom˚ u T1 Kdyˇz po naplnˇen´ı z´asobn´ık Zj pro j = 1, 2 obsahuje stromy U1 , U2 , . . . , Uk v tomto poˇrad´ı, pak k ≤ 2 loga |S| Pk−1 a vypr´azdnˇen´ı z´asobn´ıku Zj vyˇzaduje ˇcas O( i=1 (ui − ui+1 + 1) = O(u1 + k), kde ui je v´ yˇska stromu Ui pro i = 1, 2, . . . , k. Protoˇze v´ yˇska stromu U1 je nejv´ yˇse rovna v´ yˇsce stromu T , dost´av´ame, ˇze druh´a f´aze algoritmu SPLIT vyˇzaduje ˇcas O(loga |S|) a d˚ ukaz je kompletn´ı. 4.2.9
Poˇ r´ adkov´ a statistika
Nyn´ı pop´ıˇseme algoritmus pro operaci ord(k). Tato operace se ˇcasto naz´ yv´a k-t´a poˇra´dkov´a statistika Tato operace nen´ı podporov´ana navrˇzenou strukturou, pro jej´ı efektivn´ı implementaci mus´ıme rozˇs´ıˇrit strukturu vnitˇrn´ıho vrcholu v o pole Pv (1..ρ(v) − 1), kde Pv (i) je poˇcet prvk˚ u S reprezentovan´ ych v podstromu i-t´eho syna vrcholu v. Udrˇzovat pole Pv v aktu´aln´ım stavu znamen´a pˇri u ´spˇeˇsn´em proveden´ı aktualizaˇcn´ı operace proj´ıt cestu z vrcholu do koˇrene a aktualizovat pole P . Uvedeme algoritmus pro nalezen´ı k-t´e poˇra´dkov´e statistiky. ord(k) if k > |S| then neexistuje k-t´ y nejmenˇs´ı prvek, konec endif t :=koˇren stromu while t nen´ı list do i := 1 while k > Pt (i) a i < ρ(t) do k := k − Pt (i), i := i + 1 enddo t := St (i) enddo key(t) je hledan´ y k-t´ y nejmenˇs´ı prvek Invariant algoritmu: V kaˇzd´em okamˇziku plat´ı, ˇze p˚ uvodn´ı k se rovn´a aktu´aln´ı k+poˇcet prvk˚ u z S, kter´e jsou v podstromech vrchol˚ u stromu, kter´e v lexikografick´em uspoˇra´d´an´ı pˇredch´azej´ı i-t´emu synu vrcholu t. Korektnost algoritmu plyne z tohoto invariantu. 83
Vˇ eta. Algoritmy pro operace MEMBER, INSERT, DELETE, MIN, MAX, SPLIT, JOIN2 a ord(k) pro vˇsechna k v rozˇs´ıˇren´e struktuˇre (a, b)-stromu vyˇzaduj´ı v nejhorˇs´ım pˇr´ıpadˇe ˇcas O(log |S|), kde S je reprezentovan´a mnoˇzina. 4.2.10
Hodnoty a, b
(a, b)-stromy se pouˇz´ıvaj´ı jak v intern´ı tak v extern´ı pamˇeti. Jak´e hodnoty a a b je vhodn´e pouˇz´ıvat? Pro intern´ı pamˇet’ jsou doporuˇcen´e hodnoty a = 2, b = 4 nebo a = 3 a b = 6. Pro extern´ı pamˇet’ jsou doporuˇcen´e hodnoty a ≈ 100, b = 2a. 4.2.11
Paraleln´ı verze
Kdyˇz je mnoˇzina reprezentovan´a (a, b)-stromem uloˇzena na serveru a m´a k n´ı pˇr´ıstup v´ıce uˇzivatel˚ u, vznik´a probl´em s aktualizaˇcn´ımi operacemi. Tyto operace mˇen´ı strukturu (a, b)-stromu a v d˚ usledku toho se v nˇem jin´ y uˇzivatel m˚ uˇze ztratit. Tento probl´em se d´a ˇreˇsit tak, ˇze pˇri aktualizaˇcn´ıch operac´ıch se uzavˇre cel´ y strom. Nev´ yhoda: ostatn´ı uˇzivatel´e do nˇeho nemaj´ı pˇr´ıstup a nemohou pracovat. Tzv. paraleln´ı implementace operac´ı INSERT a DELETE nab´ız´ı jin´e, efektivnˇejˇs´ı ˇreˇsen´ı. Pˇredpoklad: b ≥ 2a. Pˇri operaci INSERT jsou ve vyhled´avac´ı f´azi vˇzdy uzavˇreny vrcholy t, otec(t) a synov´e vrcholu t. Algoˇ epen´ı (proto je ritmus zjist´ı, ve kter´em synu vrcholu t m´a pokraˇcovat, a pak, kdyˇz ρ(t) = b, provede Stˇ nutnˇe b ≥ 2a, abychom po t´eto operaci mˇeli zase (a, b)-strom). V algoritmu pak odpadne vyvaˇzovac´ı ˇca´st ˇ epen´ı pˇri cestˇe vzh˚ (tj. Stˇ uru ke koˇreni). Pˇri operaci DELETE jsou ve vyhled´avac´ı f´azi uzavˇreny vrcholy t, otec(t), bezprostˇredn´ı bratr y vrcholu t a jejich synov´e. Kdyˇz ρ(t) = a, pak po najiti vrcholu, kde se bude pokraˇcovat, se provede bud’ Pˇ resun (kdyˇz ρ(y) > a) nebo Spojen´ı (kdyˇz ρ(y) = a). Stejnˇe jako pˇri operaci INSERT se vynech´a vyvaˇzovac´ı ˇca´st uzav´ıraj´ıc´ı p˚ uvodn´ı algoritmus. ˇ epen´ı, Spojen´ı a Pˇ Tato u ´prava vyˇzaduje sice v´ıce Stˇ resun˚ u, ale asymptoticky vych´az´ı ˇcas stejn´ y (jen je vˇetˇs´ı multiplikativn´ı konstanta). Doporuˇcen´e hodnoty a a b jsou a ≈ 100 a b = 2a + 2 pˇri uloˇzen´ı na serveru v extern´ı pamˇeti, ve vnitˇrn´ı pamˇeti se doporuˇcuje a = 2, b = 6. Operace JOIN2 lze tak´e paralelizovat, ale operaci SPLIT paralelizovat nelze. 4.2.12
A-sort
(a, b)-stromy d´avaj´ı tak´e zaj´ımav´e aplikace pro tˇr´ıdic´ı algoritmy. Pouˇzit´ı (a, b)-strom˚ u pro setˇr´ıdˇen´ı n´ahodn´e posloupnosti nen´ı vhodn´e, reˇzie na udrˇzov´an´ı struktury (a, b)-stromu vede k tomu, ˇze multiplikativn´ı konstanta by byla o hodnˇe vˇetˇs´ı neˇz u klasick´ ych tˇr´ıdic´ıch algoritm˚ u. Tak´e uloˇzen´ı (a, b)-stromu vyˇzaduje v´ıce pamˇeti neˇz je potˇreba pro klasick´e algoritmy. Situace se podstatnˇe zmˇen´ı, kdyˇz vstupn´ı posloupnost je pˇredtˇr´ıdˇen´a a je ji tˇreba jen dotˇr´ıdit. Klasick´e algoritmy vˇetˇsinou nejsou schopn´e vyuˇz´ıt faktu, ˇze posloupnost je pˇredtˇr´ıdˇen´a, a jejich ˇcasov´a n´aroˇcnost je prakticky stejn´a (nˇekdy i horˇs´ı) jako u n´ahodn´e posloupnosti. Na rozd´ıl od nich algoritmus A-sort zaloˇzen´ y na (a, b)-stromech je schopen pˇredtˇr´ıdˇenost vyuˇz´ıt a m´a na pˇredtˇr´ıdˇen´ ych posloupnostech lepˇs´ı v´ ysledky neˇz klasick´e algoritmy. Modifikace (a, b)-strom˚ u pro algoritmus A-sort. M´ame (a, b)-strom reprezentuj´ıc´ı vstupn´ı posloupnost, je d´an ukazatel Prv na prvn´ı list, listy (a, b)-stromu jsou propojeny do seznamu v rostouc´ım lexikografick´em poˇrad´ı (ukazatel na n´asleduj´ıc´ı prvek je Nasl) a je d´ana cesta z prvn´ıho listu do koˇrene (to znamen´a, ˇze na cestˇe z prvn´ıho listu do koˇrene zn´ame pro kaˇzd´ y vrchol v jeho otce). Nyn´ı uvedeme algoritmus A-sort. 84
A-sort(x1 , x2 , . . . , xn ) i := n − 1, vytvoˇr jednoprvkov´ y strom s vrcholem t key(t) := xn , Prv := t while i ≥ 1 do A-Insert(xi ), i := i − 1 enddo y1 := key(Prv) while i ≤ n do yi := key(t), i := i + 1, t := Nasl(t) enddo V´ ystup: (y1 , y2 , . . . , yn ) setˇr´ıdˇen´a posloupnost (x1 , x2 , . . . , xn ) A-Insert(x) t := Prv while t 6= koˇren T a Ht (1) < x do t := otec(t) enddo while t 6= list do i := 1 while Ht (i) < x a i < ρ(t) do i := i + 1 enddo if i > 1 then v := St (i − 1) else v := St (ρ(t)) endif t := St (i) enddo if key(t) 6= x then vytvoˇr nov´ y list t′ , key(t′ ) = x, if t je koˇren then vytvoˇr nov´ y koˇren u, ρ(u) := 2 if key(t) > x then Hu (1) := x, Su (1) := t′ , Su (2) := t, Prv := t′ , Nasl(t′ ) := t, Nasl(t) := N IL else Hu (1) := key(t), Su (1) := t, Su (2) := t′ Prv := t, Nasl(t) := t′ , Nasl(t′ ) := N IL endif else u := otec(t) if key(t) < x then (koment´aˇr: x > max S) Su (ρ(u) + 1) := t′ , Hu (ρ(u)) := key(t), ρ(u) := ρ(u) + 1 Nasl(t) := t′ , Nasl(t′ ) := N IL else najdi i, ˇze Su (i) = t, Su (ρ(u) + 1) := S(ρ(u)), j := ρ(u) − 1, Nasl(v) := t′ , Nasl(t′ ) := t while j ≥ i do Su (j + 1) := Su (j), Hu (j + 1) := Hu (j), j := j − 1 enddo Su (i) := t′ , Hu (i) := x, ρ(u) := ρ(u) + 1, if t = Prv then Prv := t′ endif endif t := u ˇ epen´ı(t) enddo while ρ(t) > b do Stˇ endif endif Korektnost algoritmu plyne z faktu, ˇze key je izomorfismus uspoˇra´d´an´ı a seznam list˚ u je v rostouc´ım
85
poˇrad´ı. Protoˇze v je vˇzdy bezprostˇredn´ı pˇredch˚ udce t, je seznam korektnˇe definov´an. Ukazatel otec(t) je d´an na cestˇe z vrcholu Prv do koˇrene, pro ostatn´ı vrcholy se ˇreˇs´ı stejn´ ym zp˚ usobem jako pro (a, b)-stromy. 4.2.13
A-sort – sloˇ zitost
Algoritmus A-sort vyˇzaduje v´ıce ˇcasu i v´ıce pamˇeti neˇz klasick´e tˇr´ıdic´ı algoritmy, ale jejich asymptotick´a sloˇzitost je stejn´a. Jeho v´ yhoda je v pouˇzit´ı na pˇredtˇr´ıdˇen´e posloupnosti. Definice. Pro posloupnost (x1 , x2 , . . . , xn ) prvk˚ u z tot´ alnˇe uspoˇr´adan´eho univerza U definujme F = |{(i, j) | i < j, xj < xi }|. Zˇrejmˇe F = 0, pr´avˇe kdyˇz posloupnost (x1 , x2 , . . . , xn ) je setˇr´ıdˇen´a. D´ale 0 ≤ F ≤ n2 a F = n2 , pr´avˇe kdyˇz je posloupnost (x1 , x2 , . . . , xn ) klesaj´ıc´ı.
To vede k tomu br´at F jako m´ıru pˇredtˇr´ıdˇenosti posloupnosti. Spoˇc´ıt´ame sloˇzitost algoritmu A-sort v z´avislosti na n a F .
Pozorov´ an´ı. Algoritmus A-sort v nejhorˇs´ım pˇr´ıpadˇe vyˇzaduje ˇcas, kter´y potˇrebuje A-Insert, plus O(n). Pozorov´ an´ı. Algoritmus A-Insert(x) vyˇzaduje ˇcas potˇrebn´y na nalezen´ı m´ısta, kam vloˇzit x, plus O(poˇcet ˇ vol´an´ı Stˇ epen´ı). ˇ epen´ı vytvoˇril jeden vnitˇrn´ı vrchol (a, b)-stromu a protoˇze Pozorov´ an´ı. Protoˇze kaˇzd´y bˇeh procedury Stˇ a ≥ 2 a (a, b)-strom po skonˇcen´ı vol´an´ı A-Insert m´a n list˚ u, je vnitˇrn´ıch vrchol˚ u (a, b)-stromu < n. Pozorov´ an´ı (Plyne z minul´eho). Vˇsechny bˇehy procedury A-Insert vyˇzaduj´ı ˇcas na nalezen´ı m´ıst jednotliv´ych prvk˚ u plus O(n). Pozorov´ an´ı. Kdyˇz procedura A-Insert(x) pˇri hled´an´ı m´ısta pro prvek x skonˇcila ve v´yˇsce h (tj. prvn´ı cyklus se h-kr´ at opakoval), pak nalezen´ı m´ısta pro prvek x vyˇzadovalo ˇcas O(h). Pozorov´ an´ı. Vˇsechny prvky reprezentovan´e (a, b)-stromem pod prvn´ım vrcholem ve v´yˇsce h−1 jsou menˇs´ı neˇz x a je jich alespoˇ n ah−1 . Pozorov´ an´ı. Kdyˇz x = xi , pak poˇcet prvk˚ u reprezentovan´ych (a, b)-stromem pˇri bˇehu procedury AInsert(x), kter´e jsou menˇs´ı neˇz x, je poˇcet j takov´ych, ˇze i < j a xj < xi . (Plyne z toho, v jak´em poˇrad´ı vkl´ ad´ ame.) Definice. Oznaˇcme fi poˇcet j takov´ych, ˇze i < j a xj < xi . Vˇ eta. Algoritmus A-sort na setˇr´ıdˇen´ı n-ˇclenn´e posloupnosti vyˇzaduje v nejhorˇs´ım pˇr´ıpadˇe ˇcas O(n + n log Fn ), kde F je m´ıra setˇr´ıdˇenosti vstupn´ı posloupnosti. D˚ ukaz. Z pozorov´an´ı plat´ı ah−1 ≤ fi =⇒ h − 1 ≤ loga fi =⇒ h ∈ O(log fi ). Proto v nejhorˇs´ım pˇr´ıpadˇe ˇcas potˇrebn´ y pro nalezen´ı pozice xi je O(log fi ). Odtud plyne, ˇze ˇcas algoritmu potˇrebn´ y k bˇehu algoritmu A-sort je n X O(( log fi ) + n). i=1
86
P Zˇrejmˇe ni=1 fi = F a nyn´ı vyuˇzijeme toho, ˇze geometrick´ y pr˚ umˇer je vˇzdy menˇs´ı nebo roven aritmetick´emu pr˚ umˇeru, a odtud dost´av´ame n X
log fi = log
i=1
n Y
fi = n log(
i=1
n log
n Y i=1
Pn
i=1
n
fi
= n log
1
fi ) n ≤ F . n
Zhodnocen´ı: Protoˇze A-sort nepouˇz´ıv´a operaci DELETE, doporuˇcuje se pouˇz´ıt (2, 3)-stromy. Kdyˇz se budou tˇr´ıdit posloupnosti s m´ırou F ≤ n log n, pak algoritmus A-sort bude potˇrebovat v nejhorˇs´ım pˇr´ıpadˇe ˇcas O(n log log n). Mehlhorn a Tsakalidis dok´azali, ˇze kdyˇz F ≤ 0.02n1.57 , pak algoritmus A-sort je rychlejˇs´ı neˇz algoritmus Quicksort. 4.2.14
Propojen´ e stromy s prstem
Hladinovˇe propojen´y (a, b)-strom s prstem je (a, b)-strom, kde struktura vnitˇrn´ıho vrcholu r˚ uzn´eho od koˇrene je rozˇs´ıˇrena (proti klasick´emu (a, b)-stromu) o ukazatele otec(v), levy(v), pravy(v), kde: • levy(v) ukazuje na nejvˇetˇs´ı vrchol (v lexikografick´em uspoˇr´ad´an´ı) ve stejn´e hladinˇe jako v, kter´ y je menˇs´ı neˇz v (kdyˇz neexistuje, tak je to N IL), • pravy(v) ukazuje na nejmenˇs´ı vrchol (v lexikografick´em uspoˇra´d´an´ı) ve stejn´e hladinˇe jako v, kter´ y je vˇetˇs´ı neˇz v (kdyˇz neexistuje, tak je to N IL). Nav´ıc je d´an ukazatel Prst na nˇekter´ y list. Zde se liˇs´ı hlavnˇe vyhled´av´an´ı, kter´e je zobecnˇen´ım postupu A-sortu. Zaˇc´ın´ame od listu p, na kter´ y ukazuje Prst. Kdyˇz x je menˇs´ı neˇz prvek reprezentovan´ y t´ımto listem, pak se pokraˇcuje v jeho otci v, a kdyˇz p byl ’ i-t´ y syn v, tak se pomoc´ı pole Hv zjiˇst uje, zda x nem´a b´ yt reprezentov´an v podstromu jeho j-t´eho syna pro j < i. Kdyˇz ne, pokraˇcuje se ukazatelem levy(v). Kdyˇz x nen´ı reprezentov´an ani v jeho podstromu, tak se cel´ y postup opakuje o hladinu v´ yˇs (zkoum´a se otec vrcholu). Kdyˇz x je vˇetˇs´ı neˇz prvek reprezentovan´ y listem p, je postup zrcadlovˇe obr´acen´ y. Kdyˇz se nalezne vrchol, v jehoˇz podstromu m´a x leˇzet, pak se aplikuje od tohoto vrcholu (m´ısto od koˇrene) procedura Vyhledej. Struktura kromˇe operac´ı uspoˇra´dan´eho slovn´ıkov´eho probl´emu jeˇstˇe pouˇz´ıv´a pˇridanou operaci PRST(x), kter´a nastav´ı ukazatel Prst na list, kter´ y reprezentuje nejmenˇs´ı prvek vˇetˇs´ı nebo rovn´ y x (pokud x > max S, tak ukazatel Prst bude ukazovat na nejvˇetˇs´ı list). Operace provedou vyhled´an´ı a pak pokraˇcuj´ı klasick´ ym zp˚ usobem. Pouˇzit´ı: Tato struktura je velmi v´ yhodn´a pro u ´lohy, kde vˇzdy skupina po sobˇe jdouc´ıch operac´ı pracuje v bl´ızk´em okol´ı nˇejak´eho x ∈ U . Pak vyhled´an´ı prvku je rychlejˇs´ı neˇz v klasick´em (a, b)-stromu, viz A-sort. 4.2.15
Omezen´ı ˇ stˇ epen´ı, spojov´ an´ı a pˇ resun˚ u
Pozn. studenta - dost jsem popˇresouval poˇrad´ı dokazov´an´ı v t´eto kapitole tak, aby mi d´avalo logick´ y smysl. ˇ epen´ı, Spojov´ Vyvaˇzovac´ı operace Stˇ an´ı, Pˇ resun vyˇzaduj´ı ˇcas O(1), ale ve skuteˇcnosti jsou nejpomalejˇs´ı ˇca´st´ı algoritm˚ u pro operace INSERT a DELETE. Omezen´ı jejich poˇctu vedlo k menˇs´ı sloˇzitosti algoritmu A-sort. To motivovalo anal´ yzu jejich pouˇzit´ı. 87
ˇ epen´ı nejv´ Libovoln´ y bˇeh algoritmu INSERT vol´a podproceduru Stˇ yˇse log(|S|)-kr´at a libovoln´ y bˇeh algoritmu DELETE m˚ uˇze nejv´ yˇse log(|S|)-kr´at zavolat podproceduru Spojen´ı a nejv´ yˇse jednou podproceduru Pˇ resun. V obecn´em pˇr´ıpadˇe tyto odhady nejdou zlepˇsit. Pro vhodn´ y typ (a, b)-stromu vˇsak amortizovan´ y poˇcet vyvaˇzovac´ıch operac´ı (zaˇc´ın´ame-li s p˚ uvodnˇe pr´azdn´ ym stromem) je konstantn´ı. Pˇripom´ın´ame, ˇze v´yˇska vrcholu v koˇrenov´em stromˇe je maxim´aln´ı d´elka cesty z nˇeho do nˇekter´eho listu. (tj. je poˇc´ıtan´a odspodu) D˚ ukaz omezen´ı poˇctu ˇstˇepen´ı je zaloˇzen na bankovn´ım principu – navrhneme kvantitativn´ı ohodnocen´ı (a, b)-stromu, nalezneme jeho horn´ı odhad a pop´ıˇseme, jak toto ohodnocen´ı mohou zmˇenit vyvaˇzovac´ı operace. Srovn´an´ı tˇechto odhad˚ u d´a poˇzadovan´ y v´ ysledek. Necht’ b ≥ 2a a a ≥ 2. Definice. Pro pevn´e a a b oznaˇcme c = min{min{2a − 1, ⌈
b+1 b+1 ⌉} − a, b − max{2a − 1, ⌊ ⌋}}. 2 2
Definice. Mˇejme (a, b)-strom T , pro vnitˇrn´ı vrchol v r˚ uzn´y od koˇrene definujme b(v) = min{ρ(v) − a, b − ρ(v), c}, pro koˇren r definujme b(r) = min{ρ(r) − 2, b − ρ(r), c}. b se d´a vn´ımat jako vzd´alenost“ poˇctu syn˚ u od krajn´ıch hodnot a a b, ale s horn´ım omezen´ım c. ” Pozorov´ an´ı (1). Pro vnitˇrn´ı vrchol stromu v r˚ uzn´y od koˇrene plat´ı 1. b(v) ≤ c; 2. kdyˇz ρ(v) = a nebo ρ(v) = b, pak b(v) = 0; 3. kdyˇz ρ(v) = a − 1 nebo ρ(v) = b + 1, pak b(v) = −1; 4. kdyˇz ρ(v) = 2a − 1, pak b(v) = c; 5. Kdyˇz v ′ a v ′′ jsou dva r˚ uzn´e vrcholy stromu r˚ uzn´e od koˇrene takov´e, ˇze ρ(v ′ ) = ⌈ b+1 ⌉ a ρ(v ′′ ) = ⌊ b+1 ⌋, 2 2 pak b(v ′ ) + b(v ′′ ) ≥ 2c − 1; 6. pro koˇren r plat´ı b(r) ≤ c. D˚ ukaz. D˚ ukazy 1,2,3,6 jsou trivi´aln´ı. D˚ ukazy 4 a 5 jsou technick´e a vypl´ yvaj´ı z definice c (pozn. studenta - j´a to tam nevid´ım :( )
Definice. Strom (T, r) ohodnot´ıme X bh (T ) = {b(v) | v 6= r vnitˇrn´ı vrchol stromu ve v´ yˇsce h} b(T ) =
∞ X
bh (T ) + b(r).
h=1
ˇ Definice. Rekneme, ˇze (T, r, v) je parci´aln´ı (a, b)-strom, kdyˇz r je koˇren stromu, v je vnitˇrn´ı vrchol T a plat´ı: • kdyˇz v 6= r, pak a − 1 ≤ ρ(v) ≤ b + 1 a 2 ≤ ρ(r) ≤ b; 88
• kdyˇz v = r, pak 2 ≤ ρ(r) ≤ b + 1; • kdyˇz t je vnitˇrn´ı vrchol T r˚ uzn´y od v a r, pak a ≤ ρ(t) ≤ b; • vˇsechny cesty z koˇrene r do nˇejak´eho listu maj´ı stejnou d´elku. Tj. jde o a,b strom s jedn´ım pokaˇzen´ ym“ vrcholem. ” Nyn´ı rozloˇz´ıme operace INSERT a DELETE do jednotliv´ ych akc´ı se stromem a vyˇsetˇr´ıme vliv tˇechto akc´ı na jeho ohodnocen´ı. D˚ ukazy lemmat jsou zaloˇzen´e na n´asleduj´ıc´ım pozorov´an´ı Pozorov´ an´ı (2). Mˇejme dva stromy T a T ′ , kter´e maj´ı stejnou mnoˇzinu vrchol˚ u ve v´yˇsce h. Pak plat´ı: 1. kdyˇz kaˇzd´y vrchol ve v´yˇsce h m´a stejn´y poˇcet syn˚ u v obou stromech, pak bh (T ) = bh (T ′ ); 2. kdyˇz vˇsechny vrcholy ve v´yˇsce h aˇz na jeden vrchol maj´ı stejn´y poˇcet syn˚ u v obou stromech a poˇcet syn˚ u u zbyl´eho vrcholu se ve stromech T a T ′ liˇs´ı nejv´yˇse o 1, pak bh (T ) ≥ bh (T ′ ) − 1. Lemma 1. Kdyˇz (T, r) je (a, b)-strom a kdyˇz strom T ′ vznikne z T pˇrid´ an´ım/ubr´an´ım jednoho syna vrcholu v ve v´yˇsce 1 (tj. pˇrid´ avan´y/ub´ıran´y syn je list), pak (T ′ , r, v) je parci´aln´ı (a, b)-strom a plat´ı b1 (T ′ ) ≥b1 (T ) − 1 b(T ′ ) ≥b(T ) − 1.
a bh (T ′ ) = bh (T ) pro h > 1;
D˚ ukaz. Zhorˇsili jsme b1 v nejspodnˇejˇs´ı hladinˇe, na nic jin´eho jsme neˇsahali, nic jsme neˇstˇepili.
Lemma 2. Necht’ (T, r, v) je parci´aln´ı (a, b)-strom, ρ(v) = b + 1 a v je ve v´yˇsce l ≥ 1. Kdyˇz T ′ vznikne z ˇ epen´ı(v), pak (T ′ , r, otec(v)) je parci´aln´ı (a, b)-strom a plat´ı: T operac´ı Stˇ bl (T ′ ) ≥bl (T ) + 2c, bl+1 (T ′ ) ≥ bl+1 (T ) − 1 bh (T ′ ) =bh (T ) pro h 6= l, l + 1; b(T ′ ) ≥ b(T ) + 2c − 1. D˚ ukaz. Nerovn´ıtko o l-t´e hladinˇe plat´ı kv˚ uli bodu 5 z pozorov´an´ı 1, protoˇze jsme b z −1 zmˇenili na 2c − 1, o l + 1 hladinˇe to plat´ı proto, protoˇze se zvˇetˇsil uzel o jedna (viz pozorov´an´ı 2). Zbytek stromu je stejn´ y.
Lemma 3. Necht’ (T, r, v) je parci´aln´ı (a, b)-strom, ρ(v) = a − 1, v je ve v´yˇsce l ≥ 1 a y je bezprostˇredn´ı bratr v takov´y ˇze ρ(y) = a. Kdyˇz T ′ vznikne z T operac´ı Spojen´ı(v, y), pak (T ′ , r, otec(v)) je parci´aln´ı (a, b)-strom a plat´ı: bl (T ′ ) ≥bl (T ) + c + 1, bl+1 (T ′ ) ≥ bl+1 (T ) − 1 bh (T ′ ) =bh (T ) pro h 6= l, l + 1; b(T ′ ) ≥ b(T ) + c. D˚ ukaz. Ve vrstvˇe l se ze situace v bodech 2 a 3 z pozorov´an´ı 1 dostaneme do situace v bodu 4. Ve vrstvˇe l + 1 opˇet mˇen´ıme jenom jeden prvek. 89
Lemma 4. Necht’ (T, r, v) je parci´aln´ı (a, b)-strom, ρ(v) = a − 1, v je v´yˇsce l ≥ 1 a y je bezprostˇredn´ı bratr v takov´y, ˇze ρ(y) > a. Kdyˇz T ′ vznikne z T operac´ı Pˇ resun(v, y), pak (T ′ , r) je (a, b)-strom a plat´ı: bl (T ′ ) ≥ bl (T ) a bh (T ′ ) = bh (T ) pro h 6= l;
b(T ′ ) ≥ b(T ).
D˚ ukaz. Nev´ım, ze kter´eho pozorov´an´ı pˇresnˇe to plat´ı :( ale ... asi to plat´ı, protoˇze pokud jednu vzd´alenost zhorˇs´ıme, jinou zlepˇs´ıme. Nebo tak nˇeco.
Definice. Necht’ P je posloupnost n operac´ı INSERT a DELETE, aplikujme ji na pr´ azdn´y (a, b)-strom. Oznaˇcme P ˇ epen´ı ve v´yˇsce h pˇri aplikaci P, St = • Sth – poˇcet Stˇ St Ph h • Sph – poˇcet Spojen´ı ve v´yˇsce h pˇri aplikaci P, Sp = h Sph P • Ph – poˇcet Pˇ resun˚ u ve v´yˇsce h pˇri aplikaci P, P = h Ph .
Definice. Poloˇzme si St0 + Sp0 = poˇcet list˚ u v Tk ≤ n, aby n´ am vych´azely vzoreˇcky d´ale (v 0 - tj. listov´e - hladinˇe jinak nic neˇstˇep´ıme/nespojujeme a St ˇci Sp tam ned´av´ a smysl) Definice. Oznaˇcme Tk (a, b)-strom vznikl´y proveden´ım posloupnosti P na pr´ azdn´y (a, b)-strom. Seˇcten´ım pˇredchoz´ıch v´ ysledk˚ u dost´av´ame D˚ usledek 5. Kdyˇz poloˇz´ıme St0 + Sp0 = poˇcet list˚ u v Tk ≤ n, pak bh (Tk ) ≥ 2cSth + (c + 1)Sph − Sth−1 − Sph−1 pro h ≥ 1. D˚ ukaz. Skuteˇcnˇe plyne z lemmat z ˇca´st´ı pro hladiny, r˚ uzn´e operace pˇrispˇej´ı r˚ uznˇe.
D˚ usledek 6. D´ ale b(Tk ) ≥ (2c − 1)St + cSp − n, kde n je d´elka posloupnosti P. D˚ ukaz. Skuteˇcnˇe plyne z lemmat z ˇca´st´ı pro cel´e stromy.
Nyn´ı odhadneme shora b(Tk ). c . Lemma 7. Kdyˇz T je (a, b)-strom s m listy, pak 0 ≤ b(T ) ≤ c + (m − 2) a+c−1
90
D˚ ukaz. Pro 0 ≤ j < c oznaˇcme mj poˇcet vnitˇrn´ıch vrchol˚ u r˚ uzn´ ych od koˇrene, kter´e maj´ı pˇresnˇe a + j syn˚ u, a mc oznaˇcme poˇcet vnitˇrn´ıch vrchol˚ u r˚ uzn´ ych od koˇrene, kter´e maj´ı alespoˇ n a + c syn˚ u. Kdyˇ Pcz vrchol v m´a a + j syn˚ u, pak bT (v) ≤ j a pro kaˇzd´ y vnitˇrn´ı vrchol v plat´ı bT (v) ≤ c. Tedy b(T ) ≤ c + j=0 jmj . Z vlastnost´ı strom˚ u plyne c X X 2+ (a + j)mj ≤ {ρ(v) | v je vnitˇrn´ı vrchol T } = j=0
m+
c X
mj .
j=0
Odtud plyne
c X j=0
Protoˇze
j a+j−1
≤
c a+c−1
(a + j − 1)mj ≤ m − 2.
pro kaˇzd´e j takov´e, ˇze 0 ≤ j ≤ c, dost´av´ame b(T ) ≤c +
c X
jmj = c +
j=0
c X j=0
c c+ (m − 2) a+c−1
j (a + j − 1)mj ≤ a+j−1
a lemma je dok´az´ano.
Vˇ eta (1). P ≤n
a
(2c − 1)St + cSp ≤ n + c +
c(n − 2) ; a+c−1
D˚ ukaz. Protoˇze kaˇzd´a operace DELETE pouˇzije nejv´ yˇse jednu operaci Pˇ resun (a operace INSERT operaci Pˇ resun nepouˇz´ıv´a) dost´av´ame, ˇze P ≤ poˇcet operac´ı DELETE ≤ n a prvn´ı nerovnost plat´ı. Abychom dok´azali druhou nerovnost, spoj´ıme druh´e tvrzen´ı v D˚ usledku 5 a Lemma 7 (Tk m´a nejv´ yˇse n list˚ u) (2c − 1)St + cSp − n ≤ b(Tk ) ≤ c + (n − 2)
c a+c−1
Odtud plyne poˇzadovan´a nerovnost.
Lemma 8. Pro kaˇzd´e h ≥ 1 a pro kaˇzd´y (a, b)-strom T s m listy plat´ı h X l=1
bl (T )(c + 1)l ≤ (c + 1)m.
91
D˚ ukaz. Pro 0 ≤ j < c a pro libovoln´e h oznaˇcme mj (h) poˇcet vrchol˚ u ve v´ yˇsce h r˚ uzn´ ych od koˇrene, kter´e maj´ı pˇresnˇe a + j syn˚ u, a mc (h) poˇcet vrchol˚ u ve v´ yˇsce h r˚ uzn´ ych od koˇrene, kter´e maj´ı alespoˇ n a+c syn˚ u. Pak m´ame bh (T ) ≤ c X j=0
kde dodefinov´av´ame
Pc
j=0
(a + j)mj (h) ≤
c X
j=0 c X j=0
jmj (h), mj (h − 1) pro kaˇzd´e h ≥ 1,
mj (0) = m. Tyto vztahy pouˇzijeme v n´asleduj´ıc´ım odhadu. Plat´ı
h X l=1
l
bl (T )(c + 1) ≤ h X
l=1
h X l
c X j=0
c X j=0
c X
jmj (l)
j=0
l=1
(c + 1)
(c + 1)
(c + 1)
l
mj (l − 1) − a h
mj (0) − (c + 1) a
c h−1 X X l+1 mj (l) − (c + 1) j=0
l=1
(c + 1)m,
c X
≤
mj (l)
j=0
c X
=
mj (h)+
j=0
c
a X mj (l) ≤ c + 1 j=0
P kde rovnost jsme z´ıskali pˇrerovn´an´ım sˇc´ıtanc˚ u tak, aby v´ yrazy cj=0 mj (l) byly u sebe, a posledn´ı nerovnost a ≥ 1, a tedy druh´ y sˇc´ıtanec v pˇredchoz´ım v´ yrazu nen´ı kladn´ y. plyne z toho, ˇze c+1
Lemma 9. Sth + Sph ≤
n (c+1)h
+
(c+1)l l=1 bl (Tk ) (c+1)h+1
Ph
D˚ ukaz. V´ yraz z D˚ usledku 5 uprav´ıme (vyuˇz´ıv´ame, ˇze c ≥ 1): Sth + Sph ≤
bh (Tk ) Sth−1 + Sph−1 + ≤ c+1 c+1 bh (Tk ) bh−1 (Tk ) Sth−2 + Sph−2 + + ≤ ··· ≤ c+1 (c + 1)2 (c + 1)2 h−1 X bh−i (Tk ) n + = i+1 (c + 1) (c + 1)h i=0 h
X (c + 1)l n + . b (T ) l k (c + 1)h (c + 1)h+1 l=1
Vˇ eta (2). Sth + Sph + Ph ≤
2(c+2)n . (c+1)h
92
D˚ ukaz. Zkombinujeme pˇredchoz´ı dvˇe lemmata. Dostaneme
h
X n (c + 1)l Sth + Sph ≤ + ≤ b (T ) l k h+1 (c + 1)h (c + 1) l=1
n n(c + 1) 2n + = . h h+1 (c + 1) (c + 1) (c + 1)h
Protoˇze Ph ≤ Sph−1 − Sph ≤ Sth−1 + Sph−1 ≤ Sth + Sph + Ph ≤
2n (c+1)h−1
dost´av´ame, ˇze
2n 2n + 2n(c + 1) 2n + = = h h−1 (c + 1) (c + 1) (c + 1)h 2n(c + 2) (c + 1)h
D˚ usledek. Amortizovan´y poˇcet vyvaˇzovac´ıch operac´ı splˇ nuje P + St + Sp 5 ≤ . n 2 D˚ ukaz. Z definice plyne, ˇze c ≥ 1, a protoˇze a ≥ 2, z vˇety (1) dostaneme St + Sp ≤
n−2 n−2 3n n +1+ ≤n+1+ ≤ . c a 2 2
Amortizovan´ y poˇcet vyvaˇzovac´ıch operac´ı splˇ nuje tedy 5 P + St + Sp ≤ . n 2
4.2.16
Omezen´ı ˇ stˇ epen´ı, spojov´ an´ı a pˇ resun˚ u – diskuze
Vˇeta vysvˇetluje, proˇc jsou doporuˇcen´e hodnoty b ≥ 2a – pak je poˇcet vyvaˇzovac´ıch operac´ı bˇehem posloupnosti operac´ı INSERT a DELETE line´arn´ı vzhledem k d´elce t´eto posloupnosti. Pro b = 2a − 1 lze lehce nal´ezt posloupnost operac´ı INSERT a DELETE o d´elce n takovou, ˇze jej´ı aplikace na pr´azdn´ y (a, b)strom vyˇzaduje poˇcet vyvaˇzovac´ıch operac´ı u ´mˇern´ y n log n (pro kaˇzd´e dostateˇcnˇe velk´e n). Podobn´a vˇeta plat´ı i pro paraleln´ı implementaci (a, b)-strom˚ u, ale plat´ı za pˇredpokladu b ≥ 2a + 2. Pro b = 2a nebo b = 2a + 1 lze nal´ezt posloupnost, kter´a je protipˇr´ıkladem. Proto se doporuˇcuje hodnota b = 2a + 2 pro paraleln´ı implementaci (a, b)-stromu. Pro propojen´e (a, b)-stromy plat´ı silnˇejˇs´ı verze. Vˇ eta. Pˇredpokl´adejme, ˇze b ≥ 2a a a ≥ 2. Mˇejme hladinovˇe propojen´y (a, b)-strom s prstem T , kter´y reprezentuje n-prvkovou mnoˇzinu. Pak posloupnost P operac´ı MEMBER, INSERT, DELETE a PRST aplikovan´a na T vyˇzaduje ˇcas O(log(n) + ˇcas na vyhled´an´ı prvk˚ u). 93
Vysvˇetlen´ı: Zaˇc´ın´ame v libovoln´em propojen´em (a, b)-stromˇe T , proto jeho struktura m˚ uˇze b´ yt nev´ yhodn´a pro danou posloupnost operac´ı P. Abychom se dostali do vhodn´eho reˇzimu, m˚ uˇze b´ yt tˇreba aˇz log(n) ˇ vyvaˇzovac´ıch operac´ı. Cas na vyhled´av´an´ı nem˚ uˇzeme ovlivnit, ten mus´ı ovlivnit uˇzivatel. Aplikace: anal´ yza hladinovˇe propojen´ ych strom˚ u s prstem umoˇznila n´avrh algoritmu, kter´ y pro dvˇe mnoˇziny S1 a S2 reprezentovan´e propojen´ ymi (a, b)-stromy, kde b ≥ 2a a a ≥ 2, zkonstruuje propojen´ y (a, b)-strom reprezentuj´ıc´ı mnoˇzinu S1 ∪ S2 (nebo mnoˇzinu ∆(S1 , S2 ) = (S1 \ S2 ) ∪ (S2 \ S1 ) nebo ), kde n = max{|S1 |, |S2 |} a m = min{|S1 |, |S2 |}. Detaily budou S1 ∩ S2 nebo S1 \ S2 ) v ˇcase O(log n+m m v letn´ım semestru. ˇ epen´ı(t) se provede, jen kdyˇz oba bratˇri Vyvaˇzov´an´ı pˇri operaci INSERT lze prov´adˇet tak, ˇze operace Stˇ vrcholu t maj´ı b syn˚ u. Jinak se prov´ad´ı operace Pˇ resun. Nev´ım o ˇza´dn´em seri´ozn´ım pokusu tyto alternativy porovnat.
4.3
Bin´ arn´ı vyhled´ avac´ı stromy
Bin´arn´ı vyhled´avac´ı strom je struktura pro bin´arn´ı vyhled´av´an´ı v uspoˇra´dan´em poli roztaˇzen´em do roviny a vyhled´av´an´ı odpov´ıd´a cestˇe ve stromˇe. 4.3.1
Form´ aln´ı definice
Pˇredpokl´ad´ame, ˇze U je line´arnˇe uspoˇra´dan´e univerzum a S ⊆ U . Bin´arn´ı vyhled´avac´ı strom T reprezentuj´ıc´ı mnoˇzinu S je u ´pln´ y bin´arn´ı strom (tj. kaˇzd´ y vrchol je bud’ listem nebo m´a dva syny, lev´eho a prav´eho), kde existuje bijekce mezi mnoˇzinou S a vnitˇrn´ımi vrcholy stromu takov´a, ˇze • kdyˇz v je vnitˇrn´ı vrchol stromu T , kter´emu je pˇriˇrazen prvek s ∈ S, pak kaˇzd´emu vnitˇrn´ımu vrcholu u v podstromu lev´eho syna vrcholu v je pˇriˇrazen prvek z S menˇs´ı neˇz s a kaˇzd´emu vnitˇrn´ımu vrcholu w v podstromu prav´eho syna vrcholu v je pˇriˇrazen prvek z S vˇetˇs´ı neˇz s. Strukura vnitˇrn´ıho vrcholu v: • • • •
ukazatel otec(v) na otce vrcholu v ukazatel levy(v) na lev´eho syna vrcholu v ukazatel pravy(v) na prav´eho syna vrcholu v atribut key(v) – prvek z S pˇriˇrazen´ y vrcholu v.
Kdyˇz v je koˇren stromu, pak hodnota ukazatele otec(v) je N IL. List m´a ukazatele pouze na otce. Kaˇzd´ y list reprezentuje interval mezi dvˇema sousedn´ımi prvky z S – pˇresnˇe, kdyˇz u je list a je lev´ ym synem vrcholu v, nalezneme vrchol na cestˇe z u do koˇrene nejbl´ıˇze u takov´ y, ˇze je prav´ ym synem vrcholu w. Pak u reprezentuje interval (key(w), key(v)) a kdyˇz vrchol w neexistuje, pak u reprezentuje interval (−∞, key(v)) a prvek key(v) je nejmenˇs´ı prvek v S. Kdyˇz u je list a je prav´ ym synem vrcholu v, nalezneme vrchol na cestˇe z u do koˇrene nejbl´ıˇze u takov´ y, ˇze je lev´ ym synem vrcholu w. Pak u reprezentuje interval (key(v), key(w)) a kdyˇz takov´ y vrchol w neexistuje, pak u reprezentuje interval (key(v), +∞) a prvek key(v) je nejvˇetˇs´ı prvek v S. Pˇri implementaci bin´arn´ıch vyhled´av´ac´ıch strom˚ u je v´ yhodn´e vynechat listy (m´ısto nich bude ukazatel N IL). Pˇri n´avrhu algoritm˚ u je vˇsak naopak v´ yhodn´e pracovat s listy (vyhl´ıˇz´ı to logiˇctˇejˇs´ı). Proto pˇri n´avrhu algoritm˚ u budeme pˇredpokl´adat, ˇze stromy maj´ı listy reprezentuj´ıc´ı intervaly.
94
4.3.2
Algoritmy
Navrhneme algoritmy pro bin´arn´ı vyhled´avac´ı stromy realizuj´ıc´ı operace z uspoˇra´dan´eho slovn´ıkov´eho probl´emu. Vyhledej(x) t :=koˇren stromu while t nen´ı list a key(t) 6= x do if key(t) > x then t := levy(t) else t := pravy(t) endif enddo MEMBER(x) Vyhledej(x) if t nen´ı list then V´ ystup: x ∈ S else V´ ystup: x ∈ / S endif INSERT(x) Vyhledej(x) if t je list then t se zmˇen´ı na vnitˇrn´ı vrchol, key(t) := x, levy(t) a pravy(t) jsou nov´e listy, jejichˇz otcem je t endif DELETE(x) Vyhledej(x) if t nen´ı list then if levy(t) je list then odstran´ıme vrchol levy(t), otec(pravy(t)) := otec(t) if t = levy(otec(t)) then levy(otec(t)) := pravy(t) else pravy(otec(t)) := pravy(t) endif odstran´ıme vrchol t else u := levy(t) while pravy(u) nen´ı list do u := pravy(u) enddo key(t) := key(u), odstran´ıme vrchol pravy(u), otec(levy(u)) := otec(u) if u = levy(otec(u)) then levy(otec(u)) := levy(u) else pravy(otec(u)) := levy(u) endif odstran´ıme vrchol u endif endif
95
MIN t :=koˇren stromu while lev´ y syn t nen´ı list do t := levy(t) enddo V´ ystup: prvek reprezentovan´ y t je nejmenˇs´ı prvek v S MAX t :=koˇren stromu while prav´ y syn t nen´ı list do t := pravy(t) enddo V´ ystup: prvek reprezentovan´ y t je nejvˇetˇs´ı prvek v S SPLIT(x): T1 a T2 jsou pr´azdn´e stromy u1 := u2 := N IL t := koˇren stromu T while t nen´ı list a key(t) 6= x do if key(t) > x then u := levy(t), levy(t) := N IL, otec(u) := N IL if T2 je pr´azdn´ y strom then T2 := podstrom vrcholu t else levy(u2 ) := t, otec(t) := u2 endif u2 := t else u := pravy(t), pravy(t) := N IL, otec(u) := N IL if T1 je pr´azdn´ y strom then T1 := podstrom vrcholu t else pravy(u1 ) := t, otec(t) := u1 endif u1 := t endif t := u enddo if key(t) = x then otec(levy(t)) := u1 , pravy(u1 ) := levy(t) otec(pravy(t)) := u2 , levy(u2 ) := pravy(t) otec(u1 ) := N IL, otec(u2 ) := N IL, V´ ystup: x ∈ S else V´ ystup: x ∈ /S endif Koment´aˇr: T1 je bin´arn´ı vyhled´avac´ı strom reprezentuj´ıc´ı mnoˇzinu {s ∈ S | s < x} a T2 je bin´arn´ı vyhled´avac´ı strom reprezentuj´ıc´ı mnoˇzinu {s ∈ S | s > x}. JOIN3(T1 , x, T2 ) – pˇredpokl´ad´ame, ˇze kdyˇz Ti reprezentuje mnoˇzinu Si pro i = 1, 2, pak max S1 < x < min S2 vytvoˇrme nov´ y vrchol u, key(u) = x, otec(u) := N IL, otec(koˇrene T1 ) := u, otec(koˇrene T2 ) := u, levy(u) :=koˇren T1 , pravy(u) :=koˇren T2 .
96
4.3.3
Korektnost
Abych dok´azali korektnost algoritmu Vyhledej – jedn´a se o modifikaci vyhled´av´an´ı v uspoˇra´dan´em poli – pop´ıˇseme podrobnˇeji vlastnosti bin´arn´ıho vyhled´avac´ıho stromu. Nejprve rozˇs´ıˇr´ıme universum o dva nov´e prvky, o nov´ y nejmenˇs´ı prvek −∞ a o nov´ y nejvˇetˇs´ı prvek +∞. Mˇejme bin´arn´ı vyhled´avac´ı strom T reprezentuj´ıc´ı mnoˇzinu S, pak pro vrchol t stromu T definujeme indukc´ı hodnoty λ(t) a π(t). Kdyˇz r je koˇren, pak λ(r) = −∞ a π(r) = +∞. Kdyˇz hodnoty λ(t) a π(t) jsou pro vrchol t definov´any, pak pro lev´eho syna u vrcholu t definujeme λ(u) = λ(t) a π(u) = key(y) a pro prav´eho syna w vrcholu t definujeme λ(w) = key(t) a π(w) = π(t). Pozn. studenta - nejsp´ıˇs Lambda jako Lev´ y, Pi jako Prav´ y. Nyn´ı dok´aˇzeme Lemma. Je-li T ′ podstrom bin´ arn´ıho vyhled´avac´ıho stromu T urˇcen´y vrcholem t, pak T ′ reprezentuje mnoˇzinu S ∩ (λ(t), π(t)). Nav´ıc interval (λ(t), π(t)) je nejvˇetˇs´ı interval, kter´y obsahuje jenom prvky z S, kter´e jsou reprezentov´ any vrcholy podstromu T ′ . Nav´ıc, kdyˇz t je list, pak < λ(t), π(t) > je interval repreyentovan´y listem t. D˚ ukaz. Tvrzen´ı dok´aˇzeme indukc´ı. Zˇrejmˇe plat´ı, kdyˇz t je koˇren stromu T . Pˇredpokl´adejme, ˇze plat´ı pro vrchol t a dok´aˇzeme ho pro syny vrcholu t. Oznaˇcme tl lev´eho syna vrcholu t, tp prav´eho syna vrcholu t. Z definice bin´arn´ıho vyhled´avac´ıho stromu stromu plyne, ˇze kdyˇz u je vnitˇrn´ı vrchol v podstromu T urˇcen´em vrcholem tl a kdyˇz v je vnitˇrn´ı vrchol v podstromu T urˇcen´em vrcholem tp , pak key(u) < key(t) < key(v). Nyn´ı platnost tvrzen´ı pro t implikuje platnost tvrzen´ı i pro vrcholy tl a tp .
Korektnost podprocedury Vyhledej plyne z n´asleduj´ıc´ıho invariantu: Lemma. Kdyˇz pˇri vyhled´av´ an´ı x vyˇsetˇrujeme vrchol t, pak λ(t) < x < π(t). Toto tvrzen´ı se lehce dok´aˇze indukc´ı z popisu algoritmu Vyhledej. Tedy operace Vyhledej je korektn´ı a korektnost operac´ı MEMBER a INSERT je ted’ zˇrejm´a. V operaci DELETE, kdyˇz levy(t) je list, pak korektnost je zˇrejm´a. Kdyˇz levy(t) nen´ı list, pak algoritmus nalezne list v takov´ y, ˇze π(v) = x. Pak pro u = otec(v) plat´ı v = pravy(u) a λ(v) = key(u) a (λ(v), π(v)) ∩ S = ∅. Kdyˇz y = key(u), pak odstranˇen´ı vrchol˚ u u a v d´av´a bin´arn´ı vyhled´avac´ı strom reprezentuj´ıc´ı S \ {y}. Protoˇze (y, x) ∩ S = ∅, tak pˇr´ıkaz key(t) := y d´av´a bin´arn´ı vyhled´avac´ı strom reprezentuj´ıc´ı S \ {x} a proto operace DELETE je korektn´ı. Korektnost operac´ı MIN, MAX a JOIN3 plyne z definice bin´arn´ıho vyhledavac´ıho stromu. Korektnost operace SPLIT plyne z korektnosti algoritmu Vyhledej a z faktu, ˇze u1 je otec nejpravˇejˇs´ıho listu stromu T1 a u2 je otec nejlevˇejˇs´ıho listu stromu T2 . Protoˇze ke stromu T1 se pˇrid´av´a ˇca´st stromu T reprezentuj´ıc´ı prvky, kter´e jsou vˇetˇs´ı neˇz prvky reprezentovan´e v T1 , a ke stromu T2 se pˇrid´av´a ˇca´st stromu T reprezentuj´ıc´ı prvky, kter´e jsou menˇs´ı neˇz prvky reprezentovan´e v T2 , korektnost algoritmu pro operaci SPLIT je jasn´a.
97
4.3.4
ˇ Casov´ a sloˇ zitost
Zpracov´an´ı jednoho vrcholu vyˇzaduje ˇcas O(1) a algoritmus se pohybuje po jedn´e cestˇe z koˇrene do nˇejak´eho listu. Oznaˇcme hloubka(T ) d´elku nejdelˇs´ı cesty z koˇrene do nˇejak´eho listu. Pak dost´av´ame Vˇ eta. Algoritmy pro operace MEMBER, INSERT, DELETE, MIN, MAX, JOIN3 a SPLIT v bin´ arn´ım vyhled´avac´ım stromˇe T vyˇzaduj´ı ˇcas O(hloubka(T )). 4.3.5
Poˇ r´ adkov´ a statistika
Bohuˇzel ani struktura bin´arn´ıch vyhled´avac´ıch strom˚ u nepodporuje efektivn´ı implementaci operace ord(k). Pro jej´ı efektivn´ı implentaci je vhodn´e rozˇs´ıˇrit datovou strukturu tak, ˇze u kaˇzd´eho vrcholu t je deklarov´an tak´e u ´daj p(t) – poˇcet list˚ u v podstromu urˇcen´em vrcholem t. Po proveden´ı operac´ı INSERT, DELETE, JOIN3 a SPLIT je pak nutn´e aktualizovat tuto poloˇzku na cestˇe z vrcholu do koˇrene. N´asleduj´ıc´ı algoritmus pak realizuje operaci ord(k). ord(k) t :=koˇren stromu if k ≥ p(t) then k-t´ y prvek neexistuje, stop endif while true do if k > p(levy(t)) then k := k − p(levy(t)), t := pravy(t) else if k < p(levy(t) then t := levy(t) else key(t) je k-t´ y prvek reprezentovan´e mnoˇziny, stop endif endif enddo Korektnost algoritmu plyne z n´asleduj´ıc´ıho invariantu: Kdyˇz algoritmus m´a v dan´em okamˇziku v promˇenn´e t vrchol v a hodnota promˇenn´e k je k ′ , pak k-t´ y prvek v S se rovn´a k ′ -t´emu prvku v intervalu reprezentovan´em v podstromu stromu T urˇcen´em vrcholem v. Protoˇze na poˇca´tku algoritmu je v koˇren stromu a interval je S (a k ′ = k), tak na poˇca´tku bˇehu algoritmu invariant plat´ı. Pˇredpokl´adejme, ˇze plat´ı v nˇekter´em kroku. Necht’ u je lev´ y syn v, w je prav´ y syn v a Ia je interval reprezentovan´ y podstromem T urˇcen´ ym vrcholem a. Pak |Iu | = p(u) − 1, max Iu < key(v) < min Iw a Iv = Iu ∪ {key(v)} ∪ Iw . Odtud plyne, ˇze kdyˇz k ′ < p(u), pak k ′ -t´ y prvek v intervalu Iv je k ′ -t´ y prvek v intervalu Iu , kdyˇz k ′ > p(u), ′ ′ pak k -t´ y prvek v intervalu Iv je (k − p(u))-t´ y prvek v intervalu Iw , a kdyˇz k ′ = p(u), pak k ′ -t´ y prvek v intervalu Iv je key(v). Odtud plyne invariant a korektnost algoritmu. Podle stejn´ ych argument˚ u jako v pˇredchoz´ım pˇr´ıpadˇe dostaneme, ˇze ˇcasov´a sloˇzitost algoritmu je O(hloubka(T )). Tedy m˚ uˇzeme tato fakta shrnout. Vˇ eta. Algoritmy pro operace MEMBER, INSERT, DELETE, MIN, MAX, JOIN3, SPLIT a ord(k) pro vˇsechna k v rozˇs´ıˇren´ych bin´ arn´ıch vyhled´avac´ıch stromech vyˇzaduj´ı ˇcas O(hloubka(T )), kde T je reprezentuj´ıc´ı strom. 4.3.6
Diskuze
Tento v´ ysledek motivuje pouˇz´ıv´an´ı bin´arn´ıch vyhled´avac´ıch strom˚ u, kter´e splˇ nuj´ı dalˇs´ı podm´ınku, kter´a m´a zajistit, ˇze hloubka(T ) = O(log |S|). V takov´emto pˇr´ıpadˇe mluv´ıme o vyv´ aˇzen´ych bin´ arn´ıch vyhled´avac´ıch stromech. Je vˇsak nutn´e pˇridat k operac´ım INSERT, DELETE, JOIN3 a SPLIT dalˇs´ı kroky, 98
kter´e zaruˇc´ı, ˇze po jejich proveden´ı strom opˇet splˇ nuje poˇzadovan´e podm´ınky. To vede k poˇzadavku, aby vyvaˇzovac´ı operace byly rychl´e a prov´adˇelo se jich m´alo. Pˇri n´ahodn´e posloupnosti operac´ı INSERT a DELETE je velk´a pravdˇepodobnost, ˇze dostaneme n´ahodn´ y bin´arn´ı vyhled´avac´ı strom. Je zn´amo, ˇze oˇcek´avan´a hodnota promˇenn´e hloubka(T ) je O(log |S|). Protoˇze se nepouˇz´ıvaj´ı vyvaˇzovac´ı operace, m˚ uˇzeme dostat lepˇs´ı v´ ysledek (ˇcasovˇe) neˇz pro vyv´aˇzen´e bin´arn´ı vyhled´avac´ı stromy. Tento probl´em se ted’ intenzivnˇe studuje. Velk´a pozornost je vˇenov´ana pravdˇepodobnostn´ım modifikac´ım bin´arn´ıch vyhled´avac´ıch strom˚ u. Hledaj´ı se vˇsak i dalˇs´ı moˇznosti. Studuj´ı se tzv. samoupravuj´ıc´ı struktury. Zde se pracuje s datovou strukturou bez dodateˇcn´ ych informac´ı, ale operace nad touto strukturou prov´ad´ı vyvaˇzov´an´ı v z´avislosti na argumentu operace. Dok´azalo se, ˇze existuje strategie vyvaˇzov´an´ı, kter´a zajiˇst’uje dobr´e chov´an´ı bez ohledu na vstupn´ı data. Dalˇs´ı strategie je, ˇze se jen zjiˇst’uje, zda datov´a struktura nem´a v´ yraznˇe ˇspatn´e chov´an´ı, a pokud ho m´a nebo po dlouh´e ˇradˇe u ´spˇeˇsn´ ych aktualizaˇcn´ıch operac´ı se vybuduje nov´a datov´a struktura (s optim´aln´ım chov´an´ım). Tˇret´ı, pomˇernˇe star´a, strategie je zaloˇzena na pˇredpokladu, ˇze zn´ame rozdˇelen´ı vstupn´ıch dat. Zde se datov´a struktura pˇredem upravuje pro toto rozdˇelen´ı. Ukazuje se, ˇze tyto strategie maj´ı u ´spˇech. Dalˇs´ı podrobnosti v letn´ım semestru. 4.3.7
Rotace
Nyn´ı si uk´aˇzme dvˇe operace se stromy, na nichˇz jsou zaloˇzeny vyvaˇzovac´ı operace pro bin´arn´ı vyhled´avac´ı stromy. Obˇe operace vyˇzaduj´ı ˇcas O(1). Mˇejme vrchol v bin´arn´ıho vyhled´avac´ıho stromu T a jeho syna u, kter´ y je vnitˇrn´ı vrchol. Pak Rotace(v, u) je zn´azornˇena na obr´azku 1 a prov´ad´ı ji n´asleduj´ıc´ı algoritmus. o
o
v
u u
v
A
C B
C
A
B
Obr´azek 1: Rotace (v, u) Rotace(v, u) otec(u) := otec(v), if v = levy(otec(v)) then levy(otec(v)) := u else pravy(otec(v)) := u endif otec(v) := u if u = levy(v) then otec(pravy(u)) := v, levy(v) := pravy(u), pravy(u) := v else otec(levy(u)) := v, pravy(v) := levy(u), levy(u) := v endif Vˇsimnˇeme si, ˇze pˇri Rotace m˚ uˇzeme aktualizovat i funkci p. Pro vrchol w 6= u, v se jej´ı hodnota nemˇen´ı, 99
nov´a hodnota p(u) je rovn´a p˚ uvodn´ı hodnotˇe p(v) a novou hodnotu p(v) dostaneme jako p(levy(v)) + p(pravy(v)). Mˇejme vrchol w stromu T , jeho syna v a jeho syna u takov´eho, ˇze u nen´ı list a v je prav´ y syn vrcholu w, pr´avˇe kdyˇz u je lev´ y syn vrcholu v. Pak Dvojita-rotace(w, v, u) je zn´azornˇena na obr´azku a prov´ad´ı ji n´asleduj´ıc´ı algoritmus. o w
o
v
u u
v
D
w
A B
C
A
B
C
D
Obr´azek 2: Dvojita-rotace(w, v, u) Dvojita-rotace(w, v, u) otec(u) := otec(w) if w = levy(otec(w)) then levy(otec(w)) := u else pravy(otec(w)) := u endif otec(v) := u, otec(w) := u if v = levy(w) then levy(w) := pravy(u), otec(pravy(u)) := w, pravy(v) := levy(u) otec(levy(u)) := v, levy(u) := v, pravy(u) := w else pravy(w) := levy(u), otec(levy(u)) := w, levy(v) := pravy(u) otec(pravy(u)) := v, levy(u) := w, pravy(u) := v endif Tak´e zde m˚ uˇzeme v ˇcase O(1) spoˇc´ıtat nov´e hodnoty p. Pro vrchol x 6= u, v, w se hodnota nemˇen´ı, nov´a hodnota p(u) je rovn´a p˚ uvodn´ı hodnotˇe p(w) a nov´e hodnoty p(v) a p(w) z´ısk´ame podle stejn´eho vzorce jako v Rotace. Dalˇs´ı kapitoly by technicky mˇely patˇrit pod bin´arn´ı stromy, pro pˇrehlednost jsem je ale nechal ve vlastn´ıch kapitol´ach.
4.4 4.4.1
AVL-stromy Definice
Bin´arn´ı vyhled´avac´ı strom je AVL-strom, kdyˇz pro kaˇzd´ y vnitˇrn´ı vrchol v se d´elka nejdelˇs´ı cesty z jeho lev´eho syna do listu a d´elka nejdelˇs´ı cesty z jeho prav´eho syna do listu liˇs´ı nejv´ yˇse o 1. Pro vnitˇrn´ı vrchol v stromu T oznaˇcme η(v) d´elku nejdelˇs´ı cesty z vrcholu v do listu. Struktura vnitˇrn´ıch vrchol˚ u v AVL-stromech je rozˇs´ıˇrena o hodnotu ω:
100
• ω(v) = −1, kdyˇz
η(lev´ y syn vrcholu v) = η(prav´ y syn vrcholu v) + 1;
• ω(v) = 0, kdyˇz
η(lev´ y syn vrcholu v) = η(prav´ y syn vrcholu v);
• ω(v) = +1, kdyˇz
η(lev´ y syn vrcholu v) + 1 = η(prav´ y syn vrcholu v).
Vˇsimnˇeme si, ˇze hodnota η(v) pro vnitˇrn´ı vrcholy v stromu T nen´ı nikde uloˇzena. Hodnoty η jsme schopni spoˇc´ıtat z hodnot ω, ale nen´ı to tˇreba. Staˇc´ı, kdyˇz po aktualizaˇcn´ıch operac´ıch budeme umˇet aktualizovat hodnoty ω a upravit bin´arn´ı vyhled´avac´ı strom tak, aby byl opˇet AVL-strom. 4.4.2
Odhad v´ yˇ sky stromu
Odhad velikosti η(koˇren T ) =v´ yˇska stromu v z´avislosti na velikosti reprezentovan´e mnoˇziny S. Pozorov´ an´ı. Kdyˇz T je AVL-strom a v je vnitˇrn´ı vrchol T , pak podstrom T urˇcen´y vrcholem v je opˇet AVL-strom. Definice. Oznaˇcme mn(i) velikost nejmenˇs´ı mnoˇziny reprezentovan´e AVL-stromem T takov´ym, ˇze η(koˇren T ) = i. Definice. Oznaˇcme mx(i) velikost nejvˇetˇs´ı mnoˇziny reprezentovan´e AVL-stromem T takov´ym, ˇze η(koˇren T ) = i. Pozorov´ an´ı. Z definice AVL-stromu plynou rekurze mn(i) = mn(i − 1) + mn(i − 2) + 1, mx(i) = 2mx(i − 1) + 1, a mn(1) = mx(1) = 1, mn(2) = 2, mx(2) = 3. Lemma (1). mx(i) = 2i − 1 D˚ ukaz. Tento vzorec je splnˇen pro i = 1, 2. D´ale mx(i + 1) = 2mx(i) + 1 = 2(2i − 1) + 1 = 2i+1 − 1. T´ım je vzorec dok´az´an.
Abychom spoˇc´ıtali mn, pˇripomeneme si definici Fibonacciho ˇc´ısel. Definice. Fibonacciho ˇc´ıslo Fi je definov´ ano rekurenc´ı F1 = F2 = 1 a Fi+2 = Fi + Fi+1 pro vˇsechna i ≥ 3. √ i √ i 1+ 5 − 1−2 5 2 √ pro vˇsechna i ≥ 1 Lemma. Plat´ı Fi = 5 (dok´aˇzeme si v ˇca´sti o hald´ach). 101
Lemma. Existuj´ı konstanty 0 < c1 < c2 takov´e, ˇze √ √ 1+ 5 i √ 1+ 5 i c1 ( ) < 5Fi < c2 ( ). 2 2 D˚ ukaz. Protoˇze −1 <
√ 1− 5 2
<0a
√ 1+ 5 2
> 1, dost´av´ame, ˇze √ √ 1 + 5 −n lim Fn 5( ) = 1. n7→∞ 2 √
Proto skuteˇcnˇe existuj´ı konstanty 0 < c1 < c2 takov´e, ˇze c1 ( 1+2 5 )i <
√
√
5Fi < c2 ( 1+2 5 )i .
Lemma (2). mn(i) = Fi+2 − 1 D˚ ukaz. Protoˇze F3 = 2 a F4 = 3, tvrzen´ı plat´ı pro i = 1 a i = 2. D´ale mn(i + 2) =mn(i + 1) + mn(i) + 1 = Fi+3 − 1 + Fi+2 − 1 + 1 = Fi+4 − 1. Z toho indukc´ı plyne poˇzadovan´ y vztah.
Vˇ eta. i = Θ(log(n)) D˚ ukaz. Kdyˇz AVL-strom T o v´ yˇsce i reprezentuje mnoˇzinu S o velikosti n, pak plat´ı √ c1 1 + 5 i+2 √ ( ) − 1 < Fi+2 − 1 ≤ n ≤ 2i − 1. 2 5 Po zlogaritmov´an´ı z toho okamˇzitˇe dost´av´ame √ 1+ 5 c1 log( √ ) + (i + 2) log( ) < log(n + 1) < i. 2 5 √
1 Protoˇze log( 1+2 5 ) ≈ 0.69 ≈ 1.44 dost´av´ame, ˇze pro dostateˇcnˇe velk´a n plat´ı, ˇze 0.69i < log(n + 1) ≤ i. Odtud plyne, ˇze log(n + 1) ≤ i ≤ 1.44 log(n), a tedy i = Θ(log(n)).
η(koˇren T ) = Θ(log(n))
102
4.4.3
Algoritmy
Operace MEMBER(x) pro AVL-stromy je stejn´a jako operace MEMBER(x) pro nevyv´aˇzen´e bin´arn´ı vyhled´avac´ı stromy. Aktualizaˇcn´ı operace pro AVL-stromy nejprve provedou pˇr´ısluˇsnou operaci pro nevyv´aˇzen´e bin´arn´ı vyhled´avac´ı stromy a pak n´asleduje jejich vyvaˇzovac´ı ˇca´st. Pˇri u ´spˇeˇsnˇe proveden´e operaci INSERT(x) v nevyv´aˇzen´ ych bin´arn´ıch stromech zmˇen´ıme vhodn´ y list t na vnitˇrn´ı vrchol stromu reprezentuj´ıc´ı x a pˇrid´ame k t dva syny, kteˇr´ı budou listy. D˚ usledkem je, ˇze ’ definujeme ω(t) = 0. Protoˇze se vˇsak zvˇetˇsila hodnota η(t) (bylo η(t) = 0 a ted je η(t) = 1), zavol´ame proceduru Kontrola-INSERT(t), kter´a zajist´ı spr´avnou hodnotu funkce ω pro otce t. Nav´ıc, kdyˇz zjist´ı, ˇze se zvˇetˇsila hodnota η vrcholu otce t, pak zavol´a sama sebe na vrchol otec t. Nejprve provedeme anal´ yzu situace. Mˇejme vrchol t, jeho η(t) = a (ale a nezn´ame), na zaˇca´tku operace INSERT bylo η(t) = a − 1. V podstromu urˇcen´em vrcholem t m´ame uˇz spr´avn´e hodnoty ω. Vrchol v je otcem t, t = levy(v) a ω(v) m´a jeˇstˇe p˚ uvodn´ı hodnotu. Lemma. Kdyˇz se hodnota η(t) pˇri operaci INSERT zvˇetˇsila a t nebyl listem pˇred operaci, pak po operaci neplat´ı ω(t) = 0. D˚ ukaz. Skuteˇcnˇe, aby se zvˇetˇsila, mus´ı se zmˇenit z nuly na jednu ze stran.
Oznaˇcme u = pravy(v) – tj. v m´a dˇeti t, u, η(t) jsme pr´avˇe zmˇenili z a − 1 na a a jdeme ˇreˇsit v: 1. ω(v) = 1, tj. pˇredt´ım byl prav´ y syn u vˇetˇs´ı – η(u) = a. Staˇc´ı poloˇzit ω(v) = 0, protoˇze synov´e jsou stejnˇe velc´ı, a η(v) = a + 1 se nezmˇenilo, takˇze zmˇena se nepropaguje v´ yˇs. 2. ω(v) = 0, tj. pˇredt´ım byl prav´ y syn u stejn´ y – η(u) = a − 1. Protoˇze jsme zvˇetˇsili levou stranu, poloˇz´ıme ω(v) = −1.
Protoˇze jsme zvˇetˇsili η(v) = a + 1, mus´ıme zavolat proceduru Kontrola-INSERT na vrchol v. 3. ω(v) = −1, pak m´ame probl´em – pˇredt´ım byl lev´ y syn vˇetˇs´ı a my jsme ho jeˇstˇe zvˇetˇsili (tj. η(u) = a−2 a η(v) = a + 1 se zmˇenilo). Takˇze ω(v) = −2 a to je zak´azan´e. Oznaˇcme t1 = levy(t), t2 = pravy(t) (t je naposledy upravovan´ y vrchol) a podle toho, jak´e je ω(t) budeme postupovat d´al (ω(t) = 0 nenastane, viz Lemma). (a) ω(t) = −1, m˚ uˇzeme prov´est jednoduchou rotaci Rotace(v, t), tj. t p˚ ujde nahoru“, lev´ y syn ” z˚ ustane t1 , prav´ y syn bude v, kter´ y bude m´ıt za lev´eho syna t2 . Pak staˇc´ı poloˇzit ω(v) = ω(t) = 0, nic nepropagujeme v´ yˇs. (b) ω(t) = 1 – jednoduchou rotaci neprovedeme, protoˇze by se lev´a vˇetev“ pˇr´ıliˇs zkr´atila. Udˇel´ame ” tedy Dvojita-rotace(v, t, t2 ) – t2 p˚ ujde nahoru“, zavˇes´ı se za nˇej v a t a rozdˇel´ı si jeho dˇeti“. ” ” Mus´ıme udˇelat anal´ yzu pro vˇsechny tˇri pˇr´ıpady ω(t2 ). i. ω(t2 ) = 1 =⇒ η(t3 ) = a − 3 a η(t4 ) = a − 2 a staˇc´ı poloˇzit ω(t) = −1, ω(v) = ω(t2 ) = 0, protoˇze η(t2 ) = a. ii. ω(t2 ) = 0 =⇒ η(t3 ) = η(t4 ) = a − 2 a staˇc´ı poloˇzit ω(t2 ) = ω(v) = ω(t) = 0, protoˇze η(t2 ) = a. 103
iii. ω(t2 ) = −1 =⇒ η(t3 ) = a − 2 a η(t4 ) = a − 3 a staˇc´ı poloˇzit ω(v) = 1, ω(t2 ) = ω(t) = 0, protoˇze η(t2 ) = a. Kdyˇz t je prav´ y syn v, pak situace je symetrick´a. Pop´ıˇseme proceduru Kontrola-INSERT (vych´az´ı z anal´ yzy v´ yˇse) Kontrola-INSERT(t) v := otec(t) if t = levy(v) then Leva-Kontrola-INSERT(t) else Prava-Kontrola-INSERT(t) endif Leva-Kontrola-INSERT(t) if ω(v) = 1 then ω(v) := 0 else if ω(v) = 0 then ω(v) := −1, t := v, Kontrola-INSERT(t) else if ω(t) = −1 then Rotace(v, t), ω(v) := 0, ω(t) := 0 else w := pravy(t), Dvojita-rotace(v, t, w), if ω(w) = 0 then ω(t) := 0, ω(v) := 0 else if ω(w) = 1 then ω(v) := 0, ω(t) := −1 else ω(v) := 1, ω(t) := 0 endif endif ω(w) := 0 endif endif endif
104
Prava-Kontrola-INSERT(t) if ω(v) = −1 then ω(v) := 0 else if ω(v) = 0 then ω(v) := 1, t := v, Kontrola-INSERT(t) else if ω(t) = 1 then Rotace(v, t), ω(v) := 0, ω(t) := 0 else w := levy(t), Dvojita-rotace(v, t, w), if ω(w) = 0 then ω(t) := 0, ω(v) := 0 else if ω(w) = 1 then ω(v) := 0, ω(t) := −1 else ω(v) := 1, ω(t) := 0 endif endif ω(w) := 0 endif endif endif Vˇsimnˇeme si, ˇze po proveden´ı Rotace nebo Dvojita-rotace vyvaˇzov´an´ı v operaci INSERT konˇc´ı. Tedy operace INSERT prov´ad´ı nejv´ yˇse jednu proceduru Rotace nebo Dvojita-rotace. Korektnost vyvaˇzovac´ı operace je zaloˇzena na faktu, ˇze kdyˇz se zvˇetˇs´ı hodnota η(t), pak nem˚ uˇze b´ yt ω(t) = 0. Pop´ıˇseme vyvaˇzovac´ı operaci pro operaci DELETE. Pˇredpokl´adejme, ˇze t je vrchol, jehoˇz otec se odstranil (tj. bratr t byl list) a hodnota η(t) je menˇs´ı neˇz byla hodnota η(otec(t)). Proto zavol´ame proceduru Kontrola-DELETE(t). Tato procedura zajist´ı spr´avnou hodnotu funkce ω pro otce t. Nav´ıc, kdyˇz zjist´ı, ˇze se zmenˇsila hodnota η vrcholu otce t, pak zavol´a sama sebe na vrchol otec t. Pop´ıˇseme anal´ yzu situace, na n´ıˇz je zaloˇzena korektnost procedury Kontrola-DELETE(t). V anal´ yze je d˚ uleˇzit´e, ˇze kdyˇz procedura Kontrola-DELETE pˇresune vrchol x na m´ısto vrcholu y, pak skuteˇcn´a hodnota η(x) je bud’ p˚ uvodn´ı hodnota η(y) nebo je pˇresnˇe o 1 menˇs´ı. Vˇsimnˇete si, ˇze to plat´ı. D´an vrchol t, jehoˇz hodnota η(t) se zmenˇsila (o 1). V podstromu urˇcen´em vrcholem t jsou hodnoty ω aktualizov´any, v = otec(t) a ω(v) je p˚ uvodn´ı. Pˇredpokl´adejme t = levy(v), u = pravy(v) a η(t) = a (a je nezn´am´e). Nast´avaj´ı pˇr´ıpady: 1. kdyˇz ω(v) = 0, tak jsme jen z vyv´aˇzen´eho“ vrcholu udˇelali nevyv´aˇzen´ y, tedy η(u) = a + 1 a ” η(v) = a + 2. Staˇc´ı poloˇzit ω(v) = 1 a skonˇcit. 2. Kdyˇz ω(v) = −1, tak jsme strom, vych´ ylen´ y“ doleva narovnali“ - tj. zmˇen´ıme ˇc´ıslo a propagujeme ” ” v´ yˇs. Tedy η(u) = a a η(v) = a + 2. Nyn´ı poloˇz´ıme ω(v) = 0 a zavol´ame proceduru Kontrola-DELETE na vrchol v.
105
3. Kdyˇz ω(v) = 1, m´ame probl´em - ub´ır´ame na uˇz kratˇs´ım konci. Opˇet vezmeme u1 = levy(u), u2 = pravy(u) a opˇet se podle ω(u) rozhodneme, co budeme dˇelat. (a) ω(u) = 1 =⇒ η(u1 ) = a, η(u2 ) = a + 1. Provedeme Rotace(v, u). Vrchol u1 je druh´ ym synem v a plat´ı η(t) = η(u1 ) = a, η(v) = η(u2 ) = a + 1 a η(u) = a + 2. Tedy poloˇzme ω(v) = ω(u) = 0 a zavolejme Kontrola-DELETE na vrchol u. (b) ω(u) = 0 =⇒ η(u1 ) = η(u2 ) = a + 1. Provedeme Rotace(v, u). Vrchol u1 je druh´ ym synem v a plat´ı η(t) = a, η(u1 ) = a + 1 = η(u2 ), η(v) = a + 2, η(u) = a + 3. Poloˇzme ω(v) = 1, ω(u) = −1 a konˇc´ıme. (c) ω(u) = −1 =⇒ η(u1 ) = a + 1, η(u2 ) = a. Provedeme Dvojita-rotace(v, u, u1 ). Opˇet ˇreˇs´ıme v´ıce pˇr´ıpad˚ u podle ω(u) = 1 u3 = levy(u1 ), u4 = pravy(u1 )
i. ω(u1 ) = −1 =⇒ η(u3 ) = a, η(u4 ) = a − 1 a tedy η(v) = η(u) = a + 1 a η(u1 ) = a + 2. Proto poloˇz´ıme ω(v) = ω(u1 ) = 0, ω(u) = 1 a zavol´ame proceduru Kontrola-DELETE na vrchol u1 . ii. ω(u1 ) = 0 =⇒ η(u3 ) = η(u4 ) = a a tedy η(v) = η(u) = a + 1 a η(u1 ) = a + 2. Proto poloˇz´ıme ω(v) = ω(u1 ) = ω(u) = 0 a zavol´ame proceduru Kontrola-DELETE na vrchol u1 . iii. ω(u1 ) = 1 =⇒ η(u3 ) = a − 1, η(u4 ) = a a tedy η(v) = η(u) = a + 1 a η(u1 ) = a + 2. Proto poloˇz´ıme ω(u) = ω(u1 ) = 0, ω(v) = −1 a zavol´ame proceduru Kontrola-DELETE na vrchol u1 . Kontrola-DELETE(t) v := otec(t) if t = levy(v) then Leva-Kontrola-DELETE else Leva-Kontrola-DELETE endif
106
Leva-Kontrola-DELETE(t) if ω(v) = 1 then u := pravy(v) if ω(u) ≥ 0 then Rotace(v, u) if ω(v) = 0 then ω(v) := 1, ω(u) := −1 else ω(u) := ω(v) := 0, t := u, Kontrola-DELETE(t) endif else w := levy(u), Dvojita-rotace(v, u, w) if ω(w) = 1 then ω(u) := 0, ω(v) := −1 else if ω(w) := 0 then ω(u) := 0, ω(v) := 0 else ω(u) := 1, ω(v) := 0 endif endif ω(w) := 0, t := w, Kontrola-Delete(t) endif else if ω(v) = 0 then ω(v) := 1 else ω(v) := 0, t := v, Kontrola-DELETE(t) endif
107
Prava-Kontrola-DELETE(t) if ω(v) = −1 then u := levy(v) if ω(u) ≤ 0 then Rotace(v, u) if ω(u) = 0 then ω(v) := −1, ω(u) := 1 else ω(u) := ω(v) := 0, t := u, Kontrola-DELETE(t) endif else w := pravy(u), Dvojita-rotace(v, u, w) if ω(w) = 1 then ω(u) := −1, ω(v) := 0 else if ω(w) := 0 then ω(u) := 0, ω(v) := 0 else ω(u) := 0, ω(v) := 1 endif endif ω(w) := 0, t := w, Kontrola-Delete(t) endif else if ω(v) = 0 then ω(v) := −1 else ω(v) := 0, t := v, Kontrola-DELETE(t) endif endif V operaci DELETE se m˚ uˇze st´at, ˇze procedury Rotace nebo Dvojita-rotace jsou vol´any aˇz log(|S|)kr´at. To je v´ yrazn´ y rozd´ıl proti operaci INSERT. Proto operace DELETE je pomalejˇs´ı neˇz operace INSERT, i kdyˇz asymptoticky jsou stejnˇe rychl´e. Korektnost se ovˇeˇr´ı pˇr´ımo. Vˇ eta. Datov´a struktura AVL-strom umoˇzn ˇuje implementaci operac´ı MEMBER, INSERT a DELETE, kter´e vyˇzaduj´ı ˇcas O(log(|S|)) (kde S je reprezentovan´a mnoˇzina). Operace INSERT zavol´a nejv´yˇse jednu proceduru Rotace nebo Dvojita-rotace.
4.5 4.5.1
ˇ Cerveno-ˇ cern´ e stromy Definice
Bin´arn´ı vyhled´avac´ı strom T reprezentuj´ıc´ı mnoˇzinu S, jehoˇz vrcholy jsou obarveny ˇcervenˇe nebo ˇcernˇe (kaˇzd´ y vrchol m´a pr´avˇe jednu barvu) tak, ˇze jsou splnˇeny podm´ınky: • listy jsou obarveny ˇcernˇe, • kdyˇz v je vrchol obarven´ y ˇcervenˇe, pak je bud’ koˇren stromu nebo jeho otec je obarven ˇcernˇe, • vˇsechny cesty z koˇrene do list˚ u maj´ı stejn´ y poˇcet ˇcern´ ych vrchol˚ u 108
se naz´ yv´a ˇcerveno-ˇcern´y strom. Pozn studenta – j´a s´am to vˇzdycky ch´apu tak, ˇze ˇcerven´e vrcholy jsou ˇspatn´e“ a ukazuj´ı n´am odchylku ” od perfektn´ı vyv´aˇzenosti, takˇze jich tam nesm´ı b´ yt moc. 4.5.2
Vyv´ aˇ zenost
Nejprve uk´aˇzeme, ˇze ˇcerveno-ˇcern´e stromy jsou vyv´aˇzen´e stromy, tj. hloubka(T ) = O(log(|S|). Vˇ eta. Kdyˇz ˇcerveno-ˇcern´y strom T reprezentuje mnoˇzinu S, pak hloubka(T ) ≤ 2 log(2|S| + 2) = 1 + log(|S| + 1). D˚ ukaz. Pˇredpokl´adejme, ˇze T je ˇcerveno-ˇcern´ y strom, kter´ y m´a na cestˇe z koˇrene do listu pr´avˇe k ˇcern´ ych vrchol˚ u. Pak pro poˇcet vrchol˚ u #T stromu T plat´ı 2k − 1 ≤ #T ≤ 22k − 1. Nejmenˇs´ı takov´ y strom m´a vˇsechny vrcholy ˇcernˇe obarven´e a je to u ´pln´ y pravideln´ y bin´arn´ı strom o v´ yˇsce k − 1, coˇz d´av´a doln´ı odhad. Nejvˇetˇs´ı takov´ y strom m´a vˇsechny vrcholy v sud´ ych hladin´ach obarveny ˇcervenˇe a v lich´ ych hladin´ach ˇcernˇe, je to u ´pln´ y pravideln´ y bin´arn´ı strom o v´ yˇsce 2k − 1 a t´ım je d´an horn´ı odhad. Tedy k ≤ log(1 + #T ) ≤ 2k. Protoˇze velikost S je poˇcet vnitˇrn´ıch vrchol˚ u, dost´av´ame, ˇze #T = 2|S| + 1. Z vlastnost´ı ˇcerveno-ˇcern´ ych strom˚ u plyne, ˇze k ≤ hloubka(T ) ≤ 2k.
4.5.3
Popis algoritm˚ u (kromˇ e vyvaˇ zov´ an´ı)
Pro ˇcerveno-ˇcern´e stromy navrhneme algoritmy realizuj´ıc´ı operace z uspoˇra´dan´eho slovn´ıkov´eho probl´emu. Operace MEMBER pro ˇcerveno-ˇcern´e stromy je stejn´a jako pro nevyv´aˇzen´e bin´arn´ı vyhled´avac´ı stromy. Operace INSERT a DELETE maj´ı dvˇe ˇca´sti: nejprve se provede operace INSERT nebo DELETE pro nevyv´aˇzen´e bin´arn´ı vyhled´avac´ı stromy a pak n´asleduj´ı vyvaˇzovac´ı operace, kter´e zajist´ı, ˇze v´ ysledn´ y strom splˇ nuje podm´ınky pro ˇcerveno-ˇcern´e stromy (stejn´e sch´ema jako pro AVL-stromy). Sch´ema operac´ı JOIN a SPLIT bude vych´azet z jejich realizac´ı v (a, b)-stromech. V operaci JOIN prohled´av´an´ım nalezneme m´ısto, kde se stromy daj´ı spojit (a aplikujeme operaci JOIN pro nevyv´aˇzen´e bin´arn´ı vyhled´avac´ı stromy), a pak pouˇzijeme vyvaˇzovac´ı operace. Algoritmus operace SPLIT rozdˇel´ı ˇcerveno-ˇcern´ y strom do nˇekolika menˇs´ıch podle cesty vyhled´avaj´ıc´ı x (podobnˇe jako v (a, b)-stromech) a na tyto stromy pak aplikuje operaci JOIN a zkonstruuje hledan´e ˇcerveno-ˇcern´e stromy. Algoritmy pro operace MIN a MAX jsou stejn´e jako pro nevyv´aˇzen´e bin´arn´ı vyhled´avac´ı stromy.
109
4.5.4
Vyvaˇ zovac´ı operace
Nejprve pop´ıˇseme vyvaˇzovac´ı operace. Definice. Dvojice (T, v) se naz´yv´ a 2-parci´aln´ı ˇcerveno-ˇcern´ y strom, kdyˇz T je bin´ arn´ı vyhled´avac´ı strom, kaˇzd´y vrchol je obarven ˇcervenˇe nebo ˇcernˇe, v je vnitˇrn´ı vrchol stromu T obarven´y ˇcervenˇe a plat´ı: • listy jsou obarveny ˇcernˇe, • kdyˇz t je vrchol obarven´y ˇcervenˇe, pak je bud’ koˇren stromu nebo t = v nebo jeho otec je obarven ˇcernˇe, • vˇsechny cesty z koˇrene do list˚ u maj´ı stejn´y poˇcet ˇcern´ych vrchol˚ u. Tj. jde opˇet o o 1 ˇspatn´ y“ ˇcerveno-ˇcern´ y strom. ” Vyvaˇzov´an´ı 2-parci´aln´ıho ˇcerveno-ˇcern´eho stromu (T ′ , v) prov´ad´ı procedura Vyvaz-INSERT(v). Po jej´ım proveden´ı bud’ dostaneme ˇcerveno-ˇcern´ y strom nebo je procedura Vyvaz-INSERT zavol´ana na vrchol v ′ takov´ y, ˇze (T ′ , v ′ ) je 2-parci´aln´ı ˇcerveno-ˇcern´ y strom a v ′ je dˇed v (tj. je o dvˇe hladiny bl´ıˇz ke koˇreni neˇz vrchol v). Definice. Obarven´ı je realizov´ano rozˇs´ıˇren´ım struktury vrcholu v o boolskou promˇennou b(v), kde b(v) = 0 znamen´a, ˇze v je obarven ˇcervenˇe, a b(v) = 1 znamen´a, ˇze v je obarven ˇcernˇe. Rozebereme pˇr´ıpady. Na obr´azku b znaˇc´ı ˇcernou barvu a r znaˇc´ı ˇcervenou barvu. Otec vrcholu w je oznaˇcen t.
t,r
t,b u,r
w,r
u,b v,r
A B
w,b v,r
A
C
B
C
Obr´azek 3
t,b
w,b w,r
u,b
v,r
t,r v,r
u,b
A
C B
C
A
Obr´azek 4
1. Pokud je otec ˇcern´ y, nic neˇreˇs´ım. 110
B
t,b w,r
u,b v,r
D
v,b w,r
t,r u,b
A B
C
A
B
C
D
Obr´azek 5 2. Pokud je otec koˇren, nemus´ıme nic ˇreˇsit a zmˇen´ıme otcovi barvu. 3. Tedy otec je urˇcitˇe ˇcerven´ y a nen´ı koˇren. 4. Pokud je str´ yc tak´e ˇcerven´ y, pˇrebarv´ıme otce i str´ yce ( celou generaci“), ale kv˚ uli poˇct˚ um mus´ıme ” pˇrebarvit i dˇeda a propagovat v´ yˇse. (Viz obr´azek 3) 5. Pokud je str´ yc ˇcerven´ y, pˇrebarvit generaci nem˚ uˇzeme – m´ısto toho udˇel´ame rotaci. Pokud t − w − v je rovn´a“, udˇel´ame jednoduchou rotaci (obr´azek 4), pokud je lomen´a“, udˇel´ame dvojitou rotaci ” ” (obr´azek 5); potom pˇrebarv´ıme tak, aby v ˇza´dn´e cestˇe nepˇribyl ˇcern´ y uzel. Pop´ıˇseme form´alnˇe proceduru Vyvaz-INSERT(v) (pˇredpokl´ad´ame, ˇze v je obarven ˇcervenˇe). Pro zjednoduˇsen´ı s(v) = levy, kdyˇz v = levy(otec(v)), a s(v) = pravy pro v = pravy(otec(v)). Vyvaz-INSERT(v). if v nen´ı koˇren T ′ a b(otec(v)) = 0 then if otec(v) je koˇren then b(otec(v)) := 1 else w := otec(v), u := bratr(w) if b(u) = 0 then v := otec(w), b(w) := 1, b(u) := 1 b(v) := 0, Vyvaz-INSERT(v) (Viz Obr´azek 3) else t := otec(w) if s(w) = s(v) then Rotace(t, w), b(t) := 0, b(w) := 1 (Viz Obr´azek 4) else Dvojita-rotace(t, w, v), b(t) := 0, b(v) := 1 (Viz Obr´azek 5) endif endif endif endif 2-parci´aln´ı ˇcerveno-ˇcern´e stromy vznikaj´ı pˇri operac´ıch INSERT a JOIN. Pˇri operaci DELETE se poruˇs´ı struktura ˇcerveno-ˇcern´ ych strom˚ u jin´ ym zp˚ usobem a vznikne 3-parci´aln´ı ˇcerveno-ˇcern´ y strom. ˇ Rekneme, ˇze dvojice (T, v) je 3 -parci´aln´ı ˇcerveno-ˇcern´y strom, kdyˇz T je bin´arn´ı vyhled´avac´ı strom, kaˇzd´emu vrcholu je pˇriˇrazena pr´avˇe jedna z dvojice barev ˇcerven´a – ˇcern´a, v je vrchol ve stromu T a plat´ı n´asleduj´ıc´ı podm´ınky: • listy a vrchol v jsou obarveny ˇcernˇe, 111
• kdyˇz t je vrchol obarven´ y ˇcervenˇe, pak je bud’ koˇren stromu nebo jeho otec je obarven ˇcernˇe, • existuje ˇc´ıslo k takov´e, ˇze vˇsechny cesty z koˇrene do list˚ u, kter´e neobsahuj´ı vrchol v, obsahuj´ı pr´avˇe k ˇcern´ ych vrchol˚ u, a vˇsechny cesty z koˇrene do list˚ u proch´azej´ıc´ı vrcholem v obsahuj´ı k − 1 ˇcern´ ych vrchol˚ u. Rozd´ıl je v tom, ˇze u 2-parci´aln´ıch jsme slevili“ na n´aslednosti ˇcerven´ ych, naopak tady slevujeme na ” stejn´em poˇctu ˇcern´ ych vrchol˚ u. Rozebereme pˇr´ıpady. V n´asleduj´ıc´ıch obr´azc´ıch jsou vrcholy, kter´e nemaj´ı specifikovanou barvu (mohou b´ yt jak ˇcerven´e tak ˇcern´e). Tyto barvy budeme oznaˇcovat a, a′ . D˚ uvod je, ˇze se tato barva m˚ uˇze pˇren´est do c´ılov´eho stromu, ale i na jin´ y vrchol. V tomto smyslu jsou tyto barvy urˇceny vstupn´ım stromem a specifikuj´ı tyto barvy v c´ılov´em stromˇe. V Obr. 7 se barva a v c´ılov´em stromˇe neobjevuje.
t,b
u,b u,r
v,b
t,r v,b
A
C B
C
A
B
Obr´azek 6
t,a
t,b
v,b w1 ,b
A
B
u,r
v,b
u,b w2 ,b
w1 ,b
A B
C
w2 ,b C
Obr´azek 7
u,a
t,a v,b
u,b
t,b w2 ,r
w1 ,b
w2 ,b
v,b
w1 ,b
A
C B
C
A
B
Obr´azek 8 1. pokud m´ame ˇcerven´eho bratra, udˇel´ame rotaci, abychom ho mˇeli ˇcern´eho (algoritmus ale nekonˇc´ı). Obr. 6 112
t,a u,b w2 ,a’
w1 ,a
v,b w1 ,r
u,b
D
t,b
w2 ,a’
A B
C
A
v,b B
C
D
Obr´azek 9 2. tedy bratr je ˇcern´ y. Pokud oba synovce ˇcern´e, m˚ uˇzu bratra pˇrebarvit na ˇcerveno (Obr. 7) a: (a) Pokud je otec ˇcerven´ y, pˇrebarv´ıme ho na ˇcerno a probl´em˚ u jsme se zbavili: v cest´ach v podstromu v je o jednoho ˇcern´eho v´ıc, kdeˇzto v cest´ach jeho bratra nic nepˇribylo. (b) Pokud je otec ˇcern´ y, probl´em˚ u jsme se nezbavili, ale naopak jsme je pˇridali i do cest v bratru, tedy m˚ uˇzeme je delegovat o stupeˇ n v´ yˇs. 3. Pokud nejsou oba synovce ˇcern´e, ale synovec bl´ıˇz ke mˇe“ ˇcern´ y je, udˇel´am takovou rotaci, aby se ” stal m´ ym bratrem, a pˇrebarv´ıme tak, aby se jednak probl´emy vyˇreˇsily, ale aby vrˇsek“ vˇseho z˚ ustal ” stejn´ y. (Obr. 8) 4. Pokud nejsou oba synovce ˇcern´e a synovec bl´ıˇz ke mˇe“ je ˇcerven´ y, udˇel´am takovou rotaci, aby byl ” nahoˇre“, a takov´e pˇrebarven´ı, aby se probl´em vyˇreˇsil, ale vrˇsek“ byl poˇra´d stejn´ y. (Obr. 9) ” ” Form´alnˇe op´ıˇseme proceduru Vyvaz-DELETE(v), kter´a se pouˇzije na 3-parci´aln´ı ˇcerveno-ˇcern´ y strom (T, v), kdyˇz v nen´ı jeho koˇren. V´ ysledkem procedury bude bud’ ˇcerveno-ˇcern´ y strom nebo zavol´an´ı proce′ ′ dury Vyvaz-DELETE(v ), kde v je otcem vrcholu v. Z faktu, ˇze kdyˇz (T, v) je 3-parci´aln´ı ˇcerveno-ˇcern´ y strom a v je jeho koˇren, pak T je ˇcerveno-ˇcern´ y strom, plyne, ˇze aplikac´ı Vyvaz-DELETE(v) na 3parci´aln´ı ˇcerveno-ˇcern´ y strom (T, v) dostaneme ˇcerveno-ˇcern´ y strom.
113
Vyvaz-DELETE(v) u := bratr(v), t := otec(v) if b(u) = 0 then Rotace(t, u), b(u) := 1, b(t) := 0, u := bratr(v) endif (Viz Obr. 6, Koment´aˇr: nyn´ı b(u) = 1) w1 je syn u takov´ y, ˇze s(v) = s(w1 ), w2 := bratr(w1 ) if b(w1 ) = b(w2 ) = 1 then b(u) := 0 if b(t) := 0 then b(t) := 1 else if t nen´ı koˇren stromu then v := t, Vyvaz-DELETE(v) endif endif (Viz Obr. 7) else if b(w1 ) = 1 then (Koment´aˇr: b(w2 ) = 0) Rotace(t, u), b(w2 ) := 1, b(u) := b(t), b(t) := 1 (Viz Obr. 8) else Dvojita-rotace(t, u, w1 ), b(w1 ) := b(t), b(t) := 1 (Viz Obr. 9) endif endif 4.5.5
Popis nevyvaˇ zovac´ıch operac´ı
Nyn´ı pop´ıˇseme algoritmy realizuj´ıc´ı operace INSERT, DELETE, JOIN3 a SPLIT pro ˇcerveno-ˇcern´e stromy. Pˇredpokl´adejme, ˇze T je ˇcerveno-ˇcern´ y strom reprezentuj´ıc´ı mnoˇzinu S a prov´ad´ıme operaci INSERT(x) pro x ∈ / S. Kdyˇz operace INSERT(x) pro nevyv´aˇzen´e bin´arn´ı vyhled´avac´ı stromy vytvoˇr´ı strom T ′ , kde vrchol v reprezentuje x, pak v obarv´ıme ˇcervenˇe a syny v (jsou to listy) obarv´ıme ˇcernˇe. Dost´av´ame, ˇze (T ′ , v) je 2-parci´aln´ı ˇcerveno-ˇcern´ y strom, a pak aplikujeme proceduru Vyvaz-INSERT. Operace INSERT v ˇcerveno-ˇcern´ ych stromech vol´a nejv´ yˇse 2 + log(|S|)-kr´at proceduru Vyvaz-INSERT a provede nejv´ yˇse jednu rotaci nebo dvojitou rotaci. Operace DELETE je ˇreˇsena stejn´ ym zp˚ usobem jako operace INSERT, ale pˇri operaci DELETE je poruˇsena tˇret´ı podm´ınka v definici ˇcerveno-ˇcern´ ych strom˚ u a vyvaˇzov´an´ı je technicky n´aroˇcnˇejˇs´ı. Pˇredpok´adejme, ˇze T je ˇcerveno-ˇcern´ y strom. Kdyˇz chceme prov´est operaci DELETE, pak nejprve provedeme algoritmus DELETE pro nevyv´aˇzen´e bin´arn´ı vyhled´avac´ı stromy. Pˇri prov´adˇen´ı jsme odstranili vrchol u a jeho syna w, kter´ y je list. Na m´ısto vrcholu u se dostal jeho druh´ y syn v, kter´ y obarv´ıme ˇcernˇe. Pak jsou splnˇeny prvn´ı dvˇe podm´ınky v definici ˇcerveno-ˇcern´ ych strom˚ u a pokud vrchol u nebo vrchol v byl obarven ˇcervenˇe, pak je splnˇena i tˇret´ı podm´ınka. Pokud vrchol u i vrchol v byly obarveny ˇcernˇe, pak kaˇzd´a cesta z koˇrene do listu obsahuj´ıc´ı vrchol v m´a o jeden ˇcern´ y vrchol m´enˇe neˇz cesta z koˇrene do listu neobsahuj´ıc´ı vrchol v (chyb´ı ˇcern´ y vrchol u), a tedy (T, v) je 3-parci´aln´ı ˇcerveno-ˇcern´ y strom. Nyn´ı aplikujeme proceduru Vyvaz-DELETE. Anal´ yza poskytuje rychl´ y test na to, zda vznikne ˇcerveno-ˇcern´ y strom nebo 3-parci´aln´ı ˇcerveno-ˇcern´ y strom (pak v je list). Popiˇsme JOIN3(T1 , x, T2 ) . Mˇejme ˇcerveno-ˇcern´e stromy T1 a T2 reprezentuj´ıc´ı mnoˇziny S1 a S2 a mˇejme prvek x ∈ U takov´ y, ˇze max S1 < x < min S2 . Nejprve zajist´ıme, ˇze koˇreny T1 i T2 jsou obarveny ˇcernˇe. 114
Pˇredpokl´adejme, ˇze ki je poˇcet ˇcern´ ych vrchol˚ u na cestˇe z koˇrene do list˚ u ve stromˇe Ti pro i = 1, 2. Kdyˇz k1 = k2 , pak staˇc´ı prov´est JOIN3(T1 , x, T2 ) pro nevyv´aˇzen´e bin´arn´ı vyhled´avac´ı stromy (koˇren obarv´ıme ˇcervenˇe). Probl´em je, kdyˇz k1 6= k2 . Napˇr´ıklad pˇredpokl´adejme, ˇze k1 > k2 . Pak zaˇcneme v koˇreni stromu T1 a jdeme po prav´ ych synech dol˚ u tak dlouho, aˇz nalezneme ˇcern´ y vrchol v takov´ y, ˇze vˇsechny cesty z v do list˚ u v T1 obsahuj´ı pr´avˇe k2 ˇcern´ ych vrchol˚ u. Pak provedeme JOIN3 pro nevyv´aˇzen´e bin´arn´ı vyhledavac´ı stromy na podstrom T1 urˇcen´ y vrcholem v, na x a na T2 . Koˇren w vznikl´eho stromu obarv´ıme ˇcervenˇe a tento strom vloˇz´ıme do T1 m´ısto podstromu urˇcen´eho vrcholem v. Pak (T1 , w) je 2-parci´aln´ı ˇcerveno-ˇcern´ y strom a aplikujeme proceduru Vyvaz-INSERT. Pˇr´ıpad k2 > k1 se ˇreˇs´ı symetricky. Algoritmus pro operaci SPLIT je velmi podobn´ y algoritmu pro (a, b)-stromy. Vyhled´av´ame vrchol reprezentuj´ıc´ı x. Kdyˇz jsme ve vrcholu t a pokraˇcujme akc´ı t := levy(t), pak dvojici key(t) a podstrom T urˇcen´ y prav´ ym synem t vloˇz´ıme do z´asobn´ıku Z2 , kdyˇz pokraˇcujeme akc´ı t := pravy(t), pak do z´asobn´ıku Z1 vloˇz´ıme dvojici podstrom T urˇcen´ y lev´ ym synem T a key(t). Kdyˇz key(t) = x, pak do Z1 vloˇz´ıme podstrom urˇcen´ y lev´ ym synem t a do Z2 podstrom urˇcen´ y prav´ ym synem t. Kdyˇz t je list, pak do Z1 i Z2 vloˇz´ıme jednoprvkov´e stromy. Ze z´asobn´ıku Z1 pomoc´ı operace JOIN3 vytvoˇr´ıme strom T1 a ze z´asobn´ıku Z2 pomoc´ı operace JOIN3 dostaneme strom T2 . Nyn´ı pop´ıˇseme algoritmy pro tyto operace. INSERT(x) Vyhledej(x) if t je list then t se zmˇen´ı na vnitˇrn´ı vrchol, key(t) := x pro vrchol t vytvoˇrme syny levy(t) a pravy(t) b(t) := 0, b(levy(t)) := 1, b(pravy(t)) := 1, Vyvaz-INSERT(t) endif
115
DELETE(x) Vyhledej(x) if t nen´ı list then vyv := f alse if levy(t) je list then v := pravy(t) if b(t) = 1 a b(v) = 1 then vyv := true endif odstran´ıme vrchol levy(t), otec(v) := otec(t) if t = levy(otec(t)) then levy(otec(t)) := v else pravy(otec(t)) := v endif b(v) := 1, odstran´ıme vrchol t else u := levy(t) while pravy(u) nen´ı list do u := pravy(u) enddo key(t) := key(u), v := levy(u) if b(u) = 1 a b(v) = 1 then vyv := true endif odstran´ıme vrchol pravy(u), otec(v) := otec(u) if u = levy(otec(u)) then levy(otec(u)) := v else pravy(otec(u)) := v endif b(v) := 1, odstran´ıme vrchol u endif if vyv then Vyvaz-DELETE(v) endif endif
116
JOIN3(T1 , x, T2 ) if b(koˇren T1 ) = 0 then b(koˇren T1 ) := 1 endif if b(koˇren T2 ) = 0 then b(koˇren T2 ) := 1 endif k1 je poˇcet ˇcern´ ych vrchol˚ u v T1 z koˇrene do list˚ u k2 je poˇcet ˇcern´ ych vrchol˚ u v T2 z koˇrene do list˚ u if k1 ≥ k2 then t := koˇren T1 , i := k1 − k2 while i > 0 do t := pravy(t) if b(t) = 1 then i := i − 1 endif enddo vytvoˇr vrchol u, b(u) := 0, key(u) := x if t nen´ı koˇren T1 then otec(u) := otec(t), pravy(otec(t)) := u endif otec(t) := u, otec(koˇren T2 ) := u pravy(u) := koˇren T2 , levy(u) := t, Vyvaz-INSERT(T1 , u) else t := koˇren T2 , i := k2 − k1 while i > 0 do t := levy(t) if b(t) = 1 then i := i − 1 endif enddo vytvoˇr vrchol u, b(u) := 0, key(u) := x otec(u) := otec(t), levy(otec(t)) := u, otec(t) := u otec(koˇren T1 ) := u, levy(u) := koˇren T1 pravy(u) := t, Vyvaz-INSERT(T2 , u) endif
117
SPLIT(x) Z1 a Z2 jsou pr´azdn´e z´asobn´ıky, t := koˇren T while key(t) 6= x a t nen´ı list do if key(t) > x then vloˇz (key(t), pravy(t)) do Z2 , t := levy(t) else vloˇz (levy(t), key(t)) do Z1 , t := pravy(t) endif enddo if key(t) = x then V´ ystup: x ∈ S, T1 je podstrom T urˇcen´ y levy(t) T2 je podstrom T urˇcen´ y pravy(t) else V´ ystup: x ∈ / S, T1 a T2 jsou jednoprvkov´e stromy endif while Z1 6= ∅ do (t, x) je na vrcholu Z1 , odstraˇ n (t, x) ze Z1 ′ T je podstrom T urˇcen´ y t, T1 :=JOIN3(T ′ , x, T1 ) enddo while Z2 6= ∅ do (x, t) je na vrcholu Z2 , odstraˇ n (x, t) ze Z1 T ′ je podstrom T urˇcen´ y t, T2 :=JOIN3(T2 , x, T ′ ) enddo 4.5.6
Korektnost a sloˇ zitost
Korektnost algoritm˚ u je vidˇet z obr´azk˚ u. Vˇsimnˇeme si pˇri operaci DELETE, ˇze kdyˇz u je obarven ˇcervenˇe, pak po proveden´ı Rotace(t, u) bude (T, v) opˇet 3-parci´aln´ı ˇcerveno-ˇcern´ y strom a vrchol t bude obarven ˇcervenˇe. Pak z Obr. 5 je vidˇet, ˇze dostaneme ˇcerveno-ˇcern´ y strom. Tedy m˚ uˇzeme shrnout: Vˇ eta. Algoritmy operac´ı MEMBER, INSERT, DELETE, MIN, MAX, JOIN3 a SPLIT pro ˇcervenoˇcern´e stromy vyˇzaduj´ı v nejhorˇs´ım pˇr´ıpadˇe ˇcas O(log(|S|), kde S je reprezentovan´a mnoˇzina. Operace INSERT a JOIN3 zavolaj´ı nejv´yˇse jednou bud’ Rotace nebo Dvojita-rotace a operace DELETE zavol´a nejv´yˇse dvakr´at Rotace nebo Rotace a Dvojita-rotace. Vˇsimnˇete si, ˇze operace JOIN3 ve skuteˇcnosti vyˇzaduje ˇcas O(|k1 − k2 | + 1). Protoˇze Z1 a Z2 obsahuj´ı nejv´ yˇse log(|S|) poloˇzek, tak se odhad ˇcasov´e sloˇzitosti operace SPLIT provede stejn´ ym zp˚ usobem jako v (a, b)-stromech. V ostatn´ıch pˇr´ıpadech je odhad ˇcasov´e sloˇzitosti vidˇet z toho, ˇze hloubka(T ) = O(log(|S|)) a akce na kaˇzd´e hladinˇe vyˇzaduj´ı jen O(1) ˇcasu. Pokud chceme m´ıt i algoritmus pro operaci ord(k), pak mus´ıme rozˇs´ıˇrit strukturu o funkci p. Pak lze pouˇz´ıt pˇr´ımo algoritmus pro ord(k) v nevyv´aˇzen´ ych bin´arn´ıch vyhled´avac´ıch stromech. Pˇripomeˇ nme si, ˇze procedury Rotace a Dvojita-rotace mohou aktualizovat funkci p v ˇcase O(1). Proto dost´av´ame Vˇ eta. Algoritmy operac´ı MEMBER, INSERT, DELETE, MIN, MAX, JOIN3, SPLIT a ord(k) pro rozˇs´ıˇrenou strukturu ˇcerveno-ˇcern´ych strom˚ u vyˇzaduje v nejhorˇs´ım pˇr´ıpadˇe ˇcas O(log(|S|), kde S je reprezentovan´a mnoˇzina. Operace INSERT a JOIN3 zavolaj´ı nejv´yˇse jednou bud’ Rotace nebo Dvojitarotace a operace DELETE zavol´a nejv´yˇse dvakr´at Rotace nebo jednou Rotace a Dvojita-rotace. Vznik´a ot´azka, proˇc se tolik pozornosti vˇenuje procedur´am Rotace a Dvojita-rotace. Sice vyˇzaduj´ı ˇcas O(1), ale jsou to nejsloˇzitˇejˇs´ı akce vyˇzaduj´ıc´ı nejv´ıce ˇcasu. V mnoha aplikac´ıch (pouˇz´ıvaj´ı se hlavnˇe ve 118
v´ ypoˇcetn´ı geometrii), tvar stromu spolu s parametry nesou jeˇstˇe dalˇs´ı zak´odovan´e informace. Pˇri zmˇenˇe tvaru stromu je tˇreba je pˇrepoˇc´ıtat. Rotace a Dvojita-rotace mˇen´ı tvar stromu, kdeˇzto posun smˇerem ke koˇreni pouze mˇen´ı obarven´ı. V tomto pˇr´ıpadˇe pak Rotace nebo Dvojita-rotace vyˇzaduje ˇcas O(|S|) (obvykle je tˇreba prohl´ednout cel´ y strom) a nikoliv O(1).
4.6
V´ ahovˇ e vyv´ aˇ zen´ e stromy
V osmdes´at´ ych letech se ve v´ ypoˇcetn´ı geometrii hodnˇe pouˇz´ıvaly BB(α)-stromy, proto se o nich alespoˇ n √ 2 1 orientaˇcnˇe zm´ın´ıme. Mˇejme re´aln´e ˇc´ıslo α takov´e, ˇze 4 < α ≤ 2 . Pro strom T oznaˇcme p(T ) poˇcet list˚ u ve stromu T . Bin´arn´ı vyhled´avac´ı strom T reprezentuj´ıc´ı mnoˇzinu S se naz´ yv´a BB(α)-strom, kdyˇz pro kaˇzd´ y vnitˇrn´ı vrchol v plat´ı: p(Tl ) p(Tr ) α≤ =1− ≤1−α p(Tv ) p(Tv ) kde Tv je podstrom T urˇcen´ y vrcholem v, Tl je podstrom T urˇcen´ y lev´ ym synem vrcholu v, Tr je podstrom T urˇcen´ y prav´ ym synem vrcholu v. Plat´ı Tvrzen´ı. Kdyˇz T je BB(α)-strom reprezentuj´ıc´ı n-prvkovou mnoˇzinu, pak hloubka(T ) ≤ 1 +
log(n + 1) − 1 . 1 log 1−α
D˚ usledek je, ˇze BB(α)-stromy patˇr´ı do skupiny vyv´aˇzen´ ych bin´arn´ıch vyhled´avac´ıch strom˚ u. Vyvaˇzov´an´ı se provad´ı opˇet pomoc´ı Rotace a Dvojita-rotace a popisuje ho n´asleduj´ıc´ı technick´e tvrzen´ı. Tvrzen´ı. Pro kaˇzd´e α existuje konstanta d takov´ a, ˇze α < d < 1 − α a pro kaˇzd´y bin´ arn´ı vyhled´avac´ı strom T s koˇrenem t splˇ nuj´ıc´ı podm´ınky 1. podstromy Tl a Tr stromu T urˇcen´e lev´ym a prav´ym synem t jsou BB(α)-stromy; 2.
p(Tl ) p(T )
< α, ale α ≤
p(Tl ) p(T )−1
≤ 1 − α nebo α ≤
p(Tl )+1 p(T )+1
≤1−α
plat´ı: kdyˇz ρ ≤ d a provedeme Rotace(t, pravy(t)), nebo kdyˇz ρ > d a provedeme proceduru Dvojita-rotace(t, pravy(t), le p(T ′ ) pak dostaneme BB(α)-strom (zde ρ = p(T a T ′ je urˇcen lev´ym synem prav´eho syna koˇrene t). r) Toto tvrzen´ı a jeho symetrick´e verze jednoznaˇcnˇe ukazuj´ı, jak vyvaˇzovat BB(α)-stromy pˇri aktualizaˇcn´ıch operac´ıch (podstrom BB(α)-stromu je BB(α)-strom). Pak dost´av´ame: Vˇ eta. Implementace operac´ı MEMBER, INSERT a DELETE v BB(α)-stromech vyˇzaduje v nejhorˇs´ım pˇr´ıpadˇe ˇcas O(log(|S|)), kde S je reprezentovan´a mnoˇzina. Obliba BB(α)-strom˚ u byla zapˇr´ıˇcinˇena platnost´ı n´asleduj´ıc´ı vˇety, kter´a je analogi´ı vˇety o vyvaˇzovac´ıch operac´ıch pro (a, b)-stromy. √
avisl´ a jen na α Vˇ eta. Kdyˇz α je re´aln´e ˇc´ıslo takov´e, ˇze 41 < α < 1 − 22 , pak existuje konstanta c > 0 z´ takov´ a, ˇze kaˇzd´a posloupnost operac´ı INSERT a DELETE o d´elce m aplikovan´a na pr´ azdn´y BB(α)strom vol´a nejv´yˇse cm procedur Rotace a Dvojita-rotace.
119
4.7
Historick´ y pˇ rehled:
(a, b)-stromy zavedli Bayer a McGreght (1972), vˇety o poˇctu vyvaˇzovac´ıch operac´ı pro (a, b)-stromy dok´azali Huddleston a Mehlhorn (1982). A-sort analyzovali Guibas, McGreight, Plass a Roberts (1977). Anal´ yza interpolaˇcn´ıho vyhled´av´an´ı poch´az´ı od Perla, Itai a Avniho (1978), kvadratick´e vyhled´av´an´ı analyzovali Perl a Reingold (1977). Adelson-Velskij a Landis (1962) definovali AVL-stromy, ˇcerveno-ˇcern´e stromy definovali Guibas a Sedgewick (1978), verze algoritmu DELETE poch´az´ı od Tarjana (1983). BB(α)-stromy zavedli Nievergelt a Reingold (1973), vˇety o jejich vyvaˇzov´an´ı dok´azali Blum a Mehlhorn (1980). Priorita AVL-strom˚ u se odr´aˇz´ı v jejim hojn´em pouˇz´ıv´an´ı, i kdyˇz ˇcerveno-ˇcern´e stromy jsou efektivnˇejˇs´ı.
5 5.1 5.1.1
Haldy ´ Uvodn´ ı definice Motivace
V praxi se ˇcasto setk´av´ame s n´asleduj´ıc´ım probl´emem, kter´ y vznik´a na uspoˇra´dan´em univerzu, jehoˇz ´ uspoˇra´d´an´ı se vˇsak v pr˚ ubˇehu ˇcasu mˇen´ı. Uloha se liˇs´ı od slovn´ıkov´eho probl´emu v tom, ˇze se nevyˇzaduje efektivn´ı operace MEMBER. Dokonce se pˇredpokl´ad´a, ˇze operace dostane spolu s argumentem informaci o uloˇzen´ı zpracov´avan´eho prvku. Hlavn´ım poˇzadavkem je rychlost provededn´ı ostatn´ıch operac´ı a mal´e pamˇet’ov´e n´aroky. Pˇritom v praxi obvykle nestaˇc´ı zn´at jen asymptotickou sloˇzitost, d˚ uleˇzitou roli hraje skuteˇcn´a rychlost, kterou vˇsak neum´ıme obecnˇe spoˇc´ıtat, protoˇze je z´avisl´a na pouˇzit´em syst´emu a hardwaru. Pˇresto je pˇri pouˇzit´ı n´asleduj´ıc´ıch struktur dobr´e m´ıt realistickou pˇredstavu o skuteˇcn´ ych rychlostech operac´ı a podle toho si vybrat vhodnou strukturu. 5.1.2
Zad´ an´ı
Zad´an´ı probl´emu: Necht’ U je univerzum. Je d´ana mnoˇzina S ⊆ U a funkce f : S → R, kde R jsou re´aln´a ˇc´ısla (tato funkce realizuje uspoˇra´d´an´ı na univerzu U – pro u, v ∈ U plat´ı u ≤ v, pr´avˇe kdyˇz f (u) ≤ f (v); zmˇena uspoˇra´d´an´ı se pak realizuje zmˇenou funkce f ). M´ame navrhnout reprezentaci S a f , kter´a umoˇzn ˇuje operace: INSERT(s, a) – pˇrid´a k mnoˇzinˇe S prvek s tak, ˇze f (s) = a, MIN – nalezne prvek s ∈ S s nejmenˇs´ı hodnotou f (s), DELETEMIN – odstran´ı prvek s ∈ S s nejmenˇs´ı hodnotou f (s), DELETE(s) – odstran´ı prvek s ∈ S z mnoˇziny S, DECREASE(s, a) – zmenˇs´ı hodnotu f (s) o a (tj. f (s) := f (s) − a), INCREASE(s, a) – zvˇetˇs´ı hodnotu f (s) o a (tj. f (s) := f (s) + a). Pˇri operaci INSERT(s, a) se pˇredpokl´ad´a, ˇze s ∈ / S, a tento pˇredpoklad operace INSERT neovˇeˇruje. Pˇri operac´ıch DELETE(s), DECREASE(s, a) a INCREASE(s, a) se pˇredpokl´ad´a, ˇze s ∈ S, a operace nav´ıc dost´av´a informaci, jak naj´ıt prvek s v reprezentaci S a f . Haldy jsou typ struktury, kter´a se pouˇz´ıv´a pro ˇreˇsen´ı tohoto probl´emu.
120
5.1.3
Definice haldy
Halda je stromov´a struktura, kde vrcholy reprezentuj´ı prvky z S a splˇ nuj´ı lok´aln´ı podm´ınku na f . Obvykle se pouˇz´ıv´a n´asleduj´ıc´ı podm´ınka nebo jej´ı du´aln´ı verze: (usp) Pro kaˇzd´ y vrchol v plat´ı: kdyˇz v reprezentuje prvek s ∈ S a otec(v) reprezentuje t ∈ S, pak f (t) ≤ f (s). Probereme nˇekolik verz´ı hald a budeme pˇredpokl´adat, ˇze vˇzdy splˇ nuj´ı tuto podm´ınku a ˇze poˇzadavek na proveden´ı operac´ı DELETE(s), DECREASE(s, a) a INCREASE(s, a) tak´e zad´av´a ukazatel na vrchol reprezentuj´ıc´ı s ∈ S. Nav´ıc budeme uvaˇzovat operace MAKEHEAP(S, f ) – operace vytvoˇr´ı haldu reprezentuj´ıc´ı mnoˇzinu S a funkci f , MERGE(H1 , H2 ) – pˇredpokl´ad´a, ˇze halda Hi reprezentuje mnoˇzinu Si a funkci fi pro i = 1, 2 a S1 ∩S2 = ∅. Operace vytvoˇr´ı haldu H reprezentuj´ıc´ı S1 ∪ S2 a f1 ∪ f2 , pˇriˇcemˇz neovˇeˇruje disjunktnost S1 a S2 .
5.2
Regul´ arn´ı haldy
Prvn´ı pouˇzit´e haldy byly bin´arn´ı neboli 2-regul´arn´ı haldy. Tyto haldy jsou velmi obl´ıben´e pro svou jednoduchost a n´azornost a pro velmi efektivn´ı implementaci. 5.2.1
d-regul´ arn´ı strom
Pˇredpokl´adejme, ˇze d > 1 je pˇrirozen´e ˇc´ıslo. d-regul´ arn´ı strom je koˇrenov´ y strom (T, r), pro kter´ y existuje poˇrad´ı syn˚ u jednotliv´ ych vnitˇrn´ıch vrchol˚ u takov´e, ˇze oˇc´ıslov´an´ı vrchol˚ u prohled´av´an´ım do ˇs´ıˇrky (koˇren r je ˇc´ıslov´an 1) splˇ nuje n´asleduj´ıc´ı vlastnosti 1. kaˇzd´ y vrchol m´a nejv´ yˇse d syn˚ u, 2. kdyˇz vrchol nen´ı list, tak vˇsechny vrcholy s menˇs´ım ˇc´ıslem maj´ı pr´avˇe d syn˚ u, 3. kdyˇz vrchol m´a m´enˇe neˇz d syn˚ u, pak vˇsechny vrcholy s vˇetˇs´ımi ˇc´ısly jsou listy. Toto oˇc´ıslov´an´ı se naz´ yv´a pˇrirozen´e oˇc´ıslov´an´ı d-regul´arn´ıho stromu. 5.2.2
V´ yˇ ska
Tvrzen´ı. Kaˇzd´y d-regul´ arn´ı strom m´a nejv´yˇse jeden vrchol, kter´y nen´ı list a m´a m´enˇe neˇz d syn˚ u. D˚ ukaz. Plyne pˇr´ımo z poˇzadavku 2) na d-regul´arn´ı strom.
Tvrzen´ı. Kdyˇz d-regul´ arn´ı strom m´a n vrchol˚ u, pak jeho v´yˇska je ⌈logd (n(d − 1) + 1)⌉. k−1 i D˚ ukaz. M´a-li d-regul´arn´ı strom v´ yˇsku k, pak m´a alespoˇ n Σi=0 d + 1 a nejv´ yˇse Σki=0 di vrchol˚ u. Proto
dk+1 dk − 1
,
dk − 1 < n(d − 1) ≤ dk+1 − 1 121
a zlogaritmov´an´ım dostaneme k < logd (n(d − 1) + 1) ≤ k + 1. Odtud jiˇz plyne.
5.2.3
Reprezentace pomoc´ı pole
Tvrzen´ı. Necht’ o je pˇrirozen´e oˇc´ıslov´an´ı vrchol˚ u d-regul´ arn´ıho stromu. Kdyˇz pro vrchol v je o(v) = k, pak vrchol w je syn vrcholu v, pr´ avˇe kdyˇz o(w) ∈ {(k − 1)d + 2, (k − 1)d + 3, . . . , kd + 1}, a vrchol u je otcem vrcholu v, pr´ avˇe kdyˇz o(u) = 1 + ⌊ k−2 ⌋. d D˚ ukaz. Dok´aˇzeme indukc´ı podle oˇc´ıslov´an´ı. Synov´e koˇrene maj´ı ˇc´ısla 2, 3, . . . ,d + 1, protoˇze koˇren m´a ˇc´ıslo 1. Kdyˇz tvrzen´ı plat´ı pro vrchol s ˇc´ıslem k, pak synov´e vrcholu s ˇc´ıslem k + 1 maj´ı ˇc´ısla kd + 2, kd + 3, . . . , kd + d + 1, coˇz odpov´ıd´a ˇc´ısl˚ um (k + 1 − 1)d + 2, (k + 1 − 1)d + 3, . . . , (k + 1)d + 1, a tedy tvrzen´ı plat´ı. Posledn´ı ˇca´st pak plyne z toho, ˇze kdyˇz i ∈ {(k − 1)d + 2, (k − 1)d + 3, . . . , kd + 1}, pak 1 + ⌊ i−2 ⌋ = k. d
Vˇsimnˇeme si, ˇze speci´alnˇe pro d = 2 maj´ı synov´e vrcholu s ˇc´ıslem k ˇc´ısla 2k a 2k + 1 a otec vrcholu s ˇc´ıslem u a otce zvl´aˇstˇe jednoduch´ y. k m´a ˇc´ıslo ⌊ k2 ⌋. Tedy pro 2-regul´arn´ı stromy je pˇredpis pro nalezen´ı syn˚
ˇ Rekneme, ˇze mnoˇzina S s funkc´ı f je reprezentov´ana d-regul´arn´ı haldou H, kde H je d-regul´arn´ı strom (T, r), kdyˇz pˇriˇrazen´ı prvk˚ u mnoˇziny S vrchol˚ um stromu T je bijekce splˇ nuj´ıc´ı podm´ınku (usp). Toto pˇriˇrazen´ı je realizov´ano funkc´ı key, kter´a vrcholu pˇriˇrazuje j´ım reprezentovan´ y prvek.
Defince d-regul´arn´ıho stromu umoˇzn ˇuje velmi efektivn´ı implementace d-regul´arn´ıch hald. Mˇejme mnoˇzinu S reprezentovanou d-regul´arn´ı haldou H s pˇrirozen´ ym oˇc´ıslov´an´ım o d-regul´arn´ıho stromu (T, r). Pak haldu H m˚ uˇzeme reprezentovat polem H[1..|S|], kde pro vrchol stromu v, pro kter´ y o(v) = i, je H(i) = (key(v), f (key(v)). Algoritmy budeme popisovat pro stromy, protoˇze je to n´azornˇejˇs´ı. Pˇreformulovat je pro pole je snadn´e (viz oˇc´ıslov´an´ı syn˚ u a otce vrcholu v). Pro jednoduchost budeme pro vrchol v ps´at f (v) m´ısto f (key(v)), neboli f (v) bude oznaˇcovat f (s), kde s je reprezentov´an vrcholem v. U d-regul´arn´ıho stromu pˇredpokl´ad´ame, ˇze zn´ame pˇrirozen´e oˇc´ıslov´an´ı, a fr´aze ‘posledn´ı vrchol’, ‘pˇredch´azej´ıc´ı vrchol’ atd. se vztahuj´ı k tomuto oˇc´ıslov´an´ı. 5.2.4
Algoritmy
Pro d-regul´arn´ı haldy nen´ı zn´ama efektivn´ı implementace operace MERGE. Efektivn´ı implementace ostatn´ıch operac´ı jsou zaloˇzeny na pomocn´ ych operac´ıch UP(v) a DOWN(v). Operace UP(v) posunuje prvek s reprezentovan´ y vrcholem v smˇerem ke koˇreni, dokud vrchol reprezentuj´ıc´ı prvek s nesplˇ nuje podm´ınku (usp). Operace DOWN(v) je symetrick´a. UP(v): while v nen´ı koˇren a f (v) < f (otec(v)) do vymˇen ˇ key(v) a key(otec(v)) v := otec(v) enddo
122
DOWN(v): if v nen´ı list then w :=syn vrcholu v reprezentuj´ıc´ı prvek s nejmenˇs´ı hodnotou f (w) while f (w) < f (v) a v nen´ı list do vymˇen ˇ key(v) a key(w), v := w w :=syn vrcholu v reprezentuj´ıc´ı prvek s nejmenˇs´ı hodnotou f (w) enddo endif INSERT(s): v :=nov´ y posledn´ı list, key(v) := s, UP(v) MIN: V´ ystup key(koˇren(T )) DELETEMIN: v :=posledn´ı list, r :=koˇren, key(r) := key(v) odstraˇ nv DOWN(r) DELETE(s): v :=vrchol reprezentuj´ıc´ı s w :=posledn´ı list t := key(w), key(v) := t, odstraˇ nw if f (t) < f (s) then UP(v) else DOWN(v) endif DECREASE(s, a): v :=vrchol reprezentuj´ıc´ı s f (s) := f (s) − a, UP(v) INCREASE(s, a): v :=vrchol reprezentuj´ıc´ı s f (s) := f (s) + a, DOWN(v) MAKEHEAP(S, f ): T := d-regul´arn´ı strom s |S| vrcholy zvol libovolnou reprezentaci S vrcholy stromu T v :=posledn´ı vrchol, kter´ y nen´ı list while v je vrchol T do DOWN(v) v :=vrchol pˇredch´azej´ıc´ı vrcholu v enddo 5.2.5
Korektnost
Ovˇeˇr´ıme korektnost algoritm˚ u. Je zˇrejm´e, ˇze pomocn´e operace jsou korektn´ı – skonˇc´ı, kdyˇz podm´ınku (usp) splˇ nuje prvek s, kter´ y byl p˚ uvodnˇe reprezentov´an vrcholem v. Korektnost operace MIN plyne pˇr´ımo z podm´ınky (usp), protoˇze koˇren reprezentuje nejmenˇs´ı prvek mnoˇziny S. U operace INSERT je podm´ınka (usp) splnˇena pro vˇsechny vrcholy s v´ yjimkou novˇe vytvoˇren´eho listu a operace UP zajist´ı jej´ı splnˇen´ı. Pˇri operaci DELETEMIN je podm´ınka (usp) splnˇena pro vˇsechny vrcholy s v´ yjimkou koˇrene a v tomto pˇr´ıpadˇe operace DOWN zajist´ı jej´ı splnˇen´ı. Po proveden´ı operac´ı DELETE(s), DECREASE(s, a) a 123
INCREASE(s, a) je podm´ınka (usp) splnˇena pro vˇsechny vrcholy s v´ yjimkou vrcholu v a jej´ı splnˇen´ı opˇet zajist´ı operace UP resp. DOWN. Pro operaci MAKEHEAP budeme uvaˇzovat du´aln´ı formulaci podm´ınky (usp): (d-usp) kdyˇz s je prvek reprezentovan´ y vrcholem v, pak f (s) ≤ f (t) pro vˇsechny prvky reprezentovan´e syny vrcholu v. Pokud kaˇzd´ y vrchol splˇ nuje podm´ınku (d-usp), pak splˇ nuje i podm´ınku (usp). Zˇrejmˇe kaˇzd´ y list splˇ nuje podm´ınku (d-usp) a kdyˇz operace MAKEHEAP provede proceduru DOWN(v), pak je podm´ınka (d-usp) splnˇena pro vˇsechny vrcholy s ˇc´ısly alespoˇ n tak velk´ ymi jako je ˇc´ıslo v. Operace MAKEHEAP konˇc´ı proveden´ım operace DOWN na koˇren a odtud plyne jej´ı korektnost. 5.2.6
Sloˇ zitost operac´ı
Vypoˇcteme ˇcasovou sloˇzitost operac´ı: Jeden bˇeh cyklu v operaci UP vyˇzaduje ˇcas O(1) a v operaci DOWN ˇcas O(d). Proto operace UP v nejhorˇs´ım pˇr´ıpadˇe vyˇzaduje ˇcas O(logd |S|) a operace DOWN ˇcas O(d logd |S|). Operace MIN vyˇzaduje ˇcas O(1), INSERT a DECREASE vyˇzaduj´ı ˇcas O(logd |S|) a DELETEMIN, DELETE a INCREASE ˇcas O(d logd |S|). Haldu m˚ uˇzeme vytvoˇrit iterac´ı operace INSERT, coˇz vyˇzaduje ˇcas O(|S| logd (|S|)). Uk´aˇzeme, ˇze sloˇzitost operace MAKEHEAP je menˇs´ı, ale pro mal´e haldy je v´ yhodnˇejˇs´ı prov´adˇet opakovanˇe operaci INSERT. Vˇ eta. MAKEHEAP vyˇzaduje v nejhorˇs´ım pˇr´ıpadˇe jen ˇcas O(d2 |S|). D˚ ukaz. Operace DOWN(v) na vrchol ve v´ yˇsce h vyˇzaduje v nejhorˇs´ım pˇr´ıpadˇe ˇcas O(hd). Vrchol˚ u v hloubce i je nejv´ yˇse di . Pˇredpokl´adejme, ˇze strom m´a v´ yˇsku k, pak vrchol v hloubce i m´a v´ yˇsku nejv´ yˇse k − i. Tedy operace MAKEHEAP vyˇzaduje ˇcas O(
k−1 X i=0
Oznaˇcme A =
Pk−1 i=0
i
d (k − i)d) = O(
k−1 X i=0
di+1 (k − i)).
di+1 (k − i), pak
dA − A =
k−1 X
d
i+2
i=0
dk+1 +
(k − i) −
k X i=2
dk+1 + d2
d
k−1 X
d
i+1
i=0
(k − i) =
k+1 X i=2
i
d (k − i + 2) −
di (k − i + 2 − k + i − 1) − dk = dk+1 + k−1
−1 − dk. d−1
Tedy A=
k X i=2
k X i=1
di (k − i + 1) =
di − dk =
dk+1 dk+1 − d2 dk + − . 2 d−1 (d − 1) d−1
Protoˇze k = ⌈logd (|S|(d − 1) + 1)⌉, dost´av´ame, ˇze dk+1 ≤ d2 ((d − 1)|S| + 1), a proto A ≤ 2d2 |S|. Tedy MAKEHEAP vyˇzaduje v nejhorˇs´ım pˇr´ıpadˇe jen ˇcas O(d2 |S|).
124
5.2.7
Aplikace – heapsort
Tˇr´ıdˇen´ı: prostou posloupnost ˇc´ısel x1 , x2 , . . . , xn lze setˇr´ıdit n´asleduj´ıc´ım algoritmem pouˇz´ıvaj´ıc´ım haldu (f bude v tomto pˇr´ıpadˇe identick´a funkce). d-HEAPSORT(x1 , x2 , . . . , xn ): MAKEHEAP({xi | i = 1, 2, . . . , n}, f ) i=1 while i ≤ n do yi :=MIN, DELETEMIN, i := i + 1 enddo V´ ystup: y1 , y2 , . . . , yn Teoreticky lze uk´azat, ˇze pouˇzit´ı d-regul´arn´ıch hald v algoritmu HEAPSORT pro d = 3 a d = 4 je v´ yhodnˇejˇs´ı neˇz d = 2. Experimenty uk´azaly, ˇze optim´aln´ı algoritmus pro posloupnosti d´elek do 1 000 000 by mˇel pouˇz´ıvat d = 6 nebo d = 7 (v experimentech byl mˇeˇren skuteˇcnˇe spotˇrebovan´ y ˇcas, nikoli poˇcet porovn´an´ı a v´ ymˇen prvk˚ u). Pro delˇs´ı posloupnosti se optim´aln´ı hodnota d m˚ uˇze zmenˇsit. 5.2.8
Aplikace – Dijkstra
ˇ sme n´asleduj´ıc´ı u Dalˇs´ım pˇr´ıkladem je nalezen´ı nejkratˇs´ıch cest v grafu z dan´eho bodu. Reˇ ´lohu: Vstup: orientovan´ y ohodnocen´ y graf (X, R, c), kde c je funkce z R do mnoˇziny kladn´ ych re´aln´ ych ˇc´ısel, a vrchol z ∈ X. ´ Ukol: nal´ezt pro kaˇzd´ y bod x ∈ X d´elku nejkratˇs´ı cestu ze z do x, kde d´elka cesty je souˇcet c-ohodnocen´ı hran na cestˇe. Dijkstr˚ uv algoritmus: d(z) := 0, U := {z} for every x ∈ X \ {z} do d(x) := +∞ enddo while U 6= ∅ do najdi vrchol u ∈ U s nejmenˇs´ı hodnotou d(u) odstraˇ nuzU for every (u, v) ∈ R do if d(u) + c(u, v) < d(v) then if d(v) = +∞ then vloˇz v do U endif d(v) := d(u) + c(u, v) endif enddo enddo Korektnost algoritmu je zaloˇzena na kombinatorick´em lemmatu, kter´e ˇr´ık´a, ˇze kdyˇz odstraˇ nujeme z U prvek x s nejmenˇs´ı hodnotou d(x), pak vzd´alenost ze z do x je pr´avˇe d(x). Proto kdyˇz U = ∅, pak d(x) jsou d´elky nejkratˇs´ıch cest ze z do x pro vˇsechna x ∈ X. Tedy pr´ace s mnoˇzinou U vyˇzaduje nejv´ yˇse |X| operac´ı INSERT, MIN a DELETEMIN a |R| operac´ı DECREASE a vˇzdy plat´ı |U | ≤ |X|. Vypoˇcteme ˇcasovou sloˇzitost Dijkstrova algoritmu za pˇredpokladu, ˇze U reprezentujeme jako d-regul´arn´ı haldu. Kdyˇz d = 2, pak dost´av´ame, ˇze algoritmus vyˇzaduje ˇcas O(|X| log(|X|) + |R| log(|X|)). Kdyˇz |R| d = max{2, ⌊ |X| ⌋}, pak algoritmus vyˇzaduje ˇcas O(|R| logd |X|). V pˇr´ıpadˇe, ˇze (X, R) je hust´ y graf, tj. 1+ε |R| > |X| pro ε > 0, pak logd |X| = O(1) a algoritmus je line´arn´ı (tj. vyˇzaduje ˇcas O(|R|)).
125
5.3 5.3.1
Leftist haldy ´ Uvod
Dalˇs´ım typem hald, se kter´ ymi se sezn´am´ıme, jsou lefist haldy (nezn´ame vhodn´ y ˇcesk´ y pˇreklad, proto z˚ ust´av´ame u anglick´eho n´azvu). Je to velmi elegantn´ı a jednoduch´ y typ hald. Vˇsechny operace jsou stejnˇe jako u regul´arn´ıch hald zaloˇzeny na dvou z´akladn´ıch operac´ıch, z nichˇz v tomto pˇr´ıpadˇe hlavn´ı je MERGE a druhou je DECREASE. Pouˇzit´ı MERGE pˇri n´avrhu jin´ ych operac´ı je bˇeˇzn´e i v dalˇs´ıch hald´ach. Operace MERGE vyuˇz´ıv´a speci´aln´ıch vlastnost´ı leftist hald a idea operace DECREASE je stejn´a jako ve Fibonacciho hald´ach. Nejprve form´alnˇe pop´ıˇseme strukturu leftist hald. 5.3.2
Defince
Mˇejme bin´arn´ı koˇrenov´ y strom (T, r) (to znamen´a, ˇze r je koˇren, kaˇzd´ y vrchol m´a nejv´ yˇse dva syny a u kaˇzd´eho syna v´ıme, zda je to prav´ y nebo lev´ y syn). Pro vrchol v oznaˇcme npl(v) d´elku nejkratˇs´ı cesty z v do vrcholu, kter´ y m´a nejv´ yˇse jednoho syna, takˇze napˇr. pro list l plat´ı npl(l) = 0. Mˇejme S ⊆ U a funkci f : S → R. Pak bin´arn´ı strom (T, r) takov´ y, ˇze 1. kdyˇz vrchol v m´a jen jednoho syna, pak je to lev´ y syn, 2. kdyˇz vrchol v m´a dva syny, pak npl(prav´ y syn v) ≤ npl(lev´ y syn v), 3. existuje jednoznaˇcn´e pˇriˇrazen´ı prvk˚ u S vrchol˚ um T , kter´e splˇ nuje podm´ınku (usp) (toto pˇriˇrazen´ı je reprezentov´ano funkc´ı key, kter´a vrcholu v pˇriˇrad´ı prvek z mnoˇziny S reprezentovan´ y vrcholem v) je leftist halda reprezentuj´ıc´ı mnoˇzinu S a funkci f . Struktura vrcholu v v leftist haldˇe: S vrcholem v jsou spojeny ukazatel´e otec(v), levy(v) a pravy(v) na otce a na lev´eho a prav´eho syna vrcholu v. Kdyˇz ukazatel nen´ı definov´an, pak p´ıˇseme, ˇze jeho hodnota je N IL. D´ale jsou s vrcholem spojeny funkce npl(v) – promˇenn´a s hodnotou npl(v), key(v) – prvek reprezentovan´ y vrcholem v, f (v) – promˇenn´a obsahuj´ıc´ı hodnotu f (key(v)). 5.3.3
Z´ akladn´ı vlastnost
Uvedeme z´akladn´ı vlastnost leftist haldy, kter´a umoˇzn ˇuje efektivn´ı implementace operac´ı. Posloupnost vrchol˚ u v0 , v1 , . . . , vk se naz´ yv´a prav´ a cesta z vrcholu v, kdyˇz v = v0 , vi+1 je prav´ y syn vi pro kaˇzd´e i = 0, 1, . . . , k − 1 a vk nem´a prav´eho syna. Pak podstrom vrcholu v do hloubky k je u ´pln´ y bin´arn´ı strom k+1 a m´a tedy alespoˇ n2 − 1 vrchol˚ u. Proto plat´ı Tvrzen´ı. V leftist haldˇe je d´elka prav´e cesty z kaˇzd´eho vrcholu v nejv´yˇse rovna log(velikost podstromu urˇcen´eho vrcholem v).
126
5.3.4
Algoritmy
Z´akladn´ı operac´ı pro leftist haldy je MERGE. Tato operace je definov´ana rekurzivnˇe a hloubka rekurze je omezena pr´avˇe d´elkami prav´ ych cest. MERGE(T1 , T2 ): if T1 = ∅ then V´ ystup= T2 stop endif if T2 = ∅ then V´ ystup= T1 stop endif if key(koˇren T1 ) > key(koˇren T2 ) then zamˇen ˇ T1 a T2 endif T ′ :=MERGE(podstrom prav´eho syna koˇrene T1 , T2 ) pravy(koˇren T1 ) := koˇren T ′ otec(koˇren T ′ ) := koˇren T1 if npl(pravy(koˇren T1 )) > npl(levy(koˇren T1 )) then vymˇen ˇ lev´eho a prav´eho syna koˇrene T1 endif npl(koˇren T1 ) := npl(pravy(koˇren T1 ) + 1 INSERT(x): Vytvoˇr haldu T1 reprezentuj´ıc´ı {x} MERGE(T, T1 ) MIN: V´ ystup: key(koˇren T ) DELETEMIN: T1 :=podstrom lev´eho syna koˇrene T T2 :=podstrom prav´eho syna koˇrene T MERGE(T1 , T2 ) MAKEHEAP(S, f ): Q :=pr´azdn´a fronta for every s ∈ S do vloˇz leftist haldu Ts reprezentuj´ıc´ı {s} do Q enddo while |Q| > 1 do vezmi haldy T1 a T2 z vrcholu Q (odstraˇ n je) MERGE(T1 , T2 ) vloˇz do Q enddo 5.3.5
ˇ Casov´ a sloˇ zitost
Vypoˇcteme ˇcasovou sloˇzitost pˇredchoz´ıch algoritm˚ u. Kaˇzd´ y bˇeh algoritmu MERGE (bez rekurzivn´ıho vol´an´ı) vyˇzaduje ˇcas O(1). Poˇcet rekurzivn´ıch vol´an´ı je souˇcet d´elek prav´ ych cest, proto algoritmus MERGE vyˇzaduje ˇcas O(log(|S1 | + |S2 |)), kde Si je mnoˇzina reprezentovan´a haldou Ti pro i = 1, 2. Odtud d´ale plyne, ˇze ˇcas algoritm˚ u INSERT a DELETEMIN je v nejhorˇs´ım pˇr´ıpadˇe O(log(|S|)). Operace MIN vyˇzaduje ˇcas O(1). Vˇ eta. MAKEHEAP m´a ˇcasovou sloˇzitost O(|S|)
127
D˚ ukaz. Budeme uvaˇzovat, ˇze na zaˇca´tku algoritmu je na vrcholu fronty speci´aln´ı znak, kter´ y se jen pˇrenese na konec fronty. Odhadneme ˇcas, kter´ y spotˇrebuj´ı while-cykly mezi dvˇema pˇrenesen´ımi speci´aln´ıho znaku. Pˇredpokl´adejme, ˇze se speci´aln´ı znak pˇrenesl po k-t´e. V tomto okamˇziku maj´ı vˇsechny haldy ve frontˇe aˇz na jednu velikost 2k−1 . Proto ve frontˇe Q je 2|S| hald a jelikoˇz jedna operace MERGE vyˇzaduje O(k) ˇcasu, tak while-cykly k−1 |S| vyˇzaduj´ı ˇcas O(k 2k−1 ). M˚ uˇzeme tedy shrnout, ˇze operace MAKEHEAP potˇrebuje ˇcas O(
∞ X k=1
k
∞ X |S| k ) = O(|S| ). k−1 2k−1 2 k=1
k ˇ r. podle pod´ılov´eho d’Alambertova krit´eria a lze jednoduˇse spoˇc´ıtat (napˇr. Rada k=1 2k−1 konverguje napˇ stejnou metodou jako pro regul´arn´ı haldy), ˇze souˇcet je 4, tedy ˇcas je O(|S|).
P∞
5.3.6
Efektivn´ı DECREASE a INCREASE
Implementace operac´ı DECREASE a INCREASE pomoc´ı operac´ı UP a DOWN jako v d-regul´arn´ıch hald´ach nen´ı efektivn´ı, protoˇze d´elka cesty z koˇrene do listu v leftist haldˇe m˚ uˇze b´ yt aˇz |S|. Proto navrhneme pro tyto operace efektivnˇejˇs´ı algoritmus zaloˇzen´ y na jin´em principu. Tento princip je pak pouˇzit i pro Fibonacciho haldy. Nejprve pop´ıˇseme pomocnou operaci Oprav(T, v), kter´a vytvoˇr´ı leftist haldu z bin´arn´ıho stromu T ′ vznikl´eho z leftist haldy T odtrˇzen´ım podstromu s koˇrenem ve vrcholu v. Oprav(T, v): t := otec(v), npl(t) := 0 if pravy(t) 6= v then levy(t) := pravy(t) endif pravy(t) := N IL while se zmenˇsilo npl(t) a t nen´ı koˇren do t := otec(t) if npl(pravy(t)) > npl(levy(t)) then vymˇen ˇ levy(t) a pravy(t) endif npl(t) := npl(pravy(t)) + 1 enddo Po proveden´ı operace Oprav maj´ı vˇsechny vrcholy spr´avn´e ˇc´ıslo npl a podm´ınky kladen´e na leftist haldu jsou splnˇeny. Tedy po proveden´ı Oprav je T opˇet leftist halda. Kdyˇz t je posledn´ı vrchol, u kter´eho se zmenˇsilo npl, pak vˇsechny vrcholy, kde se zmenˇsilo npl, tvoˇr´ı pravou cestu z vrcholu t. To znamen´a, ˇze while-cyklus se prov´adˇel nejv´ yˇse log(|S|)-kr´at a kaˇzd´ y bˇeh while-cyklu vyˇzadoval ˇcas O(1). Proto algoritmus Oprav vyˇzaduje ˇcas O(log(|S|)). Pop´ıˇseme ostatn´ı algoritmy. DECREASE(s, a): v :=prvek reprezentuj´ıc´ı s T1 :=podstrom T urˇcen´ y vrcholem v, f (v) := f (v) − a T2 :=Oprav(T, v), T :=MERGE(T1 , T2 ) 128
INCREASE(s, a): v :=prvek reprezentuj´ıc´ı s T1 :=podstrom T urˇcen´ y vrcholem levy(v) T2 :=podstrom T urˇcen´ y vrcholem pravy(v) T3 :=leftist halda reprezentuj´ıc´ı prvek s f (v) := f (v) + a, T4 :=Oprav(T, v), T1 :=MERGE(T1 , T3 ) T2 :=MERGE(T2 , T4 ), T :=MERGE(T1 , T2 ) DELETE(s, a): v :=prvek reprezentuj´ıc´ı s T1 :=podstrom T urˇcen´ y vrcholem levy(v) T2 :=podstrom T urˇcen´ y vrcholem pravy(v) T3 :=MERGE(T1 , T2 ), T4 :=Oprav(T, v) T :=MERGE(T3 , T4 ) Protoˇze algoritmy MERGE a Oprav vyˇzaduj´ı ˇcas O(log(|S|) a protoˇze zbyl´e ˇca´sti algoritm˚ u pro operace DECREASE, INCREASE a DELETE vyˇzaduj´ı O(1) ˇcasu, m˚ uˇzeme shrnout v´ ysledky: Vˇ eta. V leftist hald´ach existuje implementace operace MIN, kter´ a v nejhorˇs´ım pˇr´ıpadˇe vyˇzaduje ˇcas O(1), implementace operac´ı INSERT, DELETEMIN, DELETE, MERGE, DECREASE a INCREASE, kter´e vyˇzaduj´ı v nejhorˇs´ım pˇr´ıpadˇe ˇcas O(log(|S|)), a implementace operace MAKEHEAP, kter´ a vyˇzaduje ˇcas O(|S|), kde S je reprezentovan´a mnoˇzina.
5.4
Amortizovan´ a sloˇ zitost
Pop´ıˇseme bankovn´ı paradigma pro poˇc´ıt´an´ı s amortizovanou sloˇzitost´ı. 5.4.1
Idea
Idea je takov´a, ˇze si nˇejak ohodnot´ıme stavy (pˇredstava: u ´ˇcet v bance) a budeme dˇelat odhad upraven´e sloˇzitosti, ke kter´e bud’ pˇriˇcteme to, co si do u ´ˇctu chceme nastˇra´dat (tj. podle definice d´ale h(D′ ) > ′ h(D), spoˇren´ı = h(D )−h(D) > 0, am(o) = t(o)+spoˇren´ı), nebo naopak odeˇcteme to, co jsme si nastˇra´dali a chceme utratit (tj. h(D′ ) < h(D), utr´acen´ı = h(D) − h(D′ ) > 0, am(o) = t(o) − utr´acen´ı). Odhad t´ehle upraven´e sloˇzitosti je pak i odhadem klasick´e sloˇzitosti. 5.4.2
Definice
Pˇredpokl´adejme, ˇze m´ame funkci h, kter´a ohodnocuje konfigurace a kvantitativnˇe vystihuje jejich vhodnost pro proveden´ı operace o. Kdyˇz na konfiguraci D aplikujeme operaci o a dostaneme konfiguraci D′ , pak amortizovan´a sloˇzitost am(o) operace o m´a vystihovat nejen ˇcasovou n´aroˇcnost operace, ale i to, jak se zmˇenila vhodnost konfigurace pro tuto operaci. Proto ji definujme jako am(o) = t(o) + h(D′ ) − h(D), kde t(o) je ˇcas potˇrebn´ y pro proveden´ı operace o. Pˇredpokl´adejme, ˇze chceme prov´est posloupnost operac´ı o1 , o2 , . . . , on na konfiguraci D0 . Zn´azorn´ıme si to takto: D0 →o1 D1 →o2 D2 →o3 · · · →on Dn . Vˇ eta. Odhad amortizovan´e sloˇzitosti je odhadem sloˇzitosti.
129
D˚ ukaz. Pˇredpokl´adejme, ˇze pro kaˇzd´e i = 1, 2, . . . , n m´ame odhad c(oi ) amortizovan´e sloˇzitosti operace oi , tj. am(oi ) ≤ c(oi ) pro vˇsechna i = 1, 2, . . . , n. Pak n X
am(oi ) =
i=1
n X i=1
t(oi ) + h(Di ) − h(Di−1 ) = h(Dn ) − h(D0 ) +
Z toho plyne, ˇze
n X i=1
t(oi ) ≤
n X i=1
n X i=1
t(oi ) ≤
n X
c(oi ).
i=1
c(oi ) − h(Dn ) + h(D0 ).
Obvykle je h(D) ≥ 0 pro vˇsechny konfigurace D nebo naopak h(D) ≤ 0 pro vˇsechny konfigurace D. Kdyˇz h(D) ≥ 0, pak n n X X t(oi ) ≤ c(oi ) + h(D0 ),
kdyˇz h(D) ≤ 0, pak
i=1
i=1
n X
n X
i=1
t(oi ) ≤
i=1
c(oi ) − h(Dn ).
To znamen´a, ˇze odhad amortizovan´e sloˇzitosti d´av´a tak´e odhad na ˇcasovou sloˇzitost posloupnosti operac´ı, kter´ y b´ yv´a lepˇs´ı neˇz odhad sloˇzitosti v nejhorˇs´ım pˇr´ıpadˇe. Tato skuteˇcnost vysvˇetluje ˇradu pˇr´ıpad˚ u, kdy v´ ysledky byly lepˇs´ı neˇz teoretick´ y v´ ypoˇcet. Ukazuje se, ˇze sloˇzitost posloupnosti operac´ı v nejhorˇs´ım pˇr´ıpadˇe je ˇcasto podstatnˇe menˇs´ı neˇz souˇcet sloˇzitost´ı v nejhorˇs´ım pˇr´ıpadˇe pro jednotliv´e operace.
5.5 5.5.1
Binomi´ aln´ı haldy Motivace
Dalˇs´ı typ hald je motivov´an sˇc´ıt´an´ım pˇrirozen´ ych ˇc´ısel. Binomi´aln´ı halda reprezentuj´ıc´ı n−prvkovou mnoˇzinu se totiˇz chov´a podobnˇe jako ˇc´ıslo n. Tento typ hald je tak´e po zobecnˇen´ı v jist´em smyslu vzorem pro Fibonacciho haldy. 5.5.2
Definice binomi´ aln´ıho stromu
Pro i = 0, 1, . . . definujeme rekurentnˇe binomi´aln´ı stromy Hi . Jsou to koˇrenov´e stromy takov´e, ˇze H0 je jednoprvkov´ y strom a strom Hi+1 vznikne ze dvou disjunktn´ıch strom˚ u Hi , kde koˇren jednoho stromu se stane dalˇs´ım synem (nejlevˇejˇs´ım nebo nejpravˇejˇs´ım) koˇrene druh´eho stromu. Viz obr´azek. 5.5.3
Vlastnosti binomi´ aln´ıho stromu
Nejprve uvedeme z´akladn´ı vlastnosti tˇechto strom˚ u. Tvrzen´ı. Pro kaˇzd´e pˇrirozen´e ˇc´ıslo i = 0, 1, . . . plat´ı:
130
H0
H1
H2 Hi Hi
H3
Hi+1
Obr´azek 10: Binomi´aln´ı stromy 1. strom Hi m´a 2i vrchol˚ u, 2. koˇren stromu Hi m´a i syn˚ u, 3. d´elka nejdelˇs´ı cesty z koˇrene do listu ve stromu Hi je i (tj. v´yˇska Hi je i), 4. podstromy urˇcen´e syny koˇrene stromu Hi jsou izomorfn´ı se stromy H0 , H1 , . . . , Hi−1 . D˚ ukaz. Tvrzen´ı plat´ı pro strom H0 a jednoduchou indukc´ı se dok´aˇze i pro dalˇs´ı stromy. Skuteˇcnˇe, kdyˇz Hi m´a 2i vrchol˚ u, pak Hi+1 m´a 2(2i ) = 2i+1 vrchol˚ u. Koˇren stromu Hi+1 m´a o jednoho syna v´ıce neˇz koˇren stromu Hi a nejdelˇs´ı cesta do listu je o 1 delˇs´ı. Protoˇze podstrom syna, kter´ y pˇribyl koˇreni stromu Hi+1 , je izomorfn´ı s Hi a jinak se nic nemˇenilo, je d˚ ukaz kompletn´ı.
5.5.4
Definice binomi´ aln´ı haldy
Definice. Binomi´aln´ı halda H reprezentuj´ıc´ı mnoˇzinu S je soubor (seznam) strom˚ u {T1 , T2 , . . . , Tk } takov´y, ˇze 1. celkov´y poˇcet vrchol˚ u v tˇechto stromech je roven velikosti S a existuje a je d´ano jednoznaˇcn´e pˇriˇrazen´ı prvk˚ u z S vrchol˚ um strom˚ u takov´e, ˇze plat´ı podm´ınka (usp) – toto pˇriˇrazen´ı je realizov´ano funkc´ı key, kter´ a vrcholu stromu pˇriˇrazuje prvek j´ım reprezentovan´y; 2. kaˇzd´y strom Ti je izomorfn´ı s nˇejak´ym stromem Hj ; 3. Ti nen´ı izomorfn´ı s ˇza´dn´ym Tj pro i 6= j. Z bin´arn´ıho z´apisu pˇrirozen´ ych ˇc´ısel plyne, ˇzeP pro kaˇzd´e pˇrirozen´e ˇc´ıslo n > 0 existuje prost´a posloupnost i1 , i2 , . . . , ik pˇrirozen´ ych ˇc´ısel takov´a, ˇze n = kj=1 2ij . Z toho plyne, ˇze pro kaˇzdou nepr´azdnou mnoˇzinu S existuje binomi´aln´ı halda reprezentuj´ıc´ı S. Tato halda obsahuje strom izomorfn´ı s Hi , pr´avˇe kdyˇz v bin´arn´ım z´apise ˇc´ısla |S| je na i-t´em m´ıstˇe zprava 1.
131
5.5.5
Algoritmy, korektnost
Operace pro binomi´aln´ı haldy jsou stejnˇe jako pro leftist haldy zaloˇzeny na operaci MERGE. Operace MERGE pro binomi´aln´ı haldy je analogi´ı sˇc´ıt´an´ı pˇrirozen´ ych ˇc´ısel v bin´arn´ım z´apise. MERGE(H1 , H2 ): (koment´aˇr: Hi reprezentuje mnoˇzinu Si pro i = 1, 2 a S1 ∩ S2 = ∅) i := 0, T :=pr´azdn´ y strom, H := ∅ while i < log(|S1 | + |S2 |) do if existuje U ∈ H1 izomorfn´ı s Hi then U1 := U else U1 :=pr´azdn´ y strom endif if existuje U ∈ H2 izomorfn´ı s Hi then U2 := U else U2 :=pr´azdn´ y strom endif case (existuje pr´avˇe jeden nepr´azdn´ y strom V ∈ {T, U1 , U2 }) do: vloˇz V do H, T :=pr´azdn´ y strom (existuj´ı pr´avˇe dva nepr´azdn´e stromy V1 , V2 ∈ {T, U1 , U2 }) do: T :=spoj(V1 , V2 ) (vˇsechny stromy T , U1 a U2 jsou nepr´azdn´e) do: vloˇz T do H, T :=spoj(U1 , U2 ) endcase i := i + 1 enddo if T 6=pr´azdn´ y strom then vloˇz T do H endif V´ ystup:H spoj(T1 , T2 ): if f (koˇren T1 ) > f (koˇren T2 ) then vymˇen ˇ stromy T1 a T2 endif vytvoˇr nov´eho syna v koˇrene T1 v :=koˇren T2 Je vidˇet, ˇze kdyˇz oba stromy T1 a T2 jsou izomorfn´ı s Hi , pak v´ ysledn´ y strom operace spoj je izomorfn´ı s Hi+1 . Korektnost operace MERGE plyne z tohoto pozorov´an´ı a z faktu, ˇze Hj obsahuje strom izomorfn´ı s Hi , pr´avˇe kdyˇz v bin´arn´ım z´apise ˇc´ısla |Sj | je na i-t´em m´ıstˇe zprava 1, a ˇze T je nepr´azdn´ y strom, kdyˇz se prov´ad´ı posun ˇra´du pˇri sˇc´ıt´an´ı. Implementace dalˇs´ıch algoritm˚ u je podobn´a jako pro leftist haldy. INSERT(x): Vytvoˇr haldu H1 reprezentuj´ıc´ı {x} MERGE(H, H1 )
132
MIN: Prohledej prvky reprezentovan´e koˇreny vˇsech strom˚ uvH V´ ystup: nejmenˇs´ı z tˇechto prvk˚ u DELETEMIN: Prohledej prvky reprezentovan´e koˇreny vˇsech strom˚ uvH T := strom, jehoˇz koˇren reprezentuje nejmenˇs´ı prvek H1 := H \ {T } H2 := halda tvoˇren´a podstromy T urˇcen´ ymi syny koˇrene T MERGE(H1 , H2 ) Z podm´ınky (usp) je zˇrejm´e, ˇze nejmenˇs´ı prvek v S je reprezentov´an v koˇreni nˇejak´eho stromu haldy. T´ım je d´ana korektnost operace MIN. Zu ´vodn´ıho tvrzen´ı plyne, ˇze H2 v operaci DELETEMIN je binomi´aln´ı halda, a odtud plyne korektnost operace DELETEMIN. Operace DECREASE se implementuje pomoc´ı operace UP a operace INCREASE pomoc´ı operace DOWN stejnˇe jako v regul´arn´ıch hald´ach. Struktura binomi´aln´ı haldy nepodporuje pˇr´ımo operaci DELETE – ta se d´a realizovat jedinˇe jako posloupnost operac´ı DECREASE(s, ∞) a DELETEMIN. Operace MAKEHEAP se prov´ad´ı opakov´an´ım operace INSERT. 5.5.6
Sloˇ zitost
V´ ypoˇcet ˇcasov´e sloˇzitosti operac´ı pro binomi´aln´ı haldy vyuˇz´ıv´a nˇekolik zn´am´ ych fakt˚ u. Vˇ eta. Pro binomi´ aln´ı haldy algoritmy operac´ı INSERT, MIN, DELETEMIN, DECREASE a MERGE vyˇzaduj´ı ˇcas O(log(|S|)), algoritmus operace INCREASE vyˇzaduje ˇcas O(log2 (|S|)) a algoritmus operace MAKEHEAP ˇcas O(|S|). D˚ ukaz. Operace MERGE simuluje sˇc´ıt´an´ı pˇrirozen´ ych ˇc´ısel v bin´arn´ım z´apise a m´a tedy stejnou sloˇzitost. Protoˇze kaˇzd´ y bˇeh cyklu vyˇzaduje ˇcas O(1), algoritmus MERGE vyˇzaduje ˇcas O(log(|S1 | + |S2 |)). Odhad sloˇzitosti vytv´aˇren´ı haldy MAKEHEAP pˇriˇc´ıt´an´ı 1 k bin´arn´ımu ˇc´ıslu je O(1).
vyuˇz´ıv´a zn´am´eho faktu, ˇze amortizovan´a sloˇzitost
Odhad sloˇzitosti operac´ı MIN a DELETEMIN je zaloˇzen na pozorov´an´ı, ˇze binomi´aln´ı halda reprezentuj´ıc´ı mnoˇzinu S m´a tolik strom˚ u, kolik je jedniˇcek v bin´arn´ım z´apise |S|, a to je nejv´ yˇse log(|S|). Z tvrzen´ı tak´e plyne, ˇze v´ yˇska vˇsech strom˚ u v binomi´aln´ı haldˇe je ≤ log(|S|) a poˇcet syn˚ u koˇrene kaˇzd´eho stromu je tak´e ≤ log(|S|), pˇriˇcemˇz tento odhad se ned´a zlepˇsit. Odtud dost´av´ame sloˇzitost operac´ı DECREASE a INCREASE v nejhorˇs´ım pˇr´ıpadˇe.
Z tˇechto v´ ysledk˚ u je vidˇet, ˇze pˇredchoz´ı typy hald maj´ı efektivnˇejˇs´ı chov´an´ı neˇz binomi´aln´ı haldy. V´ yznam binomi´aln´ıch hald tak spoˇc´ıv´a pˇredevˇs´ım v tom, ˇze se daj´ı d´ale zobecnit (t´ımto zobecnˇen´ım jsou Fibonacciho haldy) a ˇze na nich lze kr´asnˇe ilustrovat princip, ˇze s ˇradou u ´prav je v´ yhodn´e poˇckat a neprov´adˇet je okamˇzitˇe.
133
5.5.7
L´ın´ a binomi´ aln´ı halda
N´asleduj´ıc´ı algoritmy jsou zaloˇzeny na ideji, ˇze vyvaˇzov´an´ı“ staˇc´ı prov´adˇet jen pˇri operac´ıch MIN a ” DELETEMIN, kdy je stejnˇe zapotˇreb´ı prohledat vˇsechny stromy. Z tohoto d˚ uvodu zeslab´ıme podm´ınky na binomi´aln´ı haldy. L´ın´ a binomi´ aln´ı halda H reprezentuj´ıc´ı mnoˇzinu S je seznam strom˚ u {T1 , T2 , . . . , Tk } takov´ y, ˇze 1. celkov´ y poˇcet vrchol˚ u v tˇechto stromech je roven velikosti S a existuje jednoznaˇcn´e pˇriˇrazen´ı prvk˚ u mnoˇziny S vrchol˚ um strom˚ u, kter´e splˇ nuje podm´ınku (usp) – toto pˇriˇrazen´ı je jako obvykle realizov´ano funkc´ı key; 2. kaˇzd´ y strom Ti je izomorfn´ı s nˇejak´ ym stromem Hj . V l´ın´e binomi´aln´ı haldˇe je vynech´an pˇredpoklad neizomorfnosti strom˚ u tvoˇr´ıc´ıch haldu. Tento fakt se projev´ı ve velmi jednoduch´em algoritmu pro operaci MERGE. MERGE(H1 , H2 ): Proved’ konkatenaci seznam˚ u H1 a H2 Samotn´ y algoritmus pro operaci INSERT se nezmˇen´ı, jen provede tuto implementaci operace MERGE. Operace MIN a DELETEMIN pouˇzij´ı n´asleduj´ıc´ı pomocnou proceduru vyvaz. Jej´ım vstupem je soubor seznam˚ u {Oi | i = 0, 1, . . . , k}, kde seznam Oi obsahuje jen stromy izomorfn´ı se stromem Hi . Procedura vyvaz pak z tˇechto strom˚ u vytvoˇr´ı klasickou binomi´aln´ı haldu. vyvaz({Oi | i = 0, 1, . . . , k}): i := 0, H := ∅ while existuje Oi 6= ∅ do while |Oi | > 1 do vezmi dva r˚ uzn´e stromy T1 a T2 z Oi odstraˇ n je z Oi spoj(T1 , T2 ) vloˇz do Oi+1 enddo if Oi 6= ∅ then strom T ∈ Oi odstraˇ n z Oi a vloˇz do H endif, i := i + 1 enddo V´ ystup: H MIN: Prohledej prvky reprezentovan´e koˇreny vˇsech strom˚ uvH V´ ystup: nejmenˇs´ı z tˇechto prvk˚ u stromy rozdˇel do mnoˇzin Oi = {vˇsechny stromy v H izomorfn´ı s Hi } vyvaz({Oi | i = 0, 1, . . . , ⌊log(|S|)⌋}) DELETEMIN: Prohledej prvky reprezentovan´e koˇreny vˇsech strom˚ uvH T := strom, jehoˇz koˇren reprezentuje nejmenˇs´ı prvek stromy rozdˇel do mnoˇzin Oi = {vˇsechny stromy v H izomorfn´ı s Hi r˚ uzn´e od T } ∪ {podstrom T urˇcen´ y nˇejak´ ym synem koˇrene T izomorfn´ı s Hi } vyvaz({Oi | i = 0, 1, . . . , ⌊log(|S|)⌋}) ˇ Casov´ a sloˇzitost operac´ı INSERT a MERGE pˇri l´ın´e implementaci je O(1), ale ˇcasov´a sloˇzitost operac´ı 134
MIN a DELETEMIN je v nejhorˇs´ım pˇr´ıpadˇe O(|S|). Tento odhad je velmi ˇspatn´ y, ale uk´aˇzeme, ˇze amortizovan´a sloˇzitost m´a rozumn´e hodnoty. Pˇripom´ın´ame, ˇze amortizovan´a sloˇzitost je ˇcas operace plus ohodnocen´ı v´ ysledn´e struktury minus ohodnocen´ı poˇc´ateˇcn´ı struktury. Konfiguraci ohodnot´ıme poˇctem strom˚ u v haldˇe. Tvrzen´ı. Amortizovan´a sloˇzitost operac´ı MERGE a INSERT je O(1). D˚ ukaz. Protoˇze operace MERGE nemˇen´ı poˇcet strom˚ u a protoˇze operace INSERT pˇrid´a jen jeden strom, je amortizovan´a sloˇzitost operac´ı MERGE a INSERT st´ale O(1).
Lemma. Operace vyvaz vyˇzaduje ˇcas O(k +
Pk
i=0
|Oi |)
D˚ ukaz. Plat´ı, protoˇze kaˇzd´ y bˇeh vnitˇrn´ıho while-cyklu v operaci vyvaz vyˇzaduje ˇcas O(1) a zmenˇs´ı poˇcet strom˚ u v seznamech Oi o 1.
Pozorov´ an´ı. Operace MIN bez podprocedury vyvaz vyˇzaduje ˇcas O(|H|) a operace DELETEMIN bez podprocedury vyvaz ˇcas O(H + i) pro takov´e i, ˇze T je izomorfn´ı s Hi . Uk´aˇzeme, ˇze amortizovan´a sloˇzitost operac´ı MIN a DELETEMIN pˇri l´ın´e implementaci binomi´aln´ıch hald je O(log(|S|). Lemma. Operace MIN vyˇzaduje ˇcas O(|H|) a operace DELETEMIN ˇcas O(|H| + log(|S|)) D˚ ukaz. Podle tvrzen´ı v ˇca´sti 5.5.3 je i ≤ log(|S|), d´ale plyne z pˇredchoz´ıho.
Vˇ eta. Amortizovan´a sloˇzitost operace MIN a DELETEMIN je O(log(|S|)). D˚ ukaz. Ohodnocen´ı klasick´e binomi´aln´ı haldy je nejv´ yˇse log(|S|) (obsahuje tolik strom˚ u, kolik je 1 v bin´arn´ım z´apise ˇc´ısla |S|). Z toho dost´av´ame, ˇze amortizovan´a sloˇzitost operace MIN je O(|H| − |H| + log(|S|)) = O(log(|S|)). Tak´e amortizovan´a sloˇzitost operace DELETEMIN je O(|H| + log(|S|) − |H| + log(|S|)) = O(log(|S|)).
Protoˇze si funkci ohodnocen´ı vol´ıme, m˚ uˇzeme pouˇz´ıt takov´e multiplikativn´ı koeficienty, aby jednotka ˇcasu odpov´ıdala jednotce v amortizovan´e sloˇzitosti. Proto lze |H| od sebe odeˇc´ıst.
135
5.6 5.6.1
Fibonacciho haldy Motivace
V´ yznam Fibonacciho hald urˇcuje fakt, ˇze amortizovan´a sloˇzitost operac´ı INSERT a DECREASE v tˇechto hald´ach je O(1) a amortizovan´a sloˇzitost operace DELETEMIN je O(log(|S|). Proto se hodnˇe pouˇz´ıvaj´ı v grafov´ ych algoritmech, kde umoˇzn ˇuj´ı v mnoha pˇr´ıpadech dos´ahnout asymptoticky t´emˇeˇr line´arn´ı sloˇzitosti. Nezn´ame vˇsak ˇza´dn´e experiment´aln´ı v´ ysledky, kter´e by porovn´avaly pouˇzit´ı Fibonacciho hald a napˇr. d-regul´arn´ıch hald v tˇechto grafov´ ych algoritmech v praxi. Takˇze nezn´ame podm´ınky, za kter´ ych jsou Fibonacciho haldy lepˇs´ı neˇz tˇreba d-regul´arn´ı haldy, ani nev´ıme, do jak´e m´ıry je to jen teoretick´ y v´ ysledek a do jak´e m´ıry jsou opravdu prakticky pouˇziteln´e. 5.6.2
Velmi neform´ aln´ı definice
Fibonacciho halda je opˇet kolekce strom˚ u. Jde tu ale o to, ˇze ve Fibonacciho haldˇe je v kaˇzd´em stromˇe s k syny alespoˇ n Fk+2 prvk˚ u – toho dos´ahneme tak, ˇze se halda straˇsnˇe ˇcasto“ rozpad´a – kaˇzd´emu vrcholu ” m˚ uˇzeme odebrat maxim´alnˇe jednoho syna. Jakmile bychom mu chtˇeli odebrat dalˇs´ıho, tak ho m´ısto toho useknem a d´ame jako dalˇs´ı strom. 5.6.3
M´ enˇ e neform´ aln´ı definice
Neform´alnˇe ˇreˇceno, je Fibonacciho halda mnoˇzina strom˚ u, jejichˇz nˇekter´e vrcholy r˚ uzn´e od koˇren˚ u jsou oznaˇceny, a kde existuje jednoznaˇcn´a korepondence mezi prvky S a vrcholy strom˚ u (realizov´ana funkc´ı key), kter´a splˇ nuje podm´ınku (usp). Toto je vˇsak jen pˇribliˇzn´e vyj´adˇren´ı. Existuj´ı totiˇz struktury, na kter´e se tento popis hod´ı, ale nevznikly z pr´azdn´e Fibonacciho haldy aplikac´ı posloupnosti haldov´ ych operac´ı. Pˇritom d˚ ukaz efektivity Fibonacciho hald se dosti v´ yraznˇe op´ır´a o fakt, ˇze halda vznikla z pr´azdn´e haldy aplikac´ı algoritm˚ u pro Fibonacciho haldy. Proto nejprve pop´ıˇseme algoritmy pro tyto operace, a pak budeme definovat Fibonacciho haldy jako ty struktury vznikl´e z pr´azdn´e haldy aplikac´ı posloupnosti tˇechto algoritm˚ u. 5.6.4
Algoritmy
V algoritmech pˇredpokl´ad´ame, ˇze Fibonacciho halda je seznam strom˚ u, kde nˇekter´e vrcholy r˚ uzn´e od koˇren˚ u jsou oznaˇceny. Vrchol je oznaˇcen, pr´avˇe kdyˇz nen´ı koˇren a kdyˇz mu byl nˇekdy dˇr´ıve odtrˇzen nˇekter´ y jeho syn. Toto se nezaznamen´av´a pro koˇreny strom˚ u. Proto kdyˇz se vrchol stane koˇrenem (odtrˇzen´ım podstromu urˇcen´eho t´ımto vrcholem), zapomene se tento u ´daj a zaˇcne se znovu zaznamen´avat, aˇz kdyˇz ˇ vrchol pˇrestane b´ yt koˇrenem. Rekneme, ˇze strom m´a rank i, kdyˇz jeho koˇren m´a i syn˚ u. Tento fakt nahrazuje test pouˇz´ıvan´ y v binomi´aln´ıch hald´ach, ˇze strom je izomorfn´ı se stromem Hi . Algoritmy pro operace MERGE, INSERT, MIN a DELETEMIN jsou zaloˇzeny na stejn´ ych idej´ıch jako algoritmy pro l´ınou implementaci v binomi´aln´ıch hald´ach, pouze poˇzadavek, aby strom byl izomorfn´ı s Hi , je nahrazen poˇzadavkem, ˇze m´a rank i. Algoritmy pro operace DECREASE, INCREASE a DELETE vych´azej´ı z algoritm˚ u pro tyto operace v leftist hald´ach. V algoritmech pˇredpokl´ad´ame, ˇze −1 3 c = log ( 2 ). MERGE(H1 , H2 ): Proved’ konkatenaci seznam˚ u H1 a H2 136
INSERT(x): Vytvoˇr haldu H1 reprezentuj´ıc´ı {x} MERGE(H, H1 ) MIN: Prohledej prvky reprezentovan´e koˇreny vˇsech strom˚ uvH V´ ystup: nejmenˇs´ı z tˇechto prvk˚ u stromy rozdˇel do mnoˇzin Oi = {vˇ sechny stromy v H s rankem i} √ vyvaz1({Oi | i = 0, 1, . . . , ⌊c log( 5|S| + 1)⌋}) DELETEMIN: Prohledej prvky reprezentovan´e koˇreny vˇsech strom˚ uvH T := strom, jehoˇz koˇren reprezentuje nejmenˇs´ı prvek stromy rozdˇel do mnoˇzin Oi = {vˇsechny stromy v H s rankem i r˚ uzn´e od T } ∪ {podstrom T urˇcen´ y nˇekter´ ym synem koˇrene T s rankem i} √ vyvaz1({Oi | i = 0, 1, . . . , ⌊c log( 5|S| + 1)⌋}) vyvaz1({Oi | i = 0, 1, . . . , k}): i := 0, H := ∅ while existuje Oi 6= ∅ do while |Oi | > 1 do vezmi dva r˚ uzn´e stromy T1 a T2 z Oi odstraˇ n je z Oi spoj(T1 , T2 ) vloˇz do Oi+1 enddo if Oi 6= ∅ then strom T ∈ Oi odstraˇ n z Oi a vloˇz ho do H endif i := i + 1 enddo V´ ystup: H spoj(T1 , T2 ): if f (koˇren T1 ) > f (koˇren T2 ) then vymˇen ˇ stromy T1 a T2 endif vytvoˇr nov´eho syna v koˇrene T1 v :=koˇren T2 DECREASE(s, a): T :=strom v H, kter´ y obsahuje vrchol reprezentuj´ıc´ı s v :=vrchol stromu T reprezentuj´ıc´ı s if v nen´ı koˇren then odtrhni podstrom T ′ urˇcen´ y vrcholem v vyvaz2(T, v) if v byl oznaˇcen then zruˇs oznaˇcen´ı v endif vloˇz T ′ do H endif f (v) := f (v) − a
137
INCREASE(s, a): T :=strom v H, kter´ y obsahuje vrchol reprezentuj´ıc´ı s v :=vrchol stromu T reprezentuj´ıc´ı s if v nen´ı list then odtrhni podstrom T ′ urˇcen´ y vrcholem v if v nen´ı koˇren then vyvaz2(T, v) endif if v byl oznaˇcen then zruˇs oznaˇcen´ı v endif zruˇs oznaˇcen´ı vˇsech syn˚ u vrcholu v odtrhni podstromy T ′ urˇcen´e vˇsemi syny v a vloˇz je do H do H vloˇz strom maj´ıc´ı jen vrchol v endif f (v) := f (v) + a DELETE(s): T :=strom v H, kter´ y obsahuje vrchol reprezentuj´ıc´ı s v :=vrchol stromu T reprezentuj´ıc´ı s if v nen´ı list then zruˇs oznaˇcen´ı syn˚ u vrcholu v odtrhni podstromy urˇcen´e vˇsemi syny vrcholu v a vloˇz je do H endif if v nen´ı koˇren then vyvaz2(T, v) endif zruˇs vrchol v vyvaz2(T, v): u := otec v while u je oznaˇcen do u′ := otec(u), zruˇs oznaˇcen´ı u odtrhni podstrom T ′ urˇcen´ y vrcholem u ′ ′ vloˇz T do H, u := u enddo if u nen´ı koˇren T then oznaˇc u endif Vˇsimnˇeme si, ˇze kdyˇz stromy T1 a T2 maj´ı rank i, pak procedura spoj(T1 , T2 ) vytvoˇr´ı strom s rankem i + 1. Aby algoritmy pro operace MIN a DELETEMIN byly korektn´ı, mus´ ıme uk´azat, ˇze vˇsechny stromy ve √ Fibonacciho haldˇe H reprezentuj´ıc´ı mnoˇzinu S maj´ı rank nejv´ yˇse c log( 5|S| + 1). Jen tak zajist´ıme, aby v´ ysledn´a halda reprezentovala S, respektive S \ {prvek s nejmenˇs´ı hodnotou f }.
Operace vyvaz2 zajiˇst’uje, ˇze od kaˇzd´eho vrcholu stromu r˚ uzn´eho od koˇrene byl v tomto stromˇe odtrˇzen podstrom nejv´ yˇse jednoho syna – v tom pˇr´ıpadˇe je tento prvek oznaˇcen a kdyˇz se mu odtrh´av´a podstrom dalˇs´ıho syna, bude odtrˇzen i cel´ y podstrom tohoto vrcholu (t´ım se tento vrchol stane koˇrenem stromu). Kdyˇz se pozdˇeji stane tento vrchol zase vrcholem r˚ uzn´ ym od koˇrene, cel´ y proces se opakuje. 5.6.5
Sloˇ zitost operac´ı
Naˇs´ım c´ılem bude odhadnout amortizovanou sloˇzitost tˇechto operac´ı, protoˇze sloˇzitost v nejhorˇs´ım pˇr´ıpadˇe nen´ı pouˇziteln´ y v´ ysledek. Abychom to mohli udˇelat, spoˇc´ıt´ame parametry sloˇzitosti jednotliv´ ych operac´ı: MERGE – ˇcasov´a sloˇzitost O(1), nevznik´a ˇza´dn´ y nov´ y strom, oznaˇcen´e vrcholy se nemˇen´ı; INSERT – ˇcasov´a sloˇzitost O(1), pˇribyl jeden strom, oznaˇcen´e vrcholy se nemˇen´ı; MIN – ˇcasov´a sloˇzitost O(|H|), po proveden´ı operace r˚ uzn´e stromy v haldˇe maj´ı r˚ uzn´e ranky, oznaˇcen´e vrcholy se nemˇen´ı; 138
DELETEMIN – ˇcasov´a sloˇzitost O(|H| + poˇcet syn˚ u v), kde v reprezentoval prvek s nejmenˇs´ı hodnotou f . Po proveden´ı operace r˚ uzn´e stromy v haldˇe maj´ı r˚ uzn´e ranky, ˇza´dn´ y nov´ y vrchol nebyl oznaˇcen, nˇekter´e oznaˇcen´e vrcholy pˇrestaly b´ yt oznaˇcen´e; DECREASE – ˇcasov´a sloˇzitost O(1+c), kde c je poˇcet vrchol˚ u, kter´e pˇrestaly b´ yt oznaˇcen´e. Bylo pˇrid´ano 1 + c nov´ ych strom˚ u a byl oznaˇcen nejv´ yˇse jeden vrchol; INCREASE – ˇcasov´a sloˇzitost O(1 + c + d), kde c je poˇcet vrchol˚ u, kter´e pˇrestaly b´ yt oznaˇcen´e, d je poˇcet syn˚ u vrcholu v reprezentuj´ıc´ıho prvek, jehoˇz hodnota se zvyˇsuje. Bylo pˇrid´ano nejv´ yˇse 1 + c + d nov´ ych strom˚ u a byl oznaˇcen nejv´ yˇse jeden vrchol; DELETE – ˇcasov´a sloˇzitost O(1 + c + d), kde c je poˇcet vrchol˚ u, kter´e pˇrestaly b´ yt oznaˇcen´e, d je poˇcet syn˚ u vrcholu v reprezentuj´ıc´ıho prvek, kter´ y se m´a odstranit. Bylo pˇrid´ano nejv´ yˇse c + d nov´ ych strom˚ u a byl oznaˇcen nejv´ yˇse jeden vrchol. Pro v´ ypoˇcet amortizovan´e sloˇzitosti mus´ıme nejprve navrhnout funkci ohodnocuj´ıc´ı konfigurace. Pˇri vyˇsetˇrov´an´ı l´ın´e implementace binomi´aln´ıch hald se uk´azalo, ˇze vhodn´ ym ohodnocen´ım je poˇcet strom˚ u v haldˇe. Kdyˇz si ale prohl´edneme algoritmus pro operaci DECREASE, vid´ıme, ˇze zde je vhodn´e br´at do ohodnocen´ı i poˇcet oznaˇcen´ ych vrchol˚ u, a to dokonce tak, aby se pokryl nejen ˇcas, ale i pˇr´ır˚ ustek strom˚ u. To vede k n´asleduj´ıc´ımu ohodnocen´ı konfigurace: ohodnocen´ı je poˇcet strom˚ u v konfiguraci plus dvojn´asobek poˇctu oznaˇcen´ ych vrchol˚ u. Tvrzen´ı. Necht’ ρ(n) je maxim´ aln´ı poˇcet syn˚ u vrcholu ve Fibonacciho haldˇe reprezentuj´ıc´ı n-prvkovou mnoˇzinu. Pak amortizovan´ a sloˇzitost operac´ı MERGE, INSERT a DECREASE je O(1) a operac´ı MIN, DELETEMIN, INCREASE a DELETE je O(ρ(n)). D˚ ukaz. Tohle mi v˚ ubec nen´ı jasn´e, z ˇceho by mˇelo plynout.
Abychom spoˇc´ıtali odhad ρ(n), vyuˇzijeme toho, ˇze Fibonacciho halda vznikla z pr´azdn´e haldy pomoc´ı popsan´ ych algoritm˚ u. Nejprve uvedeme jedno technick´e lemma. Lemma. Necht’ v je vrchol stromu ve Fibonacciho haldˇe a necht’ u je i-t´y nejstarˇs´ı syn vrcholu v. Pak u m´a aspoˇ n i − 2 syn˚ u. D˚ ukaz. V momentˇe, kdy se u st´aval synem v, se aplikovala operace spoj, u a v byly koˇreny strom˚ u a mˇely stejn´ y poˇcet syn˚ u. Podle pˇredpoklad˚ u mˇel vrchol v alespoˇ n i − 1 syn˚ u (jinak by u nebyl i-t´ y nejstarˇs´ı syn), a protoˇze se od u mohl odtrhnout jen jeden syn, dost´av´ame, ˇze u mus´ı m´ıt alespoˇ n i − 2 syn˚ u.
Tvrzen´ı. Necht’ v je vrchol stromu ve Fibonacciho haldˇe, kter´y m´a pr´ avˇe i syn˚ u. Pak podstrom urˇcen´y vrcholem v m´a aspoˇ n Fi+2 vrchol˚ u. D˚ ukaz. Tvrzen´ı dok´aˇzeme indukc´ı podle maxim´aln´ı d´elky cesty z vrcholu v do nˇekter´eho listu. Tato d´elka je 0, pr´avˇe kdyˇz v je list. V tom pˇr´ıpadˇe v nem´a syna a podstrom urˇcen´ y vrcholem v m´a jedin´ y vrchol. Protoˇze 1 = F2 = F0+2 , tvrzen´ı plat´ı. Mˇejme nyn´ı vrchol v, kter´ y m´a k syn˚ u, a necht’ maxim´aln´ı d´elka cesty z vrcholu v do list˚ u je j. Pˇredpokl´adejme, ˇze tvrzen´ı plat´ı pro vˇsechny vrcholy, pro nˇeˇz tato d´elka je menˇs´ı neˇz j, tedy plat´ı i pro vˇsechny syny vrcholu v. Pak pro i > 1 m´a i-t´ y nejstarˇs´ı syn vrcholu v podle pˇredchoz´ıho lemmatu alespoˇ n i − 2 syn˚ u a podle indukˇcn´ıho pˇredpokladu podstrom urˇcen´ y t´ımto synem m´a alespoˇ n Fi vrchol˚ u. Odtud dost´av´ame, ˇze podstrom urˇcen´ y vrcholem v m´a alespoˇ n 1 + F2 +
k X
Fi = 1 +
i=2
139
k X i=1
Fi
vrchol˚ u, protoˇze F1 = F2 (na lev´e stranˇe prvn´ı 1 je za vrchol v a prvn´ı F2 je za nejstarˇs´ı vrchol). Indukc´ı pak dostaneme, ˇze n X 1+ Fi = Fn+2 i=1
pro vˇsechna n ≥ 0. Skuteˇcnˇe, pro n = 0 plat´ı 1+
0 X
Fi = 1 = F2 = F0+2 ,
i=1
pro n = 1 m´ame 1+
1 X
Fi = 1 + F1 = 2 = F3 = F1+2
i=1
a z indukˇcn´ıho pˇredpokladu a z vlastnost´ı Fibonacciho ˇc´ısel plyne, ˇze 1+
n X i=1
Fi = 1 +
n−1 X
Fi + Fn = Fn+1 + Fn = Fn+2 .
i=1
Kdyˇz shrneme tato fakta, dost´av´ame, ˇze podstrom urˇcen´ y vrcholem v m´a alespoˇ n Fi+2 vrchol˚ u, a tvrzen´ı je dok´az´ano.
Pozn. studenta – zde se naprosto ztr´ac´ım v toku vzorc˚ u. Snad aspoˇ n p´ıˇsu dobˇre, co se snaˇz´ıme dokazovat. Lemma. ρ(n) <
√ log2 ( 5n+1) (log2 3)−1
−2
D˚ ukaz. Vezmˇeme nyn´ı nejmenˇs´ı i takov´e, ˇze n < Fi . Protoˇze posloupnost {Fi }∞ ı, plyne z i=1 je rostouc´ pˇredchoz´ıho tvrzen´ı, ˇze kaˇzd´ y vrchol ve Fibonacciho haldˇe reprezentuj´ıc´ı n−prvkovou mnoˇzinu m´a m´enˇe neˇz i − 2 syn˚ u (kdyˇz vrchol v Fibonacciho haldy m´a i − 2 syn˚ u, pak podstrom vrcholu v reprezentuje mnoˇzinu alespoˇ n s Fi prvky). Proto ρ(n) < i − 2. K odhadu velikosti i pouˇzijeme explicitn´ı vzorec pro i-t´e Fibonacciho ˇc´ıslo: √ √ √ √ 1− 5 i 1+ 5 i − 1 1 + 5 i 1 1 − 5 i 2 2 √ =√ −√ . Fi = 2 2 5 5 5 √ √ √ i Protoˇze 0 > 1−2 5 > − 43 a protoˇze 5 > 2, dost´av´ame, ˇze | √15 1−2 5 | < 38 pro vˇsechna i = 1, 2, . . . , a tedy √ √ 1 1 + 5 i 3 1 1 + 5 i 3 √ − < Fi < √ + . 2 8 2 8 5 5
Odtud plyne, ˇze kdyˇz i splˇ nuje
pak n < Fi . Pˇreveden´ım n´asleduj´ıc´ı ekvivalenci:
3 8
√ 1 1 + 5 i 3 n≤ √ − , 2 8 5
na druhou stranu v´ yrazu, jeho vyn´asoben´ım
√ √ √ 1 + 5 3 5 ) ≤ i log2 log2 ( 5n + 8 2 140
⇔
√
5 a zlogaritmov´an´ım dostaneme
√ 1 1 + 5 i 3 n≤ √ − . 2 8 5
Z
√ 3 5 8
<1az
3 2
<
√ 1+ 5 2
plyne, ˇze √ log2 ( 5n +
√ 3 5 ) 8 √ 1+ 5 log2 2
√ log2 ( 5n + 1) . < log2 32
Tedy plat´ı n´asleduj´ıc´ı implikace √ log2 ( 5n + 1)
√ log2 ( 5n+1) log2 3−1
=⇒
√ log2 ( 5n + log2
< i, pak n < Fi , a tedy ρ(n) < i − 2.
√ 3 5 ) 8 √ 1+ 5 2
< i.
V´ ysledky shrneme do n´asleduj´ıc´ı vˇety: Vˇ eta. Ve Fibonacciho haldˇe, kter´ a reprezentuje n-prvkovou mnoˇzinu, m´a kaˇzd´y vrchol stupeˇ n menˇs´ı neˇz √ log2 ( 5n + 1) − 2. (log2 3) − 1 Amortizovan´a sloˇzitost operac´ı INSERT, MERGE a DECREASE je O(1) a amortizovan´ a sloˇzitost operac´ı MIN, DELETEMIN, INCREASE a DELETE je O(log n). Operace MIN a DELETEMIN jsou korektn´ı. √ 1+ 5 2
Pro u ´plnost dok´aˇzeme, ˇze Fi =
i
− √ 5
√ 1− 5 2
i
.
D˚ ukaz. Pro i = 1 plat´ı √ 1+ 5 1 2
− √ 5
√ 1− 5 1 2
=
1+
√
5−1+ √ 2 5
√
5
√ 2 5 = √ = 1 = F1 . 2 5
Pro i = 2 plat´ı √ 1+ 5 2 2
− √ 5
√ 1− 5 2 2
√ √ √ 1+2 5+5−1+2 5−5 4 5 √ = = √ = 1 = F2 . 4 5 4 5
Indukˇcn´ı krok: √ 1+ 5 i 2
− √ 5
√ 1− 5 i 2
√ √ 1+ 5 i−2 3+ 5 2 2
=
√ √ 1+ 5 i−2 1+ 5 2 2 2
− √ 5
√ √ 1− 5 i−2 1− 5 2 2 2
=
√ √ i−2 3− 5 − 1−2 5 2 √ = 5 √ √ √ √ 1+ 5 i−2 1+ 5 1− 5 i−2 1− 5 1 + − 1 + 2 2 2 2 √ = 5 √ √ √ √ 1+ 5 i−2 1+ 5 i−1 1− 5 i−2 1− 5 i−1 + − − 2 2 2 2 √ = 5 √ √ √ √ 1+ 5 i−2 1+ 5 i−1 1− 5 i−2 1− 5 i−1 − − 2 2 2 2 √ √ + = Fi−2 + Fi−1 = Fi . 5 5
Tedy indukc´ı dost´av´ame poˇzadovan´ y vztah. 141
5.6.6
Aplikace
Vr´at´ıme se k Dijkstrovˇe algoritmu. Mnoˇzinu U budeme reprezentovat pomoc´ı Fibonacciho haldy. Protoˇze ohodnocen´ı je nez´aporn´e a ohodnocen´ı poˇca´teˇcn´ı haldy je 0, d´av´a odhad amortizovan´e sloˇzitosti tak´e odhad ˇcasov´e sloˇzitosti (viz odstavec IV.). Proto Dijkstr˚ uv algoritmus s pouˇzit´ım Fibonacciho haldy vyˇzaduje v nejhorˇs´ım pˇr´ıpadˇe ˇcas O(|X|(1 + log |X|) + |R|) = O(|R| + |X| log |X|). Stejn´ y v´ ysledek dostaneme i pro konstrukci nejmenˇs´ı napnut´e kostry grafu. Ot´azka je, kdy v Dijkstrovˇe algoritmu nebo v algoritmu konstruuj´ıc´ım nejmenˇs´ı napnutou kostru pouˇz´ıt Fibonacciho haldu a kdy napˇr. d-regul´arn´ı haldy. Lze ˇr´ıci, ˇze Fibonacciho halda by mˇela b´ yt v´ yraznˇe lepˇs´ı pro vˇetˇs´ı, ale ˇr´ıdk´e grafy (tj. grafy s mal´ ym poˇctem hran). D´a se pˇredpokl´adat, ˇze d-regul´arn´ı haldy budou lepˇs´ı (d´ıky sv´ ym jednoduˇsˇs´ım algoritm˚ um) pro hust´e grafy (tj. grafy, kde poˇcet hran je |X|1+ε pro vhodn´e ε > 0). Probl´em je, pro kter´e hodnoty nast´av´a zlom. Nev´ım o ˇza´dn´ ych experiment´aln´ıch ani teoretick´ ych v´ ysledc´ıch tohoto typu. 5.6.7
Historick´ y pˇ rehled
Bin´arn´ı neboli 2-regul´arn´ı haldy zavedl Williams 1964. Jejich zobecnˇen´ı na d-regul´arn´ı haldy poch´az´ı od Johnsona 1975. Leftist haldy definoval Crane 1972 a detailnˇe popsal Knuth 1975. Binomi´aln´ı haldy navrhnl Vuillemin 1978, Brown 1978 je implementoval a prok´azal jejich praktickou pouˇzitelnost. Fibonacciho haldy byly zavedeny Fredmanem a Tarjanem 1987.
6
Tˇ r´ıdic´ı algoritmy
Pozn. studenta – zde jsem to jiˇz vzdal; tedy zbytek skript je t´emˇeˇr neupraven. Moˇzn´a se k tomu nˇekdy dostanu. Jednou z nejˇcastˇeji ˇreˇsen´ ych u ´loh pˇri pr´aci s daty je setˇr´ıdˇen´ı posloupnosti prvk˚ u nˇejak´eho typu. Proto velk´a pozornost byla a je vˇenov´ana tˇr´ıdic´ım algoritm˚ um ˇreˇs´ıc´ım tuto u ´lohu, kter´a sv´ ym charakterem a sv´ ymi poˇzadavky na algoritmy je ˇrazena do datov´ ych struktur. Byla navrˇzena ˇrada algoritm˚ u, kter´e se st´ale jeˇstˇe analyzuj´ı a optimalizuj´ı. Anal´ yzy jsou velmi detailn´ı a algoritmy se studuj´ı za r˚ uzn´ ych vstupn´ıch pˇredpoklad˚ u. Kromˇe toho tˇr´ıdˇen´ı je jedna z m´ala u ´loh, pro kterou alespoˇ n za jist´ ych pˇredpoklad˚ u um´ıme spoˇc´ıtat doln´ı odhad sloˇzitosti. Formulace u ´lohy: ’ Necht U je tot´alnˇe uspoˇra´dan´e univerzum. Vstup: Prost´a posloupnost {a1 , a2 , . . . , an } prvk˚ u z univerza U . V´ ystup: Rostouc´ı posloupnost {b1 , b2 , . . . , bn } takov´a, ˇze {ai | i = 1, 2, . . . , n} = {bi | i = 1, 2, . . . , n}. Tento probl´em se naz´ yv´a tˇr´ıdˇen´ı. V praxi se setk´av´ame s ˇradou jeho modifikac´ı, a nichˇz asi nejbˇeˇznˇejˇs´ı je vynech´an´ı pˇredpokladu, ˇze vstupem je prost´a posloupnost. Pak jsou dvˇe varianty ˇreˇsen´ı – bud’ se ve v´ ystupn´ı posloupnosti odstran´ı duplicity nebo v´ ystupn´ı posloupnost zachov´a ˇcetnost prvk˚ u ze vstupn´ı posloupnosti. Z´akladn´ı algoritmy, kter´e ˇreˇs´ı tˇr´ıdic´ı probl´em, jsou QUICKSORT, MERGESORT a HEAPSORT. 6.0.8
HEAPSORT
S algoritmem HEAPSORT jsme se sezn´amili pˇri aplikac´ıch hald. Byl to prvn´ı algoritmus pouˇz´ıvaj´ıc´ı haldy (bin´arn´ı regul´arn´ı haldy byly definov´any pr´avˇe pˇri n´avrhu HEAPSORTU). Pod´ıv´ame se detailnˇeji na jednu z jeho implementac´ı, kter´a tˇr´ıd´ı takzvanˇe na m´ıstˇe. 142
Tˇr´ıdic´ı algoritmy se ˇcasto pouˇz´ıvaj´ı jako podprocedura pˇri ˇreˇsen´ı jin´ ych u ´loh. V takov´em pˇr´ıpadˇe je obvykle vstupn´ı posloupnost uloˇzena v poli v pracovn´ı pamˇeti programu a poˇzadavkem je setˇr´ıdit ji bez pouˇzit´ı dalˇs´ı pamˇeti pouze s v´ yjimkou omezen´eho (mal´eho) poˇctu pomocn´ ych promˇenn´ ych. Pro ˇreˇsen´ı tohoto probl´emu se hod´ı HEAPSORT. Zvol´ıme implementaci HEAPSORTU pomoc´ı d-regul´arn´ıch hald, kter´e jsou reprezentov´any polem, v nˇemˇz je uloˇzena vstupn´ı posloupnost (viz odstavec Aplikace v kapitole o d-regul´arn´ıch hald´ach). Pouˇzijeme algoritmus s jedinou zmˇenou – budeme poˇzadovat du´aln´ı podm´ınku na uspoˇra´d´an´ı (to znamen´a, ˇze prvek reprezentovan´ y vrcholem bude menˇs´ı neˇz prvek reprezentovan´ y jeho otcem) a nahrad´ıme operace MIN a DELETEMIN operacemi MAX a DELETEMAX. V algoritmu vˇzdy um´ıst´ıme odebran´e maximum na m´ısto prvku v posledn´ım listu haldy (tj. prvku, kter´ y ho pˇri operaci DELETEMAX nahradil) m´ısto toho, abychom ho vloˇzili do v´ ystupn´ı posloupnosti. Mus´ıme si ale pamatovat, kde v poli konˇc´ı reprezentovan´a halda. Kaˇzd´a aplikace operace DELETEMAX zkr´at´ı poˇca´teˇcn´ı u ´sek pole reprezentuj´ıc´ıho haldu o jedno m´ısto a z´aroveˇ n o toto m´ısto zvˇetˇs´ı druhou ˇca´st, ve kter´e je uloˇzena jiˇz setˇr´ıdˇen´a ˇca´st posloupnosti. HEAPSORTU je st´ale vˇenov´ana velk´a pozornost a bylo navrˇzeno nˇekolik jeho modifikac´ı, snaˇz´ıc´ıch se napˇr. minimalizovat poˇcet porovn´an´ı prvk˚ u apod. 6.0.9
MERGESORT
Nejstarˇs´ı z uveden´ ych algoritm˚ u je MERGESORT, kter´ y je starˇs´ı neˇz je poˇc´ıtaˇcov´a ´era, nebot’ nˇekter´e jeho verze se pouˇz´ıvaly uˇz pˇri mechanick´em tˇr´ıdˇen´ı. Pop´ıˇseme jednu jeho iteraˇcn´ı verzi, tzv. pˇrirozen´ y MERGESORT. MERGESORT(a1 , a2 , . . . , an ): Q je pr´azdn´a fronta, i = 1 while i ≤ n do j := i while i < n a ai+1 > ai do i := i + 1 enddo posloupnost P = (aj , aj+1 , . . . , ai ) vloˇz do Q i := i + 1 enddo while |Q| > 1 do vezmi P1 a P2 dvˇe posloupnosti z vrcholu Q odstraˇ n P1 a P2 z Q MERGE(P1 , P2 ) vloˇz na konec Q enddo V´ ystup: posloupnost z Q MERGE(P1 = (a1 , a2 , . . . , an ), P2 = (b1 , b2 , . . . , bm )): P := je pr´azdn´a posloupnost, i := 1, j := 1, k := 1 while i ≤ n a j ≤ m do if ai < bj then ck := ai , i := i + 1, k := k + 1 else ck := bj , j := j + 1, k := k + 1 endif enddo while i ≤ n do ck := ai , i := i + 1, k := k + 1 enddo while j ≤ m do ck := bj , j := j + 1, k := k + 1 143
enddo V´ ystup: P = (c1 , c2 , . . . , cn+m ) Vˇsimnˇeme si, ˇze vˇsechny posloupnosti v Q jsou rostouc´ı a ˇze sjednocen´ım vˇsech jejich prvk˚ u je vˇzdy na zaˇca´tku bˇehu cyklu while |Q| > 1 do mnoˇzina {ai | i = 1, 2, . . . , n}. Protoˇze poˇcet posloupnost´ı ve frontˇe Q je nejv´ yˇse roven d´elce vstupn´ı posloupnosti a kaˇzd´ y pr˚ ubˇeh tohoto cyklu zmenˇs´ı jejich poˇcet o 1, je algoritmus MERGESORT korektn´ı. Spoˇc´ıt´ame ˇcasovou sloˇzitost MERGESORTU. Nejprve vyˇsetˇr´ıme sloˇzitost podprocedury MERGE. Protoˇze urˇcen´ı prvku ck vyˇzaduje ˇcas O(1) (provede se nejv´ yˇse jedno porovn´an´ı) a protoˇze maxim´aln´ı hodnota k je n + m, dost´av´ame, ˇze podprocedura MERGE vyˇzaduje ˇcas O(n + m) (nejv´ yˇse n + m porovn´an´ı), kde n a m jsou d´elky vstupn´ıch posloupnost´ı. Nyn´ı vypoˇcteme sloˇzitost hlavn´ı procedury. Zˇrejmˇe prvn´ı cyklus vyˇzaduje line´arn´ı ˇcas. Vyˇsetˇr´ıme druh´ y cyklus prob´ıhaj´ıc´ı pˇres frontu Q. Pˇredpokl´adejme, ˇze pˇred prvn´ım bˇehem tohoto cyklu je na vrcholu Q speci´aln´ı znak ♮, kter´ y se vˇzdy pouze pˇrenese z vrcholu Q na jej´ı konec. Protoˇze mezi dvˇema pˇrenosy ♮ projde kaˇzd´ y prvek vstupn´ı posloupnosti podprocedurou MERGE pr´avˇe jednou, vyˇzaduj´ı jednotliv´e bˇehy cyklu ˇcas O(n), kde n je d´elka vstupn´ı posloupnosti (a z´aroveˇ n souˇcet vˇsech d´elek posloupnost´ı v Q). Vˇsechny posloupnosti v Q maj´ı na poˇca´tku d´elku ≥ 1. Odtud jednoduchou indukc´ı dostaneme, ˇze po i-t´em pˇrenosu znaku ♮ maj´ı d´elku ≥ 2i−1 . Proto poˇcet pˇrenos˚ u je nejv´ yˇse ⌈log2 n⌉, a tedy algoritmus MERGESORT vyˇzaduje ˇcas O(n log n) (provede se nejv´ yˇse n log n porovn´an´ı). Vzhledem k poˇctu porovn´an´ı je MERGESORT optim´aln´ı tˇr´ıdic´ı algoritmus. Nav´ıc v t´eto verzi je adaptivn´ı na pˇredtˇr´ıdˇen´e posloupnosti, kter´e maj´ı jen mal´ y poˇcet dlouh´ ych setˇr´ıdˇen´ ych u ´sek˚ u (bˇeh˚ u). Pˇri konstantn´ım poˇctu bˇeh˚ u m´a sloˇzitost O(n). Jin´a jeho verze, kter´a zaˇc´ın´a sl´ev´an´ı vˇzdy od jednoprvkov´ ych posloupnost´ı (tzv. pˇr´ım´ y MERGESORT) tuto vlastnost nem´a. 6.0.10
QUICKSORT
Nyn´ı pop´ıˇseme patrnˇe v˚ ubec nejpouˇz´ıvanˇejˇs´ı tˇr´ıdic´ı algoritmus, kter´ ym je QUICKSORT. D˚ uvodem je, ˇze pro obecnou posloupnost je nejrychlejˇs´ı, pˇri rovnomˇern´em rozloˇzen´ı vstupn´ıch polsoupnost´ı m´a nejmenˇs´ı oˇcek´avan´ y ˇcas. Quick(ai , ai+1 , . . . , aj ): if i = j then V´ ystup: (ai ) else zvol k takov´e, ˇze i ≤ k ≤ j, a := ak , vymˇen ˇ ai a ak , l := i + 1, q := j while true do while al < a do l := l + 1 enddo while aq > a do q := q − 1 enddo if l ≥ q then exit else vymˇen ˇ al a aq , l := l + 1, q := q − 1 endif enddo if i + 1 = l then V´ ystup(a,Quick(aq+1 , aq+2 , . . . , aj )) else if j = q then V´ ystup(Quick(ai+1 , ai+2 , . . . , al−1 ), a) else 144
V´ ystup(Quick(ai+1 , ai+2 , . . . , al−1 ), a,Quick(aq+1 , . . . , aj )) endif endif endif QUICKSORT(a1 , a2 , . . . , an ): V´ ystup(Quick(a1 , a2 , . . . , an )) Algoritmus Quick setˇr´ıd´ı posloupnost (ai , ai+1 , . . . , aj ) tak, ˇze pro prvek a = ak vytvoˇr´ı posloupnost (ai , ai+1 , . . . , al−1 ) vˇsech prvk˚ u menˇs´ıch neˇz a a posloupnost (aq+1 , . . . , aj ) vˇsech prvk˚ u vˇetˇs´ıch neˇz a. Na tyto posloupnosti pak zavol´a s´am sebe a do v´ ysledn´e posloupnosti uloˇz´ı nejprve setˇr´ıdˇenou prvn´ı posloupnost, pak prvek a a nakonec setˇr´ıdˇenou druhou posloupnost. Korektnost procedury Quick i algoritmu QUICKSORT je tedy zˇrejm´a, protoˇze l ≤ j a i ≤ q. Procedura Quick bez rekurzivn´ıho vol´an´ı vyˇzaduje ˇcas O(j − i). Tedy kdyby ak byl medi´an (tj. prostˇredn´ı prvek) posloupnosti (ai , ai+1 , . . . , aj ), pak by algoritmus QUICKSORT v nejhorˇs´ım pˇr´ıpadˇe vyˇzadoval ˇcas O(n log n). Jak uvid´ıme pozdˇeji, medi´an lze sice nal´ezt v line´arn´ım ˇcase, ale pouˇzit´ı jak´ekoli procedury pro jeho nalezen´ı m´a za n´asledek, ˇze algoritmy MERGESORT a HEAPSORT budou rychlejˇs´ı (nikoliv asymptoticky, ale multiplikativn´ı konstanta bude v tomto pˇr´ıpadˇe vysok´a). Proto je tˇreba vybrat prvek ak (tzv. pivot) co nejrychleji. P˚ uvodnˇe se bral prvn´ı nebo posledn´ı prvek posloupnosti. Pˇri t´eto volbˇe a pˇri rovnomˇern´em rozdˇelen´ı vstup˚ u je oˇcek´avan´ y ˇcas QUICKSORTU O(n log n) a algoritmus je obvykle rychlejˇs´ı neˇz MERGESORT a HEAPSORT. Avˇsak ˇcas v nejhorˇs´ım pˇr´ıpadˇe je kvadratick´ y a dokonce pro urˇcit´a rozdˇelen´ı vstupn´ıch dat je i oˇcek´avan´ y ˇcas kvadratick´ y. Proto tuto volbu pivota nen´ı vhodn´e pouˇz´ıvat pro u ´lohy, kdy nezn´ame rozdˇelen´ı vstupn´ıch dat (mohlo by se st´at, ˇze je nevhodn´e). Jednoduˇse to lze napravit tak, ˇze budeme volit k n´ahodnˇe. Bohuˇzel pouˇzit´ı pseudon´ahodn´eho gener´atoru tak´e vyˇzaduje jist´ y ˇcas, a pak uˇz by algoritmus zase nemusel b´ yt rychlejˇs´ı neˇz algoritmy MERGESORT a HEAPSORT (nav´ıc takto n´ahodnˇe zvolen´ y prvek nen´ı skuteˇcnˇe n´ahodn´ y, ale to v tomto pˇr´ıpadˇe nevad´ı). D˚ usledkem je n´avrh vyb´ırat pivota jako medi´an ze tˇr´ı nebo pˇeti pevnˇe zvolen´ ych prvk˚ u posloupnosti. Praxe uk´azala, ˇze tento v´ ybˇer pivota je nejpraktiˇctˇejˇs´ı, d´a se prov´est rychle a zajiˇst’uje dostateˇcnou n´ahodnost. Protoˇze pˇri kaˇzd´em vol´an´ı m´a Quick jako argument kratˇs´ı vstupn´ı posloupnost, lze uk´azat, ˇze: 1. pˇri kaˇzd´e volbˇe pivota je nejhorˇs´ı ˇcas algoritmu QUICKSORT O(n2 ), 2. pokud je pivot vybr´an jednoduch´ ym a rychl´ ym zp˚ usobem (to plat´ı, i kdyˇz se vol´ı n´ahodnˇe), pak existuj´ı vstupn´ı posloupnosti, kter´e vyˇzaduj´ı ˇcas O(n2 ), 3. oˇcek´avan´ y ˇcas je O(n log n). N´asledn´a anal´ yza oˇcek´avan´eho pˇr´ıpadu je pro n´ahodnˇe zvolen´eho pivota (bez dalˇs´ıho pˇredpokladu na vstupn´ı data) nebo pro pˇr´ıpad, kdy pivot je pevnˇe zvolen a data jsou rovnomˇernˇe rozdˇelena. Uk´aˇzeme dva zp˚ usoby v´ ypoˇcty oˇcek´avan´eho ˇcasu. Jeden je zaloˇzen na nˇekolika jednoduch´ ych pozorov´an´ıch a nen´ı v nˇem mnoho poˇc´ıt´an´ı, druh´ y na rekurzivn´ım v´ ypoˇctu. Ten je poˇcetnˇe n´aroˇcnˇejˇs´ı, ale postup je standardn´ı. Hlavn´ı idea v obou pˇr´ıpadech spoˇc´ıv´a v tom, ˇze oˇcek´avan´ y ˇcas algoritmu QUICKSORT je u ´mˇern´ y oˇcek´avan´emu poˇctu porovn´an´ı v algoritmu QUICKSORT. Tento fakt plyne pˇr´ımo z popisu algoritmu. Budeme tedy poˇc´ıtat oˇcek´avan´ y poˇcet porovn´an´ı pro algoritmus QUICKSORT. Prvn´ı zp˚ usob v´ ypoˇctu: Kaˇzd´e dva prvky ai a aj algoritmus QUICKSORT porovn´a pˇri tˇr´ıdˇen´ı posloupnosti (a1 , a2 , . . . , an ) nejv´ yˇse jednou, pˇriˇcemˇz kdyˇz porovn´av´a ai a aj , pak pro nˇejak´ y bˇeh podprocedury Quick je ai nebo aj pivot, ale v pˇredchoz´ıch bˇez´ıch Quick ai ani aj nebyl pivotem (protoˇze pivot je vˇzdy vyˇrazen z n´asleduj´ıc´ıch vol´an´ı t´eto podprocedury). Necht’ (b1 , b2 , . . . , bn ) je v´ ysledn´a posloupnost. Oznaˇcme Xi,j boolskou promˇenou, kter´a m´a hodnotu 1, kdyˇz QUICKSORT provedl porovn´an´ı mezi prvky bi a bj , a jinak m´a hodnotu 0. Pˇredpokl´adejme, ˇze je 145
to n´ahodn´a veliˇcina. Kdyˇz pi,j je pravdˇepodobnost, ˇze Xi,j = 1, pak oˇcek´avan´a hodnota Xi,j je E(Xi,j ) = 0(1 − pi,j ) + 1pi,j = pi,j . Protoˇze poˇcet porovn´an´ı pˇri bˇehu algoritmu QUICKSORT je n X n X
Xi,j
i=1 j=i+1
a protoˇze oˇcek´avan´a hodnota souˇctu n´ahodn´ ych promˇenn´ ych je souˇctem oˇcek´avan´ ych hodnot, dost´av´ame, ˇze oˇcek´avan´ y poˇcet porovn´an´ı v algoritmu QUICKSORT je n X n X
E(Xi,j ) =
i=1 j=i+1
n X n X
pi,j .
i=1 j=i+1
Abychom spoˇc´ıtali pi,j , pop´ıˇseme chov´an´ı algoritmu QUICKSORT pomoc´ı modifikace stromu v´ ypoˇctu. Bude to bin´arn´ı strom, v nˇemˇz kaˇzd´ y vrchol odpov´ıd´a jednomu bˇehu podprocedury Quick. Vrchol v bude vnitˇrn´ım vrcholem, kdyˇz odpov´ıdaj´ıc´ı podprocedura volila pivota, a tento pivot bude ohodnocen´ım v. V podstromu lev´eho syna vrcholu v budou pr´avˇe vˇsechna n´asleduj´ıc´ı rekurzivn´ı vol´an´ı podprocedury Quick nad ˇca´st´ı posloupnosti, kter´a pˇredch´az´ı pivotu. Analogicky v podstromu prav´eho syna vrcholu v budou pr´avˇe vˇsechna n´asleduj´ıc´ı rekurzivn´ı vol´an´ı procedury Quick nad ˇca´st´ı posloupnosti, kter´a n´asleduje po pivotu. Listy stromu odpov´ıdaj´ı vol´an´ı procedury Quick nad jednoprvkov´ ymi posloupnostmi a kaˇzd´ y takov´ y jednotliv´ y prvek ohodnocuje pˇr´ısluˇsn´ y list. Kdyˇz vrchol v odpov´ıd´a vol´an´ı Quick nad posloupnost´ı (ai , ai+1 , . . . , aj ), pak vrcholy v podstromu lev´eho syna v jsou ohodnoceny prvky z posloupnosti (ai , ai+1 , . . . , al−1 ) a vrcholy v podstromu prav´eho syna vrcholu v jsou ohodnoceny prvky z posloupnosti (aq+1 , . . . , aj ) (po pˇrerovn´an´ı). D´ale plat´ı {al | i ≤ l ≤ j} = {bl | i ≤ l ≤ j}. Oˇc´ıslujeme vrcholy tohoto stromu prohled´av´an´ım do ˇs´ıˇrky za pˇredpokladu, ˇze lev´ y syn vrcholu pˇredch´az´ı ’ prav´emu synu. Necht (c1 , c2 , . . . , cn ) je posloupnost prvk˚ u {ai | 1 ≤ i ≤ n} v poˇrad´ı dan´em t´ımto oˇc´ıslov´an´ım. Pak plat´ı, ˇze Xi,j = 1, pr´avˇe kdyˇz prvn´ı prvek v posloupnosti (c1 , c2 , . . . , cn ) z mnoˇzi2 2 ny {bl | i ≤ l ≤ j} je bud’ bi nebo bj . Pravdˇepodobnost tohoto jevu je j−i+1 , tedy pi,j = j−i+1 pro 1 ≤ i < j ≤ n. Odtud oˇcek´avan´ y poˇcet porovn´an´ı v algoritmu QUICKSORT je n X n X
pi,j =
i=1 j=i+1
n X n X i=1
Z n n n−i+1 n X X X 2 1 1 2 = ≤ 2n( ) ≤ 2n dx = 2n ln n. j − i + 1 k k x 1 i=1 k=2 j=i+1 k=2
Druh´ y zp˚ usob v´ ypoˇctu: Oznaˇcme QS(n) oˇcek´avan´ y poˇcet porovn´an´ı proveden´ ych algoritmem QUICKSORT pˇri tˇr´ıdˇen´ı n-ˇclenn´e posloupnosti. Pak plat´ı QS(0) = QS(1) = 0 a n−1 n−1 2 X 1 X n − 1 + QS(k) + QS(n − k − 1) = n − 1 + ( QS(k)). QS(n) = n k=0 n k=0
Z toho dost´av´ame, ˇze nQS(n) = n(n − 1) + 2 Pˇrep´ıˇseme jeˇstˇe jednou tuto rovnici s n + 1 m´ısto n:
n−1 X
QS(k).
k=0
(n + 1)QS(n + 1) = (n + 1)n + 2
n X k=0
146
QS(k).
Od t´eto rovnice odeˇcteme rovnici pˇredchoz´ı a po jednoduch´e u ´pravˇe z´ısk´ame rekurentn´ı vztah QS(n + 1) =
2n n+2 + QS(n). n+1 n+1
Postupn´ ym dosazov´an´ım dostaneme ˇreˇsen´ı QS(n) =
n+1 X 1 1 = 2(n + 1) = i + 1 i i + 1 i i=3 i=2 i=2 Z n+1 n+1 X 1 1 1 1 2(n + 1) − ≤ 2(n + 1) ( dx) − = i 2 2 i=1 x i=2 n X n + 1 2(i − 1)
≤ 2(n + 1)
n X
2n ln(n + 1) + 2 ln(n + 1) − n − 1. Pro dostateˇcnˇe velk´a n tedy plat´ı
2n ln(n + 1) + 2 ln(n + 1) − n ≤ 2n ln n. 6.0.11
Porovn´ an´ı tˇ r´ıdic´ıch algoritm˚ u
Nyn´ı porovn´ame sloˇzitost algoritm˚ u HEAPSORT, MERGESORT, QUICKSORT, A-sort (byl pops´an v kapitole o (a, b)−stromech), SELECTIONSORT a INSERTIONSORT. Pˇripomeˇ nme si, ˇze SELECTIONSORT tˇr´ıd´ı posloupnost tak, ˇze jedn´ım pr˚ uchodem nalezne jej´ı nejmenˇs´ı prvek, kter´ y vyˇrad´ı a vloˇz´ı do v´ ysledn´e posloupnosti (ve verzi, kter´a tˇr´ıd´ı na m´ıstˇe, ho vymˇen´ı s lev´ ym krajn´ım prvkem pole). Tento proces pak opakuje se zbytkem p˚ uvodn´ı posloupnosti. Tato idea byla z´akladem algoritmu HEAPSORT. INSERTIONSORT tˇr´ıd´ı tak, ˇze do jiˇz setˇr´ıdˇen´eho zaˇca´tku posloupnosti vkl´ad´a dalˇs´ı prvek, kter´ y pomoc´ı v´ ymˇen zaˇrad´ı na spr´avn´e m´ısto, a tento proces (zaˇc´ın´a druh´ ym prvkem zleva) opakuje. QUICKSORT v nejhorˇs´ım pˇr´ıpadˇe vyˇzaduje ˇcas Θ(n2 ), oˇcek´avan´ y ˇcas je 9n log n, v nejhorˇs´ım pˇr´ıpadˇe 2 prov´ad´ı n2 porovn´an´ı, oˇcek´avan´ y poˇcet porovn´an´ı je 1.44n log n. Potˇrebuje n + log n + konst pamˇeti, pouˇz´ıv´a pˇr´ım´ y pˇr´ıstup k pamˇeti a nen´ı adaptivn´ı na pˇredtˇr´ıdˇen´e posloupnosti. HEAPSORT v nejhorˇs´ım pˇr´ıpadˇe vyˇzaduje ˇcas 20n log n, oˇcek´avan´ y ˇcas je ≤ 20n log n, v nejhorˇs´ım i v oˇcek´avan´em pˇr´ıpadˇe prov´ad´ı 2n log n porovn´an´ı. Potˇrebuje n + konst pamˇeti, pouˇz´ıv´a pˇr´ım´ y pˇr´ıstup k pamˇeti a nen´ı adaptivn´ı na pˇredtˇr´ıdˇen´e posloupnosti. MERGESORT v nejhorˇs´ım pˇr´ıpadˇe vyˇzaduje ˇcas 12n log n, oˇcek´avan´ y ˇcas je ≤ 12n log n, v nejhorˇs´ım i v oˇcek´avan´em pˇr´ıpadˇe prov´ad´ı n log n porovn´an´ı (nejmenˇs´ı moˇzn´ y poˇcet). Potˇrebuje 2n + konst pamˇeti, pouˇz´ıv´a sekvenˇcn´ı pˇr´ıstup k pamˇeti a m´a verzi, kter´a je adaptivn´ı na pˇredtˇr´ıdˇen´e posloupnosti s mal´ ym poˇctem bˇeh˚ u. A-sort v nejhorˇs´ım pˇr´ıpadˇe i v oˇcek´an´em pˇr´ıpadˇe vyˇzaduje ˇcas O(n log Fn ), kde F je poˇcet inverz´ı ve vstupn´ı posloupnosti, v nejhorˇs´ım i v oˇcek´avan´em pˇr´ıpadˇe prov´ad´ı O(n log Fn ) porovn´an´ı. Potˇrebuje 5n + konst pamˇeti, pouˇz´ıv´a pˇr´ım´ y pˇr´ıstup k pamˇeti a je adaptivn´ı na pˇredtˇr´ıdˇen´e posloupnosti s mal´ ym poˇctem inverz´ı. SELECTIONSORT v nejhorˇs´ım i v oˇcek´avan´em pˇr´ıpadˇe vyˇzaduje ˇcas 2n2 , poˇcet porovn´an´ı v nejhorˇs´ım 2 i v oˇcek´avan´em pˇr´ıpadˇe je n2 . Potˇrebuje n+konst pamˇeti, pouˇz´ıv´a pˇr´ım´ y pˇr´ıstup k pamˇeti a nen´ı adaptivn´ı na pˇredtˇr´ıdˇen´e posloupnosti. INSERTIONSORT v nejhorˇs´ım i v oˇcek´avan´em pˇr´ıpadˇe vyˇzaduje ˇcas O(n2 ), poˇcet porovn´an´ı v ne2 2 jhorˇs´ım pˇr´ıpadˇe je n2 , v oˇcek´avan´em pˇr´ıpadˇe n4 . Potˇrebuje n + konst pamˇeti, pouˇz´ıv´a sekvenˇcn´ı pˇr´ıstup k pamˇeti a m´a verzi, kter´a je adaptivn´ı na pˇredtˇr´ıdˇen´e posloupnosti s mal´ ym poˇctem inverz´ı. Prezentovan´e v´ ysledky byly spoˇc´ıt´any pro model RAM (viz Mehlhorn 1984). Oˇcek´avan´ y ˇcas pro HEAPSORT je prakticky stejn´ y jako jeho nejhorˇs´ı ˇcas. Byly navrˇzeny verze, kter´e optimalizuj´ı poˇcet porovn´an´ı, ale vˇetˇsinou maj´ı vˇetˇs´ı n´aroky na ˇcas, a proto aˇz na v´ yjimky nejsou pro 147
praktick´e pouˇzit´ı vhodn´e. Situace pro MERGESORT je komplikovanˇejˇs´ı, hodnˇe z´avis´ı na konkr´etn´ı verzi algoritmu. Algoritmus MERGESORT je nejvhodnˇejˇs´ı pro extern´ı pamˇeti se sekvenˇcn´ım pˇr´ıstupem k dat˚ um, pro intern´ı pamˇet’ kv˚ uli velk´e prostorov´e n´aroˇcnosti nen´ı doporuˇcov´an (je napˇr. dvojn´asobn´a proti HEAPSORTU a t´emˇeˇr dvojn´asobn´a proti QUICKSORTU). Tak´e se hod´ı pro n´avrh paraleln´ıch algoritm˚ u. Pro tˇr´ıdˇen´ı kr´atk´ ych posloupnost´ı je doporuˇcov´ano m´ısto QUICKSORTU pro posloupnosti d´elky ≤ 22 pouˇz´ıt SELECTIONSORT a pro posloupnosti d´elky ≤ 15 INSERTIONSORT. To vede k n´avrhu optimalizovan´eh QUICKSORTU, kter´ y, kdyˇz vol´a rekurzivnˇe s´am sebe na kr´atkou posloupnost, pak pouˇzije SELECTIONSORT nebo INSERTIONSORT. V algoritmu A-sort se doporuˇcuje pouˇz´ıt (2, 3)-strom. Pomˇer ˇcas˚ u spotˇrebovan´ ych algoritmy QUICKSORT, MERGESORT a HEAPSORT na klasick´ ych poˇc´ıtaˇc´ıch uv´ad´ı Mehlhorn (1984) jako 1 : 1.33 : 2.22. To vˇsak nemus´ı b´ yt pravda pro souˇcasn´e procesory, pamˇeti a operaˇcn´ı syst´emy. 6.0.12
Sl´ ev´ an´ı nestejnˇ e dlouh´ ych posloupnost´ı
V algoritmu MERGESORT jsme pouˇzili frontu, kter´a ˇr´ıdila proces sluˇcov´an´ı rostouc´ıch posloupnost´ı. Tato metoda je uspokojuj´ıc´ı a d´av´a optim´aln´ı v´ ysledek (ve smyslu ˇcasov´e n´aroˇcnosti), pokud posloupnosti ve frontˇe jsou stejnˇe dlouh´e. Pokud se ale jejich d´elky hodnˇe liˇs´ı, nedos´ahneme t´ımto zp˚ usobem optim´aln´ıho v´ ysledku. Pˇritom r˚ uzn´e verze tohoto probl´emu se vyskytuj´ı v mnoha u ´loh´ach. Jednou z prvn´ıch u ´loh, kde jsme se s n´ım setkali, je konstrukce Huffmanova k´odu – to je minim´aln´ı redundantn´ı k´od, kter´ y byl nalezen v roce 1952. K optim´aln´ımu ˇreˇsen´ı vede napˇr. postup, kter´ y je kombinac´ı ‘mergeov´an´ı’ a optimalizace a pouˇz´ıv´a metody dynamick´eho programov´an´ı. Nejprve form´alnˇe pop´ıˇseme abstraktn´ı verzi tohoto probl´emu. Vstup: Mnoˇzina rostouc´ıch navz´ajem disjunktn´ıch posloupnost´ı. ´ Ukol: Pomoc´ı operace MERGE co nejrychleji spojit vˇsechny tyto posloupnosti do jedin´e rostouc´ı posloupnosti. Pˇredpokl´adejme, ˇze m´ame postup, kter´ y z dan´ ych rostouc´ıch posloupnost´ı vytvoˇr´ı jedinou rostouc´ı posloupnost. Tento postup urˇcuje u ´pln´ y bin´arn´ı strom T , jehoˇz listy jsou ohodnoceny vstupn´ımi posloupnostmi a kaˇzd´ y vnitˇrn´ı vrchol je ohodnocen posloupnost´ı, kter´a je slouˇcen´ım vstupn´ıch posloupnost´ı ohodnocuj´ıc´ıch listy v podstromu urˇcen´em t´ımto vrcholem. Tedy koˇren je ohodnocen v´ ystupn´ı posloupnost´ı. Form´alnˇe pro kaˇzd´ y vnitˇrn´ı vrchol v plat´ı: 1. ””kdyˇz v1 a v2 jsou synov´e v a P (v) je posloupnost ohodnocuj´ıc´ı vrchol v, pak P (v) =MERGE(P (v1 ), P (v2 )). Oznaˇcme l(P ) d´ elku posloupnosti P . Pak souˇcet ˇcas˚ u, kter´e v tomto procesu vyˇzaduje podprocedura P MERGE, je O( {l(P (v)) | v je vnitˇrn´ı vrchol stromu T }). Indukc´ı lehce dostaneme, ˇze X X {l(P (v)) | v vnitˇrn´ı vrchol stromu T } = d(t)l(P (t)), {t je list T }
kde d(t) je hloubka listu t. Kdyˇz tedy T je u ´pln´ y bin´arn´ı strom, jehoˇz listy jsou ohodnoceny navz´ajem disjunktn´ımi rostouc´ımi posloupnostmi, pak n´asleduj´ıc´ı algoritmus Slevani spoj´ı tyto posloupnosti do jedin´e rostouc´ı posloupnosti a procedury MERGE budou vyˇzadovat celkov´ y ˇcas X O( d(t)l(P (t))). {t je list T }
Slevani(T, {P (l) | l je list T }) while P (koˇren T ) nen´ı definov´ano do 148
v := vrchol T takov´ y, ˇze P (v) nen´ı definov´ano a pro oba syny v1 a v2 vrcholu v jsou P (v1 ) a P (v2 ) definov´any P (v) :=MERGE(P (v1 ), P (v2 )) enddo Nyn´ı m˚ uˇzeme pˇreformulovat p˚ uvodn´ı probl´em: Vstup: n ˇc´ısel x1 , x2 , . . . , xn V´ ´pln´ y bin´arn´ı strom T s n listy a bijekce φ z mnoˇziny {1, 2, . . . , n} do list˚ u T takov´a, ˇze Pynstup: u d(φ(i))x je minim´ a ln´ ı (kde d(φ(i)) je hloubka listu φ(i)). i i=1 ˇ Rekneme, ˇze dvojice (T, φ) je optim´aln´ı strom vzhledem k x1 , x2 , . . . , xn . V pˇreformulov´an´e u ´loze uˇz nepracujeme s posloupnostmi, ale jen s jejich d´elkami. To znamen´a, ˇze kdyˇz pro p˚ uvodn´ı u ´lohu byly vstupem posloupnosti P1 , P2 , . . . , Pn , pak pro pˇreformulovanou u ´lohu jsou vstupem jen d´elky l(P1 ), l(P2 ), . . . , l(Pn ). Strom vytvoˇren´ y pro pˇreformulovanou u ´lohu je pouˇzit v algoritmu Slevani tak, ˇze posloupnost Pi ohodnocuje list, kter´ y byl v pˇreformulovan´e u ´loze ohodnocen d´elkou l(Pi ), a hledan´a posloupnost v p˚ uvodn´ı u ´loze ohodnocuje koˇren stromu. Mˇejme mnoˇzinu {xi | i = 1, 2, . . . , n}. Pro u ´pln´ y bin´arn´ı strom T s n listy a bijekci φ z mnoˇziny {1, 2, . . . , n} do list˚ u stromu T definujme n X Cont(T, φ) = d(φ(i))xi , i=1
kde d(φ(i)) je hloubka listu φ(i), tj. d´elka cesty z koˇrene do listu φ(i) pro i = 1, 2, . . . , n. Chceme zkonstruovat u ´pln´ y bin´arn´ı strom s n listy, kter´ y minimalizuje hodnotu Cont. K ˇreˇsen´ı pouˇzijeme n´asleduj´ıc´ı algoritmus, kter´ y je upravenou verz´ı hladov´eho algoritmu pro n´aˇs probl´em. Optim(x1 , x2 , . . . xn ): V je mnoˇzina n jednoprvkov´ ych strom˚ u φ je bijekce mezi {1, 2, . . . , n} a mnoˇzinou V for every v ∈ V do c(v) := xφ−1 (v) enddo while |V | > 1 do vezmi z V dva stromy v1 a v2 s nejmenˇs´ım ohodnocen´ım odstraˇ n je z V vytvoˇr nov´ y strom v spojen´ım strom˚ u v1 a v2 c(v) := c(v1 ) + c(v2 ), strom v vloˇz do V enddo V´ ystup: (T, φ), kde T je strom v mnoˇzinˇe V Vytvoˇren´ı nov´eho stromu v spojen´ım strom˚ u v1 a v2 znamen´a vytvoˇren´ı nov´eho vrcholu, kter´ y bude koˇrenem stromu v a jehoˇz synov´e budou koˇreny strom˚ u v1 a v2 . To je analogick´e proceduˇre spoj. Vˇ eta. Pro danou posloupnost ˇc´ısel (x1 , x2 , . . . , xn ) algoritmus Optim nalezne optim´aln´ı strom pro mnoˇzinu x1 , x2 , . . . , xn a pokud je posloupnost (x1 , x2 , . . . , xn ) neklesaj´ıc´ı, pak vyˇzaduje ˇcase O(n). D˚ ukaz. D˚ ukaz m´a dvˇe ˇca´sti. V prvn´ı dok´aˇzeme korektnost algoritmu a ve druh´e pop´ıˇseme reprezentaci mnoˇziny V a vypoˇcteme ˇcasovou sloˇzitost. Nejprve pˇripomeˇ nme, ˇze φ(i) je list T pro kaˇzd´e i ∈ {1, 2, . . . , n}. Protoˇze na zaˇca´tku V obsahuje jen jednoprvkov´e stromy, tak tvrzen´ı plat´ı. Kaˇzd´ y bˇeh cyklu while do zmenˇs´ı poˇcet strom˚ u V o jeden, ale nezmˇen´ı mnoˇzinu list˚ u. Proto T je strom s n listy, φ je bijekce z {1, 2, . . . , n} do mnoˇziny list˚ u T a algoritmus vˇzdy konˇc´ı. Dok´aˇzeme indukc´ı podle n, ˇze zkonstruovan´a dvojice (T, φ) je optim´aln´ı strom vzhledem k (x1 , x2 , . . . , xn ). Kdyˇz n = 2, tvrzen´ı zˇrejmˇe plat´ı. Pˇredpokl´adejme, ˇze plat´ı pro kaˇzdou posloupnost ˇc´ısel (y1 , y2 , . . . ,yn−1 ), a necht’ x1 ≤ x2 ≤ · · · ≤ xn je neklesaj´ıc´ı posloupnost ˇc´ısel. Bez u ´jmy na obecnosti m˚ uˇzeme pˇredpokl´adat, ˇze v prvn´ım kroku algoritmus Optim zvolil stromy φ(1) a φ(2). Uvaˇzujme mnoˇzinu (y1 , y2 , . . . , yn−1 ), kde yi = xi+2 pro i = 1, 2, . . . , n − 2, yn−1 = x1 + x2 . Necht’ T ′ je strom z´ıskan´ y ze stromu T odstranˇen´ım list˚ u φ(1) a φ(2) a necht’ ψ je bijekce z mnoˇziny {1, 2, . . . , n − 1} takov´a, ˇze 149
ψ(i) = φ(i+2) pro i = 1, 2, . . . , n−2 a ψ(n−1) je otec listu φ(1). Pak m˚ uˇzeme pˇredpokl´adat, ˇze algoritmus ′ Optim(y1 , y2 , . . . , yn−1 ) zkonstruoval strom (T , ψ), a podle indukˇcn´ıho pˇredpokladu je to optim´aln´ı strom pro (y1 , y2 , . . . , yn−1 ). Necht’ (U, θ) je optim´aln´ı strom vzhledem k (x1 , x2 , . . . , xn ). Zvolme vnitˇrn´ı vrchol u stromu U takov´ y, ˇze d´elka cesty z koˇrene do vrcholu u je nejvˇetˇs´ı mezi vˇsemi vnitˇrn´ımi vrcholy stromu U . Necht’ u1 a u2 jsou synov´e u, pak nutnˇe u1 a u2 jsou listy stromu U . Necht’ i, j ∈ {1, 2, . . . , n} takov´e, ˇze θ(i) = u1 , θ(j) = u2 . Po eventu´aln´ım pˇrejmenov´an´ı m˚ uˇzeme pˇredpokl´adat, ˇze kdyˇz i, j ∈ {1, 2}, pak i = 1 a j = 2. Definujme η z {1, 2, . . . , n} do list˚ u U tak, ˇze η(1) = u1 , η(2) = u2 , η(i) = θ(1), η(j) = θ(2) a η(k) = θ(k) pro vˇsechna k ∈ {3, 4, . . . , n} \ {i, j}. Pak η je bijekce a Cont(U, η) − Cont(U, θ) = (d(u1 ) − d(θ(1))(x1 − xi ) + (d(u2 ) − d(θ(2))(x2 − xj ). Z volby u plyne, ˇze d(u1 ) ≥ d(θ(1)), d(u2 ) ≥ d(θ(2)), x1 ≤ xi a x2 ≤ xj . Odtud (d(u1 ) − d(θ(1))(x1 − xi ) + (d(u2 ) − d(θ(2))(x2 − xj ) ≤ 0 a protoˇze (U, θ) je optim´aln´ı strom pro (x1 , x2 , . . . , xn ), dost´av´ame, ˇze (U, η) je tak´e optim´aln´ı strom pro (x1 , x2 , . . . , xn ). Odstranˇen´ım list˚ u u1 a u2 ze stromu U dostaneme strom U ′ . Definujme τ z {1, 2, . . . , n−1} pˇredpisem τ (i) = η(i + 2) pro i = 1, 2, . . . , n − 2 a τ (n − 1) = u. Pak τ je bijekce z {1, 2, . . . , n − 1} do mnoˇziny list˚ u U ′ a protoˇze (T ′ , ψ) je optim´aln´ı strom pro (y1 , y2 , . . . , yn−1 ), plat´ı, ˇze Cont(T ′ , ψ) ≤ Cont(U ′ , τ ). Protoˇze Cont(T, φ) = Cont(T, ψ) + x1 + x2 , Cont(U, η) = Cont(U ′ , τ ) + x1 + x2 pak z´avˇer je, ˇze (T, φ) je optim´aln´ı strom pro (x1 , x2 , . . . , xn ). Pˇredpokl´adejme opˇet, ˇze x1 ≤ x2 ≤ · · · ≤ xn a ˇze v dan´em okamˇziku jsou v1 , v2 , . . . , vk postupnˇe vytvoˇren´e v´ıceprvkov´e stromy (tj. strom vi byl vytvoˇren pˇred stromem vj , kdyˇz i < j). V tomto okamˇziku je mnoˇzina V sjednocen´ım mnoˇziny {v1 , v2 , . . . , vk } a mnoˇziny jednoprvkov´ ych strom˚ u, kter´e nebyly jeˇstˇe zpracov´any. Nyn´ı vytvoˇr´ıme strom w spojen´ım strom˚ u t1 a t2 s nejmenˇs´ım ohodnocen´ım. Z popisu algoritmu plyne, ˇze kdyˇz strom vi pro i = 1, 2, . . . , k vznikl spojen´ım strom˚ u u1 a u2 , pak max{c(u1 ), c(u2 )} ≤ min{c(t1 ), c(t2 )}, a proto c(w) ≥ c(vi ) pro kaˇzd´e i = 1, 2, . . . , k. Pak indukc´ı okamˇzitˇe dost´av´ame, ˇze c(v1 ) ≤ c(v2 ) ≤ · · · ≤ c(vk ). Tedy staˇc´ı, abychom mˇeli rostouc´ı posloupnost list˚ u a v n´ı ukazatel na nejmenˇs´ı list, kter´ y je jeˇstˇe nezpracovan´ ym jednoprvkov´ ym stromem (tj. pˇred ukazatelem jsou listy, kter´e uˇz nejsou stromy v mnoˇzinˇe V , za ukazatelem jsou listy, kter´e jsou jeˇstˇe jednoprvkov´e stromy v mnoˇzinˇe V ) a frontu v´ıceprvkov´ ych strom˚ u (z n´ıˇz stromy ke zpracov´an´ı odeb´ır´ame zpˇredu a novˇe vytvoˇren´e ukl´ad´ame na konec). Udrˇzovat tyto struktury vyˇzaduje ˇcas O(1) stejnˇe jako nalezen´ı dvou strom˚ u s nejmenˇs´ım ohodnocen´ım. M˚ uˇzeme tedy shrnout, ˇze algoritmus Optim konstruuje optim´aln´ı stromy v ˇcase O(n), kde n je poˇcet zadan´ ych ˇc´ısel xi .
Pro aplikaci na naˇsi p˚ uvodn´ı u ´lohu je tˇreba jeˇstˇe setˇr´ıdit vstupn´ı posloupnost d´elek pro pˇreformulovanou u ´lohu. Tato posloupnost je tvoˇrena pˇrirozen´ ymi ˇc´ısly a k jej´ımu setˇr´ıdˇen´ı m˚ uˇzeme pouˇz´ıt algoritmus BUCKETSORT (bude pops´an d´ale v textu), kter´ y vyˇzaduje ˇcas O(n + m), kde n je poˇcet posloupnost´ı a m je maxim´aln´ı d´elka posloupnosti.
Vˇ eta. Uveden´y algoritmus mnoˇzinu disjunktn´ıch ach l(P1 ), l(P2 ), . . . , l( Prostouc´ıch posloupnost´ı P1 , P2 , . . . , Pn o d´elk´ spoj´ı do jedin´e rostouc´ı posloupnosti v ˇcase O( ni=1 l(Pi )). 150
6.1
Rozhodovac´ı stromy
Vˇetˇsina obecn´ ych tˇr´ıdic´ıch algoritm˚ u pouˇz´ıv´a jedinou primitivn´ı operaci mezi prvky vstupn´ı posloupnosti, a to jejich vz´ajemn´e porovn´an´ı. To znamen´a, ˇze pr´aci takov´eho algoritmu lze popsat bin´arn´ım stromem, jehoˇz vnitˇrn´ı vrcholy jsou ohodnoceny porovn´an´ımi dvojic prvk˚ u vstupn´ı posloupnosti (napˇr. ai < aj ). Bez u ´jmy na obecnosti pˇredpokl´adejme, ˇze vstupn´ı posloupnost je permutace π mnoˇziny {1, 2, . . . , n}. Tato permutace proch´az´ı stromem takto: 1. ””Zaˇc´ın´a v koˇreni stromu. Kdyˇz je ve vnitˇrn´ım vrcholu v ohodnocen´em porovn´an´ım ai ≤ aj , pak kdyˇz π(i) < π(j), pokraˇcuje v lev´em synu vrcholu v, a kdyˇz π(j) < π(i), pokraˇcuje v prav´em synu vrcholu v. Proces tˇr´ıdˇen´ı konˇc´ı, kdyˇz se dostane do listu. Aby byl algoritmus korektn´ı, mus´ı platit, ˇze dvˇe r˚ uzn´e permutace skonˇc´ı v r˚ uzn´ ych listech. Tedy strom popisuj´ıc´ı korektn´ı algoritmus pro setˇr´ıdˇen´ı n-prvkov´ yvh posloupnost´ı mus´ı m´ıt alespoˇ n n! list˚ u. D´elka cesty z koˇrene do listu, kde skonˇcila permutace π, reprezentuje poˇcet porovn´an´ı, kter´e potˇrebuje dan´ y algoritmus k setˇr´ıdˇen´ı dan´e posloupnosti π. Protoˇze porovn´an´ı vyˇzaduje alespoˇ n jednotku ˇcasu, dost´av´ame t´ım i doln´ı odhad na ˇcas potˇrebn´ y k setˇr´ıdˇen´ı t´eto posloupnosti algoritmem odpov´ıdaj´ıc´ım dan´emu stromu. Doln´ı odhad poˇctu porovn´an´ı i ˇcasu pro dan´ y algoritmus a vˇsechny n-prvkov´e posloupnosti je pak d´elka nejdelˇs´ı cesty z koˇrene do listu v odpov´ıdaj´ıc´ım stromu. To n´am umoˇzn ˇuje z´ıskat obecnˇe platn´ y doln´ı odhad ˇcasu potˇrebn´eho k setˇr´ıdˇen´ı n−prvkov´e posloupnosti, kter´ ym je minimum pˇres vˇsechny bin´arn´ı stromy s alespoˇ n n! listy z jejich maxim´aln´ıch d´elek cest z koˇrene do listu. Korektnost tˇechto u ´vah plyne z pozorov´an´ı, ˇze kdyˇz porovn´an´ı je jedin´a primitivn´ı operace, pak algoritmus nen´ı z´avisl´ y na konkr´etn´ıch prvc´ıch vstupn´ı posloupnosti, ale jen na jejich vz´ajemn´em vztahu. Proto staˇc´ı uvaˇzovat pouze permutace n-prvkov´e mnoˇziny, protoˇze zachycuj´ı vˇsechny moˇzn´e vztahy v n-prvkov´e posloupnosti. D´ale je tˇreba si uvˇedomit, ˇze vztah mezi stromem pro n-prvkov´e posloupnosti a stromem pro (n + 1)-prvkov´e posloupnosti je d´an konkr´etn´ım algoritmem a ned´a se popsat obecnˇe. V nevhodn´em algoritmu se m˚ uˇze st´at, ˇze v nˇekter´em listu neskonˇc´ı ˇza´dn´a permutace. To nastane, kdyˇz strom pro n-prvkov´e posloupnosti m´a v´ıce neˇz n! list˚ u, nebo, jinak ˇreˇceno, kdyˇz porovn´an´ı dvou stejn´ ych prvk˚ u se na nˇejak´e cestˇe vyskytne alespoˇ n dvakr´at. N´asleduj´ıc´ı obr´azek ilustruje naˇse u ´vahy na SELECTIONSORTU pro 3-prvkov´e posloupnosti. Listy jsou ohodnoceny permutacemi vstupn´ı mnoˇziny {a1 , a2 , a3 }, kter´e v nich skonˇc´ı, nebo jsou pr´azdn´e. a1 < a2 a1 < a3 a2 < a3
a1 , a2 , a3 a1 , a3 , a2 a3 , a1 , a2
a2 < a3
a1 < a2
a1 < a3
a2 , a1 , a3 a2 , a3 , a1
a1 < a2
a3 , a2 , a1
Obr´azek 11: SELECTIONSORT - postup Definice. Mˇejme tˇr´ıdic´ı algoritmus A, kter´y jako jedinou primitivn´ı operaci s prvky vstupn´ı posloupnosti ˇ pouˇz´ıv´a jejich porovn´an´ı. Rekneme, ˇze bin´ arn´ı strom T , jehoˇz vnitˇrn´ı vrcholy jsou ohodnoceny porovn´an´ımi ai ≤ aj pro i, j = 1, 2, . . . , n, i 6= j, je rozhodovac´ım stromem algoritmu A pro n-prvkov´e posloupnosti, kdyˇz pro kaˇzdou permutaci π n-prvkov´e mnoˇziny plat´ı 151
1. ””posloupnost porovn´an´ı pˇri tˇr´ıdˇen´ı permutace π algoritmem A je stejn´a jako posloupnost porovn´an´ı pˇri pr˚ uchodu permutace π stromem T . Pak korektnost algoritmu zajiˇst’uje, ˇze dvˇe r˚ uzn´e permutace mnoˇziny {1, 2, . . . , n} skonˇc´ı v r˚ uzn´ ych listech stromu T a doln´ım odhadem pro ˇcas algoritmu A v nejhorˇs´ım pˇr´ıpadˇe je d´elka nejdelˇs´ı cesty z koˇrene do listu. Pˇri rovnomˇern´em rozdˇelen´ı vstupn´ıch posloupnost´ı je oˇcek´avan´ y ˇcas algoritmu A roven pr˚ umˇern´e d´elce cesty z koˇrene do listu. Definujme S(n) jako minimum pˇres vˇsechny stromy T s alespoˇ n n! listy z d´elek nejdelˇs´ıch cest z koˇrene do listu v T , A(n) jako minimum pˇres vˇsechny stromy T s alespoˇ n n! listy z pr˚ umˇern´ ych d´elek cest z koˇrene do listu v T. Naˇs´ım c´ılem je spoˇc´ıtat doln´ı odhady tˇechto veliˇcin. Kdyˇz nejdelˇs´ı cesta z koˇrene do listu v bin´arn´ım stromˇe T m´a d´elku k, pak T m´a nejv´ yˇse 2k list˚ u. Proto S(n) n! ≤ 2 . Odtud plyne, ˇze S(n) ≥ log2 n!. Pˇripomeˇ nme si Stirling˚ uv vzorec pro faktori´al: n! =
√
2πn
n n 1 1 (1 + + O( 2 )). e 12n n
1 Protoˇze pro n ≥ 1 je 12n , n12 ≥ 0, m˚ uˇzeme pˇredpokl´adat, ˇze (1 + zlogaritmov´an´ı vzorce dost´av´ame
log2 n! ≥
1 12n
+ O( n12 )) ≥ 1 pro vˇsechna n ≥ 1. Po
√ 1 1 log2 n + n(log2 n − log2 e) + log2 2π ≥ (n + ) log2 n − n log2 e. 2 2
Protoˇze e1 = e = 2log2 e = (eln 2 )log2 e = eln 2 log2 e , plat´ı, ˇze
1 ln 2
= log2 e, a tedy
1 n S(n) ≥ log2 n! ≥ (n + ) log2 n − . 2 ln 2
D´ale pro bin´arn´ı strom T oznaˇcme B(T ) souˇcet vˇsech d´elek cest z koˇrene do list˚ u a poloˇzme B(k) = min{B(T ) | T je bin´arn´ı strom s k listy}. Kdyˇz uk´aˇzeme, ˇze B(k) ≥ k log2 k, pak bude A(n) ≥
n! log2 n! 1 n B(n!) ≥ = log2 n! ≥ (n + ) log2 n − . n! n! 2 ln 2
Dokaˇzme tedy, ˇze B(T ) ≥ k log2 k pro kaˇzd´ y bin´arn´ı strom T s k listy. Kdyˇz ve stromˇe T vynech´ame kaˇzd´ y vrchol, kter´ y m´a jen jednoho syna, a tohoto syna spoj´ıme s jeho pˇredch˚ udcem, dostaneme u ´pln´ y bin´arn´ı strom T ′ s k listy takov´ y, ˇze B(T ′ ) ≤ B(T ). Proto se staˇc´ı omezit na u ´pln´e bin´arn´ı stromy. Kdyˇz T je u ´pln´ y bin´arn´ı strom s jedn´ım listem, pak B(T ) = 0 = 1 log2 1, kdyˇz T je u ´pln´ y bin´arn´ı strom se dvˇema listy, pak B(T ) = 2 = 2 log2 2. Tedy plat´ı B(1) ≥ 1 log2 1 a B(2) ≥ 2 log2 2. Pˇredpokl´adejme, ˇze B(i) ≥ i log2 i pro i < k, a necht’ T je u ´pln´ y bin´arn´ı strom s k listy. Necht’ T1 a T2 jsou podstromy urˇcen´e ’ syny koˇrene a necht Ti m´a ki list˚ u, kde i = 1, 2. Pak 1 ≤ k1 , k2 a k1 + k2 = k, tedy k1 , k2 < k a podle indukˇcn´ıho pˇredpokladu B(ki ) ≥ ki log2 ki . Odtud B(T ) = k1 + B(T1 ) + k2 + B(T2 ) ≥ k + B(k1 ) + B(k2 ) ≥ k + k1 log2 k1 + k2 log2 k2 . Tedy staˇc´ı uk´azat, ˇze k + k1 log2 k1 + k2 log2 k2 ≥ k log2 k 152
pro vˇsechna k1 , k2 > 0 takov´a, ˇze k = k1 + k2 . To je ekvivalentn´ı s tvrzen´ım, ˇze pro k > 0 plat´ı f (x) = x log2 x + (k − x) log2 (k − x) + k − k log2 k ≥ 0, kde x ∈ (0, k). Abychom to dok´azali, vˇsimnˇeme si, ˇze f ( k2 ) = 0 a poˇc´ıtejme derivaci f . f ′ (x) = log2 x + log2 e − log2 (k − x) − log2 e = log2
x . k−x
Nyn´ı kdyˇz x ∈ (0, k2 ), pak f ′ (x) < 0 a f je na tomto intervalu klesaj´ıc´ı, kdyˇz x ∈ ( k2 , k), pak f ′ (x) > 0 a f je na tomto intervalu rostouc´ı. Odtud plyne, ˇze f (x) ≥ 0 pro x ∈ (0, k). T´ım jsme dok´azali, ˇze A(n) ≥ (n + 21 ) log2 n − lnn2 . Shrneme naˇse v´ ysledky. Vˇ eta. Kaˇzd´y tˇr´ıdic´ı algoritmus, jehoˇz jedinou primitivn´ı operac´ı s prvky vstupn´ı posloupnosti je porovn´an´ı, vyˇzaduje v nejhorˇs´ım i v oˇcek´avan´em pˇr´ıpadˇe alespoˇ n cn log n ˇcasu pro nˇejakou konstantu c > 0. V ne1 n jhorˇs´ım pˇr´ıpadˇe pouˇzije alespoˇ n ⌈(n+ 2 ) log2 n− ln 2 ⌉ porovn´an´ı a oˇcek´avan´y poˇcet porovn´an´ı pˇri rovnomˇern´em rozdˇelen´ı vstupn´ıch posloupnost´ı je alespoˇ n (n + 21 ) log2 n − lnn2 . Tato vˇeta plat´ı i pro ˇsirˇs´ı tˇr´ıdu primitivn´ıch operac´ı, proto v n´ı lze oslabit pˇredpklady. Doln´ı odhad (v nejhorˇs´ım i pr˚ umˇern´em pˇr´ıpadˇe) bude platit i za pˇredpokladu, ˇze tˇr´ıdic´ı algoritmus nepouˇz´ıv´a nepˇr´ım´e adresov´an´ı a celoˇc´ıseln´e dˇelen´ı. (Na druh´e stranˇe n´asleduj´ıc´ı klasick´ y algoritmus BUCKETSORT ukazuje, ˇze pˇredpoklady ve vˇetˇe nelze zcela vynechat.) Tato metoda pro nalezen´ı doln´ıho odhadu se pouˇz´ıv´a i pro vyˇc´ıslov´an´ı algebraick´ ych funkc´ı a pˇri algoritmick´em ˇreˇsen´ı geometrick´ ych u ´loh.
6.2
Pˇ rihr´ adkov´ e tˇ r´ıdˇ en´ı
V n´asleduj´ıc´ıch algoritmech pˇredpokl´ad´ame, ˇze Qi jsou spojov´e seznamy, nov´ y prvek se vkl´ad´a na konec seznamu a konkatenace seznam˚ u z´avis´ı na jejich poˇrad´ı. V seznamech m´ame okamˇzit´ y pˇr´ıstup k prvn´ımu a posledn´ımu prvku (pomoc´ı ukazatel˚ u na tyto prvky). Algoritmus BUCKETSORT tˇr´ıd´ı posloupnost pˇrirozen´ ych ˇc´ısel a1 , a2 , . . . , an z intervalu < 0, m >. BUCKETSORT(a1 , a2 , . . . , an , m): for every i = 0, 1, . . . , m do Qi = ∅ enddo for every i = 1, 2, . . . , n do ai vloˇz na konec seznamu Qai enddo i := 0, P := ∅ while i ≤ m do P :=konkatenace P a Qi , i := i + 1 enddo V´ ystup: P je neklesaj´ıc´ı posloupnost prvk˚ u a 1 , a2 , . . . , a n Algoritmus nevyˇzaduje, aby prvky ve vstupn´ı posloupnosti byly r˚ uzn´e. Ve v´ ystupn´ı posloupnosti se dan´ y prvek opakuje tolikr´at, kolikr´at se opakoval ve vstupn´ı posloupnosti, se zachov´an´ım poˇrad´ı (tj. tˇr´ıdˇen´ı je stabiln´ı). Konkatenace dvou seznam˚ u a vloˇzen´ı prvku do seznamu vyˇzaduj´ı ˇcas O(1). Proto prvn´ı a tˇret´ı cyklus vyˇzaduj´ı ˇcas O(m) a druh´ y cyklus ˇcas O(n). Celkem algoritmus vyˇzaduje O(n + m) ˇcasu a pamˇeti. Zˇrejmˇe kdyˇz m = O(n), tak pro tento algoritmus neplat´ı tvrzen´ı vˇety z pˇredchoz´ıho odstavce. D˚ uvodem je, ˇze nejsou splnˇeny pˇredpoklady, protoˇze druh´ y cyklus pouˇz´ıv´a nepˇr´ım´e adresov´an´ı. Nyn´ı uvedeme dvˇe sofistikovanˇejˇs´ı verze tohoto algoritmu. V prvn´ı pˇredpokl´ad´ame, ˇze a1 , a2 , . . . , an je posloupnost navz´ajem r˚ uzn´ ych re´aln´ ych ˇc´ısel z intervalu < 0, 1 > a α je pevnˇe zvolen´e kladn´e re´aln´e ˇc´ıslo. HYBRIDSORT(a1 , a2 , . . . , an ): k := αn 153
for every i = 0, 1, . . . , k do Qi = ∅ enddo for every i = 1, 2, . . . , n do ai vloˇz na konec seznamu Q⌈kai ⌉ enddo i := 0, P := ∅ while i ≤ k do HEAPSORT(Qi ) P :=konkatenace P a Qi , i := i + 1 enddo V´ ystup: P je rostouc´ı posloupnost prvk˚ u a 1 , a2 , . . . , an Vˇ eta. Algoritmus HYBRIDSORT setˇr´ıd´ı posloupnost re´aln´ych ˇc´ısel z intervalu < 0, 1 > v nejhorˇs´ım pˇr´ıpadˇe v ˇcase O(n log n). Kdyˇz prvky ai maj´ı rovnomˇern´e rozloˇzen´ı a jsou na sobˇe nez´ avisl´e, pak oˇcek´avan´y ˇcas je O(n). D˚ ukaz. Prvn´ı dva cykly v algoritmu vyˇzaduj´ı ˇcas O(n), i-t´ y bˇeh tˇret´ıho cyklu vyˇzaduje nejv´ yˇse ˇcas O(1 + |Qi | log |Qi |). Proto ˇcas cel´eho tˇret´ıho cyklu je O(
k k k X X X (1 + |Qi | log |Qi |) = O( (1 + |Qi | log n) = O(k + ( |Qi |) log n) = O(n log n) i=0
i=0
i=0
a celkov´ y ˇcas HYBRIDSORTU v nejhorˇs´ım pˇr´ıpadˇe je nejv´ yˇse O(n log n). Nyn´ı odhadneme oˇcek´avan´ y ˇcas. Poloˇzme Xi = |Qi |. Pak Xi je n´ahodn´a promˇenn´a a protoˇze pravdˇepodobnost, 1 ˇze x ∈ Qi , je k , dost´av´ame, ˇze 1 n 1 q Prob(Xi = q) = ( ) (1 − )n−q . k q k Oˇcek´avan´ y ˇcas vyˇzadovan´ y tˇret´ım cyklem se pak rovn´a E(
k X i=0
n X
n 1 q 1 n(n − 1) n ( ) (1 − )n−q = k + k( 1 + Xi log Xi ) ≤ k + k q + ) = O(n), 2 q k k k k q=2 2
protoˇze k = αn a n n n−2 n−1 = (q(q − 1) + q) = n(n − 1) +n . q q q q−2 q−1 2
(Jedn´a se vlastnˇe o zn´am´ y v´ ypoˇcet 2. momentu binomick´eho rozdˇelen´ı).
Pozn´amka: V d˚ ukazu jsme pouˇzili odhad q log q ≤ q 2 a d˚ usledkem toho je, ˇze jsme dok´azali, ˇze oˇcek´avan´a sloˇzitost HYBRIDSORTU z˚ ustane line´arn´ı, i kdybychom v nˇem m´ısto HEAPSORTU pouˇzili nˇejak´ y tˇr´ıdic´ı algoritmus s kvadratickou sloˇzitost´ı, napˇr. INSERTIONSORT. Nyn´ı pouˇzijeme modifikaci BUCKETSORTU pro tˇr´ıdˇen´ı slov. M´ame tot´alnˇe uspoˇra´danou abecedu a chceme lexikograficky setˇr´ıdit slova a1 , a2 , . . . , an nad touto abecedou. Pˇripomeˇ nme, ˇze kdyˇz a = x1 x2 . . . xn a b = y1 y2 . . . ym jsou dvˇe slova nad tot´alnˇe uspoˇra´danou abecedou Σ, pak a < b v lexikografick´em uspoˇra´d´an´ı, pr´avˇe kdyˇz existuje i = 0, 1, . . . , min{n, m} takov´e, ˇze xj = yj pro kaˇzd´e j = 1, 2, . . . , i a bud’ l(i) n = i < m nebo i < min{n, m} a xi+1 < yi+1 . Pˇredpokl´adejme, ˇze ai = a1i a2i . . . ai , kde aji ∈ Σ a l(i) je d´elka i-t´eho slova ai . 154
WORDSORT(a1 , a2 , . . . , an ): for every i = 1, 2, . . . , n do l(i) :=d´elka slova ai enddo l = max{l(i) | i = 1, 2, . . . , n} for every i = 1, 2, . . . , l do Li = ∅ enddo for every i = 1, 2, . . . , n do ai vloˇz do Ll(i) enddo Koment´aˇr: Pro kaˇzd´e i obsahuje Li vˇsechna slova z mnoˇziny {a1 , a2 , . . . , an } d´elky i. P := {(j, aji ) | 1 ≤ i ≤ n, 1 ≤ j ≤ l(i)} P1 :=BUCKETSORT(P ) podle druh´e komponenty P2 :=BUCKETSORT(P1 ) podle prvn´ı komponenty for every i = 1, 2, . . . , l do Si = ∅ enddo (i, x) :=prvn´ı prvek P2 while (i, x) 6= N IL do (i, x) vloˇz do Si while(i, x) =n´asledn´ık (i, x) v P2 do (i, x) :=n´asledn´ık (i, x) v P2 enddo (i, x) :=n´asledn´ık (i, x) v P2 enddo Koment´aˇr: V Si jsou vˇsechny dvojice (i, x) takov´e, ˇze x je i-t´ ym p´ısmenem nˇekter´eho vstupn´ıho slova a kdyˇz x < y, pak (i, x) je pˇred (i, y). for every s ∈ Σ do Ts := ∅ enddo T := ∅, i := l while i > 0 do T := konkatenace Li a T , a :=prvn´ı slovo v T while a 6= N IL do s := i-t´e p´ısmeno a, vloˇz a do Ts a :=n´asledn´ık a v T enddo (i, x) :=prvn´ı prvek v Si , T := ∅ while (i, x) 6= N IL do T := konkatenace T a Tx , Tx := ∅ (i, x) :=n´asledn´ık (i, x) v Si enddo i := i − 1 enddo V´ ystup: T je setˇr´ıdˇen´a posloupnost slov a1 , a2 , . . . , an Uvaˇzujme jeden bˇeh posledn´ıho cyklu algortimu pro urˇcit´e i. Po jeho skonˇcen´ı jsou v T vˇsechna slova z mnoˇziny a1 , a2 , . . . , an , kter´a maj´ı d´elku alespoˇ n i, a kdyˇz slovo ar je pˇred aq v seznamu T , pak existuje k k j = i − 1, i, . . . , l takov´e, ˇze ar = aq pro kaˇzd´e k = i, i + 1, . . . , j a bud’ l(r) = j ≤ l(q) nebo j < min{l(r), l(q)} a aj+1 < aj+1 ı algoritmu BUCKETSORT indukc´ı podle i. Jedin´ y r q . To plyne z vlastnost´ a hlavn´ı rozd´ıl proti BUCKETSORTU je, ˇze neproch´az´ıme vˇsechny pˇrihr´adky Tx , ale pouze nepr´azdn´e. To n´am zajiˇst’uje mnoˇzina Si (viz Koment´aˇr). P Oznaˇcme L = ni=1 l(i) a pˇripomeˇ nme, ˇze l = max{l(i) | i = 1, 2, . . . , n}. Pak prvn´ı cyklus (v´ ypoˇcet d´elek slov) vyˇzaduje ˇcas O(L). Druh´ y cyklus (inicializace seznam˚ u Li ) vyˇzaduje ˇcas O(l) = O(L) a tˇret´ı cyklus (zaˇrazen´ı slov do Li podle d´elek) ˇcas O(n) = O(L). Vytvoˇren´ı seznamu P vyˇzaduje ˇcas O(L) a jeho setˇr´ıdˇen´ı podle obou komponent ˇcas O(L + l) = O(L), protoˇze P i P1 maj´ı nejv´ yˇse L prvk˚ u. Dalˇs´ı cyklus (zaloˇzen´ı seznam˚ u Si ) vyˇzaduje ˇcas O(l) a n´asleduj´ıc´ı cyklus vytv´aˇrej´ıc´ı seznamy Si ˇcas O(L). Cyklus zakl´adaj´ıc´ı seznamy Tx vyˇzaduje ˇcas O(|Σ|). Bˇehy dalˇs´ıho cyklu jsou indexov´any i = 1, 2, . . . , l. Pro kaˇzd´e i oznaˇcme 155
P mi poˇcet slov z mnoˇziny {a1 , a2 , . . . , an }, kter´a maj´ı d´elku alespoˇ n i. Pak L = li=1 mi a prvn´ı vnitˇrn´ı cyklus v i-t´em bˇehu vnˇejˇs´ıho cyklu vyˇzaduje ˇcas O(mi ) a druh´ y vnitˇrn´ı cyklus ˇcas O(|Si |) = O(mi ). Tedy celkov´ y ˇcas algoritmu je O(L + m), kde m = |Σ| a L je souˇcet d´elek vˇsech slov z mnoˇziny a1 , a2 , . . . , an .
6.3
Poˇ r´ adkov´ e statistiky
Na z´avˇer pop´ıˇseme dva algoritmy pro hled´an´ı k-t´eho nejmenˇs´ıho prvku v dan´e podmnoˇzinˇe tot´alnˇe uspoˇra´dan´eho univerza. Prvn´ı z nich vyuˇz´ıv´a stejn´ y princip jako QUICKSORT. Nejprve zad´ame pˇresn´e znˇen´ı naˇs´ı u ´lohy (´ uloha i algoritmy se daj´ı snadno pˇreformulovat pro pˇr´ıpad, kdy hled´ame k−t´ y nejvˇetˇs´ı prvek). Pracujeme s tot´alnˇe uspoˇra´dan´ ym univerzem U . Vstup: mnoˇzina prvk˚ u M = {a1 , a2 , . . . , an } ⊆ U a ˇc´ıslo i takov´e, ˇze 1 ≤ i ≤ n. V´ ystup: prvek ak takov´ y, ˇze |{j | 1 ≤ j ≤ n, aj ≤ ak }| = i. n Kdyˇz i = 2 , pak ak se naz´ yv´a medi´an. FIND(M = (a1 , a2 , . . . , an ), i): zvol a ∈ M M1 := {b ∈ M | b < a}, M2 := {b ∈ M | b > a} if |M1 | > i − 1 then FIND(M1 , i) else if |M1 | < i − 1 then FIND(M2 , i − |M1 | − 1) else V´ ystup: a je hledan´ y prvek endif endif D˚ ukaz korektnosti algoritmu je zaloˇzen na n´asleduj´ıc´ım jednoduch´em pozorov´an´ı: mˇejme mnoˇzinu M a prvek x a poloˇzme M1 = {m ∈ M | m < x}. Kdyˇz k ≤ |M1 |, pak k-t´ y nejmenˇs´ı prvek v M1 je stejn´ y jako k-t´ y nejmenˇs´ı prvek v M . Kdyˇz k > |M1 |, pak (k − |M1 |)-t´ y nejmenˇs´ı prvek v M \ M1 je k-t´ y nejmenˇs´ı prvek v M . Zb´ yv´a vyˇsetˇrit sloˇzitost. V nejhorˇs´ım pˇr´ıpadˇe vol´ame FIND n-kr´at a jedno vol´an´ı vyˇzaduje ˇcas O(|M |). Tedy ˇcasov´a sloˇzitost algoritmu FIND v nejhorˇs´ım pˇr´ıpadˇe je O(n2 ). Dobr´e volby prvku a mohou algoritmus znaˇcnˇe zrychlit. V tomto pˇr´ıpadˇe plat´ı stejn´a diskuse jako pro QUICKSORT. Spoˇc´ıt´ame oˇcek´avan´ y ˇcas za pˇredpokladu, ˇze prvek a byl vybr´an n´ahodnˇe. Pak pravdˇepodobnost, ˇze je k-t´ ym nejmenˇs´ım prvkem, je n1 , kde n = |M |. Oznaˇcme T (n, i) oˇcek´avan´ y ˇcas algoritmu FIND pro nalezen´ı i-t´eho nejmenˇs´ıho prvku v n-prvkov´e mnoˇzinˇe M . Plat´ı i−1 n X 1 X T (n, i) = n + ( T (n − k, i − k) + T (k, i)), n k=1 k=i+1 protoˇze procedura FIND bez rekurzivn´ıho vol´an´ı sebe sama vyˇzaduje ˇcas O(n). Pˇredpokl´adejme, ˇze T (m, i) ≤ 4m pro kaˇzd´e m < n a kaˇzd´e i takov´e, ˇze 1 ≤ i ≤ m. Pak i−1 i−1 n n X X 1 X 1 X T (n − k, i − k) + 4(n − k) + T (k, i)) ≤ n + ( 4k) = T (n, i) =n + ( n k=1 n k=1 k=i+1 k=i+1
4 n2 + 2ni − n − 2i2 4 (2n − i)(i − 1) (n + i + 1)(n − i) + )=n+ ( ). n+ ( n 2 2 n 2
V´ yraz v ˇcitateli zlomku nab´ yv´a sv´eho maxima pro i = 156
n 2
a jeho maximaln´ı hodnota je 32 n2 − n =
3n2 −2n . 2
Tedy
4 3n2 − 2n ( ) = n + 3n − 2 = 4n − 2 < 4n. n 4 Protoˇze tento odhad plat´ı tak´e pro n = 1 a n = 2, dok´azali jsme indukc´ı, ˇze T (n, i) ≤ 4n pro vˇsechna n a vˇsechna i takov´a, ˇze 1 ≤ i ≤ n. Plat´ı tedy T (n, i) ≤ n +
Vˇ eta. Algoritmus FIND nalezne i-t´y nejmenˇs´ı prvek v n prvkov´e tot´ alnˇe uspoˇr´adan´e mnoˇzinˇe a v ne2 jhorˇs´ım pˇr´ıpadˇe vyˇzaduje ˇcas O(n ). Kdyˇz se pivot vol´ı n´ ahodnˇe nebo kdyˇz vˇsechny vstupn´ı mnoˇziny maj´ı stejnou pravdˇepodobnost, pak oˇcek´avan´y ˇcas je O(n). Pro velmi mal´a i nebo pro i velmi bl´ızk´a n pracuje rychleji pˇr´ım´ y pˇrirozen´ y algoritmus (udrˇzuje si posloupnost i nejmenˇs´ıch nebo n − i nejvˇetˇs´ıch prvk˚ u a k n´ı pˇrid´av´a dalˇs´ı tak, ˇze ten prvek, kter´ y pˇrekroˇcil danou hranici, je zapomenut). Tento algoritmus vˇsak nen´ı efektivn´ı pro obecn´a i. N´asleduj´ıc´ı algoritmus nalezne i-t´ y nejmenˇs´ı prvek v line´arn´ım ˇcase i v nejhorˇs´ım pˇr´ıpadˇe. Vstupem je opˇet podmnoˇzina M tot´alnˇe uspoˇra´dan´eho univerza U a pˇrirozen´e ˇc´ıslo i takov´e, ˇze 1 ≤ i ≤ |M |. SELECT(M, i): n := |M | if n ≤ 100 then setˇrid’ mnoˇzinu M , m := i-t´ y nejmenˇs´ı prvek M else rozdˇel M do navz´ajem disjunktn´ıch pˇetiprvkov´ ych podmnoˇzin A1 , A2 , . . . , A⌈ n5 ⌉ (posledn´ı z podmnoˇzin m˚ uˇze m´ıt m´enˇe neˇz 5 prvk˚ u). n for every j = 1, 2, . . . , ⌈ 5 ⌉ do najdi medi´an mj mnoˇziny Aj enddo n m ¯ :=SELECT({mj | j = 1, 2, . . . , ⌈ n5 ⌉}, ⌈ 10 ⌉) M1 := {m ∈ M | m < m}, ¯ M2 := {m ∈ M | m ¯ < m} if |M1 | > i − 1 then m :=SELECT(M1 , i) else if |M1 | < i − 1 then m :=SELECT(M2 , i − |M1 | − 1) else m := m ¯ endif endif V´ ystup: m endif D˚ ukaz korektnosti algoritmu je stejn´ y jako u algoritmu FIND. Zb´ yv´a vyˇsetˇrit sloˇzitost. Nejprve dok´aˇzeme n´asleduj´ıc´ı lemma. Lemma. Kdyˇz n ≥ 100, pak |M1 |, |M2 | ≤
8n . 11
¯ pak |Aj ∩ M1 | ≥ 3, kdyˇz mj > m, ¯ pak |Aj ∩ M2 | ≥ 3, kdyˇz D˚ ukaz. Pro j ≤ ⌊ n5 ⌋ plat´ı, ˇze kdyˇz mj < m, n mj = m, ¯ pak |Aj ∩ M1 | = |Aj ∩ M2 | = 2. Protoˇze |{j = 0, 1, . . . , ⌊ 5 ⌋ | mj < m}|, ¯ |{j = 0, 1, . . . , ⌊ n5 ⌋ | mj > n 3n m}| ¯ ≥ ⌊ 10 ⌋, dost´av´ame, ˇze |M1 |, |M2 | ≥ ⌊ 10 ⌋ − 1. D´ale plat´ı M1 ∩ M2 = ∅, M1 ∪ M2 = M \ {m} ¯ a protoˇze 8n 3n 113n + ⌊ 10 ⌋ − 1 ≥ 110 − 2 ≥ n kdyˇz n > 100, dost´av´ame poˇzadovan´ y odhad. 11
Maxim´aln´ı ˇcas vyˇzadovan´ y algoritmem SELECT(M, i) pro |M | = n oznaˇcme T (n). Kdyˇz n ≤ 100, pak zˇrejmˇe existuje konstanta a takov´a, ˇze T (n) ≤ an. Kdyˇz n > 100, pak ⌈ n5 ⌉ ≤ 21n , a protoˇze SELECT(M, i) 100 157
pro |M | > 100 bez rekurentn´ıch vol´an´ı vyˇzaduje ˇcas O(|M |), plat´ı, ˇze T (n) ≤ T ( 21n ) + T ( 8n ) + bn pro 100 11 1100b nˇejakou konstantu b. Zvolme c ≥ max{a, 69 }. Uk´aˇzeme, ˇze T (n) ≤ cn pro vˇsechna n. Kdyˇz n ≤ 100, tak tvrzen´ı zˇrejmˇe plat´ı, protoˇze a ≤ c. Kdyˇz n > 100, pak ⌈ 21n ⌉, ⌈ 8n ⌉ < n, a protoˇze z volby c plyne 100 11 69 c, dost´av´ame b ≤ 1100 21n 8n 1031c T (n) ≤ c + c + bn = ( + b)n ≤ cn. 100 11 1100 Tedy Vˇ eta. Algoritmus SELECT nalezne i-t´y nejmenˇs´ı prvek v line´ arn´ım ˇcase. Algoritmus FIND je ve velk´e vˇetˇsinˇe pˇr´ıpad˚ u rychlejˇs´ı neˇz algoritmus SELECT, proto je v praxi doporuˇcov´an, i kdyˇz existuj´ı pˇr´ıpady (velmi ˇr´ıdk´e), kdy potˇrebuje kvadratick´ y ˇcas. Je zn´amo, ˇze medi´an nprvkov´e mnoˇziny lze nal´ezt s m´enˇe neˇz 3n porovn´an´ımi a ˇze kaˇzd´ y algoritmus hledaj´ıc´ı medi´an a pouˇz´ıvaj´ıc´ı porovn´an´ı jako jedinou primitivn´ı operaci mezi prvky mnoˇziny vyˇzaduje v´ıce neˇz 2n porovn´an´ı. 6.3.1
Historick´ y pˇ rehled
Algoritmus HEAPSORT navrhl v roce 1964 Williams a vylepˇsil Floyd (rovnˇeˇz 1964). N´avrh na pouˇzit´ı dregul´arn´ıch hald je folklor stejnˇe tak jako algoritmus MERGESORT. Algoritmy QUICKSORT a FIND zavedl Hoare (1962). Anal´ yza operace MERGE a hled´an´ı optim´aln´ıho stromu poch´az´ı od Huffmana (1952) a line´arn´ı implementaci algoritmu navrhl van Leeuwen (1976). Anal´ yza rozhodovac´ıch strom˚ u je folklor. Algoritmus HYBRIDSORT navrhli Meijer a Akl (1980), vylepˇsen´a verze BUCKETSORTU (nazvan´a WORDSORT) poch´az´ı od Aho, Hopcrofta a Ullmana (1974). Algoritmus SELECT byl navrˇzen Blumem, Floydem, Prattem, Rivestem a Tarjanem (1972).
158