Datov´ e struktury
pˇredn´aˇs´ı RNDr. V´aclav Koubek, DrSc.
zTEXali a doplnili Martin Vidner <
[email protected]> Vladim´ır Kotal
Universita Karlova Matematicko-fyzik´ aln´ı fakulta 2004
Obsah ´ 1 Uvod 1.1 Pˇredpoklady . . . . . . . . . . . . . . . . . . . . . . 1.2 Jak´e typy sloˇzitosti n´ as zaj´ımaj´ı . . . . . . . . . . . 1.2.1 Pamˇet’ov´ a sloˇzitost reprezentovan´e struktury ˇ 1.2.2 Casov´ a sloˇzitost algoritm˚ u pracuj´ıc´ıch na datov´e struktuˇre . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7 7 7 7
. . . . . . . . . . . . . . . . .
7
2 Slovn´ıkov´ y probl´ em 2.1 Pole . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Seznam . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9 9 9
3 Haˇ sov´ an´ı I 3.1 Haˇsov´ an´ı se separovan´ ymi ˇretˇezci . . . . . . . . . . . . . . . . . . . . . 3.1.1 Oˇcek´ avan´ a d´elka seznamu . . . . . . . . . . . . . . . . . . . . . 3.1.2 Oˇcek´ avan´ y ˇcas posloupnosti operac´ı . . . . . . . . . . . . . . . 3.1.3 Oˇcek´ avan´ y poˇcet test˚ u . . . . . . . . . . . . . . . . . . . . . . . 3.1.4 Oˇcek´ avan´ a d´elka nejdelˇs´ıho seznamu . . . . . . . . . . . . . . . 3.2 Haˇsov´ an´ı s uspoˇr´ adan´ ymi ˇretˇezci . . . . . . . . . . . . . . . . . . . . . 3.2.1 Oˇcek´ avan´ y ˇcas . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Haˇsov´ an´ı s pˇresuny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 Haˇsov´ an´ı se dvˇema ukazateli . . . . . . . . . . . . . . . . . . . . . . . 3.5 Haˇsov´ an´ı s line´ arn´ım pˇrid´ av´ an´ım . . . . . . . . . . . . . . . . . . . . . 3.6 Haˇsov´ an´ı se dvˇema funkcemi (otevˇren´e h., h. s otevˇrenou adresac´ı) . . 3.6.1 Algoritmus INSERT . . . . . . . . . . . . . . . . . . . . . . . . 3.6.2 Oˇcek´ avan´ y poˇcet test˚ u . . . . . . . . . . . . . . . . . . . . . . . 3.7 Sr˚ ustaj´ıc´ı haˇsov´ an´ı (standardn´ı: LISCH a EISCH) . . . . . . . . . . . 3.7.1 Algoritmus INSERT . . . . . . . . . . . . . . . . . . . . . . . . 3.8 Sr˚ ustaj´ıc´ı haˇsov´ an´ı s pomocnou pamˇet´ı (obecn´e: LICH, EICH, VICH) 3.8.1 Operace DELETE . . . . . . . . . . . . . . . . . . . . . . . . . 3.8.2 Srovn´ avac´ı graf . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.9 Srovn´ an´ı metod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.9.1 Poˇrad´ı podle ne´ uspˇeˇsn´eho pˇr´ıpadu . . . . . . . . . . . . . . . . 3.9.2 Poˇcet test˚ u pro zaplnˇenou tabulku . . . . . . . . . . . . . . . . 3.9.3 Poˇcet test˚ u vyj´ adˇren´ y vzorcem . . . . . . . . . . . . . . . . . . 3.10 Pˇrehaˇsov´ av´ an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.10.1 MEMBER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.10.2 INSERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
10 10 11 12 12 13 14 14 14 15 16 17 17 18 19 20 20 21 22 22 22 23 23 23 24 24
2
3.10.3 DELETE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.10.4 Sloˇzitost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24 24
4 Haˇ sov´ an´ı II 4.1 Univerz´ aln´ı haˇsov´ an´ı . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Oˇcek´ avan´ a d´elka ˇretˇezce . . . . . . . . . . . . . . . . . . . 4.1.2 Velikost c-univerz´ aln´ıho syst´emu . . . . . . . . . . . . . . 4.1.3 Reprezentace S a operace MEMBER, INSERT, DELETE 4.2 Extern´ı haˇsov´ an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 Operace ACCESS . . . . . . . . . . . . . . . . . . . . . . 4.2.2 Operace INSERT . . . . . . . . . . . . . . . . . . . . . . . 4.2.3 Operace DELETE . . . . . . . . . . . . . . . . . . . . . . 4.2.4 Reprezentace adres´ aˇre . . . . . . . . . . . . . . . . . . . . 4.3 Perfektn´ı haˇsov´ an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.1 Perfektn´ı haˇsovac´ı funkce do tabulky velikosti n2 . . . . . 4.3.2 Perfektn´ı haˇsovac´ı funkce do tabulky velikosti 3n . . . . . 4.3.3 GPERF . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
25 25 26 27 29 30 32 32 33 35 35 36 37 39
5 Trie 5.1 Z´ akladn´ı varianta . . . . . . . . . . . . . 5.1.1 Algoritmus MEMBER . . . . . . 5.1.2 Algoritmus INSERT . . . . . . . 5.1.3 Algoritmus DELETE . . . . . . . ˇ 5.1.4 Casov´ a a pamˇet’ov´ a sloˇzitost . . 5.2 Komprimovan´e trie . . . . . . . . . . . . 5.2.1 MEMBER . . . . . . . . . . . . . 5.2.2 INSERT . . . . . . . . . . . . . . 5.2.3 DELETE . . . . . . . . . . . . . ˇ 5.2.4 Casov´ a a pamˇet’ov´ a sloˇzitost . . 5.3 Jeˇstˇe komprimovanˇejˇs´ı trie . . . . . . . . 5.3.1 Popis A a rd . . . . . . . . . . . 5.3.2 Algoritmus pro hled´ an´ı rd a hod 5.3.3 Vertik´ aln´ı posun sloupc˚ u. . . . . ´ 5.3.4 Usporn´ e uloˇzen´ı ˇr´ıdk´eho vektoru
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
40 40 41 41 42 42 42 43 43 44 44 47 48 49 50 52
6 Uspoˇ r´ adan´ a pole 6.1 Un´ arn´ı, bin´ arn´ı a interpolaˇcn´ı vyhled´av´an´ı . . . . . . . . . . . . . . . . . . . . . . . 6.2 Zobecnˇen´e kvadratick´e vyhled´ av´an´ı . . . . . . . . . . . . . . . . . . . . . . . . . . .
55 55 56
7 Bin´ arn´ı vyhled´ avac´ı stromy 7.1 Obecnˇe . . . . . . . . . . . . . . . . . . . . . . . . . 7.1.1 Algoritmus MEMBER . . . . . . . . . . . . . 7.1.2 Algoritmus INSERT . . . . . . . . . . . . . . 7.1.3 Algoritmus DELETE . . . . . . . . . . . . . . 7.2 Optim´ aln´ı bin´ arn´ı vyhled´ avac´ı stromy . . . . . . . . 7.2.1 Co je to optim´ aln´ı bin´ arn´ı vyhled´avac´ı strom 7.2.2 Algoritmus konstrukce . . . . . . . . . . . . . 7.2.3 Sn´ıˇzen´ı sloˇzitosti z kubick´e na kvadratickou . 7.3 Skorooptim´ aln´ı bin´ arn´ı vyhled´ avac´ı stromy . . . . . 7.3.1 Aproximace optim´ aln´ıch strom˚ u . . . . . . .
58 58 59 59 59 59 60 60 61 64 64
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
3
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
65 67 67 68 69 71 75 75 77 78
8 (a, b) stromy 8.1 Z´ akladn´ı varianta . . . . . . . . . . . . . . . . . . . . . 8.1.1 Reprezentace mnoˇziny S (a, b) stromem . . . . 8.1.2 MEMBER(x) v (a, b) stromu . . . . . . . . . . 8.1.3 INSERT(x) do (a, b) stromu . . . . . . . . . . . 8.1.4 DELETE(x) z (a, b) stromu . . . . . . . . . . . 8.1.5 Shrnut´ı . . . . . . . . . . . . . . . . . . . . . . 8.1.6 Jak volit parametry (a, b) . . . . . . . . . . . . 8.2 Dalˇs´ı operace . . . . . . . . . . . . . . . . . . . . . . . 8.2.1 Algoritmus JOIN(T1 , T2 ) pro (a, b) stromy . . . 8.2.2 Algoritmus SPLIT(x, T ) pro (a, b) strom . . . . 8.2.3 Algoritmus STACKJOIN(Z) pro z´asobn´ık (a, b) 8.2.4 Algoritmus FIND(T, k) pro (a, b) strom . . . . 8.3 A-sort . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.1 A-INSERT . . . . . . . . . . . . . . . . . . . . 8.3.2 Sloˇzitost A-sortu . . . . . . . . . . . . . . . . . 8.4 Paraleln´ı pˇr´ıstup do (a, b) strom˚ u . . . . . . . . . . . . 8.4.1 Paraleln´ı INSERT(x) do (a, b) stromu . . . . . 8.4.2 Paraleln´ı DELETE(x) z (a, b) stromu . . . . . 8.5 Sloˇzitost posloupnosti operac´ı na (a, b) stromu . . . . . 8.5.1 Pˇrid´ an´ı/ubr´ an´ı listu . . . . . . . . . . . . . . . ˇ epen´ı . . . . . . . . . . . . . . . . . . . . . . 8.5.2 Stˇ 8.5.3 Spojen´ı . . . . . . . . . . . . . . . . . . . . . . 8.5.4 Pˇresun . . . . . . . . . . . . . . . . . . . . . . . 8.6 Propojen´e (a, b) stromy s prstem . . . . . . . . . . . . 8.6.1 Algoritmus MEMBER . . . . . . . . . . . . . . 8.6.2 Algoritmus FINGER . . . . . . . . . . . . . . . 8.6.3 Amortizovan´ a sloˇzitost . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . strom˚ u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
80 80 81 81 81 81 81 83 83 83 83 85 86 86 87 87 88 89 89 89 92 92 92 92 94 95 95 96
9 Samoopravuj´ıc´ı se struktury 9.1 Seznamy . . . . . . . . . . . . . . . . . . . . 9.1.1 Algoritmus MFR (Move Front Rule) 9.1.2 Algoritmus TR (Transposition Rule) 9.2 Splay stromy . . . . . . . . . . . . . . . . . 9.2.1 Operace SPLAY . . . . . . . . . . . 9.2.2 Podporovan´e operace . . . . . . . . . 9.2.3 Algoritmus MEMBER . . . . . . . . 9.2.4 Algoritmus JOIN2 . . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
98 98 98 101 103 103 104 104 104
7.4
7.5
7.3.2 Podrobnˇejˇs´ı popis naznaˇcen´e metody ˇ 7.3.3 Casov´ a sloˇzitost . . . . . . . . . . . 7.3.4 Hled´ an´ı k . . . . . . . . . . . . . . . AVL stromy . . . . . . . . . . . . . . . . . . 7.4.1 Algoritmus INSERT . . . . . . . . . 7.4.2 Algoritmus DELETE . . . . . . . . . ˇ Cervenoˇ cern´e stromy . . . . . . . . . . . . . 7.5.1 Operace INSERT . . . . . . . . . . . 7.5.2 Operace DELETE . . . . . . . . . . 7.5.3 Z´ avˇery . . . . . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . .
. . . . . . . .
4
9.2.5 9.2.6 9.2.7 9.2.8 9.2.9 9.2.10 9.2.11 9.2.12
Algoritmus JOIN3 . . . . . . . . . . . . . Algoritmus SPLIT . . . . . . . . . . . . . Algoritmus DELETE . . . . . . . . . . . . Algoritmus INSERT . . . . . . . . . . . . Algoritmus CHANGEWEIGHT . . . . . . Algoritmus SPLAY . . . . . . . . . . . . . Amortizovan´ a sloˇzitost SPLAY . . . . . . Amortizovan´ a sloˇzitost ostatn´ıch operac´ı .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
105 105 105 106 106 108 109 112
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
114 114 115 115 115 116 116 117 118 118 118 119 119 120 121 121 122 122 123 124 124 125
11 Dynamizace 11.1 Zobecnˇen´ y vyhled´ avac´ı probl´em . . . . . . . . . . 11.1.1 Operace INSERT a DELETE . . . . . . . 11.2 Semi-dynamizace . . . . . . . . . . . . . . . . . . 11.2.1 INSERT . . . . . . . . . . . . . . . . . . . 11.2.2 INSERT se sloˇzitost´ı v nejhorˇs´ım pˇr´ıpadˇe 11.3 Dynamizace . . . . . . . . . . . . . . . . . . . . . 11.3.1 Reprezentace mnoˇziny A . . . . . . . . . . 11.3.2 Pamˇet’ov´e n´ aroky . . . . . . . . . . . . . . ˇ pro v´ 11.3.3 Cas ypoˇcet f . . . . . . . . . . . . . 11.3.4 Amortizovan´ y ˇcas operace DELETE . . . 11.3.5 Amortizovan´ y ˇcas operace INSERT . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
127 127 128 129 130 131 133 134 134 134 135 136
10 Haldy 10.1 d-regul´ arn´ı haldy . . . . . . . . . . . . 10.1.1 Algoritmus UP . . . . . . . . . 10.1.2 Algoritmus DOWN . . . . . . . 10.1.3 Operace na haldˇe . . . . . . . . 10.1.4 Algoritmus MAKEHEAP . . . 10.1.5 Sloˇzitost operac´ı . . . . . . . . 10.1.6 Dijkstr˚ uv algoritmus . . . . . . 10.1.7 Heapsort . . . . . . . . . . . . 10.2 Leftist haldy . . . . . . . . . . . . . . 10.2.1 MERGE . . . . . . . . . . . . . 10.2.2 INSERT . . . . . . . . . . . . . 10.2.3 DECREASEKEY . . . . . . . 10.3 Binomi´ aln´ı haldy . . . . . . . . . . . . 10.3.1 MERGE . . . . . . . . . . . . . 10.3.2 MIN . . . . . . . . . . . . . . . 10.3.3 INSERT . . . . . . . . . . . . . 10.3.4 DELETEMIN . . . . . . . . . . 10.3.5 L´ın´ a implementace binom. hald 10.4 Fibonacciho haldy . . . . . . . . . . . 10.4.1 MERGE, INSERT, EXTRACT 10.4.2 DECREASE KEY . . . . . . .
Literatura
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MIN . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
137
Pˇ redmluva Kdyˇz jsem se nˇekdy na zaˇc´ atku r. 2002 rozhodl doplnit p˚ uvodn´ı ne´ upln´a skripta Martina Vidnera, netuˇsil jsem, kolik ˇcasu to zabere. P˚ uvodnˇe jsem na nich zaˇcal pracovat proto, ˇze jsem nemˇel ˇz´adn´e rozumn´e pozn´ amky z pˇredn´ aˇsek a vˇedˇel jsem, ˇze pˇri uˇcen´ı na st´atnice nebudu cht´ıt tr´avit ˇcas hled´an´ım a tˇr´ıdˇen´ım pozn´ amek z r˚ uzn´ ych zdroj˚ u. Nakonec jsem skonˇcil dops´an´ım chybˇej´ıc´ıch kapitol, dokreslen´ım obr´ azk˚ u a opraven´ım vˇsech chyb, kter´e jsem naˇsel, St´ale je ovˇsem pravdˇepodobn´e, ˇze skripta obsahuj´ı i v´aˇznˇejˇs´ı chyby. Pokud nˇejak´e pˇri uˇcen´ı najdete, zkuste mi napsat. Skripta m˚ uˇze ˇc´ıst prakticky kaˇzd´ y, kdo je obezn´amen se z´aklady teoretick´e informatiky, rozhodnˇe ´ ´ ale doporuˇcuji absolvovat pˇredmˇety ’Uvod do teorie pravdˇepodobnosti ’ a ’Uvod do sloˇzitosti a NPu ´plnosti ’ nebo jejich ekvivalenty. Prvn´ı se v´am bude hodit pˇri d˚ ukazech, druh´ y pˇri obecn´em ch´ap´an´ı algoritm˚ u. Obsahovˇe skripta pokr´ yvaj´ı pˇredn´ aˇsky Datov´e struktury I a II RNDr. V´aclava Koubka, DrSc. Nav´ıc jsou pˇrid´ any nˇekter´e vˇeci, pˇredn´ aˇsen´e okrajovˇe nebo prob´ıran´e pouze na cviˇcen´ı. (napˇr. AVL stromy nebo skorooptim´ aln´ı bin´ arn´ı vyhled´avac´ı stromy) Nˇekter´e kapitoly byly ps´any nez´avisle na pˇredn´aˇsk´ach. (napˇr. splay stromy) ˇ Rekl bych ”uˇzijte si to”, ale ono to zase tak lehk´e ˇctivo nen´ı :)
V. Kotal
5
6
Podˇekov´ an´ı patˇr´ı n´ asleduj´ıc´ım lidem: • Martin Vidner p˚ uvodn´ı verze skript (kapitoly Haˇsov´an´ı I,II, XXX) ˇ cka, Jindˇrich1 , Martin Mareˇs, Pavel Machek, Jakub Cern´ ˇ • Liˇs´ak, J´en ˇa, Zabiˇ y opravy a dodatky v p˚ uvodn´ı verzi skript • Martin Maˇcok faktick´e opravy • Tom´ aˇs Matouˇsek mnoˇzstv´ı faktick´ ych oprav • Ladislav Proˇsek pˇreklepy, faktick´e opravy • Jana Skot´ akov´ a, Martin Mal´ y zap˚ ujˇcen´ı pozn´ amek • Vojtˇech Fried algoritmus pro INSERT v semidyn. syst´emech • Michal Kov´ aˇc pˇreklepy, faktick´e opravy • Vojta Havr´ anek faktick´e opravy Nˇekter´e ˇc´ asti skript byly volnˇe pˇrevzaty ze zdroj˚ u jin´ ych neˇz z origin´aln´ı pˇredn´aˇsky Datov´e struktury. Konkr´etnˇe ˇc´ asti sekc´ı o binomi´aln´ıch a fibonacciho hald´ach byly inspirov´any pˇredn´aˇskou ˇ O. Cepka, sekce o splay stromech byla ˇc´asteˇcnˇe pˇrevzata z text˚ u FIT VUTBR. Sekce o semioptim´aln´ıch vyhled´ avac´ıch stromech je tvoˇrena refer´atem L. Strojila. Sekce o AVL stromech vznikla kompilac´ı a doplnˇen´ım materi´ al˚ u z webu, z´aklad tvoˇr´ı refer´at Vojtˇecha Muchy.
1 Lid´ e,
kter´ ym dˇ ekoval Martin Vidner. Identita tˇ echto jedinc˚ u zˇrejmˇ e z˚ ustane navˇ zdy utajena.
Kapitola 1
´ Uvod Chceme reprezentovat data, prov´ adˇet s nimi operace. C´ılem t´eto pˇredn´aˇsky je popsat ideje, jak datov´e struktury reprezentovat, popsat algoritmy pracuj´ıc´ı s nimi a pˇresvˇedˇcit v´as, ˇze kdyˇz s nimi budete pracovat, mˇeli byste si ovˇeˇrit, jak jsou efektivn´ı. Probl´em mˇeˇren´ı efektivity: vˇetˇsinou nem´ame ˇsanci vyzkouˇset vˇsechny pˇr´ıpady vstupn´ıch dat. Mus´ıme bud’ doufat, ˇze naˇse vzorky jsou dostateˇcnˇe reprezentativn´ı, nebo to vypoˇc´ıtat. Tehdy ale zase nemus´ıme dostat pˇresn´e v´ ysledky, pouze odhady.
1.1
Pˇ redpoklady
1. Datov´e struktury jsou nez´ avisl´e na ˇreˇsen´em probl´emu; abstrahujeme. Napˇr´ıklad u slovn´ıkov´ ych operac´ı vyhledej, pˇridej, vyjmi, n´ as nezaj´ım´a, jestli slovn´ık reprezentuje body v prostoru, vrcholy grafu nebo z´ aznamy v datab´ azi. 2. V programu, kter´ y ˇreˇs´ı nˇejak´ y probl´em, se pˇr´ısluˇsn´e datov´e struktury pouˇz´ıvaj´ı velmi ˇcasto.
1.2 1.2.1
Jak´ e typy sloˇ zitosti n´ as zaj´ımaj´ı Pamˇ et’ov´ a sloˇ zitost reprezentovan´ e struktury
Je d˚ uleˇzit´a, ale obvykle jednoduch´ a na spoˇc´ıt´an´ı a nen´ı ˇsance ji vylepˇsit — jedinˇe pouˇz´ıt u ´plnˇe jinou strukturu. Proto ji ˇcasto nebudeme ani zmiˇ novat.
1.2.2
ˇ Casov´ a sloˇ zitost algoritm˚ u pracuj´ıc´ıch na datov´ e struktuˇ re
ˇ Casov´ a sloˇ zitost v nejhorˇ s´ım pˇ r´ıpadˇ e Jej´ı znalost n´ am zaruˇc´ı, ˇze nem˚ uˇzeme b´ yt nepˇr´ıjemnˇe pˇrekvapeni (dobou bˇehu algoritmu). Hod´ı se pro interaktivn´ı reˇzim — uˇzivatel sed´ıc´ı u datab´aze pr˚ umˇernˇe dobrou odezvu neocen´ı, ale jedin´ y pomal´ y pˇr´ıpad si zapamatuje a bude si stˇeˇzovat. Za vylepˇsen´ı nejhorˇs´ıho pˇr´ıpadu obvykle plat´ıme zhorˇsen´ım pr˚ umˇern´eho pˇr´ıpadu.
7
Id: intro.tex,v 1.4 2004/10/17 15:20:05 techie Exp
8
Oˇ cek´ avan´ aˇ casov´ a sloˇ zitost Je to vlastnˇe v´ aˇzen´ y pr˚ umˇer — sloˇzitost kaˇzd´eho pˇr´ıpadu vstupn´ıch dat n´asob´ıme pravdˇepodobnost´ı jeho v´ yskytu a seˇcteme. Je zaj´ımav´ a pro d´avkov´ y reˇzim zpracov´an´ı. Napˇr´ıklad Quicksort patˇr´ı mezi nejrychlejˇs´ı zn´ am´e tˇr´ıd´ıc´ı algoritmy, ale v nejhorˇs´ım pˇr´ıpadˇe m´a sloˇzitost kvadratickou. Pozor na pˇredpoklady o rozdˇelen´ı vstupn´ıch dat. Je zn´am´ y fakt, ˇze pro kaˇzd´e k existuje ˇc´ıslo nk takov´e ˇze kaˇzd´ y n´ ahodn´ y graf s alespoˇ n nk vrcholy s velkou pravdˇepodobnost´ı obsahuje kliku velikosti k. To vede k n´ asleduj´ıc´ımu algoritmu, kter´ y urˇc´ı zda graf je nejv´ yˇse k − 1 barevn´ y s oˇcek´avan´ ym konstantn´ım ˇcasem. Algoritmus: vstup graf (V, E). 1. Kdyˇz velikost V je menˇs´ı neˇz nk , pak prohled´an´ım vˇsech moˇznost´ı urˇci barevnost grafu (V, E) a vydej odpovˇed’, jinak pokraˇcuj na n´asleduj´ıc´ı bod. 2. Zvol n´ ahodnˇe nk vrchol˚ u v mnoˇzinˇe V a zjisti zda indukovan´ y podgraf na t´eto mnoˇzinˇe obsahuje kliku velikosti k. Pokud ano, odpovˇed’ je ne, jinak pokraˇcuj na n´asleduj´ıc´ı bod. 3. Prohled´ an´ım vˇsech moˇznost´ı urˇci barevnost grafu (V, E) a vydej odpovˇed’. Tento algoritmus se ale pro praktick´e pouˇzit´ı moc nehod´ı, protoˇze norm´alnˇe se napˇr´ıklad s n´ahodn´ ymi grafy na 200 vrcholech nesetk´av´ame. Amortizovan´ a sloˇ zitost Pro kaˇzd´e n nalezneme nejhorˇs´ı ˇcas vyˇzadovan´ y posloupnost´ı n operac´ı a tento ˇcas vydˇel´ıme n. Amortizovan´ a sloˇzitost je limitou tˇechto hodnot pro n jdouc´ı do nekoneˇcna. To n´as zaj´ım´a proto, ˇze nˇekter´e datov´e struktury maj´ı takovou vnitˇrn´ı organizaci, ˇze na n´ı z´avis´ı sloˇzitost, a ta organizovanost se bˇehem posloupnosti operac´ı mˇen´ı. Nejhorˇs´ı pˇr´ıpad vlastnˇe ukl´ız´ı za n´asleduj´ıc´ı nebo pˇredchoz´ı rychl´e pˇr´ıpady. Napˇr´ıklad u pˇriˇc´ıt´ an´ı jedniˇcky ke k-cifern´emu bin´arn´ımu ˇc´ıslu je ˇcasov´a sloˇzitost poˇcet jedniˇcek ve vstupu. Nejhorˇs´ı pˇr´ıpad s line´ arn´ı sloˇzitost´ı nastane pro ˇc´ıslo ze sam´ ych jedniˇcek (tedy 2k − 1), ale tˇech pˇr´ıpad˚ u je m´ alo a amortizovan´ a sloˇzitost nakonec vyjde konstantn´ı. Nebo urˇcit´e algoritmy v pˇrekladaˇc´ıch v praxi bˇeˇz´ı rychle, pˇrestoˇze jednotliv´e operace maj´ı velkou sloˇzitost v nejhorˇs´ım pˇr´ıpadˇe. To se tak´e podaˇrilo vysvˇetlit pomoc´ı amortizovan´e sloˇzitosti. Asymptotick´ a notace Skuteˇcn´a sloˇzitost z´ avis´ı na implementaci algoritmu, na konkr´etn´ım poˇc´ıtaˇci, vlastnˇe se ned´a pˇresnˇe spoˇc´ıtat v obecn´em pˇr´ıpadˇe. Abychom mohli spoˇc´ıtat aspoˇ n nˇeco, zaˇcaly se pouˇz´ıvat odhady sloˇzitosti aˇz na multiplikativn´ı konstantu. Tyto odhady popisuj´ı r˚ ust sloˇzitosti vzhledem ke zvˇetˇsuj´ıc´ım se vstup˚ um, ale neurˇcuj´ı konkr´etn´ı funkci (ˇc´ısla). Necht’ f, g jsou funkce na pˇrirozen´ ych ˇc´ıslech. Znaˇc´ıme: f = O(g), kdyˇz f = ω(g) f = Θ(g)
∃c > 0 ∀n : f (n) ≤ cg(n) ∀c > 0 ∃nekoneˇcnˇe mnoho n : f (n) > cg(n) ∃c, d > 0 ∀n : dg(n) ≤ f (n) ≤ cg(n)
(1.1) (1.2) (1.3)
Budeme pˇrev´ aˇznˇe pouˇz´ıvat O, protoˇze chceme hlavnˇe horn´ı odhady, kdeˇzto doln´ı odhady b´ yv´a obvykle tˇeˇzˇs´ı zjistit. Pro u ´plnost: f = o(g), kdyˇz lim
n→∞
f (n) =0 g(n)
Kapitola 2
Slovn´ıkov´ y probl´ em Je d´ano universum U , m´ ame reprezentovat jeho podmnoˇzinu S ⊆ U . Budeme pouˇz´ıvat operace • MEMBER(x), x ∈ U, odpovˇed’ je ano, kdyˇz x ∈ S, ne, kdyˇz x ∈ / S. • INSERT(x), x ∈ U, vytvoˇr´ı reprezentaci mnoˇziny S ∪ {x} • DELETE(x), x ∈ U, vytvoˇr´ı reprezentaci mnoˇziny S \ {x} • ACCESS(x). Ve skuteˇcn´ ych datab´az´ıch MEMBER nestaˇc´ı, protoˇze se kromˇe kl´ıˇce prvku zaj´ım´ ame i o jeho ostatn´ı atributy. Tady se ale o nˇe starat nebudeme — obvykl´e ˇreˇsen´ı je m´ıt u kl´ıˇce pouze ukazatel na ostatn´ı data, coˇz usnadˇ nuje pˇrem´ıst’ovan´ı jednotliv´ ych prvk˚ u datov´e struktury. Pˇredpokl´ ad´ a se znalost tˇechto z´ akladn´ıch datov´ ych struktur: pole, spojov´ y seznam, obousmˇen´ y seznam, z´asobn´ık, fronta, strom.
2.1
Pole
Do pole velikosti |U | uloˇz´ıme charakteristickou funkci S. + Velmi jednoduch´e a rychl´e — vˇsechny operace prob´ıhaj´ı v konstantn´ım ˇcase O(1) ˇ – Pamˇet’ov´ a n´ aroˇcnost O(|U |), coˇz je k´amen u ´razu. Napˇr. datab´aze vˇsech lid´ı v Cesku, k´odovan´ ych ˇ rodn´ ym ˇc´ıslem, by snadno pˇrerostla moˇznosti 32-bitov´eho adresn´ıho prostoru (10 miliard RC × 4B ukazatel) Ale pro grafov´e algoritmy je tahle reprezentace velmi vhodn´a.
2.2
Seznam
ˇ Vytvoˇr´ıme seznam prvk˚ u v S, operace prov´ad´ıme prohled´an´ım seznamu. Casov´ a i pamˇet’ov´a sloˇzitost operac´ı je O(|S|) (a to i pro INSERT — mus´ıme zjistit, jestli tam ten prvek uˇz nen´ı).
9
Naj´ıt lepˇ s´ı pˇ r´ıklad?
Kapitola 3
Haˇ sov´ an´ı I Je d´ano universum U , reprezentovan´ a podmnoˇzina S, S ⊆ U, |S| = n. Velikost tabulky, ve kter´e budeme cht´ıt S reprezentovat je m. M´ame haˇsovac´ı funkci h : U → {0..m − 1}. Mnoˇzina S je reprezentov´ana tabulkou T [0..m − 1] tak, ˇze prvek s ∈ S je uloˇzen na m´ıstˇe h(s). Charakteristickou vlastnost´ı obecn´e haˇsovac´ı funkce je velk´e pl´ ytv´an´ı pamˇet´ı pokud n |U |, napˇr. pro n = log log |U |. S prvky, kter´e nesou kladnou informaci (x ∈ S), moc nenadˇel´ame. Ale z´aporn´e m˚ uˇzeme nˇejak slouˇcit do jednoho nebo i pˇrekr´ yt s tˇemi kladn´ ymi. To je z´akladn´ı idea haˇsov´an´ı. Probl´emy: 1. Jak rychle spoˇc´ıt´ ame h(s). 2. Co znamen´ a uloˇzen na m´ıstˇe h(s) ? Co kdyˇz plat´ı h(s) = h(t) a z´aroveˇ n s 6= t ? ˇ sen´ı: Reˇ 1. Omez´ıme se na rychle spoˇcitateln´e haˇsovac´ı funkce. Pˇredpokl´ad´ame, ˇze h(s) spoˇcteme v ˇcase O(1). 2. Tento pˇr´ıpad se naz´ yv´ a kolize a jednotliv´e druhy haˇsov´an´ı se dˇel´ı podle toho, jak ˇreˇs´ı kolize.
3.1
Haˇ sov´ an´ı se separovan´ ymi ˇ retˇ ezci
Tento zp˚ usob haˇsov´ an´ı ˇreˇs´ı kolize tak, ˇze koliduj´ıc´ı prvky ukl´ad´a na stejnou pozici do tabulky. Na t´eto pozici jsou uloˇzeny v podobˇe line´arn´ıch seznam˚ u. Takov´emu seznamu koliduj´ıc´ıch prvk˚ u se ˇr´ık´a ˇretˇezec. Haˇsovac´ı tabulka je tedy pole line´arn´ıch seznam˚ u, ne nutnˇe uspoˇr´adan´ ych. Odtud plyne n´azev t´eto metody, protoˇze ˇretˇezce prvk˚ u nejsou mezi sebou prom´ıch´any - ˇretˇezec, kter´ y je v tabulce uloˇzen na pozici y v sobˇe obsahuje pouze ty prvky, pro kter´e plat´ı h(x) = y. Z´akladn´ı operace na t´eto tabulce jsou MEMBER (viz algoritmus 3.1), INSERT (viz alg. 3.2) a DELETE (viz alg. 3.3). Oˇcek´avan´ a doba operace MEMBER, INSERT nebo DELETE je stejn´a jako oˇcek´avan´a d´elka seznamu. Ale pozor na pr´ azdn´ y seznam, u nˇej nedos´ahneme nulov´eho ˇcasu operace. Uk´aˇzeme, ˇze oˇcek´avan´a doba operace je konstantn´ı.
10
Id: hash1.tex,v 1.11 2005/05/08 19:44:10 techie Exp
11
Algoritmus 3.1 MEMBER pro haˇsov´ an´ı se separovan´ ymi ˇretˇezci MEMBER(x): 1. Spoˇc´ıt´ ame h(x). 2. Prohled´ ame h(x)-t´ y seznam. 3. Kdyˇz tam x je, vr´ at´ıme true, jinak false.
Algoritmus 3.2 INSERT pro haˇsov´ an´ı se separovan´ ymi ˇretˇezci INSERT(x): 1. Spoˇc´ıt´ ame h(x). (Jako MEMBER) 2. Prohled´ ame h(x)-t´ y seznam. (Jako MEMBER) 3. Kdyˇz x nen´ı v h(x)-t´em seznamu, tak ho tam vloˇz´ıme.
Algoritmus 3.3 DELETE pro haˇsov´ an´ı se separovan´ ymi ˇretˇezci DELETE(x): 1. Spoˇc´ıt´ ame h(x). (Jako MEMBER) 2. Prohled´ ame h(x)-t´ y seznam. (Jako MEMBER) 3. Kdyˇz x je v h(x)-t´em seznamu, tak ho odstran´ıme.
Pˇredpoklady: 1. h rozdˇeluje prvky U do seznam˚ u nez´avisle a rovnomˇernˇe (napˇr. h(x) = x mod m). Tedy pro ∀i, j : 0 ≤ i, j < m se poˇcty prvk˚ u S zobrazen´ ych na i a j liˇs´ı nejv´ yˇs o 1. 2. Mnoˇzina S m´ a rovnomˇern´e rozdˇelen´ı — v´ ybˇer konkr´etn´ı mnoˇziny S m´a stejnou pravdˇepodobnost. To je dost omezuj´ıc´ı, protoˇze na rozd´ıl od haˇsovac´ı funkce nejsme schopni S ovlivnit.
3.1.1
Oˇ cek´ avan´ a d´ elka seznamu
Oznaˇcme p(`) = P(seznam je dlouh´ y `). Z pˇredpoklad˚ u m´ a p(`) binomick´e rozdˇelen´ı, neboli p(`) =
` n−` n 1 1 1− ` m m
Id: hash1.tex,v 1.11 2005/05/08 19:44:10 techie Exp
12
tedy oˇcek´ avan´ a d´elka seznamu je E=
n X
` · p(`)
`=0 n X
n X n! 1 1 1 1 (n − 1)! ( )` (1 − )n−` = ( )` (1 − )n−` n `!(n − `)! m m (` − 1)![(n − 1) − (` − 1)]! m m `=0 `=0 n−1 n X 1 n X n−1 1 k 1 n n − 1 1 `−1 ( ) (1 − )(n−1)−(`−1) = ( ) (1 − )(n−1)−k = m `−1 m m m k m m
=
`
k=−1
`=0
README.1st: vˇsechny u ´pravy smˇeˇruj´ı k tomuto souˇctu podle binomick´e vˇety n 1 1 n = ( + (1 − ))n−1 = = α, m m m m
(3.1)
kde α = n/m je tzv. faktor naplnˇen´ı1 , obvykle je d˚ uleˇzit´e, je-li vˇetˇs´ı ˇci menˇs´ı neˇz 1.
3.1.2
Oˇ cek´ avan´ yˇ cas posloupnosti operac´ı
Kdyˇz m´ame posloupnost P operac´ı MEMBER, INSERT, DELETE splˇ nuj´ıc´ı pˇredpoklad rovnomˇern´eho |2 rozdˇelen´ı a aplikovanou na pr´ azdnou haˇsovac´ı tabulku, pak oˇcek´avan´ y ˇcas je O(|P | + |P 2m )
3.1.3
Oˇ cek´ avan´ y poˇ cet test˚ u
Sloˇzitost prohled´ an´ı seznamu se m˚ uˇze liˇsit podle toho, jestli tam hledan´ y prvek je nebo nen´ı. ´ eˇsn´ym pˇr´ıpadem nazveme takovou Operaci(x), kde x ∈ S, ne´ Uspˇ uspˇeˇsn´y pˇr´ıpad je x ∈ / S. V u ´spˇeˇsn´em pˇr´ıpadˇe prohled´ av´ ame pr˚ umˇernˇe jenom polovinu seznamu. ˇ = O((1 − 1 )n + n ) Oˇcek´avan´ y ˇcas pro ne´ uspˇeˇsn´ y pˇr´ıpad ECN m m ˇU ´ = O( n ) Oˇcek´avan´ y ˇcas pro u ´spˇeˇsn´ y pˇr´ıpad EC 2m
co je to test? porovn´ an´ı kl´ıˇ c˚ u, nahl´ ednut´ı do tabulky?
Ne´ uspˇ eˇ sn´ y pˇ r´ıpad Projdeme cel´ y seznam, mus´ıme nahl´ednout i do pr´azdn´eho seznamu. ˇ = 1 · p(0) + ECN
n X `=1
` · p(`) = p(0) +
n X `=0
` · p(`) = (1 −
n 1 n ) + ≈ e−α + α m m
´ eˇ Uspˇ sn´ y pˇ r´ıpad Poˇcet test˚ u pro vyhled´ u v seznamu d´elky ` je an´ı vˇsech prvk˚ 1 + 2 + · · · + ` = `+1 . 2 P Oˇcek´avan´ y poˇcet test˚ u je ` `+1 p(`), oˇcek´avan´ y poˇcet test˚ u pro vyhled´an´ı vˇsech prvk˚ u v 2 P `+1 tabulce je m · ` 2 p(`). Jeˇstˇe budeme potˇrebovat n´ asleduj´ıc´ı sumu, kterou spoˇc´ıt´ame podobnˇe jako v 3.1: n−l l n X 1 n 1 n n 1 1− = · · · = (1 − ) + ( )2 l2 l m m m m m l=0
1 anglicky
load factor
Zde Koubkov´ a 1998. Koubek 2000 to m´ a trochu jinak
Id: hash1.tex,v 1.11 2005/05/08 19:44:10 techie Exp
13
Oˇcek´avan´ y poˇcet test˚ u pro vyhled´ an´ı jednoho prvku X `+1 X m 1 X 2 ˇU ´ =m p(`) = · ( ` p(`) + ` · p(`)) EC n 2 n 2 `
`
`
n 1 n2 m n ( (1 − ) + 2 + ) = 2n m m m m 1 n 1 n−1 1 + + =1+ = − 2 2m 2m 2 2m ∼1+
3.1.4
α 2
(3.2)
Oˇ cek´ avan´ a d´ elka nejdelˇ s´ıho seznamu
Zn´ame oˇcek´ avan´e hodnoty, ale ty n´ am samy o sobˇe moc neˇreknou. Hodila by se n´am standardn´ı odchylka, ta se ale sloˇzitˇe poˇc´ıt´ a. M´ısto toho vypoˇcteme oˇcek´avan´ y nejhorˇs´ı pˇr´ıpad: Dok´aˇzeme, ˇze za pˇredpoklad˚ u 1 a 2 a |S| = n ≤ m je oˇcek´avan´a d´elka maxim´aln´ıho seznamu EMS = O( logloglogn n ). Z definice X EMS = j · P(maxim´aln´ı d´elka seznamu = j). j
Pouˇzijeme trik: necht’ q(j) = P(existuje seznam, kter´ y m´a d´elku alespoˇ n j). Pak P(maxim´ aln´ı d´elka seznamu = j) = q(j) − q(j + 1) a EMS =
X
q(j)
j
(teleskopick´ a suma) Spoˇcteme q(j):
vysvˇ etlit
q 0 (j) = P(dan´ y seznam m´a d´elku alespoˇ n j) ≤
n 1 j ( ) j m
q(j) ≤ m · q 0 (j) X X X n 1 j n j1 n EMS ≤ min(1, m ( ) )≤ min(1, m( ) ) ≤ min(1, ) j m m j! j! Necht’ j0 = max{k : k! ≤ n} ≤ max{k : (k/2)k/2 < n} = O(
log n ), log log n
pak EMS ≤
j0 X j+0
1+
∞ ∞ X X n n j0 ! = j0 + j! j 0 ! j! j=j j=j 0
0
∞ ∞ X X 1 1 j0 ! ≤ j0 + ≤ j0 + ( )(j−j0 ) ≤ j0 + j! j0 1 − 1/j0 j=j j=j 0
0
= O(j0 ) = O(
log n ) log log n
(3.3)
Id: hash1.tex,v 1.11 2005/05/08 19:44:10 techie Exp
3.2
14
Haˇ sov´ an´ı s uspoˇ r´ adan´ ymi ˇ retˇ ezci
Uspoˇr´ad´an´ı ˇretˇezc˚ u vylepˇs´ı ne´ uspˇeˇsn´ y pˇr´ıpad, protoˇze hled´an´ı v ˇretˇezci m˚ uˇzeme zastavit v okamziku, kdy naraz´ıme na prvek vˇetˇs´ı neˇz hledan´ y prvek (za pˇredpokladu, ˇze prvky v ˇretˇezci jsou uspoˇr´ad´any vzestupnˇe).
3.2.1
Oˇ cek´ avan´ yˇ cas
Oˇcek´avan´ y ˇcas v ne´ uspˇeˇsn´em pˇr´ıpadˇe se od ˇcasu v u ´spˇeˇsn´em pˇr´ıpadˇe liˇs´ı jen o aditivn´ı konstantu.
3.3
Haˇ sov´ an´ı s pˇ resuny
Zat´ım jsme pˇredpokl´ adali, ˇze ˇretˇezce koliduj´ıc´ıch prvk˚ u jsou uloˇzeny nˇekde v dynamicky alokovan´e pamˇeti. To nen´ı v´ yhodn´e, protoˇze vyˇzaduje pouˇzit´ı dalˇs´ı pamˇeti i kdyˇz nˇekter´e ˇretˇezce jsou pr´azdn´e. Proto nyn´ı budeme uk´ adat ˇretˇezce pˇr´ımo v tabulce. ˇ ezec na i-t´em m´ıstˇe uloˇz´ıme do tabulky tak, ˇze prvn´ı prvek je na i-t´em m´ıstˇe a pro kaˇzd´ Retˇ y prvek ˇretˇezce je v poloˇzce vpˇ red adresa n´asleduj´ıc´ıho prvku ˇretˇezce a v poloˇzce vzad je adresa pˇredchoz´ıho prvku. Zaˇc´ atek, resp. konec ˇretˇezce m´a pr´azdnou poloˇzku vzad, resp. vpˇ red. Pˇ r´ıklad 3.3.1. Napˇr´ıklad pro U = N, m = 10, h(x) = x mod 10, haˇsujeme posloupnost 10, 50, 21, 60:
0 1 2 3 4 5 6 7 8 9
kl´ıˇc 10 21
vpˇ red 5
50 60
vzad
5 3
0
MEMBER(x) je jednoduch´ y - od h(x)-t´eho m´ısta proch´az´ıme ˇretˇezec prvk˚ u aˇz na konec a v pˇr´ıpadˇe nalezen´ı prvku operaci ukonˇc´ıme. Pˇri INSERT mus´ıme zjistit, zda h(x)-t´ y ˇretˇezec zaˇc´ın´a na h(x)-t´em m´ıstˇe2 . Pokud ano, prvek pˇrid´ame do h(x)-t´eho ˇretˇezce, pokud ne, pˇrem´ıst´ıme prvek na h(x)-t´em m´ıstˇe na jin´e voln´e m´ısto, uprav´ıme vpˇ red a vzad a prvek vloˇz´ıme na h(x)-t´e m´ısto. 2 To
je jednoduch´ e - pokud prvek na h(x)-t´ em m´ıstˇ e m´ a nulov´ y ukazatel vzad, pak je zaˇ c´ atkem h(x)-t´ eho ˇretˇ ezce.
Id: hash1.tex,v 1.11 2005/05/08 19:44:10 techie Exp
15
Pˇ r´ıklad 3.3.2. Tabulka z pˇredchoz´ıho pˇr´ıkladu po INSERT(53) bude vypadat takto:
0 1 2 3 4 5 6 7 8 9
kl´ıˇc 10 21 53 50 60
vpˇ red 5
4
vzad
5 0
Pˇri DELETE mus´ıme testovat, zda odstraˇ novan´ y prvek nen´ı na 1. m´ıstˇe sv´eho ˇretˇezce a pokud ano a ˇretˇezec m´ a v´ıce prvk˚ u, mus´ıme pˇresunout jin´ y prvek z tohoto ˇretˇezce na m´ısto odstraˇ novan´eho prvku. Jak zjist´ıme, ˇze jin´ y prvek y patˇr´ı tam, kde je uloˇzen? Spoˇc´ıtat h(y) m˚ uˇze b´ yt relativnˇe pomal´e. Pokud T[i].vzad nˇekam ukazuje, pak v´ıme, ˇze h(y) 6= h(x).
3.4
Haˇ sov´ an´ı se dvˇ ema ukazateli
Pˇri haˇsov´an´ı s pˇresuny ztr´ ac´ıme ˇcas pr´avˇe tˇemi pˇresuny, obzvl´aˇstˇe, kdyˇz jsou z´aznamy velk´e. To motivuje n´ asleduj´ıc´ı implementaci haˇsov´an´ı s ˇretˇezci. Pouˇzijeme dva ukazatele, vpˇ red a zaˇ c´ atek: • T[i].vpˇ red je index n´ asleduj´ıc´ıho prvku v ˇretˇezci, kter´ y je zde uloˇzen. (Nemus´ı to b´ yt ˇretˇezec s h(x) = i.) • T[i].zaˇ c´ atek je index zaˇc´ atku ˇretˇezce, kter´ y obsahuje prvky, jejichˇz h(x) = i. Pˇ r´ıklad 3.4.1. Necht’ h(x) = x mod 10. Ukl´ad´ame prvky 50, 90, 31, 60:
0 1 2 3 4 5 6 7 8 9
kl´ıˇc 50 31 60 90
vpˇred 3
2
zaˇc´ atek 0 1
Tady m´ am zmatek. Zav´ est lepˇ s´ı znaˇ cen´ı.
Id: hash1.tex,v 1.11 2005/05/08 19:44:10 techie Exp
16
Pˇrid´ame 42, 72, 45:
0 1 2 3 4 5 6 7 8 9
3.5
kl´ıˇc 50 31 60 90 45 42 72
vpˇred 3
zaˇc´ atek 0 1 5
2 6
4
Haˇ sov´ an´ı s line´ arn´ım pˇ rid´ av´ an´ım
Jde to i bez ukazatel˚ u. Je d´ano m m´ıst, kter´ a tvoˇr´ı tabulku. Pokud je pˇr´ısluˇsn´e pol´ıˇcko jiˇz zaplnˇeno, hled´ame cyklicky prvn´ı voln´e n´ asleduj´ıc´ı m´ısto a tam zap´ıˇseme. Vhodn´e pro m´alo zaplnˇenou tabulku (< 60%, pro 80% vyˇzaduje uˇz hodnˇe ˇcasu). T´emˇeˇr nemoˇzn´e DELETE: bud’ oznaˇcit m´ısto jako smazan´e, nebo cel´e pˇrehaˇsovat.
0 1 2 3 4 5 6 7 8 9
kl´ıˇc 120 51 72
Pˇrid´ame 40, 98, 62, 108:
0 1 2 3 4 5 6 7 8 9
kl´ıˇc 120 51 72 40 62
98 108
Id: hash1.tex,v 1.11 2005/05/08 19:44:10 techie Exp
3.6
17
Haˇ sov´ an´ı se dvˇ ema funkcemi (otevˇ ren´ e h., h. s otevˇ renou adresac´ı)
Pouˇzijeme dvˇe haˇsovac´ı funkce, h1 a h2 , je zde vˇsak u ´ˇceln´e pˇredpokl´adat, ˇze h2 (i) a m jsou nesoudˇeln´e pro kaˇzd´e i ∈ U . Pˇri INSERTu pak hled´ame nejmenˇs´ı j takov´e, ˇze T [h1 (x) + jh2 (x)] je voln´e. Pˇ r´ıklad 3.6.1. Mˇejme h1 (x) = x mod 10
0 1 2 3 4 5 6 7 8 9
kl´ıˇc 10 31
INSERT(100): h1 (100) = 0 a pˇredpokl´adejme, ˇze h2 (100) = 3. Voln´e m´ısto najdeme pro i = 1. INSERT(70): h1 (70) = 0 a pˇredpokl´adejme, ˇze h2 (70) = 1. Voln´e m´ısto najdeme pro i = 2.
0 1 2 3 4 5 6 7 8 9
kl´ıˇc 10 31 70 100
Neuvedli jsme explicitn´ı vzorec pro h2 . Jej´ı sestaven´ı je totiˇz sloˇzitˇejˇs´ı. Vˇsimnˇete si, ˇze nem˚ uˇzeme vz´ıt h2 (100) = 4. Vˇsechny hodnoty h2 totiˇz mus´ı b´ yt nesoudˇeln´e s velikost´ı tabulky.
3.6.1
Algoritmus INSERT
viz algoritmus 3.4. Test k 6= i v kroku 3 br´ an´ı zacyklen´ı algoritmu. Tento probl´em m´a alternativn´ı ˇreˇsen´ı, nedovol´ıme vloˇzen´ı posledn´ıho prvku (m´ısto testu v cyklu si pamatujeme u ´daje nav´ıc). Analogick´e probl´emy nast´ avaj´ı u haˇsov´ an´ı s line´ arn´ım pˇrid´av´an´ım. Tato metoda pracuje dobˇre aˇz do 90% zaplnˇen´ı.
Id: hash1.tex,v 1.11 2005/05/08 19:44:10 techie Exp
18
Algoritmus 3.4 INSERT pro haˇsov´ an´ı se dvˇema funkcemi INSERT(x) 1. spoˇcti i = h1 (x) 2. kdyˇz tam x je, pak skonˇci kdyˇz je m´ısto pr´ azdn´e, vloˇz tam x a skonˇci 3. if i-t´e m´ısto obsazeno prvkem 6= x then spoˇcti h2 (x) k = (h1 (x) + h2 (x)) mod m while k-t´e m´ısto je obsazen´e prvkem 6= x a i 6= k do k = (k + h2 (x)) mod m end while end if 4. kdyˇz je k-t´e m´ısto obsazen´e prvkem x, pak nedˇelej nic, kdyˇz i = k, pak ohlaˇs pˇreplnˇeno, jinak vloˇz x na k-t´e m´ısto
3.6.2
Oˇ cek´ avan´ y poˇ cet test˚ u
Pˇredpokl´ad´ ame, ˇze posloupnost h1 (x), h1 (x) + h2 (x), h1 (x) + 2h2 (x), . . . je n´ahodn´a, tedy ˇze pro kaˇzd´e x maj´ı vˇsechny permutace ˇr´ adk˚ u tabulky stejnou pravdˇepodobnost, ˇze se stanou touto posloupnost´ı. pˇ ri ne´ uspˇ eˇ sn´ em vyhled´ av´ an´ı Oznaˇc´ıme jej C(n, m), kde n je velikost reprezentovan´e mnoˇziny a m je velikost haˇsovac´ı tabulky. Bud’ qj (n, m) pravdˇepodobnost, ˇze v tabulce velikosti m s uloˇzenou mnoˇzinou velikosti n jsou pˇri INSERT(x) obsazen´ a m´ısta h1 (x) + ih2 (x) pro i = 0..j − 1 (tedy ˇretˇezec m´a alespoˇ n j prvk˚ u).
C(n, m) =
n X
(j + 1)(qj (n, m) − qj+1 (n, m)
j=0 n n X X =( qj (n, m)) − (n + 1)qn+1 (n, m) = qj (n, m)
Protoˇze qj (n, m) =
(3.4)
j=0
j=0
n n−1 n−j+1 n ··· = qj−1 (n − 1, m − 1) mm−1 m−j+1 m
(3.5)
dostaneme po dosazen´ı: ... = 1 +
∞ ∞ X n n X qj−1 (n − 1, m − 1) = 1 + qj−1 (n − 1, m − 1) m m j=1 j=1
=1+
n C(n − 1, m − 1) m
(3.6)
ˇ sen´ım tohoto rekurentn´ıho vzorce je Reˇ C(n, m) =
m+1 , m−n+1
(3.7)
Id: hash1.tex,v 1.11 2005/05/08 19:44:10 techie Exp
19
coˇz dok´aˇzeme indukc´ı: C(n, m) = 1 +
n C(n − 1, m − 1) m =1+
m m−n+1+n m+1 1 n = = ≈ mm−n+1 m−n+1 m−n+1 1−α
(3.8)
pˇ ri u ´ spˇ eˇ sn´ em vyhled´ av´ an´ı Souˇcet oˇcek´ avan´ ych test˚ u vˇsech INSERT˚ u pˇres vytv´aˇren´ı reprezentovan´e mnoˇziny dˇelen´ y velikost´ı mnoˇziny.
=
n−1 n−1 n−1 1X 1 X m+1 m+1 X 1 C(i, m) = = n i=0 n i=0 m − i + 1 n i=0 m − i + 1 m+1 m−n+1 X 1 m+1 X 1 m+1 m+1 1 1 = (( )−( )) ≈ ln ≈ ln n i i n m − n + 1 α 1 − α i=1 i=1
(3.9)
N´asleduj´ıc´ı tabulka d´ av´ a oˇcek´ avanou dobu vyhled´av´an´ı pro r˚ uzn´e zaplnˇen´ı haˇsovac´ı tabulky. α 1 1−α 1 1 α ln 1−α
3.7
0.5 2 1.38
0.7 3.3 1.7
0.9 10 2.55
0.95 20 3.15
0.99 100 4.65
0.999 1000 6.9
Sr˚ ustaj´ıc´ı haˇ sov´ an´ı (standardn´ı: LISCH a EISCH)
Dalˇs´ı metodou jak ˇreˇsit kolize je neseparovat ˇretˇezce. To znamen´a, ˇze v jednom ˇretˇezci se nyn´ı mohou nach´ azet prvky, kter´e maj´ı r˚ uzn´e hodnoty haˇsovac´ı funkce. Proto se t´eto metodˇe ˇr´ık´a ˇ ezce se nepˇresouvaj´ı, v tabulce tedy nemus´ı b´ sr˚ ustaj´ıc´ı haˇsov´ an´ı. Retˇ yt obsaˇzena informace kde zaˇc´ın´a dan´ y ˇretˇezec. Tabulka m´ a dvˇe poloˇzky: kl´ıˇc a adresu n´asleduj´ıc´ıho prvku (vpˇ red). Prvek s ∈ S je reprezentov´an v ˇretˇezci, kter´ y pokraˇcuje v m´ıstˇe h(s). Pˇ r´ıklad 3.7.1. Opˇet pouˇzijeme haˇsovac´ı funkci h(x) = x mod 10. V n´asleduj´ıc´ı tabulce jsou srostl´e ˇretˇezce pro hodnoty 0 a 3 funkce h:
0 1 2 3 4 5 6 7 8 9
kl´ıˇc 10 21
vpˇ red 3
40 33
4 7
70
XXX doplnit odhady pro u ´ spˇ eˇ sn´ y/ne´ uspˇ eˇ sn´ y pˇ r´ıpad pro EISCH, LISCH, .. z 2003/2004.
Id: hash1.tex,v 1.11 2005/05/08 19:44:10 techie Exp
3.7.1
20
Algoritmus INSERT
viz algoritmus 3.5 Algoritmus 3.5 INSERT pro sr˚ ustaj´ıc´ı haˇsov´an´ı INSERT(x) 1. spoˇcti i = h(x) 2. prohledej ˇretˇezec zaˇc´ınaj´ıc´ı na m´ıstˇe i a pokud nenajdeˇs x, pˇridej ho do tabulky a pˇripoj ho do toho ˇretˇezce. Kam do toho ˇretˇezce m´ ame pˇripojit nov´ y prvek? (To je jin´a ot´azka, neˇz kter´e voln´e m´ısto zvolit.) Metoda LISCH (late insert standard coalesced hashing) ho pˇripoj´ı na posledn´ı m´ısto ˇretˇezce, metoda EISCH (early insert standard coalesced hashing) ho pˇripoj´ı hned za h(x)-t´e m´ısto. Pˇ r´ıklad 3.7.2. Po proveden´ı operac´ı LISCH INSERT(103), EISCH INSERT(94) bude tabulka z pˇr´ıkladu 3.7.1 vypadat takto:
0 1 2 3 4 5 6 7 8 9
kl´ıˇc 10 21
vpˇ red 3
40 33
4 6
94 70
7 9
103
Pozn´ amka 3.7.1. Pˇri u ´spˇeˇsn´em vyhled´an´ı je EISCH asi o 15% rychlejˇs´ı neˇz LISCH. (Pˇri ne´ uspˇeˇsn´em jsou samozˇrejmˇe shodn´e, protoˇze v obou pˇr´ıpadech je nutn´e proj´ıt cel´ y ˇretˇezec.)
3.8
Sr˚ ustaj´ıc´ı haˇ sov´ an´ı s pomocnou pamˇ et´ı (obecn´ e: LICH, EICH, VICH)
Standardn´ı sr˚ ustaj´ıc´ı haˇsov´ an´ı m´ a tu nev´ yhodu, ˇze se pˇri vˇetˇs´ım zaplnˇen´ı tabulky mohou vytvoˇrit dlouh´e ˇretˇezce. Tabulku tedy prodlouˇz´ıme o pomocnou pamˇet (tzv. sklep), do kter´e se nedostane ˇ ezce tedy srostou aˇz po zaplnˇen´ı sklepa. haˇsovac´ı funkce, a koliduj´ıc´ı prvky pˇrid´ av´ame odspodu. Retˇ Opˇet existuj´ı varianty pˇripojen´ı nov´eho prvku do ˇretˇezce: LICH a EICH jsou analogick´e k LISCH a EISCH. VICH (variable insert coalesced hashing) pˇripojuje na konec ˇretˇezce, jestliˇze ˇretˇezec konˇc´ı ve sklepˇe, jinak na m´ısto, kde ˇretˇezec opustil sklep.
Id: hash1.tex,v 1.11 2005/05/08 19:44:10 techie Exp
21
Pˇ r´ıklad 3.8.1. Provedeme operaci INSERT pro n´asleduj´ıc´ı posloupnost prvk˚ u: 10, 41, 60, 70, 71, 90, 69, 40, 79. Tabulka pak bude vypadat takto:
0 1 2 3 4 5 6 7 8 9 10 11 12
LICH kl´ıˇc vpˇ red 10 12 41 10
kl´ıˇc 10 41
79 40 69 90 71 70 60
79 40 69 90 71 70 60
6 7 8 9 11
EICH vpˇ red (12)(11)(9)7 10
VICH kl´ıˇc vpˇ red 10 12 41 10
8 9 11 (11)(8)6
79 40 69 90 71 70 60
12
8 9 (8)6 (9)7 11
Sklep je od ”hlavn´ı ˇc´ asti” tabulky odliˇsen ˇcarou.
3.8.1
Operace DELETE
viz algoritmus 3.6 Algoritmus 3.6 DELETE pro sr˚ ustaj´ıc´ı haˇsov´an´ı s pomocnou pamˇet´ı 1. spoˇc´ıt´ ame h(x) a prohled´ ame ˇretˇezec zaˇc´ınaj´ıc´ı na adrese h(x). kdyˇz neobsahuje x → konec. 2. kdyˇz x je na adrese h(x) a v ˇretˇezci n´asleduje prvek v pomocn´e ˇc´asti tabulky (sklepˇe) odstran´ıme x. Prvek, kter´ y n´ asleduje za x pˇresuneme na m´ısto h(x) a uvoln´ıme jeho m´ısto konec. 3. x je ve sklepˇe - zj´ıst´ıme, zda se nach´az´ı v ˇretˇezci mimo sklep prvek s haˇsovac´ı hodnotou h(x) - pokud neexistuje, pˇresuneme posledn´ı prvek v ˇretˇezci, kter´ y je ve sklepˇe na m´ısto x a m´ısto posledn´ıho prvku uvoln´ıme. Kdyˇz takov´ y prvek existuje, vezmeme prvn´ı prvek s touto vlastnost´ı. Oznaˇcme ho y, pak y pˇreneseme na m´ısto x a budeme cht´ıt uvolnit m´ısto prvku y. (obraznˇe ˇreˇceno x a y v ˇretˇezci prohod´ıme) 4. x je v ˇc´ asti, kam m˚ uˇze haˇsovac´ı funkce a ˇretezec v t´eto ˇc´asti pokraˇcuje. pak x odstran´ıme a prvky za x zahaˇsujeme do tabulky v poˇrad´ı jak se do n´ı ukl´adaly a pokud vznik´a kolize, um´ıst´ıme je zp´atky na m´ısto, kde byly.
Id: hash1.tex,v 1.11 2005/05/08 19:44:10 techie Exp
22
Pˇ r´ıklad 3.8.2. Pouˇzijeme haˇsovac´ı funkci h(x) = x mod 10 Provedeme operaci DELETE na prvky 41, 42. • metoda LICH: odstran´ıme prvky 62,78,82,52 z ˇretˇezce a provedeme postupnˇe INSERT: 62,78,82,52
? 42 v puv. tabulce nebylo XXX sehnat puvodni priklad
• metoda VICH: odstran´ıme 62,78,82,52 a provedeme INSERT: 82,62,78,52. pokud bychom provedli INSERT 82,62,52,78, pak bychom nepoznali, v jak´em to bylo v tabulce poˇrad´ı.
0 1 2 3 4 5 6 7 8 9 10 11 12
3.8.2
kl´ıˇc
vpˇ red
11 32 43
10 9
42 82 78 62 52 21 41 61
9 6 7 8 11 12
Srovn´ avac´ı graf
XXX
3.9
Srovn´ an´ı metod
Zde uv´ad´ıme porovn´ an´ı podle poˇctu test˚ u, protoˇze to se d´a vypoˇc´ıtat. Doba bˇehu se mus´ı mˇeˇrit.
3.9.1
Poˇ rad´ı podle ne´ uspˇ eˇ sn´ eho pˇ r´ıpadu
V ne´ uspˇeˇsn´em pˇr´ıpadˇe: 1. h. s uspoˇr´ adan´ ymi ˇretˇezci (nejlepˇs´ı) 2. h. s pˇresuny 3. VICH=LICH a h. se 2 ukazateli (VICH je lepˇs´ı aˇz do α = 3/4) 4. EICH 5. LISCH=EISCH (aˇz sem je vˇse O(1)) 6. h. se 2 funkcemi 7. h. s line´ arn´ım pˇrid´ av´ an´ım (nejhorˇs´ı)
Nascanovat obr´ azek z Vittera a Chena [6]
Id: hash1.tex,v 1.11 2005/05/08 19:44:10 techie Exp
3.9.2
23
Poˇ cet test˚ u pro zaplnˇ enou tabulku
Poˇcet test˚ u pro u ´plnˇe zaplnˇenou tabulku (m = n nebo m = n − 1) typ h. s pˇresuny h. se 2 ukazateli VICH=LICH EICH LISCH=EISCH h. se 2 funkcemi h. s line´ arn´ım pˇrid´ av´ an´ım
3.9.3
Poˇ cet test˚ u vyj´ adˇ ren´ y vzorcem
typ s ˇretˇezci s uspoˇr´adan´ ymi ˇretˇezci s pˇremist’ov´ an´ım se 2 ukazateli s line´arn´ım pˇrid´ av´ an´ım dvojit´e haˇsov´ an´ı LISCH EISCH
co znamenaj´ı ˇ c´ısla v prav´ em sloupci ?
XXX 1.5 1.6 1.8 1.92 2.1 n n
u ´spˇeˇsn´e vyhled´an´ı 1 + α2 1 + α2 1 + α2 2 1 + α2 + α2 1 1 2 (1 + 1−α ) 1 1 α ln 1−α 1 2α 1+ (e − 1 − 2α) 8α 1 + α 4 1 α α (e − 1)
ne´ uspˇeˇsn´e hled´an´ı e−α + α e−α + 1 + α2 − α1 (1 − eα ) e−α + α 2 1 + α2 + α + e−α (2 + α) − 2 2 1 1 2 (1 + ( 1−α ) ) 1 1−α
1 + 14 (e2α − 1 − 2α) 1 + 14 (e2α − 1 − 2α)
α 1 + 2β kdyˇz α ≤ λβ 1 + β (e2(α/β−λ) − 1 − 2(α/β − λ)) 8α LICH u ´spˇeˇsn´e: ×(3 − β2 + 2λ) + 1 ( α + λ) + λ (1 − λβ ) kdyˇz α ≥ λβ 4 α 4 β α −α/β +β kdyˇz α ≤ λβ e 1 1 2(α/β−λ) 2 LICH ne´ uspˇeˇsn´e: β + 4 (e , − 1)(3 − β + 2λ) 1 − 2 (α/β − λ) kdyˇz α ≥ λβ m kde β = m ıl adresov´e ˇc´ asti tabulky na jej´ı celkov´e velikosti a λ je jedin´e nez´aporn´e 0 je pod´ ˇreˇsen´ı rovnice e−λ + λ = β1 .
3.10
Pˇ rehaˇ sov´ av´ an´ı
V pˇredchoz´ıch metod´ ach jsme narazili na pˇr´ıpady, ˇze pˇri velk´em zaplnˇen´ı tabulky je nutn´e ji pˇrehaˇsovat. Zde si uk´ aˇzeme metodu, jak se to dˇel´a. M´ame haˇsovac´ı funkce: h0 haˇsuje do tabulky velikosti m = 20 m, h1 do 2m = 21 m, h2 do 4m = 22 m . . . , hi do 2i m.
Id: hash1.tex,v 1.11 2005/05/08 19:44:10 techie Exp
24
Mnoˇzinu S reprezentujeme takto: Uloˇzena je velikost S a ˇc´ıslo i takov´e, ˇze 2i−2 m < |S| < 2i m
(3.10)
a S je zahaˇsov´ ana funkc´ı hi .
3.10.1
MEMBER
MEMBER funguje norm´ alnˇe, pˇri INSERT a DELETE kontrolujeme poruˇsen´ı podm´ınky (3.10) a pˇr´ıpadnˇe pˇrehaˇsujeme pro i ± 1:
3.10.2
INSERT
Provedeme operaci INSERT a kdyˇz m´ame pˇridat prvek, testujeme, zda |S| + 1 < 2i m. Pokud nerovnost plat´ı, dokonˇc´ıme INSERT. Pokud neplat´ı, zvˇetˇs´ıme i o 1 a spoˇc´ıt´ame uloˇzen´ı S ∪ {x} vzhledem k nov´e haˇsovac´ı funkci hi .
3.10.3
DELETE
Provedeme operaci DELETE a kdyˇz m´ ame odstranit prvek, testujeme, zda i > 0 a |S|−1 = 2i−2 m. Pokud rovnost neplat´ı, dokonˇc´ıme DELETE. Pokud plat´ı, zmenˇs´ıme i o 1 a spoˇc´ıt´ame uloˇzen´ı S − {x} vzhledem k nov´e haˇsovac´ı funkci hi .
3.10.4
Sloˇ zitost
Tato metoda m´ a malou amortizovanou sloˇzitost. Kdyˇz se spoˇc´ıt´a haˇsovac´ı tabulka pro novou haˇsovac´ı funkci hi , pak obsahuje 2i−1 m prvk˚ u a proto je tˇreba alespoˇ n 2i−2 m u ´spˇeˇsn´ ych operac´ı DELETE nebo 2i−1 m u ´spˇeˇsn´ ych operac´ı INSERT, abychom pˇrepoˇc´ıt´avali tabulku pro jinou haˇsovac´ı funkci. Tedy amortizovan´ a sloˇzitost pˇrepoˇc´ıt´av´an´ı tabulky je O(1) (tato metoda nen´ı vhodn´a pro pr´ aci v interaktivn´ım reˇzimu).
Kapitola 4
Haˇ sov´ an´ı II 4.1
Univerz´ aln´ı haˇ sov´ an´ı
Idea univerz´ aln´ıho haˇsovan´ı m´ a odstranit poˇzadavek na rovnomˇern´e rozloˇzen´ı vstupn´ıch dat. Tento poˇzadavek chceme nahradit t´ım, ˇze budeme m´ıt soubor H haˇsovac´ıch funkc´ı do tabulky velikosti m takov´ y, ˇze pro kaˇzdou podmnoˇzinu S univerza U je pravdˇepodobnost, ˇze funkce z H se chov´a dobˇre, hodnˇe velk´ a (tj. je jen m´ alo koliz´ı). V tomto pˇr´ıpadˇe, kdyˇz vybereme h z H n´ahodnˇe s rovnomˇern´ ym rozloˇzen´ım, pak pro kaˇzdou podmnoˇzinu S ⊆ U takovou, ˇze |S| ≤ m, bude oˇcek´avan´ y ˇcas (poˇc´ıtan´ y pˇres vˇsechny funkce z H) konstantn´ı. Rozd´ıl proti tradiˇcn´ımu haˇsovan´ı je, ˇze pˇredpoklad rovnomˇern´eho v´ ybˇeru haˇsovac´ı funkce z mnoˇziny H m˚ uˇzeme zajistit (nebo se k splnˇen´ı tohoto poˇzadavku pˇribl´ıˇzit), ale v´ ybˇer vstupn´ıch dat ovlivnit nem˚ uˇzeme. Nyn´ı tuto ideu zformalizujeme. Definice 4.1.1. Tˇr´ıda haˇsovac´ıch funkc´ı H ⊆ {h|h : {0 .. N − 1} → {0 .. m − 1}} je c-univerz´ aln´ı syst´em, kde c ∈ R+ , jestliˇze ∀x 6= y ∈ {0 .. N − 1} : |{h ∈ H : h(x) = h(y)}| ≤ c
|H| , m
Nejprve uk´ aˇzeme, ˇze c-univerz´ aln´ı syst´emy existuj´ı: Vˇ eta 4.1.1. Pˇredpokl´ adejme, ˇze U = {0 .. N − 1}, kde N je prvoˇc´ıslo. Definujme H = {hab : hab (x) = ((ax + b) mod N ) mod m; a, b ∈ {0 .. N − 1}} N N 2 Potom H je c-univerz´ aln´ı a c = m /m . D˚ ukaz. |H| = N 2 , coˇz je poˇcet dvojic (a, b). Necht’ (x, y) jsou libovoln´e, ale pevn´e. Z´aroveˇ n plat´ı x 6= y. Kolize nastane v pˇr´ıpadech, kdyˇz: hab (x) = hab (y), neboli ax + b ay + b
= q + rm (mod N ) = q + sm (mod N )
kde (a, b) jsou nezn´ am´e a parametry (q, r, s) nab´ yvaj´ı vˇsech hodnot takov´ ych, ˇze q ∈ {0 .. m − 1} ∧ r, s ∈ {0 .. dN/me − 1}. 25
zaj´ım´ a n´ as jednak c, jednak velikost syst´ emu (tj. poˇ cet funkc´ı v syst´ emu)
Id: hash2.tex,v 1.13 2005/05/08 19:44:10 techie Exp
26
N je prvoˇc´ıslo, tedy ZN je tˇeleso a pro kaˇzdou trojici parametr˚ u (q, r, s) m´a soustava pr´avˇe jedno 2 ˇreˇsen´ı (a, b). Poˇcet koliduj´ıc´ıch funkc´ı je pˇresnˇe tolik, jako poˇcet trojic (q, r, s), kter´ y je m · dN/me . 2 N 2 d N e N2 = c |H| |{hab : hab (x) = hab (y)}| ≤ m m = m N 2 m m (m ) ⇒ tento univerz´ aln´ı syst´em lze zkonstruovat. Velikost H je N 2 .
4.1.1
m je poˇ cet q, ˚ N ˇ2 je poˇ cet m q, s
Oˇ cek´ avan´ a d´ elka ˇ retˇ ezce
Definice 4.1.2. Mˇejme libovolnou pevnou S ⊆ U , libovoln´e pevn´e x ∈ U a funkci h : U → {0 .. m − 1}. Definujme Sh,x = ˇretˇezec prvk˚ u y ∈ S, pro kter´e plat´ı h(y) = h(x).
(4.1)
Zaved’me δh (x, y) = [x 6= y ∧ h(x) = h(y)] X δh (x, S) = δh (x, y),
(4.2)
Iversonova konvence: [true]=1, [false]=0
(4.3)
y∈S
Chceme spoˇc´ıtat pr˚ umˇernou d´elku Sx , kde pr˚ umˇer poˇc´ıt´ame pˇres vˇsechny h ∈ H, kde H je c-univerz´aln´ı syst´em. Vˇ eta 4.1.2. Kdyˇz H je c-univers´ aln´ı syst´em, pak ∀S ⊆ U a ∀x ∈ U je oˇcek´ avan´ a hodnota ( c(|S|−1) x∈S δh (x, S) = c|S|m x∈ /S m kde pr˚ umˇer se bere pˇres h ∈ H a pˇredpokl´ ad´ ame rovnomˇern´y v´ybˇer fc´ı z H. D˚ ukaz. X
δh (x, S) =
XX
δh (x, y) =
h∈H y∈S y6=x
h∈H
=
X
= Tedy pr˚ umˇern´ a hodnota δh (x, S) ≤
δh (x, y)
y∈S h∈H y6=x
|{h ∈ H; h(x) = h(y)}| ≤
y∈S y6=x
(
XX
cn|H| m c(n−1)|H| m
X c|H| m
y∈S y6=x
x∈ /S x∈S
cn m.
Vˇ eta 4.1.3. Pro kaˇzdou mnoˇzinu S ⊆ U , |S| = n a kaˇzd´e x je oˇcek´ avan´y ˇcas operac´ı MEMBER, INSERT, DELETE O(c·n/m), pˇriˇcemˇz je bran´y pˇres vˇsechny funkce h ∈ H pˇri jejich rovnomˇern´em rozdˇelen´ı. Vˇ eta 4.1.4. Markovova nerovnost: Necht’ oˇcek´ avan´ a hodnota X je nenulov´ a. Pak plat´ı P(X ≥ tEX) ≤ 1/t Pozn´ amka 4.1.1. Jin´ a formulace Markovovy nerovnosti (vˇety) m˚ uˇze b´ yt tato: Kdyˇz X je n´ ahodn´ a veliˇcina s oˇcek´ avanou hodnoutou µ, pak P (X ≥ tµ) ≤ 1t .
pokud by nebyl uveden pˇ redpoklad X 6= 0, vˇ eta bz neplatila
Id: hash2.tex,v 1.13 2005/05/08 19:44:10 techie Exp
27
D˚ ukaz. X je rovnomˇernˇe rozdˇelen´ a n´ ahodn´a veliˇcina nab´ yvaj´ıc´ı hodnot {xi : i ∈ I}, I ⊂ N, I 0 = {i ∈ I : xi ≥ tµ}, pak 1 X xi |I| i∈I 1 X > xi |I| i∈I 0 1 X ≥ tµ |I| 0
I0 ⊂ I
µ=
z definice I 0
i∈I
|I 0 | tµ = |I| a tedy P(X ≥ tµ) =
|I 0 | 1 < |I| t
Varianta Markovovy nerovnosti: Vˇ eta 4.1.5. Za stejn´ych pˇredpoklad˚ u jako u vˇety 4.1.3, kdyˇz µ je pr˚ umˇern´ a d´elka ˇretˇezce Sh,x , pak ∀t > 1 P(|Sh,x | ≥ tµ) <
1 t
D˚ ukaz. plyne z Markovovy nerovnosti.
4.1.2
Velikost c-univerz´ aln´ıho syst´ emu
Doln´ı mez ˇ Rekli jsme, ˇze pˇri pouˇzit´ı c-univerz´ aln´ıho syst´emu z nˇej haˇsovac´ı funkce vyb´ır´ame n´ahodnˇe. V praxi ale budeme vˇetˇsinou pouˇz´ıvat pseudon´ahodn´ y gener´ator, kter´ y se po urˇcit´e periodˇe opakuje. Abychom zajistili co nejvˇetˇs´ı n´ ahodnost, potˇrebujeme, aby syst´em H mˇel co nejm´enˇe funkc´ı. Vˇ eta 4.1.6. Kdyˇz H je c-univerz´ aln´ı syst´em funkc´ı z univerza U do {0 .. m − 1}, pak |H| ≥
m d(logm N ) − 1e . c
D˚ ukaz. Mˇejme c-univerz´ aln´ı syst´em H = {h1 . . . h|H| }. Necht’ U0 = U . Necht’ U1 je nejvˇetˇs´ı podmnoˇzina U0 takov´a ˇze h1 je na (U1 ) konstantn´ı. Necht’ U2 je nejvˇetˇs´ı podmnoˇzina U1 takov´a ˇze h2 je na (U2 ) konstantn´ı. (Tak´e h1 je na (U2 ) konstantn´ı) A tak d´ ale.
Id: hash2.tex,v 1.13 2005/05/08 19:44:10 techie Exp
28
Plat´ı |U0 | = N N |U1 | ≥ m dN/me N |U2 | ≥ ≥† m m2 N |Ui | ≥ mi
†
t
Necht’ t = dlogm N e − 1. Plat´ı dxe − 1 < x a log je rostouc´ı, tedy m < N a N |Ut | ≥ > 1, mt neboli Ut obsahuje alespoˇ n 2 r˚ uzn´e prvky, a 6= b Necht’ ∗ = |{h ∈ H : h(a) = h(b)}|. Z definice c-univerz´aln´ıho syst´emu ∗ ≤ h1 , . . . , ht jsou na Ut konstantn´ı, dost´ av´ame ∗ ≥ t. Zbytek je jednoduch´ y.
c|H| m .
Protoˇze
N´as zaj´ım´ a log2 |H|, tedy kolik bit˚ u potˇrebujeme od pseudon´ahodn´eho gener´atoru na urˇcen´ı n´ahodn´e haˇsovac´ı funkce. Zjistili jsme, ˇze potˇrebujeme nejm´enˇe log2 m + log2 d(logm N ) − 1e − log2 c bit˚ u. Pˇ r´ıklad mal´ eho c-univerz´ aln´ıho syst´ emu My zn´ame c-univerz´ aln´ı syst´em velikosti N 2 , tedy log2 |H| = 2 log2 N , coˇz je hodnˇe velk´e proti pr´avˇe spoˇc´ıtan´emu doln´ımu odhadu. Nyn´ı zkonstruujeme c-univerz´aln´ı haˇsovac´ı syst´em, kter´ y tento doln´ı odhad v jist´em smyslu nab´ yv´ a. Bud’ p1 , p2 . . . rostouc´ı posloupnost vˇsech prvoˇc´ısel. Z teorie ˇc´ısel bychom si mˇeli pamatovat, ˇze pt = O(t log t). Zvol´ıme nejmenˇs´ı t takov´e, ˇze t ln pt ≥ m ln N (4.4) Definujme hc,d,l (x) = (c(x mod pl ) + d) mod p2t mod m H = {hc,d,l : c, d ∈ {0 .. p2t − 1}, t < l ≤ 2t},
(4.5) (4.6)
pak |H| = tp22t , a tedy log2 |H| = log2 t+2 log2 p2t = O(log t+2 log 2t+2 log log 2t) = O(log t) = O(log m + log log N ), ˇc´ımˇz jsme se dostali na doln´ı hranici odvozenou v´ yˇse. Dok´aˇzeme, ˇze H je 5-univerz´ aln´ı syst´em. Zvolme x 6= y ∈ U , spoˇcteme odhad |{h ∈ H : hc,d,l (x) = hc,d,l (y)}|, tedy mus´ıme odhadnout ze shora poˇcet trojic c, d, l takov´ ych, ˇze hc,d,l (x) = hc,d,l (y). Rozdˇel´ıme je do dvou skupin: 1. c, d, l takov´ a, ˇze hc,d,l (x) = hc,d,l (y), ale x mod pl 6= y mod pl 2. c, d, l takov´ a, ˇze hc,d,l (x) = hc,d,l (y), a x mod pl = y mod pl
vysvˇ etlit
Id: hash2.tex,v 1.13 2005/05/08 19:44:10 techie Exp
29
1. Plat´ı c(x mod pl ) + d = k + qm (mod p2t ) c(y mod pl ) + d = k + rm (mod p2t ) pro nˇejak´ a k ∈ {0 .. m − 1}, q, r ∈ {0 .. d pm2t e − 1}. Protoˇze pl je prvoˇc´ıslo, je poˇcet trojic splˇ nuj´ıc´ıch (1) roven p2t 2 poˇcet trojic ≤ tmd e m p2t 2 ≤ tm 1 + m 2 p22t m = tm 2 1 + m p2t 2 m |H| = 1+ p2t m |H| ≤4 m Jeˇstˇe tedy mus´ıme uk´ azat, ˇze m < p2t . Kdyby ale p2t ≤ p2t ln p2t ≤ m ln m ≤ m ln N ≤ t ln pt .
#l ≤ t, #(c, d) = #(k, q, r)
vytknut´ım
jestliˇze m ≤ p2t m, pak dostaneme tento spor: t ln pt <
Pozn´ amka 4.1.2. ∀(k, q, r)∃!(c, d), kter´e ˇreˇs´ı rovnici, jelikoˇz Zp2t je tˇeleso a x mod pl 6= y mod pl . 2. Necht’ L = {l : x mod pl = y mod pl ∧ t < l ≤ 2t}. Pak poˇcet trojic splˇ nuj´ıc´ıch (2) je roven poˇcet trojic = |L|p22t tp22t m |H| =1 m ≤
jestliˇze |L| ≤ t/m
|H| |H| Pokud tedy jeˇstˇe dok´ aˇzeme, ˇze |L| ≤ t/m, pak |{h ∈ H : hc,d,l (x) = hc,d,l (y)}| ≤ 4 |H| m + m =5 m a H je 5-univerz´ aln´ı syst´em. Q Necht’ P = l∈L pl . Z definice L vˇsechna pl dˇel´ı |x − y|, tedy i P dˇel´ı |x − y|, a proto P ≤ |L| |x − y| ≤ N . Protoˇze P ≥ pt , dostaneme |L| ≤ ln N/ ln pt , a z definice t (4.4) plyne |L| ≤ t/m.
4.1.3
Reprezentace S a operace MEMBER, INSERT, DELETE
M´ame m a pro vˇsechna i = 0, 1, . . . je d´an ci -univerz´aln´ı syst´em funkc´ı Hi haˇsuj´ıc´ı do tabulky velikosti 2i m. Reprezentace S ⊆ U : • |S| • i takov´e, ˇze 2i−2 m < |S| < 2i m • funkce h ∈ Hi • reprezentace S v˚ uˇci hi • ∀j ∈ {0..2i m − 1} je d´ ana d´elka ˇretˇezce reprezentuj´ıc´ıho prvky s h(x) = j • konstanty di omezuj´ıc´ı d´elky ˇretˇezce
Id: hash2.tex,v 1.13 2005/05/08 19:44:10 techie Exp
30
MEMBER MEMBER pracuje norm´ alnˇe. INSERT viz algoritmus 4.1 Algoritmus 4.1 INSERT pro univers´ aln´ı haˇsov´an´ı 1. zjist´ıme, zda m´ ame pˇridat do S 2. kdyˇz d´elka j-t´eho ˇretˇezce +1 > di , pak spoˇc´ıt´ ame novou reprezentaci 3. kdyˇz |S| + 1 = 2i m, pak inkrementujeme i a spoˇc´ıt´ ame novou reprezentaci 4. jinak pˇrid´ ame prvek do ˇretˇezce h(x)
DELETE viz algoritmus 4.2 Algoritmus 4.2 DELETE pro univers´aln´ı haˇsov´an´ı 1. zjist´ıme, zda x ∈ S 2. kdyˇz x ∈ S a |S| − 1 = 2i−2 m a i > 0, pak dekrementujeme i a spoˇc´ıt´ ame novou reprezentaci 3. jinak x odstran´ıme z h(x)
Spoˇ c´ıt´ an´ı nov´ e reprezentace repeat zvol´ıme n´ ahodnˇe h ∈ Hi spoˇc´ıt´ ame reprezentaci S v˚ uˇci h until vˇsechny ˇretˇezce maj´ı d´elku ≤ di Kolikr´at probˇehne ten cyklus? Z´ avis´ı to na v´ıce parametrech a nen´ı jist´e, zda to bylo nˇekdy pˇresnˇe spoˇc´ıt´ano.
4.2
Extern´ı haˇ sov´ an´ı
M´ame d´ano universum U a vnˇejˇs´ı pamˇet’ov´e medium, kter´e je rozdˇeleno do str´anek. Kaˇzd´a str´anka m˚ uˇze obsahovat nejv´ yˇse b z´ aznam˚ u. Chceme navrhnout ukl´ad´an´ı prvk˚ u do str´anek tak, aby operace MEMBER, INSERT, DELETE vyˇzadovaly jen konstatn´ı poˇcet pˇr´ıstup˚ u do extern´ı pamˇeti, aby str´anky byly dostateˇcnˇe zaplnˇen´e. Tedy jin´ ymi slovy: chceme minimalizovat poˇcet pˇr´ıstup˚ u do vnˇejˇs´ı pamˇeti.
Id: hash2.tex,v 1.13 2005/05/08 19:44:10 techie Exp
31
Vyhled´ ame vˇzdy str´ anku ve vnˇejˇs´ı pamˇeti - nat´ahneme ji do vnitˇrn´ı pamˇeti a tam provedeme vyhled´av´an´ı - toto vyhled´ av´ an´ı n´ as ale nezaj´ım´a. Necht’ U je universum, S ⊆ U . Extern´ı medium m´a str´anky o velikosti b. Je d´ana haˇsovac´ı funkce h : U → {0, 1}k prost´ a (k´ odovac´ı funkce), k libovoln´e. Funkce h tedy generuje bin´arn´ı k´ody d´elky k. Vytvoˇr´ıme strom mnoˇziny S. Vrcholy stromu jsou vˇsechny prefixy slov h(s), s ∈ S. Pro vrchol α jsou jeho synov´e α0 a α1 (pokud existuj´ı). Listy jsou prvky h(s), s ∈ S. Definice 4.2.1. Pro s ∈ S definujeme d(s) = d´elka nejkratˇs´ıho prefixu α slova h(s), ˇze pod α je nejv´ yˇse b list˚ u. Pozn´ amka 4.2.1. Alternativn´ı definice d(s): d(s) = d´elka nejkratˇs´ıho prefixu h(s) takov´a, ˇze poˇcet prvk˚ u t ∈ S, jejichˇz prefix d´elky d(s) je stejn´ y jako prefix h(s), je nejv´ yˇse b. Definice 4.2.2. d(S) = max{d(s), s ∈ S}. Pˇ r´ıklad 4.2.1. Necht’ U = {0, 1}4 , b = 2 a S = {0100, 0001, 0000, 1001} Tuto strukturu m˚ uˇzeme zobrazit do stromu, kde bude l´epe viditeln´a hodnota d(S).
l 1
0 00
01
11
000
010
110
0000 0001 0100
1100
Obr´azek 4.1: Reprezentace mnoˇziny S. Vrchol reprezentuj´ıc´ı prefix 0, by ve sv´em podstromˇe mˇel 3 prvky, coˇz je v´ıce, neˇz poˇzadujeme pomoc´ı hodnoty b. Z obr. 4.1 plyne, ˇze hodnota d(S) = 2. Tvrzen´ı 4.2.1. Plat´ı: Kdyˇz d(s) = k a prvek t m´ a stejn´y prefix d´elky k jako s, pak d(s) = d(t). Reprezentace: • adres´ aˇr: ke kaˇzd´emu slovu α d´elky d(S) je pˇriˇrazena adresa str´anky, kter´a obsahuje prvky s ∈ S, ˇze h(s) m´ a prefix α. Tato slova d´elky d(s) jsou lexikograficky uspoˇr´ad´ana. • datov´ a ˇc´ ast: str´ anky s pˇriˇrazen´ ymi prvky Pˇ r´ıklad 4.2.2. Pˇr´ıklad adres´ aˇre pro mnoˇzinu {0000, 0001, 0100, 1001}: 00 01 10 11
→ → & →
0000, 0001 0100 1001
Id: hash2.tex,v 1.13 2005/05/08 19:44:10 techie Exp
32
Pozn´ amka 4.2.2. Upˇresnˇen´ı reprezentace str´anky (str´anek): Prvek s ∈ S je uloˇzen na str´ ance, kter´ a obsahuje vˇsechny prvky t ∈ S takov´e, ˇze prefix h(t) d´elky d(s) bude je stejn´ y jako h(s), tato st´ anka bude pˇriˇrazena vˇsem slov˚ um α d´elky d(S) takov´ ym, ˇze prefix h(s) d´elky d(s) je prefix α. Pokud α neobsahuje ˇz´ adn´ y takov´ y prefix, tak je mu pˇriˇrazena str´anka NIL.
4.2.1
Operace ACCESS
viz algoritmus 4.3 Algoritmus 4.3 ACCESS pro extern´ı haˇsov´an´ı ACCESS(x) 1. Spoˇc´ıt´ ame h(x), nat´ ahneme adres´aˇr, nalezneme d(S) a najdeme str´anky odpov´ıdaj´ıc´ı prefixu h(x) d´elky d(S) 2. Nat´ ahneme odpov´ıdaj´ıc´ı str´ anku do pamˇeti, zjist´ıme, zda obsahuje x a kdyˇz ano, provedeme poˇzadoven´e u ´pravy. 3. Str´ anku uloˇz´ıme zpˇet na stejn´e m´ısto.
Operace ACCESS vyˇzaduje 3 pˇr´ıstupy na extern´ı medium. (za pˇredpokladu, ˇze adres´aˇr je tak´e uloˇzen na extern´ım mediu a zab´ır´ a jednu str´anku) Pro rychlou implementaci aktualizaˇcn´ıch operac´ı je vhodn´e m´ıt u kaˇzd´e str´anky uloˇzeno informaci kolik je prvk˚ u na str´ ance.
4.2.2
Operace INSERT
viz algoritmus 4.4 Algoritmus 4.4 INSERT pro extern´ı haˇsov´an´ı INSERT(x) 1. Spoˇc´ıt´ ame h(x), nat´ ahneme adres´aˇr, nalezneme d(S) a nalezneme adresu str´anky odpov´ıdaj´ıc´ı prefixu h(x) d´elky d(S). (XXX odkud vezmu d(S) ?) 2. Nat´ ahneme do pamˇeti odpov´ıdaj´ıc´ı str´anku. kdyˇz v n´ı existuje x → konec 3. Kdyˇz neobsahuje x a m´ a m´enˇe prvk˚ u neˇz b, vloˇz´ıme x do t´eto str´anky a uloˇz´ıme ji zp´atky na stejn´e m´ısto a aktualizujeme adres´ aˇr (poˇcty prvk˚ u na str´ance) 4. Kdyˇz str´ anka prvek x neobsahuje a m´a b prvk˚ u, str´anku rozdˇel´ıme (nalezneme nov´e d(s) pro s z t´eto str´ anky i s pˇridan´ ym x), str´anky uloˇz´ıme a aktualizujeme adres´aˇr.
Operace INSERT vyˇzaduje 6 pˇr´ıstup˚ u na extern´ı medium. Pozn´ amka 4.2.3. Rozˇstˇepen´ı str´ anky nemus´ı nutnˇe znamenat zvˇetˇsen´ı adres´aˇre. Pˇ r´ıklad 4.2.3. Do mnoˇziny z pˇr´ıkladu 4.2.1 vloˇz´ıme pomoc´ı operace INSERT prvek 1111. Hodnota d(1100) = 1 se po vloˇzen´ı prvku 1111 nezmˇen´ı. Podstrom reprezentuj´ıc´ı prvky mnoˇziny S s prefixem 11 bude m´ıt po vloˇzen´ı prvku 1111 dva syny. (viz obr. 4.2)
pokud je novˇ e nalezen´ e d(s) ≤ d(S), adres´ aˇ r se zvˇ etˇ sovat nebude
Id: hash2.tex,v 1.13 2005/05/08 19:44:10 techie Exp
33
11 110 111 1100 1111 Obr´azek 4.2: Podstrom reprezentuj´ıc´ı prvky mnoˇziny S s prefixem 11 po vloˇzen´ı prvku 1111 Pokud vezmeme situaci danou po vloˇzen´ı prvku 1111, bude adres´aˇr vypadat takto: 00 01 10
→ → &
11
%
0000, 0001 0100 1001
Nyn´ı vloˇz´ıme prvek 0010. V tomto pˇr´ıpadˇe dojde ke zvˇetˇsen´ı adres´aˇre: 000 001 010 011 100 101 110 111
→ → → % & → % %
0000, 0001 0010 0100
1001, 1111
Hodnota d(S) je nyn´ı 3.
4.2.3
Operace DELETE
viz algoritmus 4.5 Algoritmus 4.5 DELETE pro extern´ı haˇsov´an´ı DELETE(x) 1. spoˇc´ıt´ ame h(x), nat´ ahneme adres´aˇr, nalezneme d(S), nalezneme adresu str´anky odpov´ıdaj´ıc´ı prefixu h(x) d´elky d(S), zjist´ıme zda po odebr´an´ı prvku x m˚ uˇze nastat spojov´an´ı str´anek a pokud ano, nalezneme adresu str´ anky, kter´ a se spoj´ı s naˇs´ı str´ankou 2. nat´ ahneme odpov´ıdaj´ıc´ı str´ anku do pamˇeti, zjist´ıme zda obsahuje x, pokud ne, tak konec 3. kdyˇz obsahuje x a nem˚ uˇze doj´ıt ke slouˇcen´ı str´anek, tak odstran´ıme x, str´anku uloˇz´ıme na stejn´e m´ısto a aktualizujeme adres´ aˇr (poˇcty prvk˚ u na str´ance) 4. kdyˇz obsahuje a dojde ke sluˇcov´ an´ı, pak odstran´ıme x, nat´ahneme druhou str´anku a str´anky slouˇc´ıme, uloˇz´ıme novou str´ anku a aktualizujeme adres´aˇr. pro aktualizaci adres´ aˇ re to mohou b´ yt 2 operace naˇ cten´ı a uloˇ zen´ı. zˇ rejmˇ e proto, aby mohlo b´ yt souˇ casnˇ e puˇ stˇ eno v´ıc operac´ı.
Id: hash2.tex,v 1.13 2005/05/08 19:44:10 techie Exp
34
Pˇ r´ıklad 4.2.4. Pro situaci z pˇr´ıkladu 4.2.3 provedeme DELETE(0100). V adres´aˇri budou pak poloˇzky 010 a 011 ukazovat na pr´ azdnou str´anku (NIL). Adres´aˇr z˚ ustal po t´eto operaci stejn´ y. Nyn´ı smaˇzeme prvek 0001.
l ...
0 00 000
010
0000 0001 0100
ˇ ast stromu reprezentuj´ıc´ıho mnoˇzinu S pˇred smaz´an´ım prvku 0001 Obr´ azek 4.3: C´ Na obr. 4.3 je vidˇet, ˇze po smaz´ an´ı prvku 0001 m˚ uˇze b´ yt adres´aˇr opˇet zmenˇsen. Po proveden´ı DELETE(0001) bude adres´aˇr vypadat takto: → % → % & → % %
000 001 010 011 100 101 110 111
0000, 0010 NIL
1001, 1111
Nyn´ı m˚ uˇzeme prov´est zmenˇsen´ı adres´aˇre na: 00 01 10 11
→ % → %
0000, 0010 1100, 1111
Tento adres´ aˇr m˚ uˇzeme jeˇstˇe zmenˇsit: 0 1
→ →
0000, 0010 1100, 1111
Pozn´ amka 4.2.4. Pesimistick´ y odhad pro operaci DELETE je nejv´ yˇse 6 pˇr´ıstup˚ u na extern´ı medium. Aktualizace adres´ aˇ re V posledn´ım kroku DELETE se prov´ ad´ı aktualizace adres´aˇre. Nejprve provedeme opraven´ı odkaz˚ u na str´anky: pokud u sud´eho z´ aznamu v adres´aˇri dojde k vypr´azdnˇen´ı str´anky, bude tam odkaz na NIL. pokud dojde k vypr´ azdnˇen´ı u lich´e str´anky, pˇrehod´ı se odkaz na pˇredchoz´ı (sudou) str´anku.
Id: hash2.tex,v 1.13 2005/05/08 19:44:10 techie Exp
35
Potom se testuje, zda jde adres´ aˇr zmenˇsit. Zmenˇsov´an´ı prov´ad´ıme tak dlouho, dokud to jde.
4.2.4
Reprezentace adres´ aˇ re
• reprezentovat jako posloupnost dvojic (adresa str´anky, poˇcet prvk˚ u na str´ance), kde i-t´a dvojice je pˇriˇrazen´ı i-t´emu slovu v lexikografick´em uspoˇr´ad´an´ı. • zvˇetˇsov´ an´ı adres´ aˇre znamen´ a zdvojen´ı prvk˚ u • test na zmenˇsov´ an´ı adres´ aˇre - testujeme, zda adresa na lich´em m´ıstˇe je stejn´a jako adresa na n´ asleduj´ıc´ım sud´em m´ıstˇe - pokud ano, tak zmenˇs´ım adres´aˇr vymaz´an´ım sud´ ych ˇclen˚ u posloupnosti. Oˇcek´avan´e zaplnˇen´ı str´ anky pˇri rovnomˇern´em rozloˇzen´ı dat je b ln 2 ≈ 0.69b 1 Oˇcek´avan´ a velikost adres´ aˇre je b lne 2 n1+ b (pˇri rovnomˇern´em rozloˇzen´ı dat) 1 ˇ Pozn´ amka 4.2.5. Clen n1+ b nen´ı line´arn´ı, zde je probl´em, proto se to nehod´ı pro mal´a b.
b/n 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
Jak je vidˇet, pro b = 2 se to nehod´ı, adres´aˇr je vˇetˇs´ı neˇz velikost dat. Pozn´ amka 4.2.6. Kdyˇz pracujeme s velikost´ı S kolem 1010 , pak je vhodn´e, aby b ≥ 100. Pro vˇetˇs´ı mnoˇziny S mus´ı b´ yt b vˇetˇs´ı.
4.3
Perfektn´ı haˇ sov´ an´ı
Perfektn´ım haˇsov´ an´ım mysl´ıme u ´lohu nal´ezt pro danou pevnou mnoˇzinu S ⊆ U, |S| = n perfektn´ı haˇsovac´ı funkci, tj. funkci, kter´ a nem´ a na mnoˇzinˇe S kolize. Tato u ´loha nepˇripouˇst´ı pˇrirozenou implementaci operace INSERT, protoˇze pˇridan´ y prvek m˚ uˇze zp˚ usobit kolizi. Typick´ y pˇr´ıklad pouˇzit´ı je tabulka kl´ıˇcov´ ych slov kompil´ atoru. Definice 4.3.1. Funkce h : U → {0 .. m − 1} je perfektn´ı pro S, kdyˇz je na S prost´a (∀x 6= y ∈ S plat´ı h(x) 6= h(y)). Za jak´ ych podm´ınek lze povolit INSERT? Mus´ı b´ yt m´alo pravdˇepodobn´ y. Prvky nav´ıc se d´avaj´ı jinam a po jist´e dobˇe se vˇse pˇrepoˇc´ıt´ a do jedn´e tabulky pro novou perfektn´ı haˇsovac´ı funkci. Poˇzadavky na hledanou haˇsovac´ı funkci: 1. h je perfektn´ı na S 2. ∀x je h(x) rychle spoˇcitateln´ a 3. m ˇr´ adovˇe srovnateln´e s n 4. zak´ odov´ an´ı h vyˇzaduje m´ alo prostoru Poˇzadavky 2) a 3) jdou proti sobˇe. A aˇz se n´am je podaˇr´ı skloubit, budeme m´ıt probl´emy s 4). A nav´ıc hled´ an´ı h potrv´ a dlouho.
Id: hash2.tex,v 1.13 2005/05/08 19:44:10 techie Exp
4.3.1
36
Perfektn´ı haˇ sovac´ı funkce do tabulky velikosti n2
Vyuˇzijeme, co uˇz v´ıme o univerz´ aln´ım haˇsov´an´ı. Pro k ∈ {1 .. N − 1} a pro pevn´e m definujme hk (x) = (kx mod N ) mod m,
kde N = |U | je prvoˇc´ıslo.
(4.7)
Budeme hledat vhodn´ a k, m. Definujme m´ıru perfektnosti d=
N −1 X
X
δhk (x, y)
(4.8)
k=1 x6=y∈S
a pro k ∈ {1 .. N − 1} poloˇzme bk (i) = |{x ∈ S : hk (x) = i}|
(4.9)
Jednak plat´ı d=
N −1 X k=1
m−1 X
(
! 2
(bk (i)) ) − n
(4.10)
i=0
a tak´e d=
X
|{k : hk (x) = hk (y)}|
prohozen´ım sum
(4.11)
x6=y∈S
(4.12) Co znamen´ a hk (x) = hk (y) pro x 6= y? N´asleduj´ıc´ı tvrzen´ı jsou ekvivalentn´ı: kx mod N = ky mod N k(x − y) mod N = 0 k(x − y) mod N = rm
(mod m) (mod m) pro r ∈ {−bN/mc..bN/mc} − {0},
tedy d≤
X x6=y∈S
2
2n(n − 1)N N = m m
a dosazen´ım do (4.10), podle pˇrihr´ adkov´eho principu ∃k :
m−1 X i=0
(bk (i))2 ≤ n +
2n(n − 1) m
(4.13)
Pro speci´ aln´ı velikosti tabulky dost´ av´ame dosazen´ım do (4.13): Pro m = n :
∃k naleziteln´e v ˇcase O(nN ) :
m−1 X
(bk (i))2 < 3n
(4.14)
i=0
Pro m = 1 + n(n − 1) :
∃k naleziteln´e v ˇcase O(nN ) : hk je perfektn´ı
D˚ ukaz. Prob´ır´ ame vˇsechny moˇznosti pro k, tˇech je O(N ).
(4.15)
Id: hash2.tex,v 1.13 2005/05/08 19:44:10 techie Exp
37
P (4.14) Pro dan´e k spoˇc´ıt´ ame (bk (i))2 v ˇcase O(n) = O(m). P 2n(n−1) (4.15) (bk (i))2 ≤ n + 1+n(n−1) < n + 2. Kdyby hk nebyla perfektn´ı, pak ∃j : bk (j) ≥ 2 a P (bk (i))2 ≥ (n − 2)12 + 1 · 22 = n + 2, spor. Pˇri hled´an´ı k ovˇeˇr´ıme perfektnost hk v ˇcase O(n).
Nyn´ı m´ ame perfektn´ı haˇsovac´ı funkci, kter´a ale poruˇsuje poˇzadavek (3).
4.3.2
Perfektn´ı haˇ sovac´ı funkce do tabulky velikosti 3n
Zkombinujeme oba v´ ysledky z pˇredchoz´ıP ˇc´asti. Podle (4.14) nalezneme k takov´e, ˇze (bk (i))2 < 3n. Pro kaˇzd´e i ∈ {0 .. n − 1} vezmeme mnoˇzinu koliduj´ıc´ıch prvk˚ u Si = {s ∈ S : hk (s) = i}. Oznaˇcme ni = |Si |. Podle (4.15) pro kaˇzd´e i nalezneme ki takov´e, ˇze pro mi = 1 + ni (ni − 1) je hki perfektn´ı pro Si . Kaˇzdou zahaˇsovanou mnoˇzinu Si uloˇz´ıme ve v´ ysledn´e tabulce od pozice di : di =
i−1 X
(1 + nj (nj − 1)).
j=0
Koneˇcnˇe definujme g(x) = di + hki (x),
kde i = hk (x),
kter´a je perfektn´ı a velikost tabulky je m = dn =
n−1 X
(1 + nj (nj − 1)) ≤
j=0
n−1 X j=0
n2j =
n−1 X
(bk (j))2 < 3n
j=0
Ovˇsem na zak´ odov´ an´ı t´eto funkce potˇrebujeme hodnˇe pamˇeti: nevad´ı n´am di , ale k a kaˇzd´e ki je velikosti O(N ), tedy potˇrebujeme n log2 N bit˚ u, coˇz odporuje naˇsemu poˇzadavku (4). V dalˇs´ıch kroc´ıch budeme zmenˇsovat ˇc´ısla definuj´ıc´ı haˇsovac´ı funkci. Podobn´ a funkce dan´ aˇ c´ıslem velikosti O(N ) Zvolme prvoˇc´ıslo p1 takov´e, ˇze 1 + n(n − 1) ≤ p1 ≤ 1 + 2n(n − 1). Nˇejak´e takov´e mus´ı existovat (Bertrand˚ uv postul´ at: ∀n > 1∃ provˇc´ıslo p, ˇze n < p < 2n). Podle (4.15) ∃k : hk (x) = (kx mod N ) mod p1 je perfektn´ı na S. Vytvoˇrme S1 = {hk (s) : s ∈ S} ⊂ {0 .. p1 − 1} a na S1 aplikujme pˇredchoz´ı sekci, kde N = p1 . Dost´av´ ame haˇsovac´ı funkci g1 , kter´ a • je perfektn´ı pro S • je spoˇcitateln´ a v ˇcase O(1) • haˇsuje do tabulky < 3n • je urˇcena 1 ˇc´ıslem velikosti O(N ) a O(n) ˇc´ısly velikosti O(n2 )
lepˇ s´ı jm´ ena promˇ enn´ ych!
Id: hash2.tex,v 1.13 2005/05/08 19:44:10 techie Exp
38
Podobn´ a funkce dan´ aˇ c´ıslem velikosti O(n2 log N ) 6
Pro extr´emn´ı pˇr´ıpady typu N = 210 jeˇstˇe postup vylepˇs´ıme, ˇc´ımˇz zmenˇs´ıme velikost ˇc´ısel k´oduj´ıc´ıch perfektn´ı haˇsovac´ı funkci na O(log N ). Lemma 4.3.1. Pro kaˇzdou mnoˇzinu S ⊆ {0 .. N − 1} velikosti n existuje prvoˇc´ıslo p takov´e, ˇze fp (x) = x mod p je perfektn´ı na S a p = O(n2 log N ). Vyuˇzit´ı: pro S najdeme prvoˇc´ıslo p0 velikosti O(n2 log N ) takov´e, ˇze fp0 je perfektn´ı na S. Vytvoˇr´ıme S0 = {fp0 (s) : s ∈ S} ⊂ {0 .. p0 − 1} a na S0 aplikujme pˇredchoz´ı postup, kde N = p0 . Tedy pro kaˇzdou mnoˇzinu S velikosti n existuje haˇsovac´ı funkce f , kter´a • je perfektn´ı pro S • je spoˇcitateln´ a v ˇcase O(1) • haˇsuje do tabulky < 3n • je urˇcena 2 ˇc´ısly velikosti O(n2 log N ) a O(n) ˇc´ısly velikosti O(n2 ) Lemma 4.3.2. Necht’ r je ˇc´ıslo a p1 , . . . , pq jsou vˇsechny jeho prvoˇc´ıseln´e dˇelitele. Pak q = O(log r/ log log r). D˚ ukaz. r≥
q Y
pi
i=1
> q! = exp(
q X
ln i)
i=1 Z q
> exp( ln x dx) 1 q q kde exp(x) = ex ≥ e Tedy
skok
ln r q≤c ln ln r
pro vhodnou konstantu c.
D˚ ukaz lemmatu 4.3.1. Pˇredpokl´ adejme S = {x1 < . . . < xn }. Haˇsovac´ı funkce ft (x) = x mod t je perfektn´ı pr´ avˇe kdyˇz t je nesoudˇeln´e s ˇc´ıslem Y 2 D= (xi − xj ) < N n i>j
Podle 4.3.2 je mezi prvn´ımi (c ln D/ ln ln D) + 1 prvoˇc´ısly alespoˇ n jedno, kter´e nedˇel´ı D. V´ıme, ˇze pk = O(k ln k), tedy (c ln D/ ln ln D) + 1-n´ı prvoˇc´ıslo m´a velikost O(ln D) = O(n2 ln N ). nalezeni prvocisla p0 vyzaduje cas O(n2 log N ).
Id: hash2.tex,v 1.13 2005/05/08 19:44:10 techie Exp
4.3.3
39
GPERF
Jin´a konstrukce perfektn´ı haˇsovac´ı funkce je pouˇzita v programu gperf. Distribuov´an pod GPL. Jeho n´avrh je pops´ an v [3].
Kapitola 5
Trie Trie 1 je rovinn´ a implementace slovn´ıku. M´ame abecedu Σ velikosti k. Universum jsou vˇsechna slova nad Σ d´elky pr´avˇe l (nekoneˇcnou mnoˇzinu si nem˚ uˇzeme dovolit a kratˇs´ı slova dopln´ıme zprava mezerami). Chceme reprezentovat mnoˇzinu slov S ⊆ U .
5.1
Z´ akladn´ı varianta
Definice 5.1.1. Trie nad Σ je koneˇcn´ y strom, jehoˇz kaˇzd´ y vnitˇrn´ı vrchol m´a pr´avˇe k syn˚ u, kter´e jsou jednoznaˇcnˇe ohodnoceny prvky Σ. Kaˇzd´emu vnitˇrn´ımu vrcholu trie odpov´ıd´a slovo nad Σ d´elky nejv´ yˇse l: koˇrenu odpov´ıd´ a pr´ azdn´e slovo Λ; kdyˇz vrcholu v odpov´ıd´a slovo α, pak v[a], synu v ohodnocen´emu p´ısmenem a, odpov´ıd´ a slovo αa. ˇ Definice 5.1.2. Rekneme, ˇze trie nad Σ reprezentuje mnoˇzinu S, kdyˇz: • List˚ um je pˇriˇrazena boolovsk´ a funkce n´aleˇzen´ı Nal: Nal(t) je true pr´avˇe kdyˇz slovo, kter´e odpov´ıd´ a listu t, je v S. • (prefixov´ a podm´ınka) Kdyˇz v je vnitˇrn´ı vrchol trie odpov´ıdaj´ıc´ı slovu α, pak existuje β ∈ S takov´e, ˇze α je prefix β. • Pro kaˇzd´e slovo α ∈ S existuje v trie list odpov´ıdaj´ıc´ı α. Pozn´ amka 5.1.1. Na rozd´ıl od bin´ arn´ıho vyhled´avac´ıho stromu (viz kapitola 7, sekce 7.1), ˇz´adn´ y vrchol ve stromˇe neobsahuje uloˇzen´ y kl´ıˇc, kter´ y reprezentuje. Nam´ısto toho jeho pozice ve stromˇe ud´av´a kl´ıˇc, kter´ y reprezentuje2 . Pouze nˇekter´e vrcholy ve stromˇe obsahuj´ı data - napˇr. pro implementaci slovn´ıku s hesly by data uloˇzen´a v listech obsahovala popis tohoho hesla3 . Pozn´ amka 5.1.2. Proˇc jsou trie v´ yhodn´e ? • Vyhled´ av´ an´ı kl´ıˇc˚ u je rychlejˇs´ı neˇz v BVS. Vyhled´an´ı kl´ıˇce d´elky m vyˇzaduje pouze O(m) ˇcasu. Pro BVS je to O(m2 ) v nejhorˇs´ım pˇr´ıpadˇe, protoˇze se mus´ı opakovanˇe porovn´avat poˇc´ateˇcn´ı znaky hledan´eho slova. Dalˇs´ı v´ yhoda je pouˇzit´ı indexace pomoc´ı znak˚ u v operaci MEMBER. 1 N´ azev trie poch´ az´ı z anglick´ eho ”retrieval”, tedy vyzvednut´ı. N´ azory na to, jak vyslovovat ”trie” se r˚ uzn´ı. V ˇ ceˇstinˇ e se zpravidla vyslovuje tak jak se p´ıˇse. 2 Tato a n´ asleduj´ıc´ı pozn´ amka jsou volnˇ e pˇrevzaty z encyklopedie Wikipedia, heslo Trie. 3 Napˇ r. slovn´ık spisovatel˚ u, kde listy ve trie by odpov´ıdaly jm´ en˚ um jednotliv´ ych spisovatel˚ u a data uloˇ zen´ a v nich by obsahovala seznam jejich dˇ el.
40
Id: tries.tex,v 1.16 2005/05/08 21:31:58 techie Exp
41
• Trie zab´ıraj´ı m´enˇe m´ısta. Protoˇze nejsou kl´ıˇce v trie uloˇzeny explicitnˇe, pro uloˇzen´ı jednoho kl´ıˇce je potˇreba pouze amortizovan´ y konstantn´ı prostor. • Pomoc´ı trie lze jednoduˇse prov´ adˇet operaci hled´an´ı nejdelˇs´ıho prefixu4 , kde potˇrebujeme naj´ıt kl´ıˇc, kter´ y m´ a nejdelˇs´ı shodn´ y prefix s hledan´ ym kl´ıˇcem5 . D´ale trie dovoluj´ı asociovat jednu hodnotu s mnoˇzinou kl´ıˇc˚ u, kter´e maj´ı shodn´ y prefix6 .
5.1.1
Algoritmus MEMBER
viz algoritmus 5.1. Algoritmus 5.1 MEMBER pro z´ akladn´ı verzi trie {vyhled´ an´ı x = x1 . . . xl } t := koˇren i := 1 while t nen´ı list do t := t[xi ] // sestup podle znaku xi i := i + 1 end while {test} return Nal(t) Na tomto algoritmu je zaj´ımav´e to, ˇze pouˇz´ıv´a jednotliv´e znaky hledan´eho slova x k indexaci v jednotliv´ ych vrcholech trie (viz ˇr´ adek s koment´aˇrem ve v´ ypisu algoritmu 5.1.). To dovoluje naj´ıt vrchol do kter´eho se m´ a pˇri hled´ an´ı sestoupit v ˇcase O(1). Tedy sloˇzitost operace MEMBER je O(l), protoˇze mus´ıme proj´ıt nejv´ yˇse l vrchol˚ u neˇz dos´ahneme listu (d´elka slov je nejv´ yˇse l).
5.1.2
Algoritmus INSERT
viz algoritmus 5.2. Algoritmus 5.2 INSERT pro z´ akladn´ı verzi trie {vyhledej x pomoc´ı operace MEMBER(x)} if not Nal(t) then {trie nemus´ı b´ yt tak hlubok´e, jak potˇrebujeme} while i ≤ l do vrcholu t pˇridej k list˚ u ohodnocen´ ych p´ısmeny z Σ, jejich Nal := false t := t[xi ] i := i + 1 end while Nal(t) := true end if 4 anglicky
”longest-prefix matching” se hod´ı napˇr´ıklad pro implementace s´ıt’ov´ ych operaˇ cn´ıch syst´ em˚ u, kde je potˇreba prov´ adˇ et tuto operaci pro hled´ an´ı v routovac´ıch tabulk´ ach nebo tabulk´ ach pro pˇreklad adres. V pˇr´ıpadˇ e smˇ erovac´ıch tabulek se pos´ıl´ a paket na dalˇs´ı ”hop” podle c´ılov´ e adresy. Routovac´ı tabulka obsahuje z´ aznamy, kter´ e ud´ avaj´ı adresu s´ıtˇ e a adresu zaˇr´ızen´ı, na kter´ e pos´ılat pakety pro tuto s´ıt’ - tzv. ”hop”. Tento ”hop” se vyb´ır´ a tak, aby c´ılov´ a adresa paketu mˇ ela co moˇ zn´ a nejdelˇs´ı shodn´ y prefix s nˇ ejakou adresou s´ıtˇ e v routovac´ı tabulce. 6 T´ ım, ˇ ze uloˇ z´ıme data do vnitˇrn´ıch uzl˚ u trie. 5 To
Id: tries.tex,v 1.16 2005/05/08 21:31:58 techie Exp
42
Pˇri operaci INSERT se sestupuje aˇz na u ´roveˇ n d´elky slova, pˇriˇcemˇz se pˇrid´avaj´ı nov´e u ´rovnˇe v pˇr´ıpadˇe ˇze nejsou v trie pˇr´ıtomny7 .
5.1.3
Algoritmus DELETE
viz algoritmus 5.3. Algoritmus 5.3 DELETE pro z´ akladn´ı verzi trie {vyhledej x pomoc´ı operace MEMBER(x)} if Nal(t) then Nal(t) := false t := otec t {oprav´ıme prefixovou podm´ınku} while vˇsichni synov´e t jsou listy s Nal = false do zruˇs listy t Nal(t) := false t := otec t end while end if Analogicky k operaci INSERT doch´ az´ı k ruˇsen´ı hladin v r´amci jedn´e vˇetve v pˇr´ıpadˇe ˇze vˇsechny listy v hladinˇe maj´ı hodnotu Nal = false. Pouˇzili jsme obrat t := otec t. To lze prov´est bud’ tak, ˇze se vrchol kromˇe sv´ ych syn˚ u odkazuje i na sv´eho otce a spotˇrebuje tak pamˇet’ nav´ıc, nebo se cesta z koˇrene do aktu´aln´ıho vrcholu bˇehem sestupu ve stromu pamatuje na z´ asobn´ıku. Tento trik se pouˇz´ıv´a u vˇsech stromov´ ych struktur.
5.1.4
ˇ Casov´ a a pamˇ et’ov´ a sloˇ zitost
ˇ pro MEMBER je O(l), ˇcas pro INSERT a DELETE Jedna iterace cyklu zabere konstantn´ı ˇcas. Cas je O(lk). Pamˇet’ov´ a sloˇzitost trie v nejhorˇs´ım pˇr´ıpadˇe je poˇcet uloˇzen´ ych slov n´asoben´ y d´elkou cesty a poˇctem syn˚ u, tedy O(|S|lk). Pozn´ amka 5.1.3. V pˇr´ıpadˇe, kdy S obsahuje (skoro) vˇsechna slova d´elky l, tak m˚ uˇze m´ıt sloˇzitost jen O(|S|).
5.2
Komprimovan´ e trie
Mˇejme Σ = {0, 1, 2}, l = 7. S = {0202011, 0202012, 0202021, 1212102, 1212111, 1212121, 1212122}. Nekomprimovan´e trie pro tuto mnoˇzinu je na obr´azku 5.1. Vid´ıme, ˇze p´ısmena na druh´e aˇz p´at´e pozici jsou vˇzdy stejn´ a a pˇredchoz´ı algoritmy se jimi mus´ı prokousat. Pˇresnˇeji ˇreˇceno, prohl´ıˇzen´ı vrcholu v, kter´ y m´ a jedin´eho syna, kter´ y nen´ı list s hodnotou Nal = false, nepˇrin´aˇs´ı ˇz´adnou kladnou informaci, protoˇze mnoˇziny prvk˚ u z S, kter´e jsou reprezentov´any vrcholy v podstromu otce v a v podstromu vrcholu v jsou stejn´e. To vedlo k idei tyto vrcholy ze stromu vynechat a t´ım zmenˇsit (komprimovat) trie. Ke kaˇzd´emu vrcholu v pˇrid´ ame funkci uroven(v) vyjadˇruj´ıc´ı ˇc´ıslo u ´rovnˇe, ve kter´e se v nach´az´ı v p˚ uvodn´ım trie. Ke kaˇzd´emu listu v pˇrid´ame funkci slovo(v) — slovo, kter´e odpov´ıd´a v. 7 Celkem hezky si lze proces pˇ rid´ av´ an´ı nov´ ych hladin v r´ amci jedn´ e vˇ etve pˇredstavit tak, ˇ ze v kaˇ zd´ e hladinˇ e, kter´ a je novˇ e pˇridan´ a, ”vyroste smet´ ak” s k vrcholy.
Id: tries.tex,v 1.16 2005/05/08 21:31:58 techie Exp
43
0 0
1
2
1 0
1
2
0
1
2
2 0
1
2
0
1
2
3 0
1
2
0
1
2
4 0
1
2
0
1
2
5 0
1
2
0
1
2
6 0 7
1
2
0202011 0202012
0
1
2
0202021
0 1
2
0 1
1212110 1212102
2
0 1
2
1212122 1212121
ˇ Obr´azek 5.1: Nekomprimovan´e trie. Cernˇ e vyplnˇen´e ˇctverce zn´azoˇ nuj´ı listy, kter´e odpov´ıadj´ı nˇejak´emu slovu z (reprezentovan´e) mnoˇziny S. Tyto listy maj´ı hodnotu funkce Nal true. B´ıle vyplnˇen´e ˇctverce ˇz´ adn´emu slovu ze S neodpov´ıdaj´ı, maj´ı tedy hodnotu Nal false. Nyn´ı m˚ uˇzeme vynech´ avat vrcholy podle n´asleduj´ıc´ıho krit´eria: je-li v vnitˇrn´ı vrchol a vˇsichni jeho synov´e kromˇe w jsou listy s Nal = false, pak v vynech a zaˇrad’ w na jeho m´ısto. Tento proces opakujeme dokud trie obsahuje nˇejak´ y vnitˇrn´ı vrchol, jehoˇz vˇsichni synov´e s v´ yjimkou jednoho jsou listy, pro nˇeˇz Nal = false. Vˇsimnˇete si, ˇze kaˇzd´ y vnitˇrn´ı vrchol m´a pr´avˇe k syn˚ u, kter´e jsou v jednoznaˇcn´e korespondenci s p´ısmeny abecedy Σ. Pˇ r´ıklad 5.2.1. Necht’ Σ = {0, 1, 2}, l = 3. S = {001, 102, 010, 211, 212}. Nekomprimovan´ y trie pro mnoˇzinu S a jeho komprimovan´a varianta je na obr. 5.2. Pozn´ amka 5.2.1. Komprimovan´e trie je tvoˇren´ y mnoˇzinou vrchol˚ u, kde pro β je hladina(β) = |β| a otec β je nejvˇetˇs´ı vlastn´ı prefix, kter´ y patˇr´ı do trie + pˇridan´e listy. Listy jsou prvky z S + slova βa, kde β ∈ trie a βa nen´ı prefixem ˇz´ adn´eho slova v S. Pro prvky z S je Nal = True, jinak false. Plat´ı prvek(γ) = γ pro kaˇzd´ y list. n βa list, je a-t´ ym synem β Kdyˇz β ∈ trie a a ∈ Σ → ∃δ ∈ S, ˇze βa je prefixem δ Potom a-t´ y syn β je nejkratˇs´ı prefix v mnoˇzinˇe trie v S, kter´ y obsahuje βa.
5.2.1
MEMBER
Viz algoritmus 5.4
5.2.2
INSERT
Viz algoritmus 5.5
Koubek 2002/2003
Id: tries.tex,v 1.16 2005/05/08 21:31:58 techie Exp
44
l (0)
l 1
0 00
02 01
NIL
10
0 (1)
2 12 20
11
NIL NIL NIL
000 001 002 010 011 012 100 101 102
22
21
21 (2) 102 (3) 02 (2)
NIL
001 010 (3) (3)
NIL
210 211 212 (3)
(3)
(3)
210 211 212
ˇ a ˇc´ısla v z´avorce znaˇc´ı hodnotu uroven() Obr´ azek 5.2: Komprimace trie. Sed´ Algoritmus 5.4 MEMBER pro komprimovan´e trie {vyhled´ an´ı x = x1 . . . xl } t := koˇren while t nen´ı list do i := uroven(t) + 1 t := t[xi ] // xi -t´ y list end while {test} return Nal(t) ∧ slovo(t) = x
5.2.3
DELETE
Viz algoritmus 5.6
5.2.4
ˇ Casov´ a a pamˇ et’ov´ a sloˇ zitost
Pamˇet’ov´a sloˇzitost takto komprimovan´ ych trie je O(nk), kde n je velikost reprezentovan´e mnoˇziny. ˇ (maxim´alnˇe n − 1 vnitˇrn´ıch vrchol˚ u, kaˇzd´ y s polem d´elky k). Casov´ a sloˇzitost operace MEMBER je v nejhorˇs´ım pˇr´ıpadˇe O(l), pro INSERT a DELETE je to O(l + k). (m˚ uˇze b´ yt nutn´e pˇridat/odebrat jeden vnitˇrn´ı vrchol). V pr˚ umˇern´em pˇr´ıpadˇe (za pˇredpokladu rovnomˇern´eho rozloˇzen´ı vstupn´ıch dat) je to oˇcek´avan´a hloubka trie. Tu ted’ spoˇc´ıt´ ame. Necht’ qd = P(trie m´a hloubku alespoˇ n d) Oˇcek´avan´a hloubka trie reprezentuj´ıc´ı n slov je En =
∞ X d=0
d(qd − qd+1 ) =
∞ X
qd
d=0
Kdyˇz funkce prefd−1 , pˇriˇrazuj´ıc´ı slovu α jeho prefix d´elky d − 1, je na mnoˇzinˇe S prost´a, pak trie reprezentuj´ıc´ı mnoˇzinu S m´ a hloubku nejv´ yˇse d. Spoˇc´ıt´ame poˇcet mnoˇzin o velikosti n, na nichˇz je funkce prefd−1 prost´ a. Tyto mnoˇziny z´ısk´ame tak, ˇze vybereme n prefix˚ u d´elky d − 1 a kaˇzd´ y
Id: tries.tex,v 1.16 2005/05/08 21:31:58 techie Exp
Algoritmus 5.5 INSERT pro komprimovan´e trie {vyhledej x} if Nal(t) ∧ slovo(t) = x then {Trie uˇz obsahuje x, nedˇelej nic.} else if slovo(t) = x then {Trie obsahuje spr´ avn´ y list, pouze nastav pˇr´ıznak. Napˇr. ”0202010”} Nal(t) := true else {Bude potˇreba vloˇzit nov´ y list.} {Najdi, kam ho pˇripojit.} α := nejdelˇs´ı spoleˇcn´ y prefix slov x a slovo(t). D´elku α oznaˇcme |α|. v := vrchol na cestˇe z koˇrene do t takov´ y, ˇze uroven(v) je nejvˇetˇs´ı, kter´a je ≤ |α| if uroven(v) = |α| then {v je otec nov´eho listu} else {uroven(v) < |α|} {Bude potˇreba vytvoˇrit otce nov´eho listu} a := uroven(v) + 1-n´ı p´ısmeno α u := v[a] {Mezi v a u vytvoˇr nov´ y vnitˇrn´ı vrchol odpov´ıdaj´ıc´ı slovu α} w := nov´ y vrchol, uroven(w) := |α| v[a] := w c := |α| + 1-n´ı p´ısmeno slovo(t) w[c] := u for all b ∈ Σ, b 6= c do z := nov´ y vrchol, uroven(z) := |α| + 1, Nal(z) := false, slovo(z) := αb, w[b] := z end for v := w end if {Spr´ avn´emu listu pˇriˇrad’ x} d := |α| + 1-n´ı p´ısmeno x s := v[d] uroven(s) := l, Nal(s) := true, slovo(s) := x end if end if
45
Id: tries.tex,v 1.16 2005/05/08 21:31:58 techie Exp
46
Algoritmus 5.6 DELETE pro komprimovan´e trie {vyhledej x} if Nal(t) ∧ slovo(t) = x then u := otec t i := uroven(u) Nal(t) := false uroven(t) := i + 1, slovo(t) := prefix slova x d´elky i + 1 {vrchol u m´ a alespoˇ n jednoho syna, kter´ y nen´ı list s Nal = false} if vˇsichni synov´e u kromˇe syna w jsou listy s Nal = false then v := otec u smaˇz u a vˇsechny syny u kromˇe w j := uroven(v) + 1 v[xj ] := w // xj -t´ y syn v je w end if end if dopln´ıme vˇsemi sufixy d´elky l − d + 1. Proto tˇechto mnoˇzin je d−1 k k n(l−d+1) . n Protoˇze vˇsech podmnoˇzin velikosti n je qd ≤ 1 −
kd−1 n
kl n
dost´av´ame, ˇze
) k n(l−d+1) pravdˇepodobnost kl n
k d−1 (k d−1 − 1) . . . (k d−1 − (n − 1))k n(l−d+1) ≤1− k ln n−1 Y i =1− 1 − d−1 k i=0 −n2 ≤ 1 − exp k d−1 n2 ≤ d−1 , k ponˇevadˇz n−1 Y i=0
1−
i k d−1
n−1 X
= exp
i=0 Z n
≥ exp
ln 1 −
i
!
k d−1 i
ln 1 − d−1 k −n2 , k d−1 0
= exp
(uˇzijte integr´ aln´ı kriterium a substituci x = k d−1 (1 − t)) a ex − 1 ≥ x (odtud 1 − ex ≤ −x). Tedy pro c = 2dlogk ne dost´ av´ ame
Id: tries.tex,v 1.16 2005/05/08 21:31:58 techie Exp
En =
c X
qd +
d=1
≤c+
47
∞ X
qd
d=c+1 ∞ X n2 d=c
kd
≤ 2dlogk ne +
n2 kc
X ∞
k −d
d=0
1 ≤ 2dlogk ne + 1 − 1/k k . = 2dlogk ne + k−1 n Tedy oˇcek´ avan´ y ˇcas operace MEMBER je O(logk (n)) (O( log log k )) a O(logk (n) + k) pro INSERT a DELETE pro komprimovan´e trie (za pˇredpoklad˚ u rovnomˇern´eho rozloˇzen´ı vstupn´ıch dat) Zde parametr k vyjadˇruje vztah mezi prostorov´ ymi a ˇcasov´ ymi n´aroky.
Algoritmus 5.7 INSERT pro komprimovan´e trie, analogie 5.5 (verze Koubek 2002) INSERT(x = x1 , ..., xl ) t ← koˇren while t neni list do i ← hladina(t), t ← (ai+1 )-n´ı syn t end while if prvek(t) neni prefix x then β = nejvˇetˇs´ı spoleˇcn´ y prefix x a prvek(t) βa = prefix α βb = prefix prvek(t) while hladina(t) > |beta| do t ← otec(t) done if hladina(t) < |β| then vytvoˇr´ıme nov´ y vrchol w, jehoˇz synov´e, kromˇe b-t´eho syna budou listy s funkcemi Nal = false prvek(t) = β + oznaceni syna hladina(w) = |β|, β = (a1 , ..., ai ) necht v = ahladina(t)+1 - t´ y syn t, b-t´ y syn w je v w = ahladina(t)+1 -t´ y syn t end if z ← a-t´ y syn t, Nal(z) = true, prvek(z) = x else Nal(t) = true, prvek(t) = x end if
5.3
Jeˇ stˇ e komprimovanˇ ejˇ s´ı trie
Pˇ r´ıklad 5.3.1. Mˇejme komprimovan´ y trie z obr. 5.3 a jeho matici:
L.Proˇ sek: Moˇ zn´ a v t´ e oˇ cek´ avan´ e sloˇ zitosti by ˇ slo +k zanedbat, ale ne na z´ akladˇ e toho tvrzen´ı, kter´ e dokazuje jen oˇ cek´ avanou hloubku
XXX dalsi neznamy algoritmus z prednasky 2002
Id: tries.tex,v 1.16 2005/05/08 21:31:58 techie Exp
48
Algoritmus 5.8 DELETE pro komprimovan´e trie (?) DELETE(x = x1 , ..., xl ) t ← koˇren while t neni list do i ← hladina(t), t ← (ai+1 -ni syn t end while if Nal(t) = true a prvek(t) = j then Nal(t) = false v ← otec(t) prvek(t) ← prefix prvek(t) o d´elce hladina v+1 if vsichni synove vrchovlu v az na jednoho jsou listy s Nal = false then w ← syn(v), ktery je bud list s Nal(w) = true nebo neni list necht v je a-t´ y (ai -ty ???) syn sv´eho otce, v smaˇzeme a smaˇzeme vˇsechny syny v 6= w w ← a-t´ y (ai -t´ y ???) syn otce v end if end if
l 0
2
1
NIL
21 12
102
NIL
120
210 211
212
121 122
Obr´ azek 5.3: Nekomprimovan´ y trie pro pˇr´ıklad 5.3.1
root a b c
0 NIL 102 210 120
1 a NIL 211 121
2 b c 212 NIL
Chceme se zbavit poloˇzek NIL v matici reprezentuj´ıc´ı trie. Dalˇs´ı komprese dos´ahneme pomoc´ı vektor˚ u hod (vektor hodnot) a rd. Tyto vektory budou reprezentovat p˚ uvodn´ı matici.
5.3.1
Popis A a rd
Zpˇet k naˇsemu pˇr´ıkladu: 1.
hod
210
211
212
120
121
NIL
co znamena rd ?
Id: tries.tex,v 1.16 2005/05/08 21:31:58 techie Exp root
a
b 0
rd 2.
hod root 4
rd
210 a 7
49
c 3 211
b 0
212
120
121
a
b
102
NIL
c
c 3
ˇ adek i zaˇc´ın´ R´ a na m´ıstˇe rd(i) a mus´ı b´ yt splnˇena podm´ınka: Kdyˇz Mi,j 6= N IL 6= Mi0 ,j 0 , pak rd(i) + j 6= rd(i0 ) + j 0 Kdyˇz na m´ıstˇe hod chceme zapsat prvek 6= N IL a NIL, pak zap´ıˇseme prvek 6= N IL.
5.3.2
Algoritmus pro hled´ an´ı rd a hod
Necht’ M je matice typu rxs, m´ a m v´ yznamn´ ych m´ıst 6= NIL. • pro kaˇzd´ y ˇr´ adek nalezneme poˇcet m´ıst 6= NIL • setˇr´ıd´ıme ˇr´ adky Bucketsortem, tak ˇze r´adky s vˇetˇs´ım poˇctem m´ıst 6= NIL pˇredch´azej´ı ˇr´adky s menˇs´ım poˇctem m´ıst 6= NIL • proch´ az´ıme ˇr´ adky v dan´em setˇr´ıdˇen´ı a pro kaˇzd´ y ˇr´adek i nalezneme nejmenˇs´ı ˇc´ıslo rd(i), ˇze nedoch´ az´ı ke kolizi s pˇredchoz´ımi ˇr´adky (tj. kdyˇz Mi0 ,j 0 6= N IL 6= Mi,j ) a ˇr´adek i0 byl zaˇrazen, pak rd(i) + j 6= rd(i0 ) + j 0 . Pak Mi,j 6= N IL je uloˇzeno ve vektoru hod na m´ıstˇe rd(i) + j. m(l) - poˇcet m´ıst 6= NIL v ˇr´ adc´ıch s poˇctem m´ıst ≥ l + 1 6= N IL. Vˇ eta 5.3.1. Kdyˇz m(l)(l + 1) ≤ m pro kaˇzd´e l, pak rd(i) < m pro kaˇzd´y ˇr´ adek i a algoritmus vyˇzaduje ˇcas O(rsm). D˚ ukaz. Pˇredpokl´ adejme, ˇze hled´ ame rd pro ˇr´adek i, kter´ y m´a l m´ıst 6= N IL. ve vektoru hod je obsazeno m´enˇe neˇz m(l − 1) m´ıst. zkouˇs´ıme rd(i) = 1, 2, ... rd(i) = 1, 2, ... je zak´ azan´e, kdyˇz vznikne kolize. tj. ∃ ˇr´adek i0 pˇredch´ azej´ıc´ı a ∃j, j 0 takov´e, ˇze Mi0 ,j 0 6= N IL 6= Mi,j a platilo by rd(i0 )+j 0 = rd(i)+j. → tˇechto moˇznost´ı je < lm(l − 1) ≤ m. O(rs) - zjist´ıme pro kaˇzd´ y ˇr´ adek poˇcet m´ıst 6= N IL. O(m + r) - tˇr´ıdˇen´ı Bucketsortem O(mrs) - krok 2 Pˇ r´ıklad 5.3.2. XXX nejaky komentar
M root a b c
rd
0 NIL 102 210 120 root 4
1 a NIL 211 121 a 7
b 0
2 b c 212 NIL c 3
Id: tries.tex,v 1.16 2005/05/08 21:31:58 techie Exp
hod
210
M’ b c root a
0 210 120 NIL 102
211
212
1 211 121 a NIL
120
121
a
b
102
50
NIL
c
2 212 NIL b c
(pˇrehodili jsme pouze ˇr´ adky) sl - vektor posunut´ ych sloupc˚ u • sl(0) = 0 • sl(1) = 1 M’ 0 1 2 1 210 NIL NIL 2 120 211 212 3 NIL 121 NIL 4 102 a b 5 NIL NIL c zac = (6, 0, 6, 3, 6) hod = (120, 211, 212, 102, a, b, 210, 121, c) Kdyˇz M (i, j) je v´ yznamn´e m´ısto, pak M (i, j) = hod(zac(i + sl(j)) + j).
5.3.3
Vertik´ aln´ı posun sloupc˚ u
cd - vektor sloupcov´eho posunut´ı, slouˇz´ı k z´apisu transformace
cd
0 0
1 1
2 2
rd
0 6
1 0
2 6
hod
120
211
3 3
4 6 212
102
a
b
210
121
c
Jak najdeme nazp´ atek m´ısta ? Plat´ı, kdyˇz Mi,j 6= N IL, pak hod(rd(i + cd(j) + j)) = Mi,j znaˇcen´ı: • f(-,-) je fce dvou promˇenn´ ych • Bj matice posunut´ ych prvn´ıch sloupc˚ u • mj poˇcet m´ıst 6= N IL v Bj • mj (l) poˇcet m´ıst 6= N IL v ˇr´ adc´ıch matice Bj , kter´e maj´ı aspoˇ n l+1 m´ıst 6= N IL Budeme cht´ıt, aby ∀j∀l platilo mj (l) ≤ Okrajov´e podm´ınky na f: f mus´ı splˇ novat:
m f (l,mj ) .
je ten vzorec spr´ avnˇ e?
Id: tries.tex,v 1.16 2005/05/08 21:31:58 techie Exp
51
• ∀ l plat´ı f (l, m) ≥ l + 1 • ∀ j plat´ı f (0, mj ) ≤
m mj
Algoritmus na posunut´ı sloupc˚ u 1. Pro kaˇzd´ y sloupec v poˇrad´ı 0, 1, ... nalezneme nejmenˇs´ı cd(j) takov´e, aby matice Bj splˇ novala m ∀l mj (l) ≤ f (l,m (kaˇ z d´ y sloupec posunujeme dokud nesplˇ n uje podm´ ınku) ) j 2. Na z´ıskanou matici B = Bs pak pouˇzijeme pˇredchoz´ı algoritmus. m m Plat´ı m(l) = ms (l) ≤ f (l,m) ≤ l+1 . Hled´ame hodnotu cd(j) a pˇredpokl´ ad´ ame, ˇze pro nˇejakou hodnotu cd(j) nen´ı splnˇena podm´ınka m m pro l, tj. plat´ı mj (l) > f (l,m) ... platila pro Bj−1 , tj.mj−1 (l) ≤ f (l,m j−1 ) m m Z toho plyne mj (l) − mj−1 (l) > f (l,mj ) − f (l,mj−1 . Jak roste ˇc´ıslo mj (l) ?
1. v matici Bj−1 existuje ˇr´ adek s aspoˇ n l + 1 m´ısty 6= N IL a s t´ımto ˇr´adkem se stˇretne m´ısto 6= N IL (v j-t´em sloupci ← mj−1 (l) vzroste o 1) 2. v matici Bj−1 existuje ˇr´ adek s l m´ısty 6= N IL a s t´ımto ˇr´adkem se stˇretne m´ısto 6= N IL v j-t´em sloupci. Pak mj−1 (l) vzroste o l + 1. stˇret - ˇr´ adek v Bj−1 s aspoˇ n l m´ısty 6= N IL a m´ısto 6= N IL v j-t´em sloupci. Aby nebyla splnˇena podm´ınka pro l, mus´ı b´ yt poˇcet stˇret˚ u pro danou hodnotu cd(j) b´ yt aspoˇ n m f (l,mj )
−
m f (l,mj−1 )
l+1 mj−1 (l−1) l
V matici Bj−1 je nejv´ yˇse je mj − mj−1 m´ıst 6= N IL.
≤
m lf (l−1,mj−1
ˇr´adk˚ u s aspoˇ n l m´ısty 6= N IL, v j-t´em sloupci
Podm´ınka pro l m˚ uˇze zak´ azat nejv´ yˇse m(mj −mj−1 ) lf (l−1,mj−1 m m − f (l,m f (l,m j
hodnot cd
=
j−1
f (l,mj )
l+1
Staˇc´ı n´ am sˇc´ıtat pˇres hodnoty l takov´e, ˇze m mmj−1 (l) ≤ l + 1 tj. pˇres l ≤ l0 = min{l; f (l,m < l}, j−1 m mj−1 (l) ≤ f (l,mj−1 ) ≤ l + 1. Celkov´ y poˇcet zak´ azan´ ych hodnot cd je menˇs´ı neˇz l0 X l + 1 (mj − mj−1 ) f (l, mj−1 l f (l,mj−1 − 1 f (l − 1, mj−1 l=0
f (l,mj )
Zvol´ıme f (l, mj ) = 2l(2−
l + 1 ((mj − mj−1 ) f (l.mj−1 ) l f (l.mj−1 ) − 1 f (l, mj−1 )
mj m
)
.
(5.2)
(5.1)
Id: tries.tex,v 1.16 2005/05/08 21:31:58 techie Exp
52
Pozn´ amka 5.3.1. Jelikoˇz se f vyskytuje v sumˇe jen v pod´ılech, v´ yraz se zjednoduˇsˇs´ı, zvol´ıme-li f (l, mj ) = 2g(l,mj ) , kde g je nˇejak´ a vhodn´a funkce. Dosad´ıme-li, m˚ uˇzeme si vˇsimnout, ˇze dostaneme v exponentech rozd´ıly g(l, mj−1 ) − g(l, mj )ag(l, mj−1 ) − g(l − 1, mj−1 ), kter´e vznikly vhodnou pˇredchoz´ı u ´pravou v´ yrazu. (... suma z Mehlhorna na stranˇe 10, tˇret´ı suma od spoda ...) Ted’ se lze zbavit −1 ve jmenovateli pouˇzit´ım nerovnosti 2x − 1 = ex ln 2 − 1 ≥ x ln 2. (... suma z Mehlhorna na stranˇe 10, druh´a suma od spoda ...) Dalˇs´ım pozorovan´ım zjist´ıme, ˇze v takto z´ıskan´ ych rozd´ılech se mˇen´ı jenom jedna promˇenn´a. V´ yraz se d´ ale zjednoduˇsˇs´ı, bude-li g(l, mj ) = h(l)k(mj ), kdeh(l), k(mj ) budou vhodn´e line´arn´ı funkce. U funkce k linearitou vyuˇzijeme rozd´ılu mj−1 − mj v ˇcitateli, kter´ y ted’ m˚ uˇzeme zkr´atit. (... suma z Mehlhorna na stranˇe 10, prvn´ı suma od spoda ...) Dalˇs´ımi heuristikami a s vyuˇzit´ım okrajov´ ych podm´ınek pro f nakonec zjist´ıme, ˇze dobrou m volbou jsou funkce h(l) = l, k(mj ) = 2 − mj . Takto definovan´ a f splˇ nuje okrajov´e podm´ınky: f (l, m) = 2l ≥ l + 1 ∀l = 0, 1, ... m ∀j = 0, 1, ..., s f (0, mj ) = 1 ≤ m j dosad´ıme do odhadu 5.2 a dostaneme
l0 X l + 1 (mj − mj−1 ) (2− mj−1 ) m 2 ≤ m m l 2l( mj − j−1 m ) l=1
vyuˇzijeme, ˇze 2x − 1 ≥ xln(2) l0 X l + 1 (mj − mj−1 ) mj−1 4 = j l l( m m − m ) l=1
4m ln(2)
l0 X l=1
l0 l0 l+1 1 X 1 4m X = ( + )≤ 2 l ln(2) l l2 l=1
l=1
integr´aln´ı kriterium π2 4m (1 + ln(l0 )) + ≤ 4m log2 (l0 ) + 15.3m ln(2) 6 m < l} → l0 < log(m) odhadneme l0 : l0 = min{l; f (l, mj−1 pak ≤ 4m log log m) + 15.3m (5.3) Cel´ y algoritmus spoˇc´ıt´ a uloˇzen´ı matice M typu r × s do vektor˚ u cd - dimenze s, rd - dimenze 4m log log m) + 15.3m + r, hod dimenze m + s, pˇritom hodnoty cd(j) < 4m log log m) + 15.3m a rd(i) < m. ˇ potˇrebn´ Cas y k v´ ypoˇctu je O(sr(m log log(m))2 ), kde m je poˇcet m´ıst 6= N IL v matici M .
5.3.4
´ Usporn´ e uloˇ zen´ı ˇ r´ıdk´ eho vektoru
M´ame vektor v dimenze n · d (rozdˇelen´ y na n blok˚ u velikosti d) a i0 < i1 < ... < it−1 jsou vˇsechny indexy i takov´e, ˇze v(i) 6= 0.
Id: tries.tex,v 1.16 2005/05/08 21:31:58 techie Exp
53
Vytvoˇr´ıme vektor cv dimenze t, cv(j) = v(ij ). N´aˇs u ´kol - pro dan´e l zjistit, zda l = ij a pˇr´ıpadnˇe nal´ezt toto j. Sestav´ıme vektor base dimenze n: n -1 ik div d 6= j, ∀k = 0, 1, ..., t − 1 base(j) = min{l; il divd = j} ∃l, ˇze il div d = j a matici of f set typu n × d n -1 il 6= jd + k, ∀l = 0, 1, ..., t − 1 offset(j, k) = l − base(j) il = jd + k Nyn´ı uloˇz´ıme matici of f set do vektoru of f dimenze n tak, ˇze z kaˇzd´eho ˇr´adku vytvoˇr´ıme ˇc´ıslo v soustavˇe o z´ akladu d + 1: Pd−1 off(j) = k=0 (of f set(j, k) + 1)(d + 1)k potˇrebujeme base(dimn), of f (dimn) smyslupln´e kdyˇz d n a t < n (napˇr. d = log log n)) Plat´ı n´ asleduj´ıc´ı vztahy: 1. v(h) = 0 ↔ of f set(hdivd, h mod d) = −1 2. v(h) = 1 → h = base(hdivd) + of f set(hdivd, h mod d) 3. of f set(i, j) = of f (i)div(d + 1)j mod (d + 1) − 1 pro dan´e i - nalezen´ı hodnoty v(i) kdyˇz base(idivd) = −1, pak v(i) = 0 base(idivd) 6= −1, pak k = i mod d j = idivd l = of f (j)div(d + 1)k l = l mod (d + 1) l = l − 1 + base(j) v(i) = cv(l) Lze pouˇz´ıt pro mal´e t a (d + 1)d v rozsahu velikosti registru - vhodn´e napˇr. pro d ≈ log log n). Pˇ r´ıklad 5.3.3. XXX uvod k prikladu 010 101 000 001 v= 0 1 -1 3 i0 = 1, i1 = 3, i2 = 5, i3 = 11, d = 3 cv = v(1) base = 0 offset 0 1 2
0 -1 0 -1
v(3) 1
v(5)
-1 1 0 -1 1
v(11)
3 2 -1 -1 -1
3 -1 -1 0
3. sloupec tabulky offset repr. nuly off = 4 33 0 16
Id: tries.tex,v 1.16 2005/05/08 21:31:58 techie Exp
54
Potom of f (7) = (of f set(1, 0) + 1)40 + (of f set(1, 1) + 1)41 + (of f set(1, 2) + 1)42 of f (1) = 1 + 0 + 2 · 42 = 33
Kapitola 6
Uspoˇ r´ adan´ a pole 6.1
Un´ arn´ı, bin´ arn´ı a interpolaˇ cn´ı vyhled´ av´ an´ı
Uspoˇr´adan´e pole je datov´ a struktura, kter´a vznikne z pole jeho setˇr´ıdˇen´ım. Jedin´a operace, kter´a se na n´ı d´a (rozumnˇe rychle) prov´ adˇet, je MEMBER. Mˇejme slovn´ık S uloˇzen´ y jako pole prvk˚ u tak, ˇze s[i] < s[i + 1]. Algoritmus 6.1 MEMBER pro uspoˇr´ adan´e pole {vyhled´ an´ı hodnoty x mezi s[i] . . . s[j]} {odpovˇed’ ANO, kdyˇz ∃h : i ≤ h ≤ j ∧ s[h] = x} d := i {aktu´ aln´ı doln´ı a horn´ı odhad} h := j next := f (d, h) { Pˇredpokl´ ad´ ame, ˇze d ≤ f (d, h) ≤ h } while s[next] 6= x ∧ d < h do if s[next] < x then d := next + 1 else h := next − 1 end if next := f (d, h) end while {ˇrekni ANO pokud s[next] = x, jinak ˇrekni ne} Tento algoritmus m˚ uˇze prov´ adˇet un´ arn´ı, bin´arn´ı, nebo interpolaˇcn´ı vyhled´av´an´ı; staˇc´ı jen dosadit spr´avnou funkci f ; zobecnˇen´e kvadratick´e vyhled´av´an´ı bude definov´ano d´ale. metoda un´arn´ı vyhled´ av´ an´ı bin´arn´ı vyhled´ av´ an´ı interpolaˇcn´ı vyhled´ av´ an´ı zobecnˇen´e kvadratick´e v. kvadratick´e vyhled´ av´ an´ı
odpov´ıdaj´ıc´ı funkce f (d, h) = d f (d, h) = d d+h 2 e x−s[d] f (d, h) = d + d s[h]−s[d] ∗ (h − d + 1)e f (d, h) = f kvadrat
nejhorˇs´ı pˇr. O(n) O(log(n)) O(n) O(log(n)) O(log(n))
pr˚ umˇern´ y pˇr´ıpad O(n) O(log(n)) Z tˇ ech z´ apisk˚ u, O(log(log(n))) co m´am, to O(log(log(n))) opravdu vypad´ a, jako ˇ ze O(log(log(n))) zobecnˇen´e kvadratick´ ea kvadratick´ e jsou 2 r˚ uzn´ e vˇ eci
55
Id: array.tex,v 1.5 2004/10/17 15:20:04 techie Exp
6.2
56
Zobecnˇ en´ e kvadratick´ e vyhled´ av´ an´ı
Na interpolaˇcn´ım vyhled´ av´ an´ı se n´ am l´ıb´ı jeho ˇcas O(log log |S|) v pr˚ umˇern´em pˇr´ıpadˇe (pˇri rovnomˇern´em rozdˇelen´ı dat). Avˇsak jeho ˇcas v nejhorˇs´ım pˇr´ıpadˇe je aˇz O(|S|). Zato bin´arn´ı vyhled´av´an´ı m´a ˇcas nejv´ yˇse O(log |S|). Zobecnˇen´e kvadratick´e vyhled´av´an´ı je tak trochu kombinace pˇredchoz´ıch dvou vyhled´av´an´ı. Jak zobecnˇen´e kvadratick´e vyhled´ av´an´ı funguje? Vyuˇz´ıv´a funkci MEMBER s funkc´ı fkvadrat tak, jak byla pops´ ana v pˇredchoz´ım odstavci. Tomu, ˇze se zvol´ı hodnota next a podle n´ı se oprav´ı hodnota d nebo h, budeme ˇr´ıkat, ˇze se poloˇz´ı dotaz. Cel´e vyhled´av´an´ı funguje tak, ˇze se nejprve poloˇz´ı interpolaˇcn´ı dotaz. To je vˇzdy, kdyˇz je nastav true. Poloˇzen´ı dalˇs´ıch dotaz˚ u si m˚ uˇzeme pˇredstavovat jako skoky z m´ısta posledn´ıho dotazu ve smˇeru, √ kde leˇz´ı x. (Skoˇc´ıme na nov´ y index v poli). 1 Po interpolaˇcn´ım dotazu se neust´ale stˇr´ıdaj´ı skoky o delka s bin´arn´ımi dotazy, aˇz dokud nepˇreskoˇc´ıme x. (Toto stˇr´ıd´ an´ı zajiˇstuje promˇenn´a parita). Pak se znova poloˇz´ı interpolaˇcn´ı dotaz a vˇse se opakuje. Algoritmus 6.2 Krok zobecnˇen´eho kvadratick´eho vyhled´av´an´ı — f kvadrat(d, h) {Promˇenn´e nastav, parita a nahoru jsou statick´e, tj. jejich hodnoty se mezi vol´an´ımi tohoto algoritmu zachov´ avaj´ı.} {Necht’ nastav je na zaˇc´ atku true.} √ {Dokud je nastav false (pracuje se v r´amci bloku), je parita stˇr´ıdavˇe true (skok o delka) a false (bin´arn´ı vyhled´ an´ı)} if nastav then parita := true delka := h −ld + 1 m x−s[d] next := d + s[h]−s[d] · delka {= f interp(d, h)} nahoru := s[next] < x nastav := false return next end if if not parita then next := d(d + h)/2e {= f bin(d, h)} parita := true return next end if √ √ next := nahoru ? d + delka : h − delka if s[next] < x xor nahoru then nastav := true else parita := f alse end if return next Jak´ y ˇcas m´ a vyhled´ av´ an´ı v nejhorˇs´ım pˇr´ıpadˇe? Rozd´ıl mezi d a h se bˇehem nejv´ yˇse 3 dotaz˚ u zmenˇs´ı na polovinu. Proto je nejhorˇs´ı ˇcas O(log n). Jak´ y ˇcas m´ a vyhled´ av´ an´ı v pr˚ umˇern´em pˇr´ıpadˇe? T´ım mysl´ıme pˇri rovnomˇern´em rozloˇzen´ı dat. To uˇz je malinko sloˇzitˇejˇs´ı ot´ azka. Vyhled´av´an´ı si rozdˇel´ıme do nˇekolika f´az´ı. F´aze zaˇc´ın´a interpolaˇcn´ım dotazem a pokraˇcuje aˇz do dalˇs´ıho interpolaˇcn´ıho dotazu. Uk´aˇzeme, ˇze v jedn´e f´azi se 1 zde by byl vhodn´ y obr´ azek - useˇ cka, kter´ a m´ a na krajich d a h a je na ni videt prvni interpolaˇ cni dotaz a skoky po sqrt(n) a bin. a sqrt(n) ...
Id: array.tex,v 1.5 2004/10/17 15:20:04 techie Exp
57
poloˇz´ı v pr˚ umˇeru jen konstantnˇe dotaz˚ u. Pojd’me tedy zanalyzovat jednu f´azi. Souvisl´ yu ´sek pole mezi pozicemi d a h na zaˇc´ atku f´ aze oznaˇcme jako blok. Promˇenn´a delka ud´av´a d´elku bloku a m´a hodnotu h−d+1. Oznaˇcme X n´ ahodnou promˇennou, X = poˇcet i na zaˇc´atku bloku takov´ ych, ˇze i ≥ d a s[i] < x. Jinak ˇreˇceno X ud´ av´ a vzd´ alenost x od zaˇc´atku bloku. Poloˇzme p = P(n´ ahodnˇe zvolen´ y prvek mezi s[d] a s[h] je menˇs´ı neˇz x) = (x − s[d])/(s[h] − s[d]) h−d+1 j P(X = j) = p (1 − p)h−d+1−j j X m´a tedy binomick´e rozdˇelen´ı a tud´ıˇz je jeho oˇcek´avan´a hodnota p(h − d + 1) a jeho rozptyl je p(1 − p)(h − d + 1). Oznaˇcme prv pozici v vr´acenou prvn´ım (interpolaˇcn´ım) dotazem v t´eto f´azi vzhledem k poˇc´ atku bloku. Srovnej prv s oˇcek´avanou hodnotou X. |X − prv| ≥
poˇcet dotaz˚ u v r´amci bloku − 2 √ delka 2
√ protoˇze kdyˇz vynech´ ame prvn´ı dva dotazy, tak se d´ale stˇr´ıd´a bin´arn´ı dotaz √ se skokem o delka. Vynech´ame-li i bin´ arn´ı dotazy—vezmu kaˇzd´ y druh´ y—z˚ ustanou jen skoky o delka a ty dohromady nask´aˇcou m´enˇe neˇz je vzd´ alenost x od prvn´ıho dotazu. Oznaˇcme pi = P(v r´ amci bloku bylo poloˇzeno alespoˇ n i dotaz˚ u). Pak jistˇe plat´ı P( |X − prv| ≥
i − 2√ delka) ≥ pi 2
ˇ Nyn´ı pouˇzijeme Cebyˇ sevovu nerovnost, kter´a ˇr´ık´a, ˇze P( |X − EX| > t) ≤
pi ≤ P( |X − prv| ≥
rozptyl X t2
i − 2√ p(1 − p) delka 1 delka) ≤ i−2 2 ≤ 2 (i − 2)2 ( 2 ) delka
protoˇze prv je oˇcek´ avan´ a hodnota X a p(1 − p) ≤ 1/4 pro 0 ≤ p ≤ 1. Celkem jsme dostali pi ≤ 1/(i − 2)2 . Oˇcek´avan´ y ˇcas proP pr´ aci v jednom bloku (pro jednu f´azi) je O(oˇcek´avan´ y poˇcet dotaz˚ u v bloku) = P ∞ ∞ O( i=0 pi ) = O( 3 + i=3 1/(i − 2)2 ) = O( 3 + π 2 /6) = O(4.6). To jsme pouze odhadli prvn´ı tˇri ˇcleny jedniˇckou a seˇcetli ˇradu, kterou asi zn´ate z anal´ yzy. Ted’ uˇz snadno dopoˇc´ıt´ ame oˇcek´ avan´ y ˇcas zobecnˇen´eho kvadratick´eho vyhled´av´an´ı. Ten je O( (poˇcet blok˚ u) (oˇcek´ avan´ y ˇcas pro 1 blok)) = O( log log(|S|) O(1)) = O( log log(|S|)). Kde jsme vzali poˇcet blok˚ u? Ten je urˇcitˇe menˇs´ı neˇz poˇcet dotaz˚ u v interpolaˇcn´ım vyhled´av´an´ı (jen interpolaˇcn´ı dotazy).
Kapitola 7
Bin´ arn´ı vyhled´ avac´ı stromy 7.1
Obecnˇ e
Definice 7.1.1. Bin´ arn´ı vyhled´ avac´ı strom reprezentuj´ıc´ı mnoˇzinu S je takov´ y bin´arn´ı strom, ˇze 1. kaˇzd´ y vnitˇrn´ı vrchol m´ a dva syny, lev´eho a prav´eho 2. existuje jednoznaˇcn´ a korespondence mezi vrcholy S a vnitˇrn´ımi vrcholy stromu 3. pro kaˇzd´ y vnitˇrn´ı vrchol v plat´ı, ˇze vnitˇrn´ı vrcholy v podstromu jeho lev´eho syna reprezentuj´ı prvky menˇs´ı neˇz reprezentuje v a vnitˇrn´ı vrcholy v podstromu jeho prav´eho syna reprezentuj´ı prvky vˇetˇs´ı neˇz reprezentuje vrchol v. Pozn´ amka 7.1.1. Necht’ S = {s1 < s2 < ... < sn } s0 = −∞, sn+1 = ∞ Pak i-t´ y list (ve smyslu zleva doprava) reprezentuje interval < si−1 , si >. Pˇ r´ıklad 7.1.1. Necht’ S = {1, 7, 12, 15, 24, 81}. Bin´arn´ı vyhled´avac´ı strom reprezentuj´ıc´ı mnoˇzinu S je na obr. 7.1.
15 7 1
81 24
12
8
(81, ) 8
(- ,1) (1,7) (7,12) (12,15) (15,24) (24,81) Obr´ azek 7.1: Pˇr´ıklad bin´arn´ıho vyhled´avac´ıho stromu Pozn´ amka 7.1.2. V listech m´ ame jen intervaly, kaˇzd´ y vrchol implicitnˇe urˇcuje tyto intervaly. (viz obr. 7.1) Tato vazba je jednotliv´ ymi operacemi udrˇzov´ana. 58
Strom na obr. 7.1 nen´ı moˇ zn´ a nejlepˇ s´ı pˇ r´ıklad, protoˇ ze BVS mohou vypadat v´ıce nepravidelnˇ ena rozd´ıl od haldy nemus´ı m´ıt vˇ sechny uzly um´ıstˇ eny co moˇ zn´ a nejv´ıce ”vlevo”.
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
7.1.1
59
Algoritmus MEMBER
Algoritmus 7.1 MEMBER pro bin´ arn´ı vyhled´avac´ı stromy t ← koˇren while t nen´ı list a z´ aroveˇ n t nereprezentuje x do if x > prvek reprezentovan´ y t then t ← prav´ y syn else t ← lev´ y syn t end if end while
7.1.2
Algoritmus INSERT
1. najdi list kam patˇr´ı x (xi−1 < x < xi ) 2. udˇelej z nˇej vnitˇrn´ı vrchol s hodnotou x
tohle je pouze pokus o alg. XXX dopsat podle nˇ ejak´ eho d˚ uvˇ eryhodn´ eho zdroje !
3. pˇridej mu dva syny s intervaly < xi−1 , x >, < x, xi > 4. uprav struktur´ aln´ı podm´ınku na strom
7.1.3
Algoritmus DELETE
DELETE(x) provedeme n´ asledovnˇe: 1. nalezneme x (vrchol reprezentuj´ıc´ı x) 2. pokud jeden jeho syn je list, pak odstran´ıme vrchol + syna, kter´ y je list, druh´ y syn nahrad´ı odstranˇen´ y vrchol 3. pokud ˇz´ adn´ y jeho syn nen´ı list, pak: nalezneme vrchol u, reprezentuj´ıc´ı nejmenˇs´ı prvek v S vˇetˇs´ı neˇz x. lev´ y syn tohoto vrcholu je list. pˇrem´ıst´ıme prvek reprezentovan´ y t´ımto vrcholem do vrcholu reprezentuj´ıc´ıho x odstran´ıme u a jeho lev´eho syna, prav´eho syna u d´ame na m´ısto u. Jak nalezneme vrchol reprezentuj´ıc´ı nejmenˇs´ı prvek v S vˇetˇs´ı neˇz x ? Jsme ve vrcholu t reprezentuj´ıc´ım x a hled´ ame vrchol u: u ← prav´ y syn t while lev´ y syn u 6= list do u ← lev´ y syn u end while ˇ pro operace MEMBER, INSERT a DELETE v bin´arn´ım vyhled´avac´ım stromˇe je Cas O(d´elka stromu) = O(v´ yˇska stromu).
7.2
Optim´ aln´ı bin´ arn´ı vyhled´ avac´ı stromy
Budeme cht´ıt reprezentaci bin´ arn´ıho vyhled´avac´ıho stromu takovou, ˇze bude optimalizovan´a vzhledem k operaci MEMBER za pˇredpokladu, ˇze zn´ame pravdˇepodobnost proveden´ı t´eto operace na jednotliv´e vrcholy stromu.
co kdyˇ z oba synov´ e jsou listy ?
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
7.2.1
60
Co je to optim´ aln´ı bin´ arn´ı vyhled´ avac´ı strom
Prvky jsou uloˇzeny ve vnitˇrn´ıch vrcholech stromu. Listy jsou intervaly (−∞, x1 ), (x1 , x2 ), . . ., (xn , ∞). Listy nemus´ıme implicitnˇe ve stromˇe zaznamen´avat. U optim´aln´ıch strom˚ u d´ale pˇredpokl´ad´ame, ˇze zn´ame pravdˇepodobnosti operac´ı Access(x).
7.2.2
Algoritmus konstrukce
D´ana mnoˇzina S = {x1 < x2 < ... < xn }, prov´ad´ı se pouze operace MEMBER(x) a jsou d´any pravdˇepodobnosti α1 , ..., αn , β0 , ..., βn , kde
P znaˇ c´ı pravdˇ epodobnost
• αi = P (prov´ adˇela se operace M EM BER(xi )) • βi = P (prov´ adˇela se operace M EM BER(x) pro x ∈< xi , xi+1 >) kde x0 = −∞, xn+1 = ∞. Tedy jsou d´ any pravdˇepodobnosti pˇr´ıstupu k vnitˇrn´ım vrchol˚ um a k list˚ um. Chceme nal´ezt bin´ arn´ı vyhled´ avac´ı strom reprezentuj´ıc´ı S takov´ y, ˇze operace MEMBER m´a nejmenˇs´ı oˇcek´ avan´ y ˇcas. Pn Pn Oˇcek´avan´ y ˇcas operace MEMBER je i=1 αi (ai + 1) + i=0 βi bi , kde ai je hloubka prvku reprezentuj´ıc´ıho prvek xi , bi je hloubka listu reprezentuj´ıc´ıho interval < xi , xi+1 >. Zobecn´ıme u ´ lohu: D´ana mnoˇzina S = {x1 < x2 < ... < xn } a ohodnocen´ı αi prvku xi a βi intervalu (x Pin, xi+1 ). Chceme zkonstruovat bin´ a rn´ ı vyhled´ a vac´ ı strom T reprezentuj´ ıc´ ı S takov´ y , ˇ z e hod(T ) = i=1 αi (ai + 1) + Pn β b je minim´ a ln´ ı. i i i=0 T je pak optim´ aln´ı bin´ arn´ı vyhled´ avac´ı strom. Pro 1 ≤ i ≤ j ≤ n, Ui,j je u ´loha nal´ezt optim´aln´ı bin´arn´ı vyhled´ avac´ı strom pro Si,j = xi < xi+1 < ... < xj a hodnoty αi , αi+1 , ..., αj , βi−1 , βi , ..., βj .
oˇ cek´ avan´ a hodnota = stˇ redn´ı hodnota n´ ahodn´ e veliˇ ciny; n.v. s diskr´ etn´ım rozdˇ elen´ım m´ a stˇ Pr. hodnotu xi pi XXX sjednotit indexy a z´ avorky - bud’ c(i, j) nebo ci,j
Pozorov´ an´ı 7.2.1. Necht’ T je strom reprezentuj´ıc´ı mnoˇzinu Si,j a koˇren T hodnot´ı prvek xk pro i ≤ k ≤ j. Necht’ Tl je podstrom lev´eho syna koˇrene, Tp je podstrom prav´eho syna koˇrene. Pak: Pj Pj hod(T ) = hot(Tl ) + hod(Tp ) + l=i αl + l=i−1 βl Tl reprezentuje mnoˇzinu Si,k−1 a Tp reprezentuje mnoˇzinu Sk+1,j . Pozorov´ an´ı 7.2.2. Necht’ plat´ı pˇredpoklady pozorov´an´ı 7.2.1 a necht’ T je optim´aln´ı bin´arn´ı vyhled´avac´ı strom pro Si,j . Pak Tl je optim´aln´ı bin´arn´ı vyhled´avac´ı strom pro Si,k−1 a Tp je optim´aln´ı bin´ arn´ı vyhled´ avac´ı strom pro Sk+1,j . Pozorov´ an´ı 7.2.3. Kdyˇz zn´ ame hod(Tk,k0 ) pro opt. bin. vyhl. strom reprezentuj´ıc´ı mnoˇzinu Sk,k0 kde i ≤ k ≤ k 0 ≤ j a k 0 − k < j − i, pak hod(Ti,j ) pro opt. bin. vyhl. strom je j X l=i
αl +
j X
βl + min{hod(Ti,k−1 ) + hod(Tk+1,j ), i ≤ k ≤ j}
l=i−1
Kdyˇz hod(Ti,k−1 ) + hod(Tk+1,j ) ≤ min{hod(Ti,k0 −1 ) + hod(Tk0 +1,j ), i ≤ k 0 ≤ j} pak ∃ opt. bin. vyhl. strom pro Si,j , jehoˇz koˇren reprezentuje xk . Pj Pj Systematicky spoˇc´ıt´ ame wi,j = l=i αl + l=i−1 βl pro vˇsechny 1 ≤ i ≤ j ≤ n. Inicializujeme matice H,K typu nxn, H = K = 0. for i=1,2,...,n do
XXX typu n krat n
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
61
Hi,i = wi,i , Ki,i = i end for Hi,j pro i ≤ j bude Hi,j = hod(Ti,j ) pro opt. bin. vyhl. strom reprezentuj´ıc´ı Si,j a Ki,j bude index prvku reprezentovan´eho v koˇreni Ti,j . Algoritmus 7.2 V´ ypoˇcet matic H, K for every i = 1, 2, .., n do Hi,i = wi,i , Ki,i = i end for j=1 while j < n do i=1 while i + j ≤ n do m = i, hod = Hi+1,j (1) k = i + 1 (2) while k ≤ i + j (3) do if hod > Hi,k−1 + Hk+1,i+j then hod = Hi,k−1 + Hk+1,i+j m=k end if k =k+1 end while Hi,i+j = hod + wi,i+j , Ki,i+j = m, i = i + 1 end while j =j+1 end while Vˇ eta 7.2.1. Uveden´y algoritmus 7.2 spoˇc´ıt´ a korektnˇe matice H a K v ˇcase O(n3 ) a vyˇzaduje 2 O(n ) pamˇeti. Ki,j ≤ Ki,j+1 ≤ Ki+1,j+1 Konstrukce opt. bin. vyhl, stromu ze znalosti matice K • koˇren stromu bude xK(1,n) . • podstrom lev´eho syna bude optim. strom pro S1,K(1,n)−1 • podstrom prav´eho syna bude optim. strom pro SK(1,n)+1,n To n´am d´ av´ a rekurzivn´ı algoritmus pro v´ ystavbu opt. bin. vyhl. stromu z matice K, strom takto zkonstruujeme v ˇcase O(n).
7.2.3
Sn´ıˇ zen´ı sloˇ zitosti z kubick´ e na kvadratickou
XXX slouˇcit s ˇc´ ast´ı pˇredch subsekce Chceme sn´ıˇzit ryhchlost konstrukce opt. bin. vyhl. stromu z kubick´e na kvadratickou. Pro tento u ´kol pouˇzijeme kvadratick´e programov´ an´ı. Pomoc´ı t´eto techniky lze modifikovat algoritmus pro konstrukci optim´ aln´ı BVS tak, ˇze bude m´ıt m´ısto sloˇzitosti O(n3 ) sloˇzitost O(n2 ).
XXX obr. matice
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
62
Algoritmus 7.3 Modifikovan´ y algoritmus pro v´ ypoˇcet matic H, K for every i = 1, 2, .., n do Hi,i = wi,i , Ki,i = i end for j=1 while j < n do i=1 while i + j ≤ n do m = Ki,i + j, hod = Hi,m−1 + Hm+i,i+j (1’) k = Ki,i+j + 1 (2’) while k ≤ Ki+1,j+1 (3’) do if hod > Hi,k−1 + Hk+1,i+j then hod = Hi,k−1 + Hk+1,i+j m=k end if k =k+1 end while Hi,i+j = hod + wi,i+j , Ki,i+j = m, i = i + 1 end while j =j+1 end while
Algoritmus 7.2 pro v´ ypoˇcet H a K jsme modifikovali tak, ˇze ˇr´adky (1),(2),(3) jsme nahradili ˇr´adky (1’),(2’),(3’). T´ım vznikl algoritmus 7.3. Modifikovan´ y algoritmus: Tˇret´ı vnoˇren´ y cyklus vyˇzaduje ˇcas O(Ki+1,j+1 − Ki,j ). Tedy druh´ y vnoˇren´ y cyklus vyˇzaduje ˇcas O(K2,2+j −K1,1+j +K3,3+j −K2,2+j +K4,4+j −K3,3+j +...+Kn−j,n − Kn−j−1,n−1 ) = O(Kn−j,n ) = O(n). Vˇ eta 7.2.2. Za pˇredpokladu Ki,j ≤ Ki,j+1 ≤ Ki+1,j+1 pro kaˇzd´e 1 ≤ i ≤ j ≤ n − 1 modifikovan´y algoritmus korektnˇe spoˇc´ıt´ a matice H a K v ˇcase O(n2 ) a vyˇzaduje pamˇet’ O(n2 ). Vstup: d´ ana ˇc´ısla w(i, j),(1 ≤ i ≤ j ≤ n 0 pro i = j, kde i = 1, 2, ..., n V´ ystup: definujeme c(i, j) = w(i, j) + min{c(i, k − 1) + c(k, j), i < k ≤ j} pro i 6= j ´ ˇ ısla c(i, j) budou tvoˇrit v´ Ukolem je tedy nal´ezt ˇc´ısla c(i, j). C´ ystup algoritmu. Kdyˇz pouˇzijeme modifikaci algoritmu pro hled´ an´ı opt. bin. vyhl. stromu, pak spoˇc´ıt´ame c(i, j) v ˇcase O(n3 ). Definice 7.2.1. K(i, j) = min{l, l = i + 1, ..., j a plat´ı c(i, l − 1) + c(l, j) ≤ c(i, k − 1) + c(k, j)∀k = i + 1, ..., j} Kdyˇz K(i, j) ≤ K(i, j + 1) ≤ K(i + 1, j + 1) pro i ≤ j, pak lze pouˇz´ıt algoritmus vyˇzaduj´ıc´ı ˇcas O(n2 ). (tj. m˚ uˇzeme pouˇz´ıt rychlejˇs´ı modifikaci algoritmu pro hled´an´ı opt. bin. vyhl. stromu a spoˇc´ıt´ame c(i, j) v ˇcase O(n2 )) Pozn´ amka kvadratick´eho programov´an´ı a hled´an´ı opt. bin. vyhl. stromu: Poloˇzme Pj7.2.1. Vztah Pj w(i, j) = l=i αl + l=i−1 βl , pak c(i, j) = Hi+1,j . Chceme uk´ azat, ˇze kdyˇz plat´ı • (A) w(i, j) ≤ w(i0 , j 0 ) pro i0 ≤ i ≤ j leqj 0
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
63
• (B) w(i, j) + w(i0 , j 0 ) ≤ w(i, j 0 ) + w(i0 , j) pro i ≤ i0 ≤ j leqj 0 pak plat´ı K(i, j) ≤ K(i, j + 1) ≤ K(i + 1, j + 1) pro 1 ≤ i ≤ j. Lemma 7.2.1. Za uveden´ych pˇredpoklad˚ u plat´ı c(i, j) + c(i0 , j 0 ) ≤ c(i, j 0 ) + c(i0 , j) pro i ≤ i0 ≤ j ≤ j 0 D˚ ukaz. indukc´ı dle j 0 − i: plat´ı: kdyˇz i = i0 nebo j = j 0 , pak trivi´ alnˇe plat´ı c(i, j) + c(i0 , j 0 ) ≤ c(i, j 0 ) + c(i0 , j) inici´aln´ı krok: kdyˇz j 0 − i ≤ 0, pak plat´ı bud’ i = i0 nebo j = j 0 . indukˇcn´ı krok: pˇredpokl´ adejme, ˇze nerovnost plat´ı, kdyˇz j 0 − i < n a necht’ j 0 − i = n, kde n ≥ 2. 1. j = i0 pak m´ ame dok´ azat, ˇze c(i, j) + c(j, j 0 ) ≤ c(i, j 0 ). oznaˇcme K(i, j 0 ) = l. z def c(i,j)
1. (1a) l ≤ j pak c(i, j) + c(j, j 0 ) ≤ w(i, j 0 ) + c(i, l − 1) = c(i, j) v´ıme, ˇze i < l ≤ j, tedy j 0 − l < j 0 − i. ⇒ (1a) plat´ı.
w(i, j) + c(i, l − 1) + c(l, j) + c(j, j 0 )
z (A) a ind. pˇ redp.
≤
2. (1b) l ≥ j, d˚ ukaz stejn´ y jako pro 1a. ⇒ 1 plat´ı. 3. j > j 0 oznaˇcme k = K(i, j 0 ), l = K(i0 , j) 1. (2a) l ≤ k, pak i0 < l <≤ j, i < k < j ≤ j 0 c(i, j) + c(i0 , j 0 ) ≤w(i, j) + c(i, l − 1) + c(l, j) + w(i0 , j 0 ) + c(i0 , k − 1) + c(k, j 0 ) =w(i, j) + w(i0 , j 0 ) + c(i, l − 1) + c(i0 , k − 1) + c(l, j) + c(k, j 0 ) podle (B)
≤
w(i, j 0 ) + w(i0 , j) + c(i, k − 1) + c(i0 , l − 1) + c(l, j) + c(k, j 0 ) =
0
0
v´ıme, ˇze i ≤ i ≤ l − 1 ≤ k − 1 a k − 1 − i < j − i. Potom =w(i, j 0 ) + c(i, k − 1) + c(k, j 0 ) + w(i0 , j) + c(i, l − 1)c(l, j) =c(i, j 0 ) + c(i0 , j) 2. (2b) k ≤ l d˚ ukaz je analogick´ y jako pro (2a). ⇒ 2 plat´ı. ⇒ lemma je dok´ azan´e.
c(i, k − 1) + c(i0 , l − 1) jsme dostali z ind. pˇ redp.
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
64
Lemma 7.2.2. Kdyˇz c(i, j) + c(i0 , j 0 ) ≤ c(i, j 0 ) + c(i0 , j) pro i ≤ i0 ≤ j ≤ j 0 , pak plat´ı K(i, j) ≤ K(i, j + 1) ≤ K(i + 1, j + 1) D˚ ukaz. Uk´ aˇzeme, ˇze plat´ı K(i, j) ≤ K(i, j + 1), d˚ ukaz druh´e nerovnosti je analogick´ y. Abychom dok´ azali (i, j) ≤ K(i, j + 1), tak staˇc´ı uk´azat, ˇze plat´ı c(i, k − 1) + c(k, j) < c(i, k 0 − 1) + c(k 0 , j) pak c(i, k − 1) + c(k, j + 1) < c(i, k 0 − 1) + c(k 0 , j + 1) pro i < k 0 < k ≤ j. poˇzadovan´ a nerovnost plyne z t´eto nerovnosti: c(i, k 0 − 1) + c(k 0 , j) − c(i, k − 1) − c(k, j) 0
c(i,k −1)>0
≤
c(i, k 0 − 1) + c(k 0 , j + 1) − c(i, k − 1) − c(k, j + 1)
skonˇcili jsme s triky, uprav´ıme nerovnost a vyjde to: c(i, k 0 − 1) + c(k 0 , j) + c(i, k − 1) + c(k, j + 1) ≤c(i, k 0 − 1) + c(k 0 , j + 1) + c(i, k − 1) + c(k 0 , j + 1) c(k 0 , j) + c(k, j + 1) ≤ c(k 0 , j + 1) + c(k, j) plat´ı k 0 < k ≤ j ≤ j + 1 ... nerovnost plat´ı dle pˇredpokladu (poloˇz´ıme i = k’, i’=k, j=j, j’=j+1)
7.3
Skorooptim´ aln´ı bin´ arn´ı vyhled´ avac´ı stromy
Definice 7.3.1. Necht’ S = {x1 < x2 < . . . < xn } a necht’ βi (resp. αj ) je pravdˇepodobnost operace Access(a, S), kde xi (resp. xj < a < xj+1 ) pro 1 ≤ i ≤ n (resp. 0 ≤ j ≤ n). Pa =P Potom βi ≥ 0, αi ≥ 0 a βi + αi = 1. (2n+1)-tice (α0 , β1 , α1 , . . . , βn , αn ) se naz´ yv´a rozdˇelen´ı (pravdˇepodobnosti) pˇr´ıstupu. Strom potom konstruujeme rekurz´ı tak, aby pr˚ umˇern´ a v´ aˇzen´ a cesta ve stromˇe byla co nejkratˇs´ı. Takov´ y strom lze konstruovat pomoc´ı rekurzivn´ıho v´ ypoˇctu zkouˇsen´ım vˇsech kandid´at˚ u na koˇren. To lze v ˇcase O(n2 ), protoˇze volba koˇrene jednoznaˇcnˇe urˇcuje prvky prav´eho i lev´eho podstromu (nebot’ se jedn´ a o vyhled´ avac´ı strom). Takov´ y strom lze konstruovat pomoc´ı rekurzivn´ıho v´ ypoˇctu zkouˇsen´ım vˇsech kandid´ at˚ u na koˇren. To lze v ˇcase O(n2 ), protoˇze volba koˇrene jednoznaˇcnˇe urˇcuje prvky prav´eho i lev´eho podstromu (nebot’ se jedn´a o vyhled´avac´ı strom).
7.3.1
Aproximace optim´ aln´ıch strom˚ u
Pˇri konstrukci se budeme snaˇzit volbou koˇrene podstromu rozdˇelit prvky na dvˇe stejnˇe pravdˇepodobn´e mnoˇziny. Uvaˇzujme n´ asleduj´ıc´ı situaci. S = {x1 , x2 , x3 , x4 } s pravdˇepodobnostmi pˇr´ıstupu (α0 , β1 , α1 , 1 5 , 0, 18 , 0, 18 , 18 , 0, 12 ). β2 , α2 , β3 , α3 , β4 , α4 ) = ( 61 , 24 Doporuˇcuji si pˇredstavit uveden´e body na re´aln´e ose tak, ˇze α0 je v bodˇe 0, α4 v bodˇe 1. Bod 21 padne bud’ do βi nebo do αj pro nˇejak´e i, resp. j. V prvn´ım pˇr´ıpadˇe zvol´ıme xi jako koˇren stromu, jinak vol´ıme mezi xj a xj+1 , podle toho, zda 12 leˇz´ı v lev´e nebo prav´e polovinˇe αj . V naˇsem pˇr´ıpadˇe vol´ıme x3 jako koˇren stromu. Pro rozhodnut´ı o koˇrenu lev´eho podstromu vrchol, kter´ y popsan´ ym zp˚ usobem odpov´ıd´a bodu 1 1 . Tento postup nen´ ı totoˇ z n´ y s postupem, kdy se bere bod v novˇ e vznikl´ e pod´ uloze, protoˇze pˇri 4 2 konstrukci podstromu bychom zanedbali ˇc´ast intervalu α3 .
XXX pokud se div´ıte j = j, nedivte se, znamen´ a to, ˇ ze j z 1. ˇ c´ asti se rovn´ a j z druh´ e ˇ c´ asti :) chce to lepˇ s´ı znaˇ cen´ı
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
7.3.2
65
Podrobnˇ ejˇ s´ı popis naznaˇ cen´ e metody
Necht’
α0 αi−1 αi si = si−1 + + βi + . (7.1) 2 2 2 Uvˇedomte si, ˇze si jsou stˇredy interval˚ u pˇr´ısluˇsej´ıc´ıch ”ne´ uspˇeˇsn´emu vyhled´av´an´ı”, tj. (xi , xi+1 ). Vol´an´ı funkce construct tree(0, n, 0, 1) vytvoˇr´ı skoro optim´aln´ı vyhled´avac´ı strom dle popsan´e metody. s0 =
procedure contruct tree(i,j,cut,l) Pozn´ amka: Pˇredpokl´ ad´ ame, ˇze parametry volan´e funkce splˇ nuj´ı n´ asleduj´ıc´ı podm´ınky. 1. i a j jsou cel´ a ˇc´ısla takov´ a, ˇze 0 ≤ i < j ≤ n 2. l je cel´e ˇc´ıslo, l ≥ 0 Pl−1 3. cut = p=1 xp 2−p , kde xp ∈ {0, 1} pro vˇsechna p 4. cut ≤ si ≤ sj ≤ cut + 2−l+1 Vol´ an´ı construct tree(i, j, , ) vytvoˇr´ı bin´ arn´ı vyhled´ avac´ı strom pro vrcholy i+1, . . . , j a listy i, . . . , j. begin if i + 1 = j (pˇr´ıpad A) return koˇren=j, lev´ y list=i, prav´ y list=j; else najdi k takov´e, ˇze 5) i < k ≤ j 6) k = i + 1 nebo sk−1 ≤ cut + 2−l 7) k = j nebo sk ≥ cut + 2−l Takov´e k vˇzdy existuje, protoˇze parametry funkce splˇ nuj´ı podm´ınku 4. if k = i + 1 (pˇr´ıpad B) return koˇren=i+1 lev´ y list=i prav´ y list=construct tree(i+1,j,cut+2−l ,l+1); if k = j (pˇr´ıpad C) return koˇren=j lev´ y list=construct tree(i,j-1,cut,l+1) prav´ y list=j; if i + 1 < k < j (pˇr´ıpad D) return koˇren=k lev´ y list=construct tree(i,k-1,cut,l+1) prav´ y list=construct tree(k,j,cut+2−l ,l+1); end Vˇ eta 7.3.1. Necht’ bi je hloubka vrcholu xi a aj je hloubka listu (xj , xj+1 ) ve stromˇe TBB vytvoˇren´em funkc´ı construct tree(0,n,0,1). Potom bi ≤ blog 1/βi c, aj ≤ blog 1/αj c + 2 D˚ ukaz. Vˇeta ˇr´ık´ a, ˇze hloubka vrcholu roste s klesaj´ıc´ı pravdˇepodobnost´ı pˇr´ıstupu k tomuto vrcholu. Plyne z n´ asleduj´ıc´ıch fakt˚ u. Fakt 1. Jestliˇze hodnoty parametr˚ u funkce construct tree splˇ nuj´ı podm´ınky 1-4 a i + 1 6= j, potom k splˇ nuj´ıc´ı poˇzadovan´e podm´ınky existuje a hodnoty parametr˚ u rekurzivn´ıch vol´an´ı construct tree splˇ nuji 1-4.
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
66
D˚ ukaz. Pˇredpokl´ adejme, ˇze parametry splˇ nuj´ı 1 – 4 a i + 1 6= j. Potom zˇrejmˇe plat´ı cut ≤ sj ≤ cut + 2−l+1 . Pro spor pˇredpokl´ adejme, ˇze neexistuje neexistuje ˇz´adn´e k, i < k ≤ j, pro kter´e by platilo sk−1 ≤ cut + 2−l a sk ≥ cut + 2−l . Potom ovˇsem bud’ pro vˇsechna k takov´a, ˇze i < k ≤ j, plat´ı sk < cut + 2−l nebo pro vˇsechna k takov´a, ˇze i < k ≤ j, plat´ı sk−1 > cut + 2−l . V prvn´ım pˇr´ıpadˇe k = j odpov´ıd´ a poˇzadovan´ ym podm´ınk´am, v druh´em jim odpov´ıd´a k = i+1. Tedy k vˇzdy existuje. Zb´ yv´a uk´ azat, ˇze nov´e parametry vol´an´ı funkce splˇ nuj´ı poˇzadovan´e podm´ınky. To ale plyne z toho, ˇze k splˇ nuje 5-7 a i + 1 6= j. Fakt 2. Hodnoty parametr˚ u vˇsech vol´ an´ı construct tree splˇ nuj´ı podm´ınky 1-4. D˚ ukaz. Indukc´ı. construct tree(0, n, 0, 1) splˇ nuje 1-4 a pomoc´ı pˇredchoz´ıho faktu. ˇ Rekneme, ˇze vrchol h (resp. list h) je vytvoˇren vol´an´ım construct tree(i, j, cut, l), jestliˇze h = j (resp. h = j nebo h = i) a byl proveden pˇr´ıpad A, nebo h = i + 1 (resp. h = i) a byl proveden pˇr´ıpad B, nebo h = j a byl proveden pˇr´ıpad C, nebo h = k a byl proveden pˇr´ıpad D. D´ale nˇecht’ bi je hloubka vrcholu i a aj hloubka listu j ve stromˇe vr´acen´em construct tree(0, n, 0, 1). Fakt 3. Je-li vrchol h (resp. list h) vytvoˇren vol´an´ım construct tree(i, j, cut, l), potom bh + 1 = l (resp. ah = l). D˚ ukaz. Indukc´ı podle l. Fakt 4. Je-li vrchol h (resp. list h) vytvoˇren vol´an´ım construct tree(i, j, cut, l), potom βh ≤ 2−l+1 (resp. αh ≤ 2−l+2 ). D˚ ukaz. Parametry splˇ nuj´ı 4 a tedy 2l+1 ≥ sj − si = (αi + αj )/2 + βi+1 + αi+1 + . . . + βj ≥ βh (resp. αh /2) vˇety. Z fakt˚ u 3 a 4 obdrˇz´ıme βh ≤ 2−bh a αh ≤ 2−ah +2 . Zlogaritmov´an´ım a pˇreveden´ım na celoˇc´ıseln´e hodnoty dost´ av´ ame tvrzen´ı vˇety. Vˇety 1 a 2 ukazuj´ı, ˇze hloubka vrcholu je pˇribliˇznˇe rovna logaritmu pˇrevr´acen´e hodnoty pravdˇepodobnosti pˇr´ıstupu k tomuto vrcholu. ’ 1 , γ2 , . . . , γn ) je diskr´etn´ı rozdˇelen´ı pravdˇepodobnosti. Potom se funkce Definice 7.3.2. Necht P(γ n H(γ1 , γ2 , . . . , γn ) = − i=1 γi log γi naz´ yv´a entropie rozdˇelen´ı. Povˇsimnˇete si, ˇze entropie nez´ aleˇz´ı na vytvoˇren´em stromˇe, jenom na pravdˇepodobnostech pˇr´ıstupu. Vˇ eta 7.3.2. Necht’ PBB je v´ aˇzen´ a d´elka cesty zkonstruovan´eho stromu. Potom PBB ≤
X
βi blog 1/βi c +
X
αj blog 1/αj c + 1 +
X
αj ≤ X ≤ H(α0 , β1 , α1 , . . . , βn , αn ) + 1 + αj
(7.2)
Nav´ıc ’ Vˇ eta 7.3.3. Necht’ PBB je v´ aˇzen´ a d´elka aˇzen´ a P cesty zkonstruovan´eho stromu a necht Popt je v´ d´elka cesty v optim´ aln´ım stromu. (B = βi ) Potom
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp 1. max{ logH−dB ; d ∈ R} ≤ Popt ≤ PBB ≤ H + 1 + (2+2−d ) P 2. PBB ≤ Popt + B(log e + log(Popt /B)) + 2 αj
67
P
αj
D˚ ukaz. Plyne z vˇety 5 (p˚ uvodn´ı ˇc´ıslov´ an´ı, viz [1], strana 175) a vˇety 2. Je to jenom sloˇzit´e poˇc´ıt´ an´ı, jde o to, ˇze dovedeme odhadnout, jak velk´a dovede b´ yt ta v´aˇzen´a cesta v n´ami vytvoˇren´em stromˇe. PBB − Popt ≤ log Popt , coˇz je pˇribliˇznˇe logH.
7.3.3
ˇ Casov´ a sloˇ zitost
Pro sestrojen´ı stromu s jedn´ım vrcholem potˇrebuje metoda konstatn´ı ˇcas, tj. T (1) = c1 . Pro n > 1 je potˇreba naj´ıt k a dojde aˇz ke dvˇema rekurzivn´ım vol´an´ım construct tree. Necht’ T (m, n) je ˇcas potˇrebn´ y pro nalezen´ı k, kde m = k − i (tj. vzd´alenost k od poˇc´atku zkouman´eho ano maxim´alnˇe dvakr´at, v pˇr´ıpadˇe D prvn´ı vol´an´ı sestroj´ı strom s u ´seku). construct tree je vol´ k − 1 − i = m − 1 vrcholy a druh´e vol´ an´ı strom s j − k = n − m. Tedy T (n) ≤ max(T (m − 1) + T (n − m) + TS (n, m) + c2 ). Zde c2 je konstanta mˇeˇr´ıc´ı sloˇzitost pˇred´av´an´ı parametr˚ u. Dodefinujeme-li T (0) = 0, potom uveden´a nerovnost plat´ı i pro pˇr´ıpady B a C. Zavedeme-li d´ale konvenci TS (1, m) = 0 a c = max(c1 , c2 ), dot´av´ame zjednoduˇsen´ y v´ yraz: T (0) = 0T (n) ≤ max (T (m − 1) + T (n − m) + TS (n, m) + c) 1≤m
7.3.4
(7.3)
Hled´ an´ı k
ˇ ıslo k m˚ C´ uˇzeme hledat bin´ arn´ım vyhled´av´an´ım (p˚ ulen´ı intervalu), ale v´ ysledn´a ˇcasov´a sloˇzitost by byla O(n log n) Principi´ aln´ı probl´em s vyhled´ av´ an´ım pomoc´ı p˚ ulen´ı intervalu je, ˇze n´am nalezen´ı k trv´a dlouho i v pˇr´ıpadˇe, ˇze je bl´ızko i nebo j a tedy neredukuje velikost pod´ ulohy podstatn´ ym zp˚ usobem. ˇ sen´ım je kombinace exponenci´ Reˇ aln´ıho a bin´arn´ıho vyhled´av´an´ı. T´ım dos´ahneme toho, ˇze k, kter´a jsou bl´ızko krajn´ım bod˚ um intervalu, nalezneme rychleji. Budeme vyhled´ avat od konc˚ u intervalu, ale ne v konstatn´ıch kroc´ıc´ıch. 1) Porovn´ ame sr s cut+2−l , kde r = b(i+1+j)/2c. Je-li sr ≥ cut+2−l , potom k ∈ {i+1, . . . , r}. Je-li sr ≤ cut + 2−l , potom k ∈ {r, . . . , j}. V dalˇs´ım budeme pˇredpokl´adat, ˇze k ∈ {i + 1, . . . , r}. Tento krok trv´ a konstantn´ı ˇcas. 2) Nalezneme nejmenˇs´ı t, t = 0, 1, 2, . . ., takov´e, ˇze si+2t ≥ cut + 2−l . Nazvˇeme jej t0 . t0 lze nal´ezt v ˇcase d2 (t0 + 1) pro nˇejakou konstantu d2 . Potom i + 2t0 −1 < k ≤ i + 2t0 , tj. 2t0 ≥ k − i = m > 2t0 −1 a odtud log m > t0 − 1. Tedy trv´an´ı kroku 2 je omezen´e d2 (2 + log m). 3) Bin´arn´ım vyhled´ av´ an´ım na intervalu i + 2t0 −1 + 1, . . . , i + 2t0 zjist´ıme pˇresnou hodnotu k. t0 Tohle zabere d3 (log(2 − 2t0 −1 ) + 1) = d3 t0 < d3 (1 + log m) (pro nˇejakou konstantu d3 ). Tedy pro i < k ≤ b(i+1+j)/2c nalezneme k v ˇcase menˇs´ım neˇz d3 (1 + log m). Zde se m = k −i. Symetricky lze k nal´ezt v ˇcase ≤ d(1 + log(n − m + 1)), v pˇr´ıpadˇe, ˇze b(i + 1 + j)/2c < k. Tedy TS (n, m) = d(1 + log min(m, n − m + 1)) Dost´av´ ame pro construct tree n´ asleduj´ıc´ı rekurzivn´ı vztah. T (0) = 0 T (n) = max (T (m − 1) + T (n − m) + d(1 + log min(m, n − m + 1)) + c) 1≤m
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
68
Vˇ eta 7.3.4. Je-li vyhled´ av´ an´ı k implementov´ ano pomoc´ı uveden´e kombinace exponenci´ aln´ıho a bin´ arn´ıho vyhled´ av´ an´ı, potom T (n) = O(n). D˚ ukaz. Indukc´ı podle n uk´ aˇzeme T (n) ≤ (2d + c)n − d log(n + 1). Pro n = 0 vztah zˇrejmˇe plat´ı. Pro n > 0 m´ ame T (n) = max (T (m − 1) + T (n − m) + d(1 + log min(m, n − m + 1)) + d + c) 1≤m
(7.4)
Tedy podle symetrie v´ yrazu v m − 1 a n − m dost´av´ame: T (n) ≤
(T (m − 1) + T (n − m) + d log m + d + c)
max
(7.5)
1≤m<(n+1)/2
Podle indukˇcn´ıho pˇredpokladu dost´ av´ame T (n) ≤
((2d + c)(m − 1 + n − m) −
max 1≤m<(n+1)/2
− d(log m + log(n − m + 1)) + d log m + (d + c))
(7.6)
Coˇz se rovn´ a (2d + c)n +
max
(−d(1 + log m − m + 1))
(7.7)
1≤m<(n+1)/2
V´ yraz v z´ avorce je vˇzdy menˇs´ı neˇz nula a je nejvˇetˇs´ı pro m = (n + 1)/2. Tedy dost´av´ame n´asleduj´ıc´ı nerovnost: T (n) ≤ (2d + c)n − d(1 + log(n + 1)/2) = (2d + c)n − d log(n + 1)
7.4
(7.8)
AVL stromy
Bin´arn´ı vyhled´ avac´ı stromy jsou pomˇernˇe pˇr´ıjemn´e jednoduchou implementac´ı operac´ı nad nimi, ale nen´ı pˇritom nijak omezena jejich hloubka. M˚ uˇze se tedy st´at, ˇze strom m˚ uˇze vypadat sp´ıˇse jako seznam, a ˇcasov´ a sloˇzitost operac´ı bude tedy line´arn´ı. Pokud bychom vˇsak chtˇeli, aby mˇel strom co nejmenˇs´ı v´ yˇsku (vzd´ alenost list˚ u od koˇrene by se mohla liˇsit maxim´alnˇe o jedniˇcku), byly by operace INSERT a DELETE n´ aroˇcn´e. Rozumn´ ym kopmromisem mohou b´ yt pr´avˇe AVL-stromy. AVL stromy jsou nazvan´e podle jmen jejich tv˚ urc˚ u (Adel’son-Velskii a Landis). P˚ uvodn´ı ˇcl´anek o AVL stromech lze nal´ezt v [4]. Definice 7.4.1. Necht’ v je vnitˇrn´ı vrchol stromu T. Potom • l(v) je d´elka nejdelˇs´ı cesty z v do listu v podstromu lev´eho syna v. • p(v) je d´elka nejdelˇs´ı cesty z v do listu v podstromu prav´eho syna v. Pokud takov´ y podstrom neexistuje, poloˇzme l(v) resp. p(v) rovno −1. D´ale oznaˇcme b(v) = l(v) − p(v). Vrchol v nazveme vyv´ aˇzen´y, jestliˇze b(v) nab´ yv´a hodnot −1, 0 nebo 1. Definice 7.4.2. AVL strom je bin´ arn´ı vyhled´avac´ı strom takov´ y, ˇze pro kaˇzd´ y vnitˇrn´ı vrchol v plat´ı l(v) − p(v) ∈ {−1, 0, 1}.
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
69
Pozn´ amka 7.4.1. AVL stromy jsou jen jednou z moˇznost´ı jak vyvaˇzovat stromy. Dokonale vyv´ aˇzen´e stromy stanovuj´ı podm´ınku, ˇze pro kaˇzd´ y uzel ve stromu plat´ı, ˇze poˇcty uzl˚ u v lev´em a prav´em podstromu tohoto uzlu se liˇs´ı nejv´ yˇse o jedniˇcku. AVL stromy tento poˇzadavek zeslabuj´ı tak, ˇze vyˇzaduj´ı, aby se v´yˇsky lev´eho a prav´eho podstromu libovoln´eho vrcholu liˇsily nejv´ yˇse o jedniˇcku1 . ´ Uvod do vyv´ aˇzen´ ych bin´ arn´ıch strom˚ u lze nal´ezt napˇr. v [5]. Vˇ eta 7.4.1. AVL-strom o n vrcholech m´ a v´yˇsku nejv´yˇse 2 log n. D˚ ukaz. Oznaˇcme N (h) minim´ aln´ı poˇcet vrchol˚ u AVL stromu v´ yˇsky h. M˚ uˇzeme tedy N (h) definovat takto: N (0) = 1 N (1) = 2 N (h) = 1 + N (h − 1) + N (h − 2) Je zˇrejm´e, ˇze plat´ı N (h) ≥ 2N (h − 2) nebo N (h − 2) ≤ N (h − 1). Odtud dostaneme, ˇze N (h) ≥ 2h/2 a tedy h ≤ 2 log N (h). Nerovnost N (h) ≥ 2h/2 dok´aˇzeme indukc´ı: 1. N (0) = 1 ≥ 20/2 = 1 N (1) = 2 ≥ 21/2 2. N (h) ≥ 2N (h − 2) ≥ 2 · 2h/(2−1) = 2h/2 Vˇsechny vrcholy AVL stromu jsou tedy vyv´aˇzen´e. Nevyv´aˇzen´e vrcholy mohou vzniknout pˇri operac´ıch INSERT a DELETE. Pˇri tom se m˚ uˇze hodnota b(v) zmˇenit maxim´alnˇe o jedniˇcku. Hodnota b(v) nevyv´ aˇzen´eho vrcholu bude tedy −2 nebo 2.
7.4.1
Algoritmus INSERT
Vloˇzen´ı nov´eho vrcholu do AVL-stromu se prov´ad´ı stejnˇe jako v nevyvaˇzovan´ ych bin´arn´ıch vyhled´avac´ıch stromech. Pˇri tom se vˇsak u nˇekter´ ych vrchol˚ u m˚ uˇze poruˇsit podm´ınka na vyv´aˇzenost. Mˇejme strom na obr´ azku 7.2.
x y
T3 T1
T2 Obr´azek 7.2: AVL strom
V tomto stromˇe jsou v´ yˇsky podstrom˚ u T1 , T2 a T3 stejn´e. Pokud pˇri vloˇzen´ı nov´eho vrcholu do podstromu T1 vzroste v´ yˇska tohoto podstromu, bude vrchol x nevyv´aˇzen´ y. Jeho vyv´aˇzen´ı se vˇsak provede jednoduˇse pomoc´ı tzv. LL-rotace. (viz obr. 7.3) 1 Plat´ ı,
ˇ ze kaˇ zd´ y dokonale vyv´ aˇ zen´ y strom je z´ aroveˇ n AVL stromem. Opaˇ cn´ e tvrzen´ı neplat´ı.
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
70
y
x y
x
T1
T3 T2
T1
T3
T2 Obr´ azek 7.3: LL-rotace pro AVL stromy
Pokud bychom vˇsak chtˇeli nov´ y vrchol vloˇzit do T2 a v´ yˇska tohoto podstromu by vzrostla, byl by opˇet vrchol x nevyv´ aˇzen´ y. To se m˚ uˇze napravit pomoc´ı LR-rotace. (viz obr. 7.4)
x
z
y
y
T3
x
z
T1
T1 T2'
T2'
T2''
T3
T2''
Obr´ azek 7.4: LR-rotace pro AVL stromy Poznamenejme, ˇze na vyv´ aˇzenost nem´a vliv, zda jsme vrchol vloˇzili do T20 , nebo do T2 ”. Pˇri vkl´ad´an´ı nov´eho vrcholu do prav´eho podstromu vrcholu x se pro vyv´aˇzen´ı pouˇz´ıvaj´ı rotace RRrotace a RL-rotace, kter´e jsou symetrick´e k jiˇz uveden´ ym rotac´ım. LL-rotaci a RR-rotaci se tak´e nˇekdy ˇr´ık´a jednoduch´a rotace, kdeˇzto LR-rotaci a RL-rotaci se ˇr´ık´a dvojit´ a rotace. Vˇsimnˇete si, ˇze po rotaci je v´ yˇska podstromu, se kter´ ym se rotace prov´adˇela, stejn´a jako jeho v´ yˇska pˇred vloˇzen´ım nov´eho vrcholu. Tedy po rotaci nen´ı naruˇsena vyv´aˇzenost nˇejak´eho pˇredka. Staˇc´ı tedy vyv´ aˇzit ten nevyv´aˇzen´ y vrchol, kter´ y je ve stromu nejn´ıˇze. Pokusme se nyn´ı charakterizovat ten vrchol, kter´ y je tˇreba vyv´aˇzit. Samozˇrejmˇe, ˇze vrchol x leˇz´ı na cestˇe od koˇrene k pˇridan´emu vrcholu a plat´ı: • bud’ b(x) = 1 a nov´ y vrchol je pˇrid´av´an vlevo od x • nebo b(x) = −1 a nov´ y vrchol je pˇrid´av´an vpravo od x Nav´ıc pro kaˇzd´ y vrchol y na cestˇe od x do pˇridan´eho listu je b(y) = 0, nebot’ jinak by byl s´am nevyv´aˇzen´ y, nebo by nezmˇenil svou v´ yˇsku a tedy by nebylo tˇreba vyvaˇzovat ani x.
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
71
Operace INSERT je form´ alnˇe pops´ ana algoritmem 7.4. Algoritmus 7.4 INSERT pro AVL stromy INSERT(c) r ← koˇren while r != NIL do if prvek reprezentovan´ y r = c then END end if if balance(r) != 0 then x := r end if if prvek reprezentovan´ y r > c then r := lef t(r) else r := right(r) end if end while {vloˇzen´ı nov´eho vrcholu} r := nov´ y vrchol key(r) := c b(r) := 0 lef t(r) := nil right(r) := nil r := x VYVAZUJ(r)
7.4.2
Algoritmus DELETE
Ub´ır´an´ı vrchol˚ u z AVL-stromu se prov´ad´ı stejnˇe jako u nevyv´aˇzen´ ych bin´arn´ıch vyhled´avac´ıch strom˚ u. To znamen´ a, ˇze se ub´ıran´ y vrchol nahrad´ı nejpravˇejˇs´ım vrcholem lev´eho podstromu nebo nejlevˇejˇs´ım vrcholem prav´eho podstromu2 . Pˇri tom se samozˇrejmˇe mohou tak´e nˇekter´e vrcholy st´at nevyv´aˇzen´ ymi. To se opˇet ˇreˇs´ı pomoc´ı rotac´ı. Operace DELETE je form´ alnˇe pops´ ana algoritmem 7.6. V algoritmu se pouˇz´ıvaj´ı dvˇe procedury pro vyvaˇzov´ an´ı popsan´e v algoritmech 7.7 a 7.8. Probl´em je, ˇze ne pˇri vˇsech rotac´ıch se zachov´av´a v´ yˇska podstromu, jak tomu bylo u operace INSERT. Proto se zde vyvaˇzov´ an´ı neomez´ı pouze na jeden vrchol. Pˇri operaci DELETE se m˚ uˇze prov´est aˇz log n rotac´ı. Kaˇzdop´ adnˇe sloˇzitost operace DELETE je stejnˇe jako sloˇzitost operace INSERT O(log n).
2 To
je klasick´ y postup operace DELETE pro BVS popsan´ y v [5], str. 70.
XXX dok´ azat max. poˇ cet rotac´ı pˇ ri DELETE
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
Algoritmus 7.5 VYVAZUJ pro AVL stromy {´ uprava balance (staˇc´ı od x do vloˇzen´eho listu)} while r != NIL do if prvek reprezentovan´ y r > c then balance(r) := balance(r) + 1 r := lef t(r) end if if prvek reprezentovan´ y r < c then balance(r) := balance(r) − 1 r := right(r) else r := N IL end if end while if balance(x) = 2 then if prvek reprezentovan´ y lef t(x) > c then LL-rotace else LR-rotace end if end if if balance(x) = −2 then if prvek reprezentovan´ y right(x) < c then RR-rotace else RL-rotace end if end if
72
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
Algoritmus 7.6 DELETE pro AVL stromy DELETE(x) r ← otec vrcholu reprezentovan´eho x {vrcholu lef t := r jsme odebrali lev´eho syna} while r! = N IL do {Proch´ az´ı vrcholy od otce ubran´eho vrcholu ke koˇreni} if lef t then if b(r) = 0 then {Vrchol r je st´ ale vyv´ aˇzen´ y a v´ yˇska jeho podstromu se nezmˇenila} b(r) := −1 end if if b(r) = 1 then {Vrchol r je st´ ale vyv´ aˇzen´ y, ale v´ yˇska jeho podstromu se sn´ıˇzila} b(r) := 0 {Je tˇreba vyvaˇzovat} else VYVAZUJ RIGHT(right(r)) end if else if b(r) = 0 then {Vrchol r je st´ ale vyv´ aˇzen´ y a v´ yˇska jeho podstromu se nezmˇenila} b(r) = 1 END end if if b(r) = −1 then {Vrchol r je st´ ale vyv´ aˇzen´ y, ale v´ yˇska jeho podstromu se sn´ıˇzila} b(r) := 0 {Je tˇreba vyvaˇzovat} else VYVAZUJ LEFT(left(r)) end if end if x := r r := otec(r) lef t := lef t(r) = x end while
73
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
Algoritmus 7.7 VYVAZUJ RIGHT pro AVL stromy VYVAZUJ RIGHT(x) if b(x) = 0 then RR-rotace END end if {V´ yˇska podstromu se nezmˇenila} if b(x) = −1 then RR-rotace else RL-rotace end if
Algoritmus 7.8 VYVAZUJ LEFT pro AVL stromy VYVAZUJ LEFT(x) if b(x) = 0 then LL-rotace {V´ yˇska podstromu se nezmˇenila} END end if if b(x) = 1 then LL-rotace else LR-rotace end if
74
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
7.5
75
ˇ Cervenoˇ cern´ e stromy
Definice 7.5.1. Bin´ arn´ı vyhled´ avac´ı strom T se naz´ yv´a ˇcervenoˇcern´y, jestliˇze kaˇzd´ y vrchol je obarven ˇcervenˇe nebo ˇcernˇe a plat´ı n´ asleduj´ıc´ı podm´ınky: 1. Listy jsou ˇcern´e. 2. Pokud m´ a ˇcerven´ y vrchol otce, je otec ˇcern´ y. 3. Vˇsechny cesty z koˇrene do listu maj´ı stejn´ y poˇcet ˇcern´ ych vrchol˚ u. Vˇ eta 7.5.1. Pro bin´ arn´ı vyhled´ avac´ı ˇcervenoˇcern´e stromy reprezentuj´ıc´ı mnoˇzinu S, |S| = n plat´ı, ˇze jejich hloubka je O(log n).
nejdelˇ s´ı cesta je max. 2× delˇ s´ı neˇ z nejkratˇ s´ı
D˚ ukaz. je-li k poˇcet ˇcern´ ych vrchol˚ u na cestˇe z koˇrene do listu, pak 2k − 1 ≤ |S| ≤ 22k − 1 To plyne z toho, ˇze cesta z koˇrene do listu se m˚ uˇze skl´adat v extr´emn´ıch pˇr´ıpadech bud’ z k ˇcern´ ych vrchol˚ u, pak je poˇcet vnitˇrn´ıch vrchol˚ u stromu 1 + 2 + ... + 2k−1 = 2k − 1 nebo z cesty, kde se stˇr´ıdaj´ı ˇcern´e a ˇcerven´e vrcholy, pak je poˇcet vnitˇrn´ıch vrchol˚ u 1 + 2 + ... + 22k−1 = 22 k − 1. Tedy plat´ı k ≤ log2 |S| + 1 ≤ 2k pˇriˇcemˇz prvky S jsou reprezentov´ any pouze ve vnitˇrn´ıch vrcholech, ne v listech.
7.5.1
to plat´ı pro vˇ sechny bin. vyhl. stromy
Operace INSERT
Uvedeme pouze odliˇsnost od operace INSERT v obecn´em bin´arn´ım vyhled´avac´ım stromˇe. Situace: list t se zmˇenil na vnitˇrn´ı vrchol reprezentuj´ıc´ı prvek x a pˇridali jsme mu 2 listy. Vrchol t obarv´ıme ˇcervenˇe a jeho syny ˇcernˇe. Podm´ınky 1 a 3 st´ale plat´ı, ale podm´ınka 2 platit nemus´ı. Definice 7.5.2. Strom a jeho vrchol (T, t) nazveme 2-t´emˇeˇr ˇcervenoˇcern´y strom (2tˇcˇcs), jestliˇze plat´ı • 1 Listy jsou ˇcern´e. (nezmˇenˇeno) • 2’ Pokud m´ a ˇcerven´ y vrchol r˚ uzn´y od t otce, je otec ˇcern´ y. • 3 Vˇsechny cesty z koˇrene do listu maj´ı stejn´ y poˇcet ˇcern´ ych vrchol˚ u. (nezmˇenˇeno) Definice 7.5.3. Je-li vrchol t ˇcerven´ y a jeho otec je tak´e ˇcerven´ y, pak ˇrekneme, ˇze t je porucha. Pozn´ amka 7.5.1. Poruˇse v 2tˇcˇcs se tak´e nˇekdy ˇr´ık´a 2-porucha. Tedy nyn´ı m´ ame 2tˇcˇcs (T, t) Je-li t porucha, pak ji mus´ıme nˇejak opravit. Situace je na obr´azku 7.5. Nejprve z´ aleˇz´ı na tom, jakou barvu m´a s, str´ yc t: 1. s je ˇcerven´ y. Pak pouze pˇrebarv´ıme o, d a s podle obr´azku 7.6. Podm´ınky 1 a 3 jsou splnˇeny. Nyn´ı d m˚ uˇze b´ yt porucha, ovˇsem posunut´a o 2 hladiny v´ yˇse. Vznikl 2tˇcˇcs (T, d). 2. s je ˇcern´ y. Z´ aleˇz´ı na tom, zda hodnota t leˇz´ı mezi hodnotami o a d nebo ne. Jin´ ymi slovy, zda cesta t-o-d obsahuje zat´ aˇcku.
Srovnej: Kaˇ zd´ y ˇ cerven´ y vrchol r˚ uzn´ y od t m´ a ˇ cern´ eho otce.
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
76
d o
s
t Obr´ azek 7.5: Obecn´a situace pˇri INSERTu
d
d
o
s
o
t
s
t Obr´ azek 7.6: Oprava INSERTu pˇrebarven´ım
o
d o
t
s
t
C A
d s
A
B
B
C
Obr´ azek 7.7: Oprava INSERTu rotac´ı a pˇrebarven´ım
d
t
o
s
d
o
t D A
s A
B
B
C
D
C
Obr´ azek 7.8: Oprava INSERTu dvojitou rotac´ı a pˇrebarven´ım 1. Bez zat´ aˇcky: Provedeme rotaci a pˇrebarv´ıme podle obr´azku 7.7. Splnˇeny budou podm´ınky 1, 2 i 3, tedy m´ ame ˇcervenoˇcern´ y strom.
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
77
2. Se zat´ aˇckou: Provedeme dvojitou rotaci a pˇrebarv´ıme podle obr´azku 7.8. Splnˇeny budou podm´ınky 1, 2 i 3, opˇet m´ ame rovnou ˇcervenoˇcern´ y strom.
7.5.2
Operace DELETE
Zat´ımco INSERT se pˇr´ıliˇs neliˇsil od sv´e obdoby u AVL strom˚ u, operace DELETE u ˇcervenoˇcern´ ych strom˚ u je oproti AVL strom˚ um sloˇzitˇejˇs´ı ment´alnˇe, ovˇsem jednoduˇsˇs´ı ˇcasovˇe. Situace: odstraˇ nujeme vrchol t (kter´ y nemus´ı reprezentovat odstraˇ novan´ y prvek — viz DELETE v obecn´ ych bin´ arn´ıch vyhled´ avac´ıch stromech) a jeho syna, kter´ y je list. Druh´eho syna t, u, d´ ame na m´ısto smazan´eho t a zaˇcern´ıme ho. T´ım m´ame splnˇen´e podm´ınky 1 a 2. Pokud byl ale t ˇcern´ y, chyb´ı n´ am na cest´ach proch´azej´ıc´ıch nyn´ı vrcholem u jeden ˇcern´ y vrchol. Definice 7.5.4. Strom a jeho vrchol (T, u) nazveme 3-t´emˇeˇr ˇcervenoˇcern´y strom (3tˇcˇcs), jestliˇze plat´ı • 1 Listy jsou ˇcern´e. (nezmˇenˇeno) • 2 Pokud m´ a ˇcerven´ y vrchol otce, je otec ˇcern´ y. (nezmˇenˇeno) • 3’ Vˇsechny cesty z koˇrene do listu neproch´azej´ıc´ı u maj´ı stejn´ y poˇcet ˇcern´ ych vrchol˚ u, necht’ je to k. Vˇsechny cesty z koˇrene do listu proch´azej´ıc´ı u maj´ı stejn´ y poˇcet ˇcern´ ych vrchol˚ u, necht’ je to `. A plat´ı k − 1 ≤ ` ≤ k. Kdyˇz u nen´ı koˇren a ` < k, pak ˇrekneme, ˇze u je porucha. Pozn´ amka 7.5.2. Takov´emu vrcholu v 3tˇcˇcs se nˇekdy ˇr´ık´a 3-porucha. Necht’ vrchol u je porucha. Pak m˚ uˇzeme pˇredpokl´adat, ˇze je obarven ˇcernˇe, jinak bychom ho pˇrebarvili na ˇcerno a t´ım by se porucha odstranila a vznikl ˇcervenoˇcern´ y strom. Situace: m´ ame 3tˇcˇcs (T, u), u je porucha s otcem o, bratrem b a synovci s1, s2, viz obr´azek 7.9.
o u
b s1
s2
Obr´ azek 7.9: Obecn´a situace pˇri DELETE Oprava z´ aleˇz´ı na barvˇe vrcholu b: 1. Bratr je ˇcern´ y. Rozliˇsujeme d´ ale 4 pˇr´ıpady, z nichˇz jeden propaguje poruchu o hladinu v´ yˇs a ostatn´ı skonˇc´ı s ˇcervenoˇcern´ ym stromem. 1. Otec i synovci jsou ˇcern´ı. Pˇrebarv´ıme b na ˇcerveno, viz obr´azek 7.10. Dost´av´ame 3tˇcˇcs (T, o), tedy porucha je o hladinu v´ yˇse. 2. Otec je ˇcerven´ y, synovci ˇcern´ı. Pˇrebarv´ıme otce a bratra podle obr´azku 7.11 a dost´av´ame ˇcervenoˇcern´ y strom.
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
78
o
o
u
b
u
s1
b
s2
s2
s1
ˇ asteˇcn´a oprava DELETE pˇrebarven´ım Obr´ azek 7.10: C´
o
o
u
b
u
s1
b
s2
s1
s2
Obr´ azek 7.11: Oprava DELETE pˇrebarven´ım
o
b
u
b
o s2
A s1 B
C
s2
u
s1 C A
B
Obr´ azek 7.12: Oprava DELETE pˇrebarven´ım a rotac´ı 3. Synovec s1, jehoˇz hodnota leˇz´ı mezi hodnotami otce a bratra, je ˇcern´ y, druh´ y synovec je ˇcerven´ y. Pˇrebarv´ıme a zrotujeme podle obr´azku 7.12, barva otce se nemˇen´ı (tj., vrchol b bude m´ıt barvu, kterou p˚ uvodnˇe mˇel vrchol o). Dost´av´ame ˇcervenoˇcern´ y strom. 4. Synovec s1, jehoˇz hodnota leˇz´ı mezi hodnotami otce a bratra, je ˇcerven´ y, druh´ y synovec m´a libovolnou barvu. Pˇrebarv´ıme a dvojitˇe zrotujeme podle obr´azku 7.13 (tj., vrchol s1 bude m´ıt barvu, kterou p˚ uvodnˇe mˇel vrchol o a barva vrcholu s2 se nezmˇen´ı). Dost´av´ame ˇcervenoˇcern´ y strom. 5. Bratr je ˇcerven´ y. Provedeme rotaci. Dostaneme strom ve tvaru, kter´ y je na 7.14. a aplikujeme pˇredchoz´ı pˇr´ıpad ˇc.1. Pˇrestoˇze to tak na prvn´ı pohled nevypad´a, m´ame vyhr´ano, protoˇze bratr poruchy je ˇcern´ y a otec ˇcerven´ y, tedy pˇr´ıˇst´ı oprava bude pˇr´ıpad 2, 3, nebo 4 a skonˇc´ıme s ˇcervenoˇcern´ ym stromem.
7.5.3
Z´ avˇ ery
Pro bin´arn´ı vyhled´ avac´ı ˇcervenoˇcern´e stromy lze implementovat MEMBER, INSERT a DELETE tak, ˇze vyˇzaduj´ı ˇcas O(log n) a INSERT pouˇz´ıv´a nejv´ yˇse jednu (dvojitou) rotaci a DELETE pouˇz´ıv´a
Id: treesbin.tex,v 1.18 2005/05/09 08:57:59 techie Exp
79
o
s1
u
b A
s1
s2
u
D B
b
o
s2 A
B
C
D
C
Obr´ azek 7.13: Oprava DELETE pˇrebarven´ım a dvojitou rotac´ı
o
b
u
b
o
A s1
s2 B
C
s2
u
s1 C A
B
ˇ asteˇcn´a oprava DELETE pˇrebarven´ım a rotac´ı Obr´ azek 7.14: C´ nejv´ yˇse dvˇe rotace nebo rotaci a dvojitou rotaci. Jsou lepˇs´ı neˇz AVL stromy, kter´e pˇri DELETE spotˇrebuj´ı aˇz log n rotac´ı. Oproti v´ahovˇe vyv´aˇzen´ ym strom˚ um i proti AVL strom˚ um jsou ˇcervenoˇcern´e stromy jen konstantnˇe lepˇs´ı, ale i to je dobr´e. Pˇri pouˇzit´ı bin´ arn´ıch vyhled´avac´ıch strom˚ u ve v´ ypoˇcetn´ı geometrii nese informaci i rozloˇzen´ı prvk˚ u ve stromˇe, a tato informace se mus´ı po proveden´ı rotace nebo dvojit´e rotace aktualizovat. To znamen´ a prohled´ an´ı cel´eho stromu a tedy ˇcas O(n) za kaˇzdou rotaci a dvojitou rotaci nav´ıc. Pro tyto probl´emy jsou ˇcervenoˇcern´e stromy obzvl´aˇstˇe vhodn´e, protoˇze minimalizuj´ı poˇcet pouˇzit´ ych rotac´ı a dvojit´ ych rotac´ı3 . ˇ Pozn´ amka 7.5.3. Cervenoˇ cern´e stromy se pouˇz´ıvaj´ı pˇri implementaci (2, 4)-strom˚ u, se kter´ ymi se sezn´am´ıme v dalˇs´ı kapitole. Vrchol se dvˇema syny je nahrazen jedn´ım ˇcern´ ym vrcholem, vrchol se tˇremi syny je nahrazen ˇcern´ ym vrcholem s jedn´ım ˇcerven´ ym synem a vrchol se ˇctyˇrmi syny je nahrazen ˇcern´ ym vrcholem se dvˇema syny. Pozor! Aktualizaˇcn´ı operace pro (2, 4)-stromy neodpov´ıdaj´ı aktualizaˇcn´ım operac´ım na ˇcervenoˇcern´ ych stromech (i reprezentace prvk˚ u je odliˇsn´a).
3 Cervenoˇ ˇ cern´ e stromy se pouˇ z´ıvaj´ı napˇr´ıklad ve standardn´ı ˇsablonov´ e knihovnˇ e jazyka C++ od SGI, kter´ a je zahrnuta do GCC. M´ ate-li Linux, zkuste se pod´ıvat do /usr/include/g++-2/stl\_tree.h; Co se t´ yˇ ce ”real-world” aplikac´ı ˇ cerveno-ˇ cern´ ych strom˚ u, je moˇ zn´ e zm´ınit packet filter (PF) v OpenBSD, kde se tyto stromy pouˇ z´ıvaj´ı k reprezentaci pravidel pro firewall. Pro firewally je ˇ cas vyhodnocen´ı jednotliv´ ych paket˚ u proti pravidl˚ um kritick´ y. ˇ Zaj´ımav´ e je, ˇ ze p˚ uvodn´ı implementaci PF pouˇ z´ıvala AVL stromy. Cerveno-ˇ cern´ e stromy se uk´ azaly jako v´ yhodnˇ ejˇs´ı. Implementaci ˇ cerveno-ˇ cern´ ych strom˚ u lze v OpenBSD naj´ıt v /usr/include/sys/tree.h v podobˇ e maker jazyka C. Tento soubor obsahuje rovnˇ eˇ z makra pro implementaci Splay strom˚ u. A pokud v´ıte o podobnˇ e dostupn´ ych implementac´ıch jin´ ych datov´ ych struktur z t´ ehle pˇredn´ aˇsky, sem s nimi !
Kapitola 8
(a, b) stromy 8.1
Z´ akladn´ı varianta
Necht’ a, b ∈ N, a ≤ b. Strom je (a, b) strom, kdyˇz plat´ı 1. Kaˇzd´ y vnitˇrn´ı vrchol kromˇe koˇrene m´a alespoˇ n a a nejv´ yˇse b syn˚ u. 2. Koˇren m´ a nejv´ yˇse b syn˚ u. Pokud a ≥ 2, pak m´a alespoˇ n 2 syny, nebo je listem. 3. Vˇsechny cesty z koˇrene do listu jsou stejnˇe dlouh´e. Definice 8.1.1. Jsou-li synov´e kaˇzd´eho vrcholu oˇc´ıslov´ani, m˚ uˇzeme definovat lexikografick´e uspoˇr´ ad´ an´ı vrchol˚ u na stejn´e hladinˇe. u ≤l v, jestliˇze otec u
11
4 8
2 2
17
5 7 4
5
7
9 8
9
14 11
14
18 17
Obr´ azek 8.1: Pˇr´ıklad (a, b) stromu 80
18
21
Cviˇ cen´ı: Co by se stalo, kdybychom definici zjednoduˇ sili a m´ısto podm´ınek 1a2 poˇ zadovali, aby kaˇ zd´ y vrchol mˇ el a aˇ zb syn˚ u?
Id: trees-ab.tex,v 1.8 2004/10/17 15:20:05 techie Exp
8.1.1
81
Reprezentace mnoˇ ziny S (a, b) stromem
Mˇejme S ⊆ U , pˇriˇcemˇz universum je line´arnˇe uspoˇr´adan´e. (a, b) strom T reprezentuje mnoˇzinu S, jestliˇze existuje jednoznaˇcn´e pˇriˇrazen´ı prvk˚ u S list˚ um T , kter´e zachov´av´a uspoˇr´ad´an´ı. Potˇrebujeme nav´ıc podm´ınku 4. a ≥ 2 a b ≥ 2a − 1 Struktura vnitˇrn´ıho vrcholu v: • ρv je poˇcet syn˚ u • Sv [1 .. ρv ] je pole ukazatel˚ u na syny • Hv [1 .. ρv − 1]: Hv [i] je maxim´ aln´ı prvek v podstromu Sv [i]
8.1.2
MEMBER(x) v (a, b) stromu
viz algoritmus 8.1 Algoritmus 8.1 MEMBER pro (a, b) stromy {vyhled´ an´ı x} t := koˇren while t nen´ı list do i := 1 while Ht [i] < x ∧ i < ρt do i := i + 1 end while t := St [i] end while {testov´an´ı x} if t reprezentuje x then x∈S else x∈ /S end if
8.1.3
INSERT(x) do (a, b) stromu
viz algoritmus 8.2
8.1.4
DELETE(x) z (a, b) stromu
viz algoritmus 8.3
8.1.5
Shrnut´ı
Operace ˇstˇepen´ı, pˇresun i spojen´ı vyˇzaduj´ı konstantn´ı ˇcas. Vˇ eta 8.1.1. Operace MEMBER, INSERT a DELETE pro (a, b) stromy vyˇzaduj´ı ˇcas O(log n), kde n je velikost reprezentovan´e mnoˇziny.
Id: trees-ab.tex,v 1.8 2004/10/17 15:20:05 techie Exp
82
Algoritmus 8.2 INSERT pro (a, b) stromy vyhled´an´ı x if t nereprezentuje x then o := otec t vrcholu o pˇridej nov´eho syna t0 reprezentuj´ıc´ıho x zaˇrad’ t0 na spr´ avn´e m´ısto mezi jeho bratry a uprav ρo , So a Ho t := o while ρt > b do ˇ epen´ı — m˚ {Stˇ uˇzeme prov´est d´ıky podm´ınce 4} rozdˇel t na t1 a t2 k t1 dej prvn´ıch b(b + 1)/2c syn˚ ut k t2 dej zbyl´ ych d(b + 1)/2e syn˚ ut o := otec t uprav ρo , So a Ho {pˇri ˇstˇepen´ı koˇrene jeˇstˇe mus´ıme vytvoˇrit nov´ y koˇren} t := o end while end if Algoritmus 8.3 DELETE pro (a, b) stromy vyhled´an´ı x, nav´ıc si zapamatuj vrchol u, v jehoˇz poli Hu je x if t reprezentuje x then o := otec t odstraˇ nt uprav Ho , Hu {...} uprav So a ρo t := o while ρt < a ∧ t nen´ı koˇren do v := bezprostˇredn´ı bratr t if ρv = a then {sm´ıme spojit} {Spojen´ı} o := otec t sluˇc v a t do t uprav ρo , So a Ho t := o else {ρv > a, spojen´ı by mohlo m´ıt v´ıce neˇz b syn˚ u} {Pˇresun} pˇresuˇ n krajn´ıho syna v do t uprav Hotec t end if end while if t je koˇren a m´ a jen jednoho syna then smaˇz t end if end if
S H a S jsme pracovali jako se seznamy, nepotˇrebujeme, aby to byla pole. T´ım se zjednoduˇs´ı implementace.
V´ yhodnost pro vnˇ ejˇ s´ı pamˇ eti?
Id: trees-ab.tex,v 1.8 2004/10/17 15:20:05 techie Exp
83
n t
T1
T2
Obr´ azek 8.2: Idea operace JOIN
8.1.6
Jak volit parametry (a, b)
Pro vnitˇrn´ı pamˇet’ je vhodn´e a = 2 nebo a = 3, b = 2a. Pro vnˇejˇs´ı pamˇet’ je vhodn´e a ≈ 100, b = 2a. Pro minimalizaci pamˇet’ov´ ych n´ arok˚ u je v´ yhodn´e b = 2a − 1, pro minimalizaci ˇcasov´ ych n´arok˚ u je v´ yhodn´e b = 2a.
8.2
Dalˇ s´ı operace
MIN, MAX (XXX) Pro operaci JOIN je vhodn´e spolu se stromem uchov´avat tak´e nejvˇetˇs´ı prvek reprezentovan´e mnoˇziny.
8.2.1
Algoritmus JOIN(T1 , T2 ) pro (a, b) stromy
Operace JOIN provede spojen´ı dvou (a,b)-strom˚ u T1 a T2 do jednoho (a,b)-stromu za pˇredpokladu, ˇze vˇsechny prvky, kter´e reprezentuje strom T1 jsou menˇs´ı neˇz prvky reprezentovan´e stromem T2 . Algoritmus najde vrchol pro stromu T2 , spoj´ı stromy do jednoho (viz obr. 8.2) a provede ˇstˇepˇen´ı. Pˇrepis viz algoritmus 8.4 ˇ Casov´ a sloˇ zitost operace JOIN JOIN vyˇzaduje ˇcas O(rozd´ıl hloubek strom˚ u) ≤ O(log(|S1 | + |S2 |))
8.2.2
Algoritmus SPLIT(x, T ) pro (a, b) strom
Operace SPLIT(x, T ) provede rozdˇelen´ı (a,b)-stromu T na dva (a,b)-stromy T1 a T2 tak, ˇze: • T1 je (a,b)-strom reprezentuj´ıc´ı prvky z S < x • T2 je (a,b)-strom reprezentuj´ıc´ı prvky z S > x kde S je mnoˇzina, reprezentovan´ a (a,b)-stromem T . Na v´ ystupu t´eto operace d´ale dostaneme informaci, zda x ∈ S. Z´akladn´ı myˇslenkou pro implementace t´eto operace je pouˇzit´ı dvou z´asobn´ık˚ u (a,b)-strom˚ u. Proch´az´ıme strom T od koˇrene k list˚ um a na kaˇzd´e u ´rovni vloˇz´ıme do prvn´ıho z´asobn´ıku ty podstromy bratr˚ u aktu´ aln´ıho vrcholu, kter´e obsahuj´ı prvky menˇs´ı neˇz prvek reprezentovan´ y aktu´aln´ım vrcholem. Do druh´eho z´ asobn´ıku vloˇz´ıme podstromy s vˇetˇs´ımi prvky. (viz obr. 8.3) Po projit´ı
proˇ c? pr´ y se k tomu jeˇ stˇ e dostaneme
Id: trees-ab.tex,v 1.8 2004/10/17 15:20:05 techie Exp
84
Algoritmus 8.4 JOIN pro (a, b) stromy Require: T1 reprezentuje S1 , T2 reprezentuje S2 a max S1 < min S2 n := hloubka T1 − hloubka T2 if n ≥ 0 then t := koˇren T1 while n > 0 do t := posledn´ı syn t n := n − 1 end while Spoj t s koˇrenem T2 a vytvoˇr nov´ y vrchol t0 . {zde se vyuˇzije znalost nejvˇetˇs´ıho prvku mnoˇziny S1 } while ρt > b do ˇ epen´ı t Stˇ t := otec t end while else {analogicky: koˇren T2 , prvn´ı syn . . . } end if
stromu provedeme slit´ı tˇechto dvou z´ asobn´ık˚ u do strom˚ u T1 a T2 pomoc´ı operace STACKJOIN. (viz sekce 8.2.3) Pˇrepis operace SPLIT viz algoritmus 8.5 Algoritmus 8.5 SPLIT pro (a, b) stromy Ensure: Vytvoˇr´ı T1 reprezentuj´ıc´ı {s ∈ S : s < x} a T2 reprezentuj´ıc´ı {s ∈ S : s > x} Necht’ Z1 a Z2 jsou pr´ azdn´e z´ asobn´ıky t := koˇren T while t nen´ı list do i := 1 while Ht [i] < x ∧ i < ρt do i := i + 1 end while Vytvoˇr strom T1 , jehoˇz koˇren m´ a syny St [1] . . . St [i − 1] Vytvoˇr strom T2 , jehoˇz koˇren m´ a syny St [i + 1] . . . St [ρt ] if T1 nen´ı jednoprvkov´ y strom then Push(Z1 , T1 ) end if if T2 nen´ı jednoprvkov´ y strom then Push(Z2 , T2 ) end if t := St [i] end while if t reprezentuje prvek r˚ uzn´ y od x then Udˇelej z t (a, b) strom a vloˇz ho do pˇr´ısluˇsn´eho z´asobn´ıku. end if T1 := STACKJOIN(Z1 ) {viz d´ ale} T2 := STACKJOIN(Z2 )
Id: trees-ab.tex,v 1.8 2004/10/17 15:20:05 techie Exp
85
t
T T1 T2 =
(T'1 , T'2 , ..., T'k ) JOIN
Obr´ azek 8.3: Idea operace SPLIT ˇ Casov´ a sloˇ zitost operace SPLIT ˇ rozˇrez´ Cas av´ an´ı stromu je u ´mˇern´ y jeho hloubce. Celkov´ y ˇcas operace SPLIT ovˇsem z´avis´ı jeˇstˇe na sloˇzitosti operace STACKJOIN.
8.2.3
Algoritmus STACKJOIN(Z) pro z´ asobn´ık (a, b) strom˚ u
Operace STACKJOIN provede JOIN vˇsech (a,b)-strom˚ u uloˇzen´ ych na z´asobn´ıku. V´ ysledkem je jedin´ y (a,b)-strom. Pˇrepis viz algoritmus 8.6 Algoritmus 8.6 STACKJOIN pro (a, b) stromy T := Pop(Z) while Z 6= ∅ do T 0 := Pop(Z) T := JOIN(T, T 0 ) end while
ˇ Casov´ a sloˇ zitost operace STACKJOIN Necht’ Z obsahuje (a, b) stromy T1 . . . Tk , pˇriˇcemˇz T1 je vrchol z´asobn´ıku. Plat´ı ∀i : hloubka Ti ≤ hloubka Ti+1 ˇcas STACKJOIN = hloubka T2 − hloubka T1 + 1 + hloubka T3 − hloubka T2 + 1 + ... + hloubka Tk − hloubka Tk−1 + 1 = hloubka Tk − hloubka T1 + poˇcet JOIN˚ u = O(hloubka T ) = O(log |S|) Tedy i operace SPLIT vyˇzaduje ˇcas O(log |S|).
Id: trees-ab.tex,v 1.8 2004/10/17 15:20:05 techie Exp
8.2.4
86
Algoritmus FIND(T, k) pro (a, b) strom
Nalezen´ı k-t´eho nejmenˇs´ıho prvku. Rozˇs´ıˇr´ıme reprezentaci stromu a kaˇzd´emu vnitˇrn´ımu vrcholu v pˇrid´ame: • Kv [1 .. ρv ]: Kv [i] je poˇcet list˚ u v podstromu Sv [i] viz algoritmus 8.7 Algoritmus 8.7 FIND pro (a, b) stromy t := koˇren T while t nen´ı list do i := 1 while Kt [i] < k ∧ i < ρt do k := k − Kt [i] i := i + 1 end while t := St [i] end while if k > 1 then return nil {k > |S|} else return t end if ˇ Casov´ a sloˇzitost je opˇet logaritmick´ a, pˇriˇcemˇz dˇr´ıve uveden´e operace nejsou zpomaleny t´ım, ˇze aktualizuj´ı pole (seznam) K.
8.3
A-sort
Na prvn´ı pohled se zd´ a, ˇze pouˇzit´ı (a, b) strom˚ u ke tˇr´ıdˇen´ı nen´ı v´ yhodn´e. Pamˇet’ov´e n´aroky budou oproti bˇeˇzn´emu tˇr´ıdˇen´ı v poli asi pˇetkr´ at vˇetˇs´ı. Aby se tedy tˇr´ıdˇen´ı (a, b) stromem vyplatilo, muselo by pˇrin´est zv´ yˇsen´ı rychlosti. V t´eto ˇc´ asti pˇredvedeme, ˇze to skuteˇcnˇe je moˇzn´e, jestliˇze vstupn´ı data jsou jiˇz ˇc´asteˇcnˇe setˇr´ıdˇen´ a. Pro u ´ˇcely A-sortu rozˇs´ıˇr´ıme reprezentaci takto: • Listy stromu jsou propojeny do seznamu • Je zn´ ama cesta z nejmenˇs´ıho (nejlevˇejˇs´ıho) listu do koˇrene (uloˇzen´a napˇr. v z´asobn´ıku) Pouˇzijeme (2, 3)-strom. Proˇc, to si zd˚ uvodn´ıme aˇz po odvozen´ı sloˇzitosti A-sortu. Necht’ vstupn´ı posloupnost je a1 , . . . , an . Postupnˇe odzadu vkl´ad´ame jej´ı prvky do stromu modifikovan´ ym INSERTem: k := n while k > 1 do A-INSERT(ak ) k := k − 1 end while Na konci pˇreˇcteme setˇr´ıdˇenou posloupnost pomoc´ı spojov´eho seznamu list˚ u.
Id: trees-ab.tex,v 1.8 2004/10/17 15:20:05 techie Exp
87
T t Obr´ azek 8.4: Idea algoritmu A-INSERT
8.3.1
A-INSERT
A-INSERT (viz algoritmus 8.8) pracuje t´emˇeˇr stejnˇe jako p˚ uvodn´ı INSERT - najde spr´avn´ y list a potom pˇr´ıpadnˇe pˇrid´ a nov´ y prvek. K nalezen´ı spr´avn´eho listu ovˇsem vyuˇz´ıv´a cestu z nejmenˇs´ıho listu. (viz obr. 8.4) Zde uveden´ a verze A-INSERTu odstraˇ nuje duplicitn´ı prvky, operaci lze pochopitelnˇe upravit tak, ˇze nech´ av´ a duplicitn´ı prvky, kter´e z˚ ust´avaj´ı ve stejn´em poˇrad´ı.
8.3.2
Sloˇ zitost A-sortu
P ˇ A-sortu = P ˇcasu vyhled´ ˇ Cas an´ı + ˇcasu pˇrid´an´ı + ˇcas vytvoˇren´ı v´ ystupn´ı posloupnosti. Cas vytvoˇ ystupn´ı posloupnosti = O(n). Pren´ı v´ ˇcasu pˇrid´ an´ı = poˇcet pˇridan´ ych vrchol˚ u · ˇcas pˇrid´an´ı vrcholu + poˇcet ˇstˇepen´ı · ˇcas ˇstˇepen´ı = O(n) · O(1) + poˇcet ˇstˇepen´ı· O(1). Protoˇze se zde neprov´ad´ı operace DELETE, lze kaˇzd´emu ˇstˇepen´ı pˇriˇradit vnitˇrn´ı vrchol, kter´ y byl pˇri tomto ˇstˇepen´ı vytvoˇren (ˇstˇepen´ı rozdˇel´ı vrchol t na dva vrcholy t1 a t2 , budeme pˇredpokl´ adat, ˇze vrchol t1 je pokraˇcov´an´ım vrcholu t a vrchol t2 je vrchol vznikl´ y pˇri ˇstˇepen´ı). Tedy poˇcet ˇstˇepen´ ı je menˇ s ´ ı neˇ z poˇ c et vnitˇ r n´ ıch vrchol˚ u (pˇ r i ˇ s tˇ e pen´ ı koˇ r ene vznik´ a P nav´ıc jeˇstˇe nov´ y koˇren), tedy ˇcasu pˇrid´an´ı = O(n). ˇ A-sortu tedy z´ Cas avis´ı hlavnˇe na celkov´em ˇcase vyhled´an´ı prvk˚ u. Oznaˇcme fi = |{j > i : aj < ai }|, tedy poˇcet prvk˚ u posloupnosti, kter´e v nesetˇr´ıdˇen´e posloupnosti n´asleduj´ı ai , ale v setˇr´ıdˇen´e patˇr´ı ˇ vyhled´an´ı ai je tedy pˇred ai . Pˇri vyhled´ an´ı ai ve stromu vyjadˇ u nalevo od ai . Cas Pruje fi poˇcet list˚ O(log fi ) a celkov´ yP ˇcas vyhled´ an´ı je O( log fi ). Hodnota F = fi , zvan´ a poˇcet inverz´ı, vyjadˇruje uspoˇr´adanost vstupn´ı posloupnosti. Pro spr´avnˇe uspoˇr´ adanou posloupnost je F = 0, pro obr´acenˇe uspoˇr´adanou posloupnost je F = n(n − 1)/2. To jsou tak´e mezn´ı hodnoty, jichˇz m˚ uˇze F nab´ yvat. Z vlastnost´ı logaritmu a srovn´ an´ım geometrick´eho a aritmetick´eho pr˚ umˇeru dost´av´ame qY X Y fi ≤ n log(F/n). log fi = log fi = n log n A-sort tedy vyˇzaduje ˇcas O(n max(1, log((F + 1)/n))). V nejhorˇs´ım pˇr´ıpadˇe to je O(n log n) a Mehlhorn a Tsakalidis uk´ azali, ˇze A-sort je lepˇs´ı neˇz Quicksort v pˇr´ıpadˇe, ˇze F ≤ 0.02n1.57 . Naproti tomu Insertsort, jednoduch´ y algoritmus, kter´ y postupnˇe line´arn´ım prohled´an´ım zatˇrid’uje prvky pole do jeho jiˇz setˇr´ıdˇen´eho poˇc´ ateˇcn´ıho u ´seku, vyˇzaduje ˇcas O(n + F ), coˇz je v nejhorˇs´ım pˇr´ıpadˇe O(n2 ). Zb´ yv´a jeˇstˇe zd˚ uvodnit, proˇc pouˇz´ıt (2, 3)-stromy. V´ıme, ˇze (2, 3)-stromy maj´ı nejmenˇs´ı prostorov´e n´aroky mezi (a, b)-stromy. Na druh´e stranˇe vˇsak (2, 3)-stromy v obecn´em pˇr´epadˇe vyˇzaduj´ı
oˇ setˇ rit log 0 nebo transpozic? standardn´ı term´ın?
Id: trees-ab.tex,v 1.8 2004/10/17 15:20:05 techie Exp
88
Algoritmus 8.8 A-INSERT(x) {Nalezen´ı} t := nejmenˇs´ı list stromu T repeat t := otec t until t je koˇren ∨ x ≤ Ht [1] {nyn´ı jako v p˚ uvodn´ım INSERTu, pouze jsme jinak inicializovali t} while t nen´ı list do i := 1 while Ht [i] < x ∧ i < ρt do i := i + 1 end while t := St [i] end while {Pˇrid´an´ı} if t nereprezentuje x then o := otec t vrcholu o pˇridej nov´eho syna t0 reprezentuj´ıc´ıho x zaˇrad’ t0 na spr´ avn´e m´ısto mezi jeho bratry a uprav ρo , So a Ho t := o while ρt > b do ˇ epen´ı — m˚ {Stˇ uˇzeme prov´est d´ıky podm´ınce 4} rozdˇel t na t1 a t2 k t1 dej prvn´ıch b(b + 1)/2c syn˚ ut k t2 dej zbyl´ ych d(b + 1)/2e syn˚ ut o := otec t uprav ρo , So a Ho {pˇri ˇstˇepen´ı koˇrene jeˇstˇe mus´ıme vytvoˇrit nov´ y koˇren} end while end if
zbyteˇcnˇe mnoho vyvaˇzovac´ıch operac´ı, a proto jsou v´ yraznˇe pomalejˇs´ı neˇz napˇr. (2, 4)-stromy. ˇ epen´ı), ˇze pro Protoˇze vˇsak A-sort nepouˇz´ıv´ a operaci DELETE, uk´azali jsme (viz poˇcet operac´ı Stˇ A-sort to nen´ı pravda. Zde (2, 3)-stromy patˇr´ı mezi nejrychleji pracuj´ıc´ı (a, b)-stromy.
8.4
Paraleln´ı pˇ r´ıstup do (a, b) strom˚ u
Pˇri operac´ıch INSERT a DELETE jsme nejprve sestupovali stromem dol˚ u aˇz k list˚ um, potom jsme se vraceli nahoru a ˇstˇepili nebo spojovali vrcholy. To znemoˇzn ˇuje dovolit paraleln´ı pˇr´ıstup do stromu. Procesu, kter´ y je ve f´ azi vyhled´an´ı, by se mohlo st´at, ˇze mu jin´ y proces zmˇen´ı strom “pod rukama”. St´ avaj´ıc´ı operace INSERT a DELETE tedy poˇzaduj´ı v´ yluˇcn´ y pˇr´ıstup ke stromu. Nyn´ı pˇredvedeme paraleln´ı verzi tˇechto operac´ı, kde se ˇstˇepen´ı nebo spojov´an´ı prov´ad´ı jiˇz pˇri sestupu. Potom jiˇz nen´ı nutn´e se vracet a je tedy moˇzn´e rovnou odemykat ˇc´asti stromu, ke kter´ ym jiˇz dan´ y proces nebude pˇristupovat. Cenou za tento pˇr´ıstup jsou zbyteˇcn´a ˇstˇepen´ı/spojen´ı. Potˇrebujeme omezit b: podm´ınku b ≥ 2a − 1 zpˇr´ısn´ıme na 4’. a ≥ 2 a b ≥ 2a
udˇ elat obr´ azek ilustruj´ıc´ı zbyteˇ cn´ aˇ s/s
Id: trees-ab.tex,v 1.8 2004/10/17 15:20:05 techie Exp
8.4.1
89
Paraleln´ı INSERT(x) do (a, b) stromu
viz algoritmus 8.9 Algoritmus 8.9 paraleln´ı INSERT pro (a, b) stromy o := lock(nadkoˇren) {Nadkoˇren je implementaˇcn´ı pom˚ ucka. Slouˇz´ı k zamknut´ı pˇr´ıstupu k cel´emu stromu a uchov´ av´ a max(S)} t := koˇren {Invariant mezi pr˚ uchody cyklem: o je otec t, o je jedin´ y vrchol zamknut´ y t´ımto procesem.} while t nen´ı list do i := 1 while i < ρt ∧ Ht [i] < x do i := i + 1 end while s := St [i] {preventivn´ı rozˇstˇepen´ı:} if ρ(t) = b then rozdˇel t na t1 a t2 : {viz 4’} k t1 dej prvn´ıch b(b + 1)/2c syn˚ ut k t2 dej zbyl´ ych d(b + 1)/2e syn˚ ut t1 pˇredch´ az´ı t2 uprav ρo , So a Ho {implic.: uprav ρt1 , . . . , Ht2 } {pˇri ˇstˇepen´ı koˇrene jeˇstˇe mus´ıme vytvoˇrit nov´ y koˇren} n := tj , kde s je syn tj else n := t end if lock(n) unlock(o) o := n t := s end while if t nereprezentuje x then vrcholu o pˇridej nov´eho syna t0 reprezentuj´ıc´ıho x zaˇrad’ t0 na spr´ avn´e m´ısto mezi jeho bratry a uprav ρo , So a Ho end if unlock(o)
8.4.2
Paraleln´ı DELETE(x) z (a, b) stromu
viz algoritmus 8.10
8.5
Sloˇ zitost posloupnosti operac´ı na (a, b) stromu
A-sort funguje jednak proto, ˇze v pˇredtˇr´ıdˇen´e posloupnosti rychle najde m´ısto, kam se m´a vkl´adat, jednak proto, ˇze se pˇri sam´ ych INSERTech (a d´ıky spr´ avn´ym a, b?) prov´ad´ı m´alo vyvaˇzovac´ıch
Id: trees-ab.tex,v 1.8 2004/10/17 15:20:05 techie Exp
90
Algoritmus 8.10 paraleln´ı DELETE pro (a, b) stromy o := lock(nadkoˇren) {Nadkoˇren je implementaˇcn´ı pom˚ ucka. Slouˇz´ı k zamknut´ı pˇr´ıstupu k cel´emu stromu a uchov´ av´ a max(S)} t := koˇren h := nil {Jakmile h 6= nil, x ∈ Hh a h bude zamˇcen´ y do konce procesu.} {Invariant mezi pr˚ uchody cyklem: o je otec t, o je kromˇe h jedin´ y vrchol zamknut´ y t´ımto procesem.} while t nen´ı list do i := 1 while i < ρt ∧ Ht [i] < x do i := i + 1 end while if Ht [i] = x then h := t end if s := St [i] {preventivn´ı spojen´ı/pˇresun:} if ρ(t) = a then v := bezprostˇredn´ı bratr t if ρv = a then {sm´ıme spojit} {Spojen´ı} sluˇc v a t do t {viz 4’} uprav ρo , So a Ho t := o else {ρv > a, spojen´ı by mˇelo v´ıce neˇz b syn˚ u} {Pˇresun} pˇresuˇ n krajn´ıho syna v do t uprav Ho , Hv a Ht end if end if lock(t) if o 6= h then unlock(o) end if o := t t := s end while if t reprezentuje x then odstraˇ nt uprav Ho , Hh uprav So a ρo unlock(h) end if unlock(o)
krok˚ u. V t´eto sekci se pod´ıv´ ame na poˇcet vyvaˇzovac´ıch krok˚ u pro posloupnost operac´ı INSERT a DELETE. Necht’ b ≥ 2a.
Id: trees-ab.tex,v 1.8 2004/10/17 15:20:05 techie Exp
91
Vˇ eta 8.5.1. Mˇejme posloupnost n operac´ı INSERT a DELETE aplikovanou na pr´ azdn´y (a, b) strom. Oznaˇcme P poˇcet pˇresun˚ u pˇri prov´ adˇen´ı posloupnosti, SP poˇcet spojen´ı a ST poˇcet ˇstˇepen´ı. D´ ale oznaˇcme Ph , SPh a STh poˇcet pˇresun˚ u. spojen´ı a ˇstˇepen´ı, kter´e nastanou ve v´yˇsce h (listy maj´ı v´yˇsku 0). Necht’ b+1 c = min min 2a − 1, − a, 2 (8.1) b+1 b − max 2a − 1, 2 Pak plat´ı P (2c − 1)ST + cSP Ph + SPh + STh
≤ n
(8.2)
c (n − 2) ≤ n+c+ a+c−1 2nc+2 ≤ (c + 1)h
(8.3) (8.4)
Plat´ı c ≥ 1 (pˇri b = 2a dokonce c = 1). Z toho ST + SP ≤
n n−2 +1+ , c a
(8.5)
tedy line´arnˇe vzhledem k n. Pro paraleln´ı verze INSERT a DELETE plat´ı obdobn´a vˇeta, kdyˇz b ≥ 2a + 2. Pro d˚ ukaz pouˇzijeme bankovn´ı paradigma: datovou strukturu ohodnot´ıme podle toho, jak je “uklizen´a”. Operace, kter´e datovou strukturu “uklid´ı”, zvˇetˇs´ı jej´ı “z˚ ustatek na u ´ˇctˇe”. Ty, kter´e ji “naruˇs´ı”, z˚ ustatek zmenˇs´ı. Potom najdeme vztah mezi z˚ ustatkem a spotˇrebovan´ ym ˇcasem. Tohle pokulh´ av´ a. Myslel jsem si, ˇze z˚ ustatek je nˇeco jako ˇcas v konzervˇe, kter´y si pomal´e operace berou od rychl´ych . . . , ale v tomhle pˇr´ıpadˇe to asi funguje jinak. (a, b) stromy jsou uklizen´e, kdyˇz maj´ı vrcholy poˇcet syn˚ u nˇekde uprostˇred mezi a a b. Tehdy nenastane v brzk´e dobˇe vyvaˇzovac´ı operace. V tomto smyslu definujme: z(v) = min(ρv − a, b − ρv , c) z(koˇren) = min(ρv − 2, b − ρv , c)
v je vnitˇrn´ı vrchol r˚ uzn´ y od koˇrene
(8.6) (8.7)
Pro strom T definujme z(T ) =
X
z(v)
v∈T
X
zh (T ) =
z(v)
v∈T v m´ a v´ yˇ sku h
Plat´ı z(T ) =
X
zh (t)
h
Podobnˇe jako u ˇcervenoˇcern´ ych strom˚ u definujme parci´aln´ı (a, b)-strom: Definice 8.5.1. (T, v) je parci´ aln´ı (a, b)-strom, kdyˇz v je vnitˇrn´ı vrchol T r˚ uzn´ y od koˇrene a kromˇe v jsou splnˇeny podm´ınky pro (a, b)-strom a a − 1 ≤ ρv ≤ b + 1.
vyjasnit pouˇ ziju z jako z˚ ustatek m´ısto b jako balance, protoˇ ze souvislost s vyvaˇ zov´ an´ım stromu je zde sp´ıˇ s matouc´ı
Id: trees-ab.tex,v 1.8 2004/10/17 15:20:05 techie Exp
92
Z definice z˚ ustatku vypl´ yvaj´ı tyto vlastnosti: ρv = a − 1 nebo b + 1 ρv = a nebo b ρv = 2a − 1 b+1 b+1 ρu = ∧ ρv = 2 2
=⇒ z(v) = −1 =⇒ z(v) = 0 =⇒ z(v) = c
(8.8) (8.9) (8.10)
=⇒ z(u) + z(v) ≥ 2c − 1
(8.11)
|ρu − ρv | ≤ 1 =⇒ z(u) ≥ z(v) − 1
8.5.1
(8.12)
Pˇ rid´ an´ı/ubr´ an´ı listu
Mˇejme (a, b)-strom T a pˇrid´ ame nebo ubereme list, jehoˇz otec je v. Pak vznikne parci´aln´ı (a, b)strom (T 0 , v) a plat´ı: z1 (T 0 ) ≥ z1 (T ) − 1 zh (T 0 ) = zh (T ) h > 1 z(T 0 ) ≥ z(T ) − 1
8.5.2
(8.13) (8.14) (8.15)
ˇ epen´ı Stˇ
Mˇejme parci´ aln´ı (a, b)-strom (T, v), kde v je ve v´ yˇsce h. Necht’ T 0 vznikl ˇstˇepen´ım v. Pak (T 0 , otec v je parci´aln´ı (a, b)-strom a plat´ı: zh (T 0 ) ≥ 2c + zh (T ) z 8.8 a 8.11 0 zh+1 (T ) ≥ zh+1 (T ) − 1 zi (T 0 ) = zi (T ) i 6= h, h + 1 z(T 0 ) ≥ z(T ) + 2c − 1
8.5.3
(8.16) (8.17) (8.18) (8.19)
Spojen´ı
Mˇejme parci´ aln´ı (a, b)-strom (T, v), kde ρv = a − 1 a v je ve v´ yˇsce h, y je bezprostˇredn´ı bratr v. Necht’ ρy = a a T 0 vznikl spojen´ım v a y. Pak (T 0 , otec v je parci´aln´ı (a, b)-strom a plat´ı: zh (T 0 ) ≥ c + 1 + zh (T ) z 8.8, 8.9 a 8.10 0 zh+1 (T ) ≥ zh+1 (T ) − 1 zi (T 0 ) = zi (T ) i 6= h, h + 1 z(T 0 ) ≥ z(T ) + c
8.5.4
(8.20) (8.21) (8.22) (8.23)
Pˇ resun
Mˇejme parci´ aln´ı (a, b)-strom (T, v), kde ρv = a − 1 a v je ve v´ yˇsce h, y je bezprostˇredn´ı bratr v. Necht’ ρy > a a T 0 vznikl pˇresunem syna od y k v. Pak T 0 je (a, b)-strom a plat´ı: zh (T 0 ) ≥ zh (T ) z 8.8, 8.9 a 8.12 0 zi (T ) = zi (T ) i 6= h z(T 0 ) ≥ z(T )
(8.24) (8.25) (8.26)
Id: trees-ab.tex,v 1.8 2004/10/17 15:20:05 techie Exp
93
Necht’ po skonˇcen´ı posloupnosti operac´ı m´ame (a, b)-strom Tk . Seˇcteme pˇredchoz´ı v´ ysledky: z(Tk ) ≥ (2c − 1)ST + cSP − n
z1 (Tk ) ≥ 2cST1 + (c + 1)SP1 − n zh (Tk ) ≥ 2cSTh + (c + 1)SPh − STh−1 − SPh−1
(8.27)
h>1
(8.28) (8.29)
Vad´ı n´am, ˇze jsou ve v´ yrazu i spojen´ı a ˇstˇepen´ı z jin´e hladiny. c ≥ 1 =⇒ 2c ≥ c + 1. zh (Tk ) ≥ (c + 1)(STh + SPh ) − STh−1 − SPh−1 zh (Tk ) STh−1 + SPh−1 zh (Tk ) zh−1 (Tk ) STh−2 + SPh−2 + + ≤ + c+1 c+1 c+1 (c + 1)2 (c + 1)2 ! h−1 X zh−i (Tk ) ST0 + SP0 ≤ + j = h − i, rozˇs´ıˇr´ıme (c + 1)h−i i+1 h (c + 1) (c + 1) i=0 h j X z (T )(c + 1) n j k + = h+1 (c + 1) (c + 1)h j=1
STh + SPh ≤
(8.30) (8.31)
(8.32)
Necht’ T je (a, b)-strom s m listy. Chceme shora odhadnout z(T ). ( s pr´avˇe a + j syny kdyˇz j ∈ {0 .. c − 1} mj = poˇcet vnitˇrn´ıch vrchol˚ u r˚ uzn´ ych od koˇrene s alespoˇ n a + j syny kdyˇz j = c (8.33) Kdyˇz v je vnitˇrn´ı vrchol r˚ uzn´ y od koˇrene s pr´avˇe a + j syny, j ∈ {0 .. c − 1}, pak z(v) ≤ j. Kdyˇz v je vnitˇrn´ı vrchol r˚ uzn´ y od koˇrene s alespoˇ n a + c syny, pak z(v) ≤ c. Tedy c X jmj = ∗ (8.34) z(T ) ≤ c + j=0
Spoˇc´ıt´ame hrany v T : nalevo jsou hrany vych´azej´ıc´ı z koˇrene a vnitˇrn´ıch vrchol˚ u, napravo jsou hrany pˇrich´ azej´ıc´ı do vnitˇrn´ıch vrchol˚ u a list˚ u. c c X X mj + m (8.35) 2+ (a + j)mj ≤ poˇcet hran = j=0
Tedy m − 2 ≥
∗ = c+
c X j=0
Pc
j=0 (a
j=0
+ j − 1)mj .
c X j c c (a + j − 1)mj ≤ c + (a + j − 1)mj ≤ c + (m − 2) (8.36) a+j−1 a+c−1 a+c−1 j=0
Spojen´ım tohoto v´ ysledku s 8.27 dostaneme 8.3.
Id: trees-ab.tex,v 1.8 2004/10/17 15:20:05 techie Exp
94
K d˚ ukazu 8.4 vyuˇzijeme 8.32. mh,j
( s pr´avˇe a + j syny kdyˇz j ∈ {0 .. c − 1} = poˇcet vnitˇrn´ıch vrchol˚ u ve v´ yˇsce h s alespoˇ n a + j syny kdyˇz j = c zh (T ) ≤
c X
jmh,j
(8.37)
(8.38)
j=0 c X
mh,j = poˇcet vrchol˚ u ve v´ yˇsce h ≥
j=0
jmh,j ≤
j=0
zi (Tk )(c + 1)i ≤
h X
i=1
oznaˇcme si =
j=0
(8.39)
c X
mi−1,j − a
j=0
c X
mi,j
(8.40)
j=0
c X (c + 1)i jmi,j
i=1
Pc
(a + j)mh+1,j
j=0 c X
h X
c X
(8.41)
j=0
mi,j 8.40
≤
h X
(c + 1)i (si−1 − asi )
(8.42)
i=1
= (c + 1)s0 − (c + 1)h ash +
h X
(c + 1)i si−1 −
i=2
≤ (c + 1)m
protoˇze
STh + SP + h ≤
a ≥ 1 a s0 = m c+1
(8.43) (8.44)
m n 2n + ≤ h h (c + 1) (c + 1) (c + 1)h
Ph ≤ SPh−1 − SPh ≤ SPh−1 + STh−1 ≤ T´ım dost´av´ ame 8.4: STh + SPh + Ph ≤
8.6
a si−1 c+1
2n (c + 1)h−1
2n(c + 2) (c + 1)h
Propojen´ e (a, b) stromy s prstem
Variantou (a, b) strom˚ u jsou (a, b) stromy, kter´e maj´ı propojen´e jednotliv´e hladiny a d´ale obsahuj´ı ukazatel na jeden z list˚ u. Tˇemto strom˚ um se tak´e nˇekdy ˇr´ık´a jenom stromy s prstem (pˇredpokl´ad´a se, ˇze jsou propojen´e) nebo hladinovˇe propojen´e. V anglick´e literatuˇre se vyskytuj´ı pod pojmem finger trees. Struktura vnitˇrn´ıho vrcholu v obsahuje n´asleduj´ıc´ı poloˇzky: • ρ(v) = poˇcet syn˚ uv • Syn[1..ρ(v)] je pole ukazatel˚ u na syny vrcholu v
Id: trees-ab.tex,v 1.8 2004/10/17 15:20:05 techie Exp
95
• Hod[1..ρ(v)] je pole hodnot, plat´ı • Hod(i − 1) < prvky reprezentovan´e v podstromu i-t´eho syna ≤ Hod(i) • otec(v) = ukazatel na otce vrcholu v o Pˇredch˚ udce(v) ukazatele na bezprostˇr. pˇredch˚ udce (n´asledn´ıka) v na hladinˇe vrcholu v N´asledn´ık(v) (v lexikogr. uspoˇr´ad´an´ı) h - hodnota, kter´ a leˇz´ı mezi nejvˇetˇs´ım prvkem podstromu v a nejmenˇs´ım prvek podstromu n´asledn´ıka. Pˇr´ıklad (a,b)-stromu s prstem je vidˇet na obr. 8.5
10, 20
3, 7, 10
2, 3 2
14, 20
3
6
11, 12, 14
8, 10
6, 7 7
8
10
11
12
16, 20 14
16
20
Obr´ azek 8.5: (a,b)-strom s prstem pˇri proveden´ı operace MEMBER(6)
8.6.1
Algoritmus MEMBER
Viz algoritmus 8.11
8.6.2
Algoritmus FINGER
FINGER(x) nastav´ı hodnotu na list, kter´ y reprezentuje prvek nejbliˇzˇs´ı k x. Pouˇzit´ı: kdyˇz lze operace pˇrirozen´ ym zp˚ usobem rozdˇelit do segment˚ u a operace v ? segmentu maj´ı operace bl´ızko sebe • vyhled´ an´ı x vyˇzaduje ˇcas O(1 + log(l)) • nastav´ım prst na nˇejakou vhodnou hodnotu
XXX alg. MEMBER je velmi podivny, prepracovat
Id: trees-ab.tex,v 1.8 2004/10/17 15:20:05 techie Exp
96
Algoritmus 8.11 MEMBER (a,b) stromy s prstem MEMBER(x) 1) Necht’ y je hodnota, na kterou ukazuje Prst. if x < y then pokraˇcuju 2) else 3) end if 2) v ← otec(y) dokud x < h(Pˇredch˚ udce(Pˇredch˚ udce(v)) jdu na otce(Pˇredch˚ udce(v)) v opaˇcn´em pˇr´ıpadˇe kdyˇz x ≤ h(Pˇredch˚ udce(v)) pak v ← Pˇredch˚ udce(v) a pokraˇcuji norm´ aln´ım vyhled´ av´ an´ım 3) symetrick´e ke 2)
Vˇ eta 8.6.1. Necht’ T je propojovan´y (a,b) strom s prstem a necht’ P je posloupnost pˇr´ıkaz˚ u MEMBER, INSERT, DELETE, FINGER, kterou provedeme na T . Pak P vyˇzaduje ˇcas O(log(n) + ˇcas na vyhled´ an´ı) kde n je velikost mnoˇziny reprezentovan´e stromem T . (b ≥ 2a)
8.6.3
Amortizovan´ a sloˇ zitost
Vezmeme posloupnost n operac´ı, spoˇc´ıt´ ame maxim´aln´ı ˇcas, kter´ y vyˇzaduj´ı a ten vydˇel´ıme n. Limita takto z´ıskan´ ych ˇc´ısel pro n → ∞ je amortizovan´a sloˇzitost. Bankovn´ı paradigma o
Pouˇzijeme n´ asleduj´ıc´ı znaˇcen´ı pro pˇrechodu mezi stavy (situacemi): D → D0 • D - vstupn´ı situace • o - operace • D0 - v´ ystupn´ı operace ˇ Amortizovan´ a sloˇzitost operace o je Cas(O) + bal(D0 ) − bal(D), kde bal() je ohodnocen´ı konfigurace. O O D0 →1 D1 →2 D2 → . . . → Dn n X
ˇcas(Oi ) + bal(Dn ) − bal(D0 ) =
X
a(Oi ) ≤
X
i(Oi )
i=1
Obvykle plat´ı, ˇze bal ≥ 0 nebo bal ≤ 0. Kdyˇz bal ≥ 0, pak: X X X ˇcas(Oi ) ≤ a(Oi ) + bal(D0 ) ≤ i(Oi ) + bal(D0 ) Kdyˇz bal ≤ 0, pak X
ˇcas(Oi ) ≤
X
a(Oi ) − bal(Dn ) ≤
X
i(Oi ) − bal(D0 )
Id: trees-ab.tex,v 1.8 2004/10/17 15:20:05 techie Exp
Zaˇc´ın´ame na pr´ azdn´em (a,b) stromˇe → bal = 0. XXX nechybi tady neco ?
97
Kapitola 9
Samoopravuj´ıc´ı se struktury Upravuj´ıc´ı algoritmy pracuj´ı na seznamech, mohou pˇrem´ıstit prvek, kter´ y je argumentem operace. ˇ na vyhled´an´ı - to je pozice hledan´eho prvku. Pokud nen´ı v seznamu, (pokud z˚ ust´ av´ a v seznamu) Cas je to d´elka seznamu + 1. Pokud byl prvek na i-t´em m´ıstˇe a pˇresune se na j-t´e, tak je-li j < i, provedou i − j voln´ ych v´ ymˇen j > i, provedou j − i placen´ ych v´ ymˇen Voln´e v´ ymˇeny se nezapoˇc´ıt´ avaj´ı do sloˇzitosti. Pokud x nen´ı v seznamu pˇri operaci INSERT(x), tak pˇredpokl´ adejme, ˇze je na 1. pozici po ukonˇcen´ı seznamu.
9.1
Seznamy X
XX operace nad obycejne seznamy jsou velmi jednoduche. Vˇsechny mus´ı line´arnˇe proj´ıt cel´ y seznam neˇz provedou danou operaci. MEMBER INSERT DELETE
9.1.1
Algoritmus MFR (Move Front Rule)
Pravidlo MFR: Pˇri operaci MEMBER(x) je x v seznamu nebo pˇri operaci INSERT(x) bude x po skonˇcen´ı operace na 1. m´ıstˇe seznamu. Vˇ eta 9.1.1. Mˇejme posloupnost P operac´ı MEMBER, INSERT a DELETE a mˇejme dva prost´e seznamy S1, S2 mnoˇziny S. Pak pro kaˇzd´y upravuj´ıc´ı algoritmus A plat´ı: Kdyˇz MFR provede P na seznam S1 a A provede P na seznam S2, tak plat´ı: Oznaˇc´ıme: • s = ˇcas na vyhled´ an´ı A • p = poˇcet placen´ych v´ymˇen A • f = poˇcet voln´ych v´ymˇen A ( s + p − f − |P | Pak ˇcas MFR ≤ s + p − f − |P | +
|S| 2
kdyˇz S1 = S2 kdyˇz S1 = 6 S2
98
pˇ redn´ aˇ ska z 18.3.2003
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
99
Definice 9.1.1. Necht’ S1, S2 jsou dva prost´e seznamy mnoˇziny S, pak bal(S1, S2) je poˇcet neuspoˇr´adan´ ych dvojic {x, y}, x 6= y, x, y ∈ S takov´ ych ˇze x je pˇred y v S1 a y je pˇred x v S2. Pozn´ amka 9.1.1. Plat´ı • bal(S1, S2) = 0 ⇔ S1 = S2 (prvky jsou ve stejn´em poˇrad´ı ⇔ seznamy jsou stejn´e) • bal(S1, S2) ≤ |S| (vˇsechny dvojice jsou pˇreh´azen´e) 2 D˚ ukaz vˇety 9.1.1. Pˇres amortizovanou sloˇzitost A. Pˇredpokl´adejme, ˇze A i MFR maj´ı prov´est operaci O. 0 A ... prov´ad´ı na seznam SA , v´ ysledek bude SA 0 MFR .. prov´ ad´ı O na seznam SM F R , v´ ysledek bude SM FR amortizovan´ a sloˇzitost operace O bude: 0 0 = ˇcas MFR pro operaci O + bal(SA , SM F R ) − bal(SA , SM F R )
Balance bal je definov´ ana vzhledem k algoritmu A. Uk´aˇzeme, ˇze amortizovan´ a sloˇzitost O pro MFR ≤ 2 ∗ ˇcas na vyhled´ an´ı A + poˇcet placen´ ych v´ ymˇen A − poˇcet voln´ ych v´ ymˇen A − 1
SA
vyhled´ an´ı
→
00 SA
v´ ymˇ eny
→
0 SA
0 0 SMFR → SM F R → SM F R
kde po operaci DELETE(x) MEMBER(x) INSERT(x)
00 0 SA = SA 00 SA = SA 00 = SA x je v seznamu , SA 0 00 pˇrid´an´ım x za posledn´ı prvek seznamu vznikne z SA x nen´ı v seznamu, SA
Podstatn´e je, ˇze seznamy jsou nad stejnou mnoˇzinou. Amort. sloˇzitost prvn´ı ˇc´ asti ≤ 2 ∗ ˇcas na vyhled´an´ı pro A − 1 Amort. sloˇzitost druh´e ˇc´ asti = poˇcet placen´ ych v´ ymˇen A − poˇcet voln´ ych v´ ymˇen A ˇ MFR je n + 1 , ˇcas na (i) Pˇredpokl´ adejme, ˇze x nen´ı v seznamu a d´elka seznam˚ u je n. Cas 00 0 vyhled´ an´ı pro algoritmus je n + 1 operace MEMBER(x) a DELETE(x) SA = SM F R a tedy amort. sloˇz. MFR = ˇcas operace = n + 1 ≤ 2(n + 1) − 1 n + 1 je ˇcas na vyhled´ an´ı pro A − 1 00 SA vznikne z SA pˇrid´ an´ım x za posl. prvek SA 0 SM rid´ an´ım x na zaˇc. seznamu tedy F R vznikne z SM F R pˇ 00 0 bal(SA , SM F R ) − bal(SA , SM F R ) = n
Amort. sloˇz. operace MFR = n + 1 + n = 2n + 1 = 2(n + 1) − 1 = 2 ∗ ˇcas na vyhled´an´ı A − 1 (ii) x je v seznamu. Pˇredpokl´ adejme, ˇze x je na i-t´em m´ıstˇe v seznamu SA na j-t´em m´ıstˇe v ˇ operace pro MFR je j, ˇcas na vyhled´an´ı pro A je i. Oznaˇcme k poˇcet y seznamu SM F R Cas v seznamu takov´ ych, ˇze y je v SA za x, v SM F R pˇred x. 00 0 Pak i + k ≥ j (i + k ≥ i − k + j) amort. sloˇz. pro MFR = j + bal(SA , SM F R ) − bal(SA , SM F R )
tento dukaz je nejaky podivny
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
100
– DELETE(x) 00 0 bal(SA , SM F R ) − bal(SA , SM F R ) ≤ −k amort. sloˇz. ≤ j − k ≤ 2i − 1 = 2 ∗ ˇcas na vyhled´an´ı A - 1 – MEMBER(x), INSERT(x) 00 0 bal(SA , SM ejak´e dvojice mohly pˇrib´ yt) F R ) − bal(SA , SM F R ) ≤ −k + i − 1 (nˇ amort. sloˇz. operace MFR ≤ j − k + i − 1 ≤ i + i − 1 = 2i − 1 = 2 ∗ˇcas na vyhled´an´ı A − 1 Amort. sloˇ zitost 1. f´aze operace ≤ 2 ∗ ˇcas na vyhled´ an´ı A − 1 2. f´aze operace = poˇcet placen´ ych v´ ymˇen A − poˇcet voln´ ych v´ ymˇen A 00 Pˇri placen´e v´ ymˇenˇe si v seznamu SA vymˇen´ı x m´ısto z za x, tedy dvojice {x, z} pˇribude pˇri 0 0 00 0 poˇc´ıt´an´ı bal(SA , SM F R ) − bal(SA , SM F R ) (v SM F R je x prvn´ı) 00 Pˇri voln´e v´ ymˇenˇe se v seznamu SA vymˇen´ı x m´ısto s prvkem u pˇred x, tedy dvojice {x, u} se vynech´a pˇri poˇc´ıt´ an´ı bal. Amort. sloˇz. MFR ≤ 2∗ˇcas na vyhled´an´ı A+poˇcet placen´ ych v´ ymˇen A− poˇcet voln´ ych v´ ymˇen A − 1 Tedy plat´ı: ˇcas posloupnosti P pro MFR ≤ odhad amort. sloˇzitosti+bal(S1 , S2 ) = 2∗ˇcas na vyhled´an´ı v P algoritmem A+ poˇcet placen´ ych v´ ymˇen A pˇri P − poˇcet voln´ ych v´ ymˇen A pˇri P − |P | + bal(S1 , S2 ) |P | ... za kaˇ zdou operaci je -1
• kdyˇz S1 = S2 pak bal(S1 , S2 ) = 0 a plat´ı a) • kdyˇz S1 6= S2 pak bal(S1 , S2 ) ≤ |S| a plat´ı b) 2 temporary solution by T.Matouˇ sek
Oˇ cek´ avan´ a sloˇ zitost MFR P D˚ ukaz. EM F R = li pi kde li je oˇcek´ avan´a vzd´alenost xi od zaˇc´atku seznamu a pi je pravdˇepodobnost, ˇze se budeme pt´ at na xi . n X li = 1 + E( Yij ) j=1
Jedniˇcka je tam za prvek xi , kde Yij je n´ahodn´a promˇenn´a s alternativn´ım rozdˇelen´ım s pravdˇepodobnost´ı pij a ˇr´ık´ a, jestli je prvek xj pˇred xi . Pr˚ umˇer souˇctu je souˇcet pr˚ umˇer˚ u, takˇze plat´ı: li = 1 +
n X
EYij
j=1
D´ale v´ıme, ˇze EYij = pij , nebo-li li = 1 +
n X j=1
pij
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
101
Zb´ yv´a tedy spoˇc´ıtat pij :
pij = p(”xj bude pˇred xi ”) = p(”posledn´ı MEMBER, kter´ y byl na xi nebo xj ,byl na xj ”) = p(”posledn´ı zavol´ an´ı MEMBER bylo na xj ”|”posledn´ı zavol´an´ı MEMBER bylo na xi nebo xj ”) ∗
= p(”zavol´ an´ı MEMBER na xj ”|”zavol´an´ı MEMBER na xi nebo xj ”) pj = p i + pj (9.1) Kdyˇz to d´ ame dohromady: EM F R =
X
l i pi =
X
[1 +
n X j=1
n X pj ]pi = 1 + p i p j pi + pj pi + p j i,j=1
Pozn´ amka 9.1.2. S t´ımto jsme se setkali pˇri EISCH. Je to d˚ uvod, proˇc je EISCH lepˇs´ı neˇz LISCH, VICH lepˇs´ı neˇz LICH.
9.1.2
Algoritmus TR (Transposition Rule)
Kdyˇz je x pˇri operaci MEMBER(x) a INSERT(x) na i-t´em m´ıstˇe, tak ho d´a pˇr´ısl. operace na (i − 1)-n´ı m´ısto. Pokud pˇri INSERT(x) nen´ı x v seznamu, INSERT um´ıst´ı x na pˇredposledn´ı m´ısto. Pozn´ amka 9.1.3. Lze naj´ıt posloupnost pˇr´ıkaz˚ u P lib. d´elky, ˇze MFR vyˇzaduje ˇcas (|P |) a TR vyˇzaduje ˇcas (|P |2 ). Na druhou stranu oˇcek´avan´ y ˇcas TR ≤ oˇcek´avan´ y ˇcas MFR. Chceme spoˇc´ıtat oˇcek´ avan´ y ˇcas MFR pro posloupnosti P aplikovan´e na seznam S, kde P obsahuje jen operace MEMBER(x) pro x ∈ S. Pˇredpokl´ adejme, ˇze S = 1, 2, ..., n a β1 = pravdˇepodobnost operace MEMBER(x) pro x ∈ S. S = {1, 2, 3} ... stavy Markovova ˇretˇezce jsou vˇsechny permutace S pravdˇepodobnost pˇrechodu je pst. operace pˇrev´ adˇej´ıc´ı jeden stav do druh´eho. Tyto Markovovy ˇretˇezce jsou nerozloˇziteln´e a aperiodick´e a to znamen´a, ˇze existuj´ı asymptot. pravdˇepodobnosti, tj. pro seznam Π je d´ana pravdˇepodobnost κΠ , ˇze po proveden´ı n´ahodn´e posloupnosti P s dan´ ym rozloˇ ım operac´ı skonˇc´ıme u seznamu Π. P zen´ P Pak oˇ c ek´ a van´ y ˇ c as je κ Π Π i βi Π(i), Π(i) je pozice i v seznamu Π. P p1 = Π κΠ Π(i) ... oˇcek´ avan´ a pozice prvku i δ(j, i) = asmyptot. pst., ˇze prvek j je pˇred i, pak plat´ı X δ(j, i) = {κΠ , Π seznam, Π(j) < Π(i)}
* - kaˇ zd´ e vol´ an´ı MEMBER na dan´ y prvek je stejne pravdˇ epodobn´ e
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
M(1) 132 M(1)
102
M(1) M(1)
213
M(2) M(3)
M(2)
M(2)
123 M(1)
M(3)
231
M(3) M(2)
M(2)
312
321
M(3)
M(3)
Obr´ azek 9.1: Pˇrechody mezi stavy pak pi =
X
κΠ Π(i)
Π
=
X
κΠ (1 + |j, Π(j) < Π(i)|
Π
(9.2)
=1+
X
j, Π{κΠ , Π(j) < Π(i)}
=1+
X
δ(j, i)(1)
j
Zkus´ıme δ(j, i) spoˇc´ıtat jin´ ym zp˚ usobem: Idea: jak se m˚ uˇze st´ at, ˇze ve v´ ysledn´em seznamu je j pˇred i ? V posloupnosti P existovala operace MEMBER(x) a po n´ı se uˇz nevyskytovala operace MEMBER(i) ani MEMBER(j). Jak´a je pravdˇepodobnost tohoto jevu ? βj
∞ X
[1 − (βi − βj )]k
=
k=0
βj
1 1 − (1 − (βi + βj )
=
βj βj + βi
(1)
=
1 +
X j,i j6=i
βj βj + βi
(9.3)
Oˇcek´avan´ y ˇcas operace je X i
X βi βj βi pi = βi + βj j,i j6=i
Pˇredpokl´ adejme, ˇze β1 ≥ β2 ≥ ... ≥ βn pak nejrychlejˇs´ı algoritmus na seznam x1 − x2 − ... − xn je klasick´ y algoritmus bez pˇrem´ıst’ov´an´ı prvk˚ u. Klasick´ y algoritmus je takov´ y algoritmus, kter´ y pˇredem v´ı, jak´e jsou pravdˇepodobnosti pˇr´ıstupu k jednotliv´ ym prvk˚ um a m´ a pˇredem seznam srovnan´ y sestupnˇe podle tˇechto pravdˇepodobnost´ı.
jake operace ? XXX
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
103
Oˇcek´avan´ y ˇcas tohoto algoritmu je n X
iβi = 1 +
i=1
X
2
i,j=1
≤1+
X
βj βi βi + βj
2βi = 1 +
i,j j
=1+2· n X
2(i − 1)βi
i=1
X
iβi − 2
i
=2
n X
X
(9.4) βi
i
iβi − 1
i=1
Plat´ı
9.2
βj ≤1 βj + βi
Splay stromy
Splay strom (splay tree, rozvinut´ y strom) patˇr´ı do kategorie adaptabiln´ıch datov´ ych struktur urˇcen´ ych k vyhled´ av´ an´ı. M´ a z´ akladn´ı vlastnosti bin´arn´ıch vyhled´avac´ıch strom˚ u - obsahuje ohodnocen´e prvky. Kaˇzd´emu reprezentovan´emu prvku s ∈ S, kde S ⊆ U , (U je universum) je pˇriˇrazena v´aha. V pr˚ ubˇehu operac´ı nad touto strukturou se vˇsak mˇen´ı jej´ı uspoˇr´ad´an´ı ve prospˇech celkov´eho sn´ıˇzen´ı ˇcasov´e sloˇzitosti.
9.2.1
Operace SPLAY
Z´akladn´ı operac´ı je pro pr´ aci s tˇemito stromy je SPLAY(x) - rozˇs´ıˇren´ı, kter´a zjist´ı, zda x je reprezentov´an v dan´e mnoˇzinˇe. Pokud x leˇz´ı v mnoˇzinˇe, algoritmus ho pˇrem´ıst´ı do koˇrene. Kdyˇz x neleˇz´ı v mnoˇzinˇe, pak algoritmus pˇrem´ıst´ı do koˇrene bud’ nejmenˇs´ı prvek vˇetˇs´ı neˇz x nebo nejvˇetˇs´ı prvek menˇs´ı neˇz x (kter´ y leˇz´ı v reprez. mnoˇzinˇe) Tento mechanismus se zaˇc´ın´ a od stanoven´eho uzlu, a postupn´ ymi rotacemi zp˚ usobuje, ˇze stanoven´ y uzel se stane koˇrenem stromu, pˇri zachov´an´ı vyhled´avac´ıch relac´ı. Celkov´ ym v´ ysledkem je skuteˇcnost, ˇze ˇcasto pouˇz´ıvan´e poloˇzky se hromad´ı v bl´ızkosti koˇrene. Na rozd´ıl od BVS, jehoˇz nejhorˇs´ı pˇr´ıpad pro degenerovan´ y (line´arn´ı) strom m´a sloˇzitost O(N ) a je sloˇzitost splay stromu pro ”k” r˚ uzn´ ych po sobˇe jdouc´ıch operac´ı O(k ∗ log(N )). Tato sloˇzitost nen´ı stanovena tradiˇcn´ım pˇr´ıstupem ”nejhorˇs´ı pˇr´ıpad”, kter´ y hled´a nejnev´ yhodnˇejˇs´ı situaci izolovan´e operace, ale metodou ”amortizovan´e anal´ yzy” (amortized analysis), kter´a hodnot´ı celou sekvenci r˚ uzn´ ych operac´ı. Nˇekter´e z nich jsou delˇs´ı, nˇekter´e kratˇs´ı neˇz log(N ), ale v pr˚ umˇeru vych´az´ı sloˇzitost O(ln(N )). Splay stromy pˇredstavuj´ı jeden z pˇr´ıklad˚ u adaptabiln´ıch datov´ ych struktur, jejichˇz vnitˇrn´ı uspoˇr´ad´an´ı se mˇen´ı vlivem jako vedlejˇs´ı jev operac´ı nad tˇemoto strukturami. Maj´ı dobrou tendenci vyvaˇzovat stromovou strukturu a svou vlastnost´ı pˇribliˇzovat ˇcasto vyhled´avan´e kl´ıˇce koˇreni se podobaj´ı adaptibiln´ı line´ arn´ı struktuˇre pro sekvenˇcn´ı vyhled´av´an´ı, v n´ıˇz se kaˇzd´ y vyhledan´ y uzel vymˇen´ı se sv´ ym lev´ ym pˇredch˚ udcem. I ve stromov´e podobˇe si algoritmus zachov´av´a jednoduchost a pr˚ uhlednost.
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
9.2.2
104
Podporovan´ e operace
MEMBER(x,T ), INSERT(x,T ), DELETE(x,T ), JOIN2(T1 ,T2 ), JOIN3(x, T1 , T2 ) (nebo asi taky JOIN3(T1 , x, T2 )), SPLIT(x), CHANGEWEIGHT(x, 4). • JOIN2(T1 ,T2 ) Pˇredpokl´ ad´ a, ˇze ∀ prvky reprezentovan´e T1 < ∀ prvky reprezentovan´e T2 , tj. maxT1 < minT2 . V´ ysledn´ y strom reprezentuje T1 ∪ T2 . • JOIN3(T1 , x, T2 ) Pˇredpokl´ ad´ a, ˇze ∀ prvky reprezentovan´e T1 < x < ∀ prvky reprezentovan´e T2 , tj. maxT1 < x < minT2 . V´ ysledn´ y strom reprezentuje T1 ∪ T2 ∪ x. • SPLIT(x,T ) V´ ysledek: strom T1 : ∀ prvky ∈ T1 < x strom T2 : ∀ prvky ∈ T2 > x + informace, zda x leˇzel v reprezentovan´e mnoˇzinˇe • CHANGEWEIGHT(x, 4) Zjist´ı, zda x leˇz´ı ve stromˇe a pokud ano, pak k jeho v´aze pˇriˇcte 4.
9.2.3
Algoritmus MEMBER
Mechanismus vyhled´ an´ı (splay search), pracuje stejnˇe jako u BVS, ale po vyhled´an´ı se aplikuje na vyhledan´ y uzel mechanismus Splay, jehoˇz v´ ysledkem je pˇresunut´ı uzlu na m´ısto koˇrene. Viz algoritmus 9.1 Algoritmus 9.1 MEMBER pro Splay stromy SPLAY(x, S) if x je reprezentov´ an v koˇreni then ”x je v S” else ”x nen´ı v S” end if
9.2.4
Algoritmus JOIN2
Viz algoritmus 9.2 Algoritmus 9.2 JOIN2(T1 ,T2 ) SPLAY(∞, T1 ) // XXX (nejvˇetˇs´ı ?) nejmenˇs´ı prvek koˇren T2 bude prav´ y syn koˇrene T1 Operac´ı SPLAY se z T1 stane strom, kde prav´ y syn koˇrene bude list. M´ısto toho listu navˇes´ıme strom T2 . Pak budou v lev´em podstromu koˇrene tohoto nov´eho stromu vˇsechny prvky menˇs´ı neˇz hodnota v koˇrenu a v prav´em vˇsechny vˇetˇs´ı, coˇz chceme.
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
105
S2
S1
Obr´ azek 9.2: JOIN2 pro splay stromy
9.2.5
Algoritmus JOIN3
Viz algoritmus 9.3 Algoritmus 9.3 JOIN3(T1 , x, T2 ) vytvoˇr´ıme vrchol t reprezentuj´ıc´ı x koˇren T1 je lev´ y syn t koˇren T2 je prav´ y syn t Vytvoˇr´ıme nov´ y vrchol reprezentuj´ıc´ı x a jeho synov´e budou T1 – lev´ y, T2 – prav´ y.
x
S1
S2
Obr´ azek 9.3: JOIN3 pro splay stromy
9.2.6
Algoritmus SPLIT
Viz algoritmus 9.4
9.2.7
Algoritmus DELETE
Mechanismus ruˇsen´ı uzlu (splay delete) je ponˇekud sloˇzitˇejˇs´ı. Uzel, kter´ y se m´a zruˇsit, se mechanismem splay pˇresune na pozici koˇrene. Zruˇsen´ım koˇrene z´ısk´ame 2 podstromy. Mechanismus splay se d´ale aplikuje na bezprostˇredn´ıho pˇredch˚ udce a nen´ı-li tak n´asledn´ıka zruˇsen´eho uzlu (ve smyslu relace uspoˇr´ ad´ an´ı - v pr˚ uchodu inorder). T´ım se tento uzel dostane do pozice koˇrene lev´eho podstromu. Podle pravidel vyhled´ avac´ıho stromu mus´ı b´ yt vˇsechny uzly lev´eho podstromu menˇs´ı neˇz
zde chybi obrazek, ale celkem nen´ı pro pochopen´ı potˇ reba :)
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
106
Algoritmus 9.4 SPLIT(x,T ) SPLAY(x) y = prvek reprezentovan´ y koˇrenem T1 = podstrom lev´eho syna koˇrene T2 = podstrom prav´eho syna koˇrene if y = x then v´ ystup T1 , T2 x∈T else if y < x then v´ ystup T \ T2 , T2 else v´ ystup T1 , T \ T1 end if x 6∈ T
jeho koˇren a vˇsechny uzly prav´eho podstromu vˇetˇs´ı. Proto mus´ı m´ıt lev´ y podstrom koˇren vpravo voln´ y a na toto m´ısto se pˇripoj´ı prav´ y podstrom. Tento postup m´a symetrickou - levou versi. Operace ”Splay Delete”, ruˇs´ıc´ı uzel D XXX je uvedena na obr.2.2. XXX Viz algoritmus 9.5 Algoritmus 9.5 DELETE(x) SPLAY(x) if koˇren reprezentuje x then T1 je podstrom lev´eho syna koˇrene T T2 je podstrom prav´eho syna koˇrene T T ← JOIN2(T1 , T2 ) end if jin´ y z´apis: T1 , T2 ← SP LIT (x, T ) T ← JOIN 2(T1 , x, T2 )
9.2.8
Algoritmus INSERT
Mechanismus vkl´ ad´ an´ı (splay insert) vloˇz´ı uzel jako list stejn´ ym zp˚ usobem jako BVS, ale potom se aplikuje na vloˇzen´ y uzel mechanismus ”splay”, kter´ y opˇet posune vloˇzen´ y uzel na pozici koˇrene. Operace ”Splay insert” uzlu s kl´ıˇcem C XXX je uvedena na obr. 9.4. Viz algoritmus 9.6 jin´ y z´apis: T1 , T2 ← SP LIT (x, T ) T ← JOIN 3(T1 , x, T2 )
9.2.9
Algoritmus CHANGEWEIGHT
Viz algoritmus 9.7 Pˇredpokl´ adejme, ˇze w(x) je v´ aha prvku a je to kladn´e cel´e ˇc´ıslo. tw(x) - tot´ aln´ı v´ aha x, je to souˇcet vah vˇsech prvk˚ u v podstromˇe urˇcen´em x.
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
107
x y y=x
S1
S2
y<x
S2
S1
y> x
x y S1
S2
Obr´ azek 9.4: INSERT(x) pro splay stromy Algoritmus 9.6 INSERT(x) SPLAY(x) if koˇren nereprezentuje x then if koˇren stromu reprez. prvek < x then T2 je podstrom prav´eho syna koˇrene T1 = T - T2 else T1 je podstrom lev´eho syna koˇrene T2 = T - T1 end if JOIN3(T1 , x, T2 ) end if Algoritmus 9.7 CHANGEWEIGHT(x, 4) SPLAY(x) if x je reprezentov´ an v koˇreni then k v´aze x pˇriˇcti 4 end if
Pˇ r´ıklad 9.2.1. tw(a) = w(a) + w(b) + w(c) r(x) je rank(x) r(x) = blog tw(x)c
chyb´ı obr´ azek, tady je to nejake zmatene
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
108
P bal(konf igurace) = {r(x) : x ∈ konf igurace} Pro strom T je tw(x) = tw(koˇren T ) r(T ) = r(koˇren T ) Lemma 9.2.1. Necht’ T je bin´ arn´ı vyhled´ avac´ı strom, t je vnitˇrn´ı vrchol a u,v jsou synov´e t. Pak r(t) > min{r(u), r(v)}(r(list) = −∞). D˚ ukaz. Pˇredpokl´ adejme, ˇze tw(u) ≤ tw(v) r(t) = blog tw(t)c ≥ blog 2tw(u)c = 1 + blog tw(u)c = 1 + r(u)
9.2.10
Algoritmus SPLAY
Vol´an´ı algoritmu SPLAY se vˇetˇsinou zapisuje jako SPLAY(x), kde explitictnˇe neuv´ad´ıme strom, na kter´em je operace prov´ adˇena - to vˇetˇsinou vyplyne z kontextu. Tam, kde je nutn´e uv´est, na kter´em stromˇe se operace SPLAY prov´ad´ı (napˇr. v implementaci operace JOIN2, p´ıˇseme vol´an´ı jako SPLAY(x,T ). Viz algoritmus 9.8 Algoritmus 9.8 SPLAY(x) SPLAY(x) t ← koˇren while t nen´ı list a t nereprezentuje x do if x < t then t ← lev´ y syn t else t ← prav´ y syn t end if end while if t je list then t ← otec(t) end if while t nen´ı koˇren do if otec(t) je koˇren then rotace(t, otec(t)) else if otec(t) i t jsou oba lev´ı (prav´ı) synov´e then rotace(otec(t), dˇed(t)) rotace(t, otec(t)) else dvojit´ a rotace(t, otec(t), dˇed(t)) end if end if end while V algoritmu SPLAY (algoritmus 9.8) se pouˇz´ıv´a jednoduch´e (obr. 9.5) a dvojit´e (obr. 9.6) rotace. Vrchol t se po skonˇcen´ı operace SPLAY(x) dostane do koˇrene. Toho dos´ahneme tak, ˇze v prvn´ım cyklu najdeme vrchol t reprezentuj´ıc´ı prvek x, v druh´em cyklu pˇresouv´ame vrchol t do koˇrene.
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
109
ded(t) otec(t) t
t
otec(t) D
otec(t)
ded(t)
t
C A
A
B
A
B
C
D
ded(t) B C
D
Obr´ azek 9.5: Dvakr´at jednoduch´a rotace pro SPLAY(x)
ded(t)
t
otec(t) t
otec(t)
A B
ded(t)
D
C
A
B
C
D
Obr´ azek 9.6: Dvojrotace pro SPLAY(x)
9.2.11
Amortizovan´ a sloˇ zitost SPLAY
Budeme pˇredpokl´ adat, ˇze v(x) ≥ 1 pro kaˇzd´e x. Tot´aln´ı v´aha x = w(x), coˇz je souˇcet vah vˇsech prvk˚ u v podstromu vrcholu reprezentuj´ıc´ıho x. Znaˇc´ıme r(x) = blog2 w(x)c = rank vrcholu x Pro strom T : w(T ) = w(koˇren(T ))r(T ) = r(koˇren(T )) bal(konfigurace) = souˇcet rank˚ u vˇsech vrchol˚ u v mnoˇzin´ach tvoˇr´ıc´ıch konfigurace ) z T reprezenN´aˇs c´ıl : Budeme cht´ıt uk´ azat, ˇze amortizovan´a sloˇzitost operac´ı je O(log w(T v(x) ), kdyˇ tuje S. ˇ operace SPLAY = poˇcet bˇeh˚ Cas u druh´eho cyklu, kter´ y vrchol t transportuje do koˇrene. Lemma 9.2.2. Pomocn´e lemma: Mˇejme vrchol w ve stromˇe T se syny y1 a y2 a pˇredpokl´ adejme, ˇze y1 , y2 nejsou listy. Kdyˇz w reprezentuje a, yr reprezentuje bi pro i = 1, 2, pak rank(a) > min{r(b1 ), r(b2 )} D˚ ukaz. Situaci lze vidˇet na obr´ azku 9.7.
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
110
a w
b1 y1
b2 y2
Obr´ azek 9.7: Pro d˚ ukaz pomocn´eho lemmatu pro splay stromy Zˇrejmˇe r(a) ≥ r(b1 ) a r(a) ≥ r(b2 ), tedy r(b1 ) 6= r(b2 ) ⇒ r(a) > min{r(b1 ), r(b2 )} r(a) = blog2 w(a)c ≥ b(w(b1 ) + w(b2 ))c ≥ blog2 (2 − min{w(b1 ), w(b2 )}) = 1 + log2 min{w(b1 ), w(b2 )} = 1 + min{w(b1 ), w(b2 )}
(9.5)
Vˇ eta 9.2.1. Amortizovan´ a sloˇzitost operace SPLAY(x,T ) ≤ 3(r(T ) − r(t)) + 1, kde t je vrchol, kter´y transportujeme do koˇrene. T je strom reprezentuj´ıc´ı S. (kdyˇz x je prvek reprez. mnoˇziny, pak t reprezentuje x, jinak je to bud’ nejvˇetˇs´ı nebo nejmenˇs´ı prvek menˇs´ı (vˇetˇs´ı) neˇz x) D˚ ukaz. Oznaˇcme T0 p˚ uvodn´ı strom, Ti strom po i-t´em bˇehu druh´eho cyklu v SPLAY a pˇredpokl´adejme, ˇze druh´ y cyklus bˇeˇz´ı k-kr´ at. (tj. Tk je v´ ysledn´ y strom) Amortizovan´ a sloˇzitost (SPLAY(x,T )) = ˇcas operace + bal(v´ ysledn´a konfigurace) − bal(p˚ uvodn´ı konfigurace) = k + bal(Tk ) − bal(T0 ) X = k(1 + bal(Ti ) + bal(Ti−1 )
”ˇ cas operace” = k
(9.6)
i=1
Oznaˇcme ri rank ve stromˇe Ti , necht’ ui je otec t ve stromˇe Ti a kdyˇz ui nen´ı koˇren Ti , pak vi je otec ui v Ti . • a) ui je koˇren: chci odhadnout 1 + bal(Ti ) − bal(Ti−1 ) : 1 + bal(Ti ) − bal(Ti−1 ) X X =1+ ri (z) + ri−1 (z) z reprezentov´ an v Ti
z
= 1 + ri (ui−1 ) + ri (t) − ri−1 − ri−1 (t) = 1 + ri (ui−1 ) − ri−1 (t) ≤ 1 + 3(ri−1 (ui−1 ) − ri−1 (t)) Plat´ı ri (t) = ri−1 (ui−1 ), protoˇze stromy A,B,C na obr. 9.8 jsou stejn´e.
(9.7)
balance = P rank v Tk
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
111
u i-1
t u i-1
t A
C A
B
B
C
Obr´ azek 9.8: Pro d˚ ukaz amort. sloˇzitosti operace SPLAY Plat´ı ri (ui−1 ) ≤ ri−1 (ui−1 ) ri−1 (ui−1 ) ≥ ri−1 (t) • b) ui−1 nen´ı koˇren: 1. ui−1 je jin´ y syn v Ti−1 neˇz t 2. ui−1 je stejn´ y syn v Ti−1 jako t • ad b1) : 1 + bal(Ti ) − bal(Ti−1 =
X z
ri (z) −
X
ri−1 (z)
z
= 1 + ri (t) − ri (ui−1 ) + ri (vi−1 ) − ri−1 (t) − ri (ui−1 ) − ri−1 (vi−1 ) = 1 + ri (ui−1 ) + ri (vi−1 ) − ri−1 (t) − ri−1 (ui−1 ) ≤ 2(ri−1 (vi−1 ) − ri−1 (t)) ≤ 3(ri−1 (vi−1 ) − ri−1 (t))
(9.8)
Prvn´ı nerovnost v odvozen´ı plat´ı, protoˇze 1 + ri (ui−1 ) + ri (vi−1 ) = 2ri−1 (t) = 2ri−1 (vi−1 ). Amortizovan´ a sloˇzitost bˇehem cyklu: ≤ 3(ri (vi−1 ) − ri−1 (t)) • ad b2) : 1 + bal(Ti ) − bal(Ti−1 ) = ... = 1 + ri (ui−1 ) + ri (vi−1 ) −i−1 (t) − ri−1 (ui−1 ) ≤ – α Pˇredpoklad: ri−1 (t) < ri (vi−1 ) Pak plat´ı: ≤ 1 + 2(ri−1 (vi−1 ) − ri−1 (t)) ≤ 3(ri (vi−1 ) − ri−1 (t)) – β Pˇredpoklad: ri−1 (t) = ri (vi−1 ), ri (t) > ri (vi−1 ) ... = 1 + ri (ui−1 ) + ri (vi−1 ) − ri−1 (t) − ri−1 (ui−1 ) ≤ 2(2(ri−1 (vi−1 ) − ri−1 (t)) ≤ 3(ri (vi−1 ) − ri−1 (t))
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
112
– γ Pˇredpoklad: ri (t) = ri (vi−1 ) − ri−1 (vi−1 ) = ri−1 (t) V´ım: ri−1 (t) = r0 (t) = ri−1 (vi−1 ) = r0 (ui−1 ) = ri (t) = ri (vi−1 ) = r0 (vi−1 ) spor s lemmatem 9.2.2. ⇒ pˇr´ıpad γ nem˚ uˇze nastat Z´avˇer pro b) : Amortizovan´ a sloˇzitost bˇehem cyklu ≤ 3(ri (vi−1 ) − ri−1 (t)) Vˇzdy plat´ı ri (vi−1 ) = ri (t) X
k(1 + bal(Ti ) − bal(Ti−1 ))
i=1
≤
X
k3(ri (vi−1 ) − ri−1 (t))
(9.9)
i=1
= 1 + 3(rk−1 (vk−1 ) − r0 (t)) = 1 + 3(ro (T ) − r0 (t))
9.2.12
Amortizovan´ a sloˇ zitost ostatn´ıch operac´ı
Definice 9.2.1. Amortizovan´ a sloˇzitost operace SP LAY (x, T ) ≤ 1+3(r(T )−r(t)), kde t je prvek, kter´ y se pˇrem´ıst´ı do koˇrene. Oznaˇcme t− prvek ve stromˇe T, kter´ y reprezentuje nejvˇetˇs´ı prvek ≤ x. Oznaˇcme t+ prvek ve stromˇe T, kter´ y reprezentuje nejmenˇs´ı prvek ≥ x. Kdyˇz x je reprezentov´ ano T , pak t− − t+ je prvek reprezentuj´ıc´ı x. Jednotliv´e operace maj´ı n´ asleduj´ıc´ı amortizovan´e sloˇzitosti: • SP LAY (x, T ) = O(log
w(T ) min{w(t− ),w(t+ )} )
• M EM BER(x, T ) = O(log • SP LIT (x, T ) = O(log
w(T ) min{w(t− ),w(t+ )} )
w(T ) min{w(t− ),w(t+ )} )
• CHAN GEW EIGHT (x, 4) = O(log • JOIN 3(T1 , x, T2 ) = O(log
w(T )−max{4,0} min{w(t− ),w(t+ )} )
w(T1 )+w(T2 )+v(x) ) v(x)
Oznaˇcme t∞ prvek v T1 , kter´ y reprezentuje nejvˇetˇs´ı prvek z T1 . Pak amortizovan´e sloˇzitosti pro zb´ yvaj´ıc´ı operace jsou n´ asledujic´ı: • JOIN 2(T1 , T2 ) = O(log
w(T1 )+w(T2 ) ) w(t∞ )
• DELET E(x, T ) = O(log
w(T ) min{w(t− ),w(t+ ),w(t1 } )
Prvek t1 je prvek T1 , kter´ y reprezentuje v T nejvˇetˇs´ı prvek ≤ x.
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
• IN SERT (x, T ) = O(log
113
w(T )+v(x) min{w(t− ),w(t+ )} )
Pˇ r´ıklad 9.2.2. Mˇejme mnoˇzinu X = x1 , ..., xn a pravdˇepodobnosti pro v´ yskyt operace MEMBER(x). Necht’ U je optim´ aln´ı bin´ arn´ı vyhled´avac´ı strom. Necht’ T je bin´arn´ı vyhled´avac´ı strom reprezentuj´ıc´ı X. P je posloupnost operac´ı MEMBER(x) vyhovuj´ıc´ı dan´ ym pravdˇepodobnostem. Chceme aplikovat P na strom T , kde pro implementaci pouˇzijeme strategii SPLAY strom˚ u. Srovn´ame ˇcas, kter´ y tato strategie vyˇzaduje s ˇcasem obvykl´e implementace MEMBER pˇri aplikaci P na U . Definujeme v(x) = 3d−d(x) , kde d je hloubka stromu U a d(x) je hloubka prvku v U reprezentuj´ıc´ıho prvek x. Spoˇc´ıt´ame tot´ aln´ı v´ ahu prvku x: w(x) =
X
d − d(x)2i 3d−d(x)−i ≤ 3d−d(x)
i=0
2 d − d(x)( )i ≤ 3d−d(x)+1 3 i=0
X
Pak plat´ı: r(x) ≤ d − d(x) + 1 r(T ) ≤ d + 1, (prvek v koˇreni m´ a hloubku 0) Amortizovan´ a sloˇzitost operace MEMBER(x) ≤ O(d(x)) = O(r(T ) − r(x)) = O(d + 1 − d + d(x) − 1) = O(d(x)) ˇ posloupnosti P pouˇzit´e na strom T a implementovan´e strategi´ı SPLAY Cas X =( amortizovan´ a sloˇzitost operac´ı v P) + bal(T ) = O(ˇcas P pro strom U + bal(T )) operace v P
bal(T ) je balance stromu T . bal(T ) =
X x∈X
r(x) =
X
d + 1 = O(x2 )
x∈X
⇒ O(ˇcas P pro strom U) + bal(T ) = O(ˇcas P pro U + x2 ) Z´avˇer: pro dlouh´e posloupnosti snad t´emˇeˇr stejn´e jako opt. BVS.
tady bylo ve vzorci nˇ eco jako |x2 | (?)
Kapitola 10
Haldy Definice 10.0.2. Haldy jsou stromov´e struktury, kter´e splˇ nuj´ı • lok´aln´ı podm´ınku na uspoˇr´ ad´ an´ı - prvek reprezentuj´ıc´ı otce je menˇs´ı neˇz prvek reprezentovan´ y synem apod. • struktur´ aln´ı podm´ınku na stromy, ze kter´ ych jsou vytvoˇren´e Pozn´ amka 10.0.1. Podle tˇechto podm´ınek se haldy rozdˇeluj´ı na Fibonacciho, Leftist, d-regul´arn´ı apod. (mohou se liˇsit jak lok´ aln´ı, tak struktur´aln´ı podm´ınkou)
10.1
d-regul´ arn´ı haldy
Definice 10.1.1. d-regul´ arn´ı halda, d cel´e ˇc´ıslo d ≥ 2 Je to strom T takov´ y, ˇze existuje jednoznaˇcn´a korespondence mezi vrcholy strom˚ u a prvky reprezentovan´e mnoˇziny a plat´ı: 1. strom T splˇ nuje struktur´ aln´ı podm´ınky: • kaˇzd´ y vrchol s vyj´ımkou nejv´ yˇse jednoho je bud’ list nebo m´a d syn˚ u • kaˇzd´ y vrchol m´ a nejv´ yˇse d syn˚ u • existuje oˇc´ıslov´ an´ı syn˚ u kaˇzd´eho vrcholu tak, ˇze po oˇc´ıslov´an´ı pr˚ uchodem ˇs´ıˇrky plat´ı: kdyˇz vrchol nen´ı list, pak kaˇzd´ y vrchol s menˇs´ım ˇc´ıslem m´a d syn˚ u. 2. podm´ınku na lok´ aln´ı uspoˇr´ ad´ an´ı: kdyˇz x je prvek pˇriˇrazen´ y vrcholu t, pak otci(t) je pˇriˇrazen prvek ≤ x pak po oˇc´ıslov´an´ı pr˚ uchodem do ˇs´ıˇrky plat´ı: kdyˇz vrchol m´ a ˇc´ıslo i, jeho synov´e maj´ı ˇc´ısla d(i − 1) + 2, d(i − 1) + 3, ..., di + 1 a otec m´a ˇc´ıslo d i−1 d e. Pˇ r´ıklad 10.1.1. Pˇr´ıklad 3-regul´ arn´ı haldy je na obr´azku ??. Kdyˇz takto oˇc´ıslovan´e prvky d´ ame do pole, pak plat´ı: kdyˇz je vrchol na i-t´em m´ıstˇe, ˇc´ısla syn˚ u ıstˇe v poli. to vyuˇzijeme pro implementaci polem jsou 3(i − 1) + 2, 3i, 3i + 1 a otec je na d i−1 3 e m´ uˇsetˇr´ıme m´ısto. Pozn´ amka 10.1.1. Nejpopul´ arnˇejˇs´ı jsou 2-reg. haldy, protoˇze synov´e i-t´eho vrcholu jsou na i m´ıstech 2(i − 1) + 2 = 2i, 2(i − 1) + 3 = 2i + 1, otec je na d i−1 e poˇc´ıt´an´ı 2 e + 1 = d 2 e. ⇒ snadn´ (bitov´ y posun) 114
XXX chybi obr.
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
10.1.1
115
Algoritmus UP
Operace UP(x) srovn´ a haldu smˇerem nahoru. Algoritmus 10.1 UP pro d-regul´ arn´ı haldy A: if prvek reprezentovan´ y x je < prvek reprezentovan´ y otcem(x) then x a otce(x) vymˇen´ıme pokraˇcujeme v A end if
10.1.2
Algoritmus DOWN
Algoritmus 10.2 DOWN pro d-regul´ arn´ı haldy A: if prvek reprezentovan´ y x > prvek reprezentovan´ y nˇekter´ ym synem x then vymˇen´ıme x a syna x, kter´ y reprezentuje nejmenˇs´ı prvek, pokraˇcujeme v A end if Pozn´ amka 10.1.2. Kdyˇz m´ a hlada hloubku h, pak UP(x) vyˇzaduje ˇcas O(h), DOWN(x) ˇcas O(dh).
10.1.3
Operace na haldˇ e
INSERT Algoritmus 10.3 INSERT pro d-regul´arn´ı haldy pˇrid´ame posledn´ı list t reprezentuj´ıc´ı x UP(t)
MIN Algoritmus 10.4 MIN pro d-regul´ arn´ı haldy vr´at´ı prvek reprezentovan´ y v koˇreni
DELETEMIN viz algoritmus 10.5. DECREASEKEY(x, ∆) Proveden´ı t´eto operace pˇredpokl´ ad´ a, ˇze mus´ıme zn´at polohu vrcholu t reprezentuj´ıc´ıho x, toto halda neumoˇzn ˇuje nal´ezt. viz algoritmus 10.6.
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
116
Algoritmus 10.5 DELETEMIN pro d-regul´arn´ı haldy prvek reprezentovan´ y posledn´ım listem d´ame do koˇrene odstran´ıme posledn´ı list DOWN(koˇren) Algoritmus 10.6 DECREASEKEY pro d-regul´arn´ı haldy zmˇen´ıme uspoˇr´ ad´ an´ı v bodˇe x UP(x) mohl by b´ yt menˇs´ı neˇz jeho otec, proto provedeme UP
INCREASEKEY(x, ∆) Mus´ıme zn´ at polohu vrcholu t reprezentuj´ıc´ıho x, toto halda neumoˇzn ˇuje nal´ezt. viz algoritmus 10.7. Algoritmus 10.7 INCREASEKEY pro d-regul´arn´ı haldy zmˇen´ıme uspoˇr´ ad´ an´ı v bodˇe x DOWN(x)
DELETE Mus´ıme zn´ at polohu vrcholu t reprezentuj´ıc´ıho x, toto halda neumoˇzn ˇuje nal´ezt. Vezmeme prvek y reprezentovan´ y posledn´ım listem, odstran´ıme posledn´ı list, prvek t, kter´ y reprezentoval x bude reprezentovat y. Algoritmus 10.8 DELETE pro d-regul´arn´ı haldy if y < x then UP(t) else DOWN(t) end if
10.1.4
Algoritmus MAKEHEAP
D´ana prost´ a posloupnost x1 , x2 , ..., xn . Chceme vytvoˇrit d-reg. haldu reprezentuj´ıc´ı mnoˇzinu x1 , x2 , ..., xn . Vezmeme ”d-reg. strom” T s vrcholy pˇriˇrad´ıme prvky x1 , x2 , ..., xn . Pro vˇsechny vrcholy, kter´e nejsou listy podle oˇc´ıslov´ an´ı v poˇrad´ı od nejvˇetˇs´ıho k nejmenˇs´ımu provedeme DOWN(t). chyb´ı obr´ azek Invariant: v okamˇziku, kdy prov´ ad´ım DOWN(t), tak vrcholy, kter´e reprezentuj´ıc´ı vˇetˇs´ı prvky splˇ nuj´ı smˇerem dol˚ u podm´ınku
10.1.5
Sloˇ zitost operac´ı
V d-reg. haldˇe reprezentuj´ıc´ı n-prvkovou mnoˇzinu implementace operac´ı vyˇzaduje ˇcasy dan´e tabulkou: Operace MIN INSERT, DECREASEKEY DELETEMIN, INCREASEKEY, DELETE
Sloˇzitost O(1) O(logd (n)) O(d · logd (n))
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
117
M´ame vrchol v i-t´e hladinˇe a ”d-reg. strom” m´a hloubku h. Kolik ˇcasu potˇrebuje DOWN(t) ? Je to O(d(h − 1)). Poˇcet vrchol˚ u v i-t´e hladinˇe je di. ˇ MAKEHEAP je O(P i = 0h − 1di d(h − i)) = O(dS), kde Cas X S= i = 0h − 1di (h − i) Budeme poˇc´ıtat dS − S =
X
i = 0h − 1di+1 (h − i) − dh − h +
X
X
i = 0h − 1di (h − i − (h − i − 1)) = dh − h ⇒S=
10.1.6
i = 0h − 1di (h − i) = dh − 1 d−1
n dh − h dh−1 − 1 , h = logd (n) ⇒ S ≈ O( ) +d d−1 (d − 1)2 d
(10.1)
Dijkstr˚ uv algoritmus
K ˇcemu jsou d-reg. haldy dobr´e ? napˇr. pro implementaci Dijkstrova algoritmu. Vstup: orientovan´ y graf (V, E), fce c : E → R+ , vrchol z V´ ystup: d(v), v ∈ V d(v) je d´elka nejkratˇs´ı cesty ze z do v
Algoritmus 10.9 Dijkstr˚ uv algoritmus pro d-regul´arn´ı haldy d(z) = 0, d(v) = ∞∀v ∈ V, v 6= z, U = z while U 6= ∅ do vezmeme z U prvek u ∈ U s nejmenˇs´ı hodnotou d(u), odstran´ıme ho z U . for ∀(u, v) ∈ E do if d(v) > d(u) + c(u, v) then d(v) = d(u) + c(u, v) , v pˇrid´ ame do U end if end for end while U reprezentujeme pomoc´ı d-reg. haldy. Pak ˇcas Dijkstrova algoritmu je O(|V | · ˇcas na INSERT + |V | · ˇcas na DELETEMIN + |E| · ˇcas na DESCREASEKEY) Kdyˇz d = 2, pak to je O(|E|log2 (|V |)) |E| d = max |V cas O(|E|logd (|V |)) | , 2, vyjde ˇ Kdyˇz ∃ , ˇze |E| ≥ c|V |1+ pro nˇejak´e c, pak ˇcas je O(|E|). (graf je dostateˇcnˇe hust´ y) |E| ≥ c|V | log |V | pro nˇejak´e c, , pak ˇcas je O(|E| log log|V |).
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
10.1.7
118
Heapsort
Tˇr´ıd´ıc´ı algoritmus Heapsort je dalˇs´ı aplikac´ı d-regul´arn´ıch hald. HEAPSORT - viz alg. 10.10 Vstup: prost´ a posloupnost prvk˚ u x1 , x2 , ..., xn V´ ystup: uspoˇr´ adan´ a psl. prvk˚ u x1 , x2 , ..., xn Algoritmus 10.10 Heapsort pro d-regul´arn´ı haldy MAKEHEAP(x1 , x2 , ..., xn ) i=1 while HEAP 6= ∅ do x1 = MIN(HEAP) DELETEMIN(HEAP) i=i+1 end while Pozn´ amka 10.1.3. Optimum pro d-reg. haldy je nˇekde mezi d = 6 a d = 7.
10.2
Leftist haldy
Definice 10.2.1. Mˇejme bin´ arn´ı strom a pro kaˇzd´eho syna m´ame urˇceno, zda je lev´ y nebo prav´ y. Pro vrchol v definujeme npl(v) jako d´elku nejkratˇs´ı cesty z v do vrcholu v podstromu v s nejv´ yˇse jedn´ım synem. Bin´arn´ı strom je LEFTIST, kdyˇz a) kdyˇz vrchol v m´ a jednoho syna, pak je to lev´ y syn b) kdyˇz vrchol v m´ a dva syny, pak npl(lev´eho syna) ≥ npl(prav´eho syna) Definice 10.2.2. Cesta x1 , x2 , ..., xn se naz´ yv´a prav´a, kdyˇz xi je prav´ y syn xi−1 pro i = 2, 3, ..., n a xn nem´a prav´eho syna. Vlastnosti: 1. kaˇzd´ y podstrom leftist stromu je leftist 2. d´elka prav´e cesty z ∀ vrcholu v je ≤ log(poˇcet vrchol˚ u v podstromu vrcholu v) Definice 10.2.3. Letist halda reprezentuj´ıc´ı mnoˇzinu S je leftist strom T s n vrcholy takov´ y, ˇze existuje jednoznaˇcn´ a korespondence mez prvky S a vrcholy T takov´a, ˇze ∀ prvek pˇriˇrazen´ y vrcholu v ≥ prvek pˇriˇrazen´ y otci v.
10.2.1
MERGE
Operace MERGE s argumenty T1 , T2 pˇredpokl´ad´a, ˇze T1 , T2 reprezentuj´ı disjunktn´ı mnoˇziny S1 , S2 . V´ ysledkem t´eto operace je halda reprezentuj´ıc´ı S1 ∪ S2 . Form´aln´ı z´ apis viz algoritmus 10.11 ˇ Pozn´ amka 10.2.1. Casov´ a sloˇzitost operace MERGE v leftist hald´ach je O(log(n1 + n2 )), kde n1 , n2 jsou velikosti reprezentovan´ ych mnoˇzin.
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
119
Algoritmus 10.11 MERGE pro leftist haldy MERGE(T1 , T2 ) if T1 = 0 then MERGE(T1 , T2 ) → T2 konec end if if T2 = 0 then MERGE(T1 , T2 ) → T1 konec end if if koˇren T2 reprezentuje prvek < prvek repr. koˇrenem T1 then vymˇen´ıme T1 a T2 end if prav´ y syn koˇrene T1 → MERGE(T2 , podstrom prav´eho syna koˇrene T1 ) if npl(lev´eho syna koˇrene T1 ) < npl(prav´eho syna koˇrene T1 ) then prohod´ım syny koˇrene T1 end if npl(koˇrene T1 ) = npl(prav´eho syna koˇrene T1 ) + 1 MERGE(T1 , T2 ) → T1
10.2.2
INSERT
viz algoritmus 10.12 Algoritmus 10.12 INSERT pro leftist haldy INSERT(x) vytvoˇr´ıme novou haldu T1 reprezentuj´ıc´ı pouze prvek x T ← MERGE(T1 , T2 ) DELETEMIN T1 ← podstrom lev´eho syna koˇrene T T2 ← podstrom prav´eho syna koˇrene T T ← MERGE(T1 , T2 )
Vˇ eta 10.2.1. Operace MIN v leftist hald´ ach vyˇzaduje ˇcas O(1), operace MERGE, INSERT, a DELETEMIN vyˇzaduj´ı ˇcas O(logn), kde n je poˇcet prvk˚ u ve v´ysledn´e haldˇe. XXX obr.
Pozn´ amka 10.2.2. Pod´ıv´ ame se jak vypad´a v´ ysledn´ y strom a pod´ıv´ame se na vrcholy, se kter´ ymi jsme nˇeco museli prov´ adˇet - tyto vrcholy leˇz´ı na prav´e cestˇe, tj. je jich omezen´ y poˇcet.
10.2.3
DECREASEKEY
viz algoritmus 10.13 Pozn´ amka 10.2.3. npl, kter´e jsem musel pˇrepisovat, je vˇzdycky prav´ y syn. Vˇ eta 10.2.2. Operace DECREASEKEY, INCREASEKEY a DELETE vyˇzaduj´ı v leftist hald´ ach ˇcas O(logn). (n je poˇcet prvk˚ u v´ysledn´e reprez. mnoˇziny)
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
120
Algoritmus 10.13 DECREASEKEY pro leftist haldy DECREASEKEY(x) odtrhneme podstrom T1 vrcholu x, y → otec(x) T2 = T − T1 zmenˇs´ıme ohodnocen´ı koˇrene stromu T1 if y m´a jen prav´eho syna then zmˇen´ıme tohoto syna na lev´eho, npl(y) = 0 end if y → otec(y) while npl(y) > min{npl(lev´ y syn y), npl(prav´ y syn y)} + 1 do if npl(lev´eho syna y) < npl(prav´eho syna y) then prohod´ıme syny y end if npl(y) = npl(prav´eho syna y) + 1, y → otec(y) end while T ← MERGE(T1 , T2 )
10.3
Binomi´ aln´ı haldy
Definice 10.3.1. Binomi´ aln´ı strom Bi je rekurzivnˇe definov´an jako strom sest´avaj´ıc´ı se z koˇrene a jeho dˇet´ı B0 , B1 , ..., Bi−1 . Kaˇzd´ y strom m´a vlastnost haldy, tj. pro kaˇzdou stromovou hranu plat´ı kl´ıˇc otce ≤ kl´ıˇc syna. Definice 10.3.2. Binomi´ aln´ı halda je soubor strom˚ u takov´ ych, ˇze • kaˇzd´ y strom je izomorfn´ı s nˇejak´ ym Bi • ˇz´adn´e dva stromy nejsou izomorfn´ı • existuje jednoznaˇcn´ a korespondence mezi vrcholy reprezentovan´e mnoˇziny a vrcholy strom˚ u takov´ a, ˇze prvek odpov´ıdaj´ıc´ı otci je menˇs´ı neˇz prvek odpov´ıdaj´ıc´ı vrcholu. Pozn´ amka 10.3.1. Nejˇcastˇeji je binom. halda implementov´ana jako pole ukazatel˚ u, kde i-t´ y ukazatel ukazuje na koˇren stromu Bi nebo je NIL. To, jak dlouh´e pole budeme potˇrebovat, je kardin´aln´ı pro amortizovanu sloˇzitost. Bin´arn´ı z´apis ˇc´ısla n m´a d´elku blog2 nc ⇒ stromy ˇr´adu vyˇsˇs´ıho neˇz blog2 nc se nebudou vyskytovat. (jinak by mˇel graf v´ıce neˇz n vrchol˚ u) Binomi´ aln´ı stromy rostou exponenci´alnˇe spolu s ˇr´adem. (proto funguje amort. anal´ yza) Pozn´ amka 10.3.2. Na binomi´ aln´ı strom se m˚ uˇzeme d´ıvat i jinak: strom Bi sest´av´a ze 2 kopi´ı Bi−1 (viz obr. 10.1) a z´ısk´ a se z nich operac´ı zvanou spojen´ı. Binomi´aln´ı haldy souvis´ı s binomi´aln´ım rozvojem ˇc´ısel. Tvrzen´ı 10.3.1. Binomi´ aln´ı halda je tvoˇrena binomi´ aln´ımi stromy Bi , kter´e maj´ı n´ asleduj´ıc´ı vlastnosti: u • Bi m´ a 2i vrchol˚ • hloubka Bi je i • koˇren Bi m´ a i syn˚ u • ∀j < i existuje syn koˇrene Bi takov´y, ˇze jeho podstrom je izomorfn´ı s Bj . D˚ ukaz. indukc´ı pˇres i (element´ arn´ı)
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
121
Algoritmus 10.14 Spojen´ı dvou binomi´aln´ıch strom˚ u Spojeni(S1 , S2 ) S1 , S2 jsou stromy izomorfn´ı s Bi pro nˇejak´e i if prvek reprezentovan´ y koˇrenem S1 ≤ prvek reprezentovan´ y koˇrenem S2 then koˇren S2 se stane dalˇs´ım synem koˇrene S1 else koˇren S1 se stane dalˇs´ım synem koˇrene S2 end if
B0
B1
B2
B4
B3
Bi
...
B0 B1
B2
B i-2
B i-1
B i-1
Obr´ azek 10.1: Binomi´aln´ı stromy
10.3.1
MERGE
Algoritmus MERGE (viz algoritmus 10.15) pracuje jako ”bin´arn´ı sˇc´ıt´an´ı” - 2 stromy Bi (= 2 jedniˇcky v ˇr´ adu i) slije do Bi − 1 (= pˇrenos do i + 1) Pracuje v O(log2 n) - nejvyˇsˇs´ı moˇzn´ y ˇr´ad je blog2 nc. Toto je sloˇzitost v nejhorˇs´ım pˇr´ıpadˇe. Ukazatel MIN nov´e haldy je nastaven na menˇs´ı z MIN(h1 ), MIN(h2 ) - to zabere O(1). Pozn´ amka 10.3.3. V algoritmu MERGE (viz algoritmus 10.15) odpov´ıd´a P pˇrenosu v bin´arn´ım sˇc´ıt´an´ı, T je v´ ysledn´ a halda.
10.3.2
MIN
MIN(h) - prohled´ ame prvky reprezentovan´e koˇreny strom˚ u a najdeme nejmenˇs´ı. V praxi je pro kaˇzdou haldu drˇzen ukazatel, ukazuj´ıc´ı na koˇren reprezentuj´ıc´ı nejmenˇs´ı prvek haldy. Tento ukazatel je obnovov´ an pˇri operaci DELETE MIN.
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
122
Algoritmus 10.15 MERGE pro binomi´aln´ı haldy MERGE(T1 , T2 ) (T1 , T2 binom. haldy velikosti n1 , n2 ) P = 0, i = 0, T = 0 while i ≤ log(n1 + n2 ) do S1 je strom v T1 izomorfn´ı s Hi (pokud neexistuje, tak S1 = 0) S1 je strom v T1 izomorfn´ı s Hi (pokud neexistuje, tak S1 = 0) if S1 , S2 , P = 0 then neprovedeme nic end if if jeden strom z S1 , S2 , P je nepr´ azdn´ y then vloˇz´ım tento strom do T , P = 0 end if if dva stromy z S1 , S2 , P jsou nepr´azdn´e then spoj´ım tyto stromy a v´ ysledek vzloˇz´ım do P end if if vˇsechny stromy z S1 , S2 , P jsou nepr´azdn´e then vloˇz´ım do T , spojen´ı S1 , S2 vloˇz´ım do P end if i=i+1 end while
10.3.3
INSERT
Operace INSERT(h,i) se provede pˇr´ıkazem MERGE(h, MAKEHEAP(i)). Tato operace je analogick´a s inkrementac´ı bin´ arn´ıho ˇc´ıtaˇce. Dijkstr˚ uv algoritmus prov´ ad´ı na zaˇc´atku n operac´ı INSERT, n´am tedy nejde o jednotliv´e operace, ale o posloupnost INSERT˚ u. Pozn´ amka 10.3.4. INSERT je stejn´ y jako v leftist hald´ach. Vˇ eta 10.3.1. Amortizovan´ a sloˇzitost operace INSERT je O(1). D˚ ukaz. Vyuˇzijeme u ´ˇcetn´ı metody: Algoritmus INSERT udrˇzuje n´ asleduj´ıc´ı invariant: Kaˇzd´ y binom. strom v haldˇe m´ a na sv´em u ´ˇctu 1 jednotku. (Ten, kter´ y pˇrest´av´a b´ yt koˇrenem, zaplat´ı, ten kdo vyhr´ al, si 1 jednotku ponechal.) Pˇri vytv´aˇren´ı stromu ji zaplat´ı operace, kter´a strom vytvoˇrila: • MAKEHEAP vytvoˇr´ı 1 strom ⇒ zaplat´ı 1 • DELETE MIN vytvoˇr´ı ≤ logn strom˚ u ⇒ zaplat´ı ≤ logn Pokud INSERT spust´ı kask´ adu sl´ev´ an´ı, pak je kaˇzd´e slit´ı zaplaceno z u ´ˇctu stromu, kter´ y dan´ ym slit´ım zanikne. (jeho koˇren se stane synem)
10.3.4
DELETEMIN
Operace DELETEMIN (viz algoritmus 10.16) je provedena tak, ˇze ze stromu Bk , na kter´ y ukazuje ukazatel MIN, utrhneme koˇren. T´ım vzniknou nov´e stromy B0 , B1 , ..., Bk−1 , ze kter´ ych vytvoˇr´ıme novou haldu, nastav´ıme pro ni ukazatel MIN a zavol´ame MERGE. DELETEMIN pracuje v O(log2 n), protoˇze k ≤ log2 n. Toto je sloˇzitost v nejhorˇs´ım pˇr´ıpadˇe.
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
123
Algoritmus 10.16 DELETEMIN pro binom. haldu DELETEMIN prohled´an´ım prvk˚ u reprezentovan´ ych koˇreny strom˚ u naleznu strom S, jehoˇz koˇren reprezentuje nejmenˇs´ı prvek T1 = T S, T2 je tvoˇren podstormy vˇsechn syn˚ u koˇrene S (tj. utrhnu koˇren a zbytek d´ am do haldy) - je to halda d´ıky vlastnosti 4 T → MERGE(T1 , T2 )
Pozn´ amka 10.3.5. Operace DELETE se ned´a rozumnˇe prov´est, museli bychom pˇrebudovat cel´ y strom. Vˇ eta 10.3.2. Operace MERGE, INSERT, MIN, DELETEMIN a DECREASEKEY vyˇzaduj´ı ˇcas O(logn). Operace INCREASEKEY vyˇzaduje ˇcas O(log 2 n). Pozn´ amka 10.3.6. MERGE zab´ır´ a dost ˇcasu - mus´ıme ho dˇelat ?
10.3.5
L´ın´ a implementace binom. hald
L´ın´a implementace vych´ az´ı z toho, ˇze chceme operaci MERGE prov´adˇet v ˇcase O(1). Zmˇen´ıme definici - vynech´ ame podm´ınku 2 z definice 10.3.2, tj. ted’ v naˇs´ı binom. haldˇe mohou b´ yt izomorfn´ı stromy. (i kdyˇz jen doˇcasnˇe) Dalˇs´ı zmˇena spoˇc´ıv´a ve zmˇenˇe reprezentace binomi´aln´ı haldy - haldu reprezentujeme dvojit´ ym kruhov´ ym spojov´ ym seznamem pˇres koˇreny strom˚ u. (kruhov´ y spojov´ y seznam umoˇzn ˇuje pˇrid´av´an´ı a odeb´ırn´a prvk˚ u v ˇcase O(1).) Operaci MERGE(T1 , T2 ) pak m˚ uˇzeme prov´est konkatenac´ı seznam˚ u T1 a T2 . Jenom to by nefungovalo, mus´ıme jeˇstˇe zmˇenit operace MIN, DELETEMIN. Algoritmus 10.17 DELETEMIN pro l´ın´e binom. haldy MIN pˇri prohled´ av´ an´ı prvk˚ u reprezentovan´ ych koˇreny strom˚ u seˇrad´ıme stromy do mnoˇzin Qi , i = 0, ..., n , kde Qi je mnoˇzina vˇsech strom˚ u v T izomorfn´ıch s Bi . i = 0, T = 0 while ∃Qi 6= 0 do while |Qi | > 1 do vezmeme dva stromy z Qi , spoj´ıme je, v´ ysledek d´ame do Qi+1 end while if Qi 6= 0 then strom z Qi d´ am do T end if i=i+1 end while DELETEMIN um´ıst´ı stromy po odtrˇzen´ı nejmenˇs´ıho prvku do odpov´ıdaj´ıc´ıch mnoˇzin Qi . (v mnoˇzinˇe Qi jsou stromy izomorfn´ı s Bi ) Pot´e provede konsolidaci - uprav´ı haldu do podoby, kdy je kaˇzd´ y ˇr´ad zastoupen nejv´ yˇse jedn´ım stromem. Konsolidace bˇeˇz´ı v O(logn) plus vyˇcerp´a u ´ˇcty strom˚ u, kter´e zaniknou pˇri sl´ev´an´ı.
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
124
Konsolidace prob´ıh´ a takto: 1. vytvoˇr´ım pole d´elky logn, kter´e je pr´azdn´e ⇒ O(logn) 2. proch´ az´ım spojov´ y seznam vrchol˚ u strom˚ u v haldˇe a jeden strom za druh´ ym vyjmu a d´av´am do pole vytvoˇren´eho v kroku 1, pˇriˇcemˇz se vˇzdy provede pˇr´ısluˇsn´e slit´ı. • pokud strom zanikne, tak pr´ aci zaplat´ıme z jeho u ´ˇctu • pokud strom nezanikne, tak pr´ aci plat´ıme z u ´ˇctu konsolidace → O(logn) 3. z pole vytvoˇr´ıme spojov´ y seznam → O(logn) DELETEMIN tedy potˇrebuje • O(logn) do u ´ˇct˚ u novˇe vytvoˇren´ ych strom˚ u • O(logn) na jejich zaveden´ı do spojov´eho seznamu • O(logn) na konsolidaci Pˇri konsolidaci vˇzdy z´ aroveˇ n vyhled´ame nov´e minimum. Vˇ eta 10.3.3. Operace MERGE a INSERT pˇri l´ın´e implementaci vyˇzaduj´ı ˇcas O(1), operace DELETEMIN a MIN vyˇzaduj´ı ˇcas O(poˇcet strom˚ u v haldˇe).
Operace MERGE INSERT MIN DELETEMIN
Amort. sloˇzitost O(1) O(1) O(logn) O(logn)
Tabulka 10.1: Amortizovan´a sloˇzitost pro l´ın´e binomi´aln´ı haldy
10.4
Fibonacciho haldy
Fibonacciho haldy vych´ azej´ı z binomi´ aln´ıch hald, form´alnˇe se liˇs´ı v podstatˇe pouze t´ım, ˇze v haldˇe povol´ıme i jin´e stromy neˇz binomi´ aln´ı. Toto n´am umoˇzn´ı implementaci operace DECREASE KEY, kter´a nebyla v binomi´ aln´ıch hald´ ach pˇri zachov´an´ı sloˇzitosti ostatn´ıch operac´ı moˇzn´a. ˇ ad uzlu a stromu je definov´ R´ an jako u binomi´aln´ıch hald. Sl´ev´an´ı se prov´ad´ı pouze mezi stromy stejn´eho ˇr´ adu.
10.4.1
MERGE, INSERT, EXTRACT MIN
Implementace operac´ı MERGE(h1 ,h2 ), INSERT(h,i), EXTRACT MIN(h) je stejn´a jako u binomi´aln´ıch hald v ”l´ın´e” verzi.
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
125
Algoritmus 10.18 DECREASE KEY pro Fibonacciho haldy DECREASE KEY(h,i,δ) 1. sn´ıˇz´ım kl´ıˇc prvku i o δ 2. podstrom i s koˇrenem i odˇr´ızneme a jako samostatn´ y strom ho zavedeme haldy (tj. zaˇrad´ım do spojov´eho seznamu koˇren˚ u strom˚ u v haldˇe) ⇒ O(1) 3. Abychom udrˇzeli stromy dostateˇcnˇe ”koˇsat´e”1 tak od kaˇzd´eho vrcholu x mohou b´ yt odˇr´ıznuti nejv´ yˇse 2 synov´e ⇒ po odˇr´ıznut´ı 2. syna je odˇr´ıznut i s´am vrchol x.
F0
F1
F2
F3
F4
F5
Obr´ azek 10.2: Poˇcty vrchol˚ u strom˚ u F0 , F1 , ... tvoˇr´ı Fibonacciho posloupnost.
10.4.2
DECREASE KEY
DECREASE KEY prov´ ad´ı sn´ıˇzen´ı hodnoty kl´ıˇce pro dan´ y prvek. To se dˇeje za cenu pˇr´ıtomnosti jin´ ych neˇz binomi´ aln´ıch strom˚ u v haldˇe. uˇze vyvolat kask´adu ˇrez˚ u, je jej´ı Pozn´ amka 10.4.1. Pˇrestoˇze jedna operace DECREASE KEY m˚ amortizovan´ a sloˇzitost O(1). Pozn´ amka 10.4.2. Pomoc´ı u ´ˇcetn´ı metody 2 dok´aˇzeme, ˇze to plat´ı: Pˇri odˇrez´av´ an´ı syna vrcholu x zaplat´ı operace DECREASE KEY • 2 jednotky na u ´ˇcet x • 1 jednotku na u ´ˇcet vznikl´eho stromu • 1 jednotku za pr´ aci (odˇr´ıznut´ı a zaˇrazen´ı) Pˇri odˇr´ıznut´ı druh´eho syna jsou na u ´ˇctu vrcholu x 4 jednotky ⇒ mohu zopakovat body 1) - 3). Vˇ eta 10.4.1. Nejvyˇsˇs´ı ˇr´ ad stromu ve Fibonacciho haldˇe je blogϕ nc = Θ(log2 n) pro nˇejak´e ϕ > 1. Lemma 10.4.1. Necht’ x je vrchol a y1 , ..., ym jeho synov´e v poˇrad´ı, v jak´em byli k x sliti. Potom ∀ ∈ 1, ..., m je ˇr´ ad yi aspoˇ n i − 2. D˚ ukaz. V okamˇziku, kdy byl yi slit pod x, mˇel x ˇr´ad ≥ i − 1. (y1 , ..., yi−1 jiˇz v t´e chv´ıli byli synov´e x) V tomto okamˇziku byl tak´e ˇr´ ad yi−1 ≥ i − 1. (sl´ev´ame pouze stromy stejn´eho ˇr´adu) Od t´e doby mohl yi ztratit nejv´ yˇse jednoho syna, jinak by byl s´am odˇr´ıznut a pˇrestal by b´ yt synem x. ⇒ yi m´a ˇr´ad ≥ i − 2. 2 Pro
definici u ´ˇ cetn´ı metody viz pˇredn´ aˇsky ze ”Sloˇzitosti a NP u ´plnosti”.
Id: samoop.tex,v 1.14 2005/05/07 21:29:06 techie Exp
126
Fi Fi-1 1
2
...
i-1
i-1
1
Fi-2 2
...
i-2
Obr´ azek 10.3: K d˚ ukazu vˇety 10.4.1 D˚ ukaz. Dokazujeme vˇetu 10.4.1, kter´ a jin´ ymi slovy ˇr´ık´a: Strom ˇr´adu i ve Fibonacciho haldˇe m´a velikost alespoˇ n ϕi pro nˇejak´e ϕ > 1. Necht’ Fj je nejmenˇs´ı moˇzn´ y (tj. m´ a oˇrezan´e podstromy na max. moˇznou u ´roveˇ n - byl z nich odˇr´ıznut 1 syn) strom ˇr´ adu j splˇ nuj´ıc´ı tvrzen´ı lemma 10.4.1 a necht’ |Fj | = fj . Pak 1. Fi vznikne ”slit´ım” Fi−1 a Fi−2 ⇒ fi = fi−1 + fi−2 2. fi ≥ ϕi , kde ϕ =
√ 1+ 5 2
≈ 1.618 ... zlat´ y ˇrez
ad 1) viz obr. 10.3 Slit´ı je nepˇresn´ y term´ın - sl´ev´ ame pouze stromy stejn´eho ˇr´adu. Fi−2 je v´ ysledek DECREASE KEY. (t´ım se strom ”oholil”) Uˇr´ıznu posledn´ıho syna, pod kter´ ym je nejvˇetˇs´ı podstrom (abych dostal nejmenˇs´ı moˇzn´ y podstrom) ad 2) ϕ je klad´ y koˇren rovnice x2 − x √ −1=0 neboli plat´ı ϕ2 = ϕ + 1, ϕ = 1+2 5 ≈ 1.618 dok´aˇzeme indukc´ı: – i = 0 : f0 = 1 ≥ ϕ0 = 1 – i = 1 : f1 = 2 ≥ ϕ1 = 1.618 – indukˇcn´ı krok: IP: fi ≥ ϕi , fi+1 ≥ ϕi+1 fi+2 = fi+1 + fi ≥ ϕi+1 + ϕi = ϕi (ϕ + 1) = ϕi+2
Kapitola 11
Dynamizace V uspoˇr´adan´em poli um´ıme rychle vyhled´avat, ale pˇridat prvky znamen´a cel´e ho pˇrebudovat. Ve sr˚ ustaj´ıc´ım haˇsov´ an´ı zase neˇsly prvky mazat, ve velmi komprimovan´ ych trie ani pˇrid´avat, ani mazat. V t´eto kapitole uk´ aˇzeme obecnou metodu, jak tyto probl´emy ˇreˇsit, podobnou pˇr´ıstupu u binomi´aln´ıch hald. Takov´e struktuˇre, kter´ a neumoˇzn ˇuje vkl´ad´an´ı (operace INSERT) ani maz´an´ı (operace DELETE) prvk˚ u budeme ˇr´ıkat statick´ a struktura. Chceme vytvoˇrit takovou reprezentaci, kter´a bude vyuˇz´ıvat v´ yhod statick´e struktury, ale z´ aroveˇ n umoˇzn´ı operace INSERT a DELETE. K tomu se dopracujeme postupnˇe. Nejdˇr´ıve provedeme semidynamizaci, kter´a umoˇzn´ı (v nov´e reprezentaci p˚ uvodn´ı mnoˇziny) operaci INSERT, pak dynamizaci, kter´a pˇrid´a operaci DELETE.
11.1
Zobecnˇ en´ y vyhled´ avac´ı probl´ em
Definice 11.1.1. Vyhled´ avac´ı probl´em je funkce f : U1 × 2U2 → U3 , kde U1 , U2 a U3 jsou univerza. ˇ sen´ı vyhled´ Definice 11.1.2. Reˇ avac´ıho probl´emu pro x ∈ U1 , A ⊆ U2 je nalezen´ı hodnoty f (x, A). Pozn´ amka 11.1.1. Chceme naj´ıt strukturu, kter´a reprezentuje A a algoritmus, kter´ y pro vstup x ∈ U1 spoˇc´ıt´ a f (x, A). Takov´e struktuˇre se ˇr´ık´a statick´ a struktura pro vyhled´avac´ı probl´em. Pˇ r´ıklad 11.1.1. Klasick´ y vyhled´ avac´ı probl´ em: U1 = U2 = U , univerzum prvk˚ u; U3 = {0, 1}, A ⊆ U2 ( 0 kdyˇz x ∈ /A f (x, A) = (rozloˇziteln´ y) 1 kdyˇz x ∈ A Euklidovsk´ a vzd´ alenost bod˚ u v rovinˇ e: U1 = U2 = euklidovsk´a rovina; U3 = R+ ; f (x, A) = dist(x, A vzd´ alenost bodu x ∈ U1 od mnoˇziny A. (rozloˇziteln´ y, ⊕ ... operace min) Nalezen´ı pˇredch˚ udce U1 = U2 = U3 pro x ∈ U1 a A ⊆ U! a je f (x, U! ) je nejvˇetˇs´ı prvek A ≤ x (rozloˇziteln´ y, je potˇreba disjunkce) Pˇ r´ısluˇ snost ke konvexn´ımu obalu U1 = U2 = rovina; U3 = {0, 1}; ( 0 kdyˇz x nepatˇr´ı do konvexn´ıho obalu A f (x, A) = (nen´ı rozloˇziteln´ y probl´em) 1 kdyˇz x patˇr´ı do konvexn´ıho obalu A
127
Id: dynam.tex,v 1.16 2005/05/08 14:42:26 techie Exp
128
x2
x0
A
x1
B
Obr´ azek 11.1: Konvexn´ı obal
11.1.1
Operace INSERT a DELETE
Pro mnoˇzinu A ⊆ U2 a pro statickou strukturu S ˇreˇs´ıc´ı vyhled´avac´ı probl´emf pro x ∈ U2 . • INSERT(x,A) - vybudov´ an´ı struktury ˇreˇs´ıc´ı vyhled´avac´ı probl´em pro mnoˇzinu A ∪ {x} • DELETE(x,A) - vytvoˇren´ı struktury ˇreˇs´ıc´ı vyhl. probl´em pro mnoˇzinu A − {x} Pozn´ amka 11.1.2. Ze statick´e struktury chce vytovoˇrit dynamickou (dynamizace). INSERT je obvykle jednoduˇsˇs´ı neˇz DELETE, na ten budeme potˇrebovat dodateˇcn´e pˇredpoklady. N´aroky na dynamizaci • chceme aby se f (x, A) v nov´e struktuˇre spoˇc´ıtalo pˇribliˇznˇe stejnˇe rychle jako v p˚ uvodn´ı struktuˇre • kdyˇz vytvoˇren´ı p˚ uvodn´ı struktury pro n prvnkovou mnoˇzinu trvalo t, pak operace INSERT by pˇribliˇznˇe mˇela vyˇzadovat ˇcas t/n. Definice 11.1.3. Vyhled´ avac´ı probl´em je rozloˇziteln´y, kdyˇz existuje operace ⊕ spoˇcitateln´a v konstantn´ım ˇcase a plat´ı: kdyˇz x ∈ U1 a A a B jsou disjunktn´ı podmnoˇziny U2 , pak f (x, A ∪ B) = f (x, A) ⊕ f (x, B). Pozn´ amka 11.1.3. Z v´ yˇse uveden´ ych pˇr´ıklad˚ u nen´ı rozloˇziteln´ ym probl´emem pˇr´ısluˇsnost ke konvexn´ımu obalu, ostatn´ı vyhled´ avac´ı probl´emy jsou rozloˇziteln´e. Definice 11.1.4. Necht’ f je rozloˇziteln´ y vyhled´avac´ı probl´em a S je “statick´a” datov´a struktura, kter´a ho ˇreˇs´ı. Neboli S je tvoˇrena pro pevnou mnoˇzinu A ⊆ U2 a obsahuje operaci, kter´a pro vstup x poˇc´ıt´a f (x, A). Pop´ıˇseme d˚ uleˇzit´e parametry S: necht’ n = |A|, oznaˇcme QS (n) = ˇcas potˇrebn´ y pro v´ ypoˇcet f (x, A) ’ SS (n) = pamˇet potˇrebn´a pro vybudov´an´ı S PS (n) = ˇcas potˇrebn´ y pro vybudov´an´ı S
Id: dynam.tex,v 1.16 2005/05/08 14:42:26 techie Exp
11.2
129
Semi-dynamizace
Semi-dynamizace umoˇzn´ı operaci INSERT nad novou reprezentac´ı p˚ uvodn´ı mnoˇziny. Tato reprezentace bude vyuˇz´ıvat statick´e struktury. Nejprve provedeme ”z´akladn´ı” semidynamizaci, pot´e ji vylepˇs´ıme pro INSERT se sloˇzitost´ı v nejhorˇs´ım pˇr´ıpadˇe. Vylepˇsen´ı bude vyˇzadovat jin´ y rozklad p˚ uvodn´ı mnoˇziny a algoritmus INSERT (viz algoritmus 11.2) bude sloˇzitˇejˇs´ı. Vˇ eta 11.2.1. M´ ame rozloˇziteln´y vyhled. probl´em f a m´ ame pro nˇej statickou strukturu, kter´ a S(n) ho ˇreˇs´ı v ˇcase Q(n), vyˇzaduje S(n) pamˇeti a vytvoˇr´ı se v ˇcase P (n), kde Q(n), P (n) , jsou n n neklesaj´ıc´ı funkce. Pak existuje semidynamick´ a dat. struktura D, ˇreˇs´ıc´ı f v ˇcase O(Q(n) log n) vyˇzaduj´ıc´ı O(S(n)) pamˇeti a umoˇzn ˇuj´ıc´ı INSERT s amort. sloˇzitost´ı O( P (n) n · log n). D˚ ukaz. Budeme pˇredpokl´ adat, ˇze QS (n), SS (n)/n a PS (n)/n jsou neklesaj´ıc´ı funkce. M´ame mnoˇzinu A a vytvoˇr´ıme pro ni novou strukturu D. Necht’ Ai ⊆ A takov´a, ˇze bud’ |Ai | = 2i nebo Ai = ∅ S Ai ∩ Aj = ∅proi 6= j. Ai = A Plat´ı Ai 6= ∅ pr´ avˇe kdyˇz (i + 1)-n´ı bit v dvojkov´em rozvoji ˇc´ısla |A| je 1. Chceme navrhnout strukturu, kter´ a by umˇela 1. Pro x ∈ U1 a pevn´e A ⊆ U2 rychle spoˇc´ıtat f (x, A). 2. Pro A a y ∈ U2 rychle vytvoˇrit strukturu pro A ∪ {y}. Mˇejme A0 , A1 , · · · takov´e, ˇze 1. Ai ∩ Aj = ∅ pro i 6= j 2. bud’ Ai = ∅ nebo |Ai | = 2i S 3. i Ai = A Nov´a struktura D reprezentuj´ıc´ı A je potom • nˇejak´ a dynamick´ a struktura reprezentuj´ıc´ı A (napˇr. (a,b)-strom, ˇcerveno-ˇcern´ y strom, AVLstrom) • Pro kaˇzd´e Ai 6= ∅ m´ ame S strukturu reprezentuj´ıc´ı Ai . • Pro kaˇzd´e Ai 6= ∅ seznam prvk˚ u v Ai ; prvky tˇechto seznam˚ u jsou projpojeny s odpov´ıdaj´ıc´ımi prvky ve stromˇe. Jak v nov´e struktuˇre spoˇc´ıt´ ame f (x, A) ? Pro kaˇzdou Ai 6= ∅ spoˇc´ıt´ ame f (x, Ai ) a pomoc´ı operace ⊕ pak spoˇc´ıt´ame f (x, A). Pozn´ amka 11.2.1. Plat´ı, ˇze kdyˇz Ai 6= ∅, pak i ≤ dlog2 |A|e ˇcas, kter´ y je potˇreba v nov´e struktuˇre na v´ ypoˇcet f (x, A)
log|A|
log2 |A| +
X i=0
log|A|
Q(2i )
≤
log|A| +
X
Q(|A|)
=
log|A|(Q(|A|) + 1)
(11.1)
i=0
Pozn´ amka 11.2.2. Prvn´ı nerovnost plyne z toho, ˇze Q(n) je nerostouc´ı funkce. V dalˇs´ıch d˚ ukazech P (n) a . pro S a P se vyuˇz´ıv´ a opˇet t´eto vlastnosti pro S(n) n n
XXX jak ma vypadat tento vzorec ?
Id: dynam.tex,v 1.16 2005/05/08 14:42:26 techie Exp
130
log2 (|A|) - vyhodnocen´ı f (x, A) z f (x, Ai ), i = 0, 1, ... Tedy algoritmus potˇrebuje O(log|A|Q(|A|)) ˇcasu kdyˇz Q(n) = Θ(n )pro > 0, pak plat´ı, ˇze nov´a struktura pro v´ ypoˇcet f potˇrebuje log|A| +
logn X
Q(2i )
i=0 log|A| X S(|A|) X S(2i ) i 2 ≤ |A| + 2i i 2 |A| i=0 i=0
log|A|
= |A| +
= |A| −
(11.2)
log|A| S(|A|) i S(|A|) X i 2 = |A| − ( 2) |A| |A| i=0
= O(S(|A|))
11.2.1
INSERT
Algoritmus 11.1 INSERT pro semidynamizaci (rozklad A na mnoˇziny Ai ) INSERT(x) if x 6∈ A then nalezneme nejmenˇs´ı j, ˇze Aj = ∅ end if S Aj = {x} ∪ i < jAi , Ai = ∅ pro i < j vytvoˇr´ıme strukturu S spojov´ y seznam pro Aj x pˇrid´ame do reprezentace A. Kdy se buduje znovu (tedy podruh´e) S struktura pro Aj (mˇeˇreno poˇctem INSERT˚ u) ? 1. mus´ı se naplnit vˇsechny Ai pro i¡j to je 2j − 1 u ´spˇeˇsn´ ych INSERT˚ u (ty, kter´e pˇridaly prvek) 2. provede se u ´spˇeˇsn´ y INSERT, kter´ y vypr´azdn´ı Ai pro i ≤ j 3. znovu se mus´ı naplnit Ai tj. 2j − 1 u ´spˇeˇsn´ ych INSERT˚ u 4. daˇs´ı u ´speˇsn´ y INSERT vytvoˇr´ı teprve S strukturu pro Aj tj. 2j − 1 + 1 + 2j − 1 + 1 = 2 · 2j = 2j+1 u ´spˇeˇsn´ ych INSERT˚ u. Amortizovan´ y ˇcas operace INSERT je log|A|
log|A| +
log|A| X P (2j ) X P |A| P |A| ≤ log|A| + = O(log|A| · ) j+1 2 |A| |A| i=0 i=0
Vˇ eta 11.2.2. M´ ame rozloˇziteln´y vyhled´ avac´ı probl´em f a m´ ame pro nˇej statickou strukturu, kter´ a S(n) ho ˇreˇs´ı v ˇcase Q(n), vyˇzaduje S(n) pamˇeti a vytvoˇr´ı se v ˇcase P (n), kdeQ(n), P (n) , jsou n n neklesaj´ıc´ı funkce. Pak existuje semidynamick´ a dat. struktura D, ˇreˇs´ıc´ı f v ˇcase O(Q(n) log n) vyˇzaduj´ıc´ı O(S(n)) pamˇeti a umoˇzn ˇuj´ıc´ı INSERT se sloˇzitost´ı O( P (n) n · log n).
Id: dynam.tex,v 1.16 2005/05/08 14:42:26 techie Exp
11.2.2
131
INSERT se sloˇ zitost´ı v nejhorˇ s´ım pˇ r´ıpadˇ e
N´asleduje konstrukce takov´e semidynamick´e struktury, kter´a bude podporovat INSERT se sloˇzitost´ı v nejhorˇs´ım pˇr´ıpadˇe. Pozn´ amka 11.2.3. Pokud |A| bude O( P|A| ).
P (n) n
= Θ(nε ) pro ε > 0, pak amortizovan´ y ˇcas pro operaci INSERT
M´ame mnoˇzinu A budeme m´ıt roklad A na disjunktn´ı mnoˇziny Ai,j , i = 0, 1, ..., j ∈ 0, 1, ..., kj , kde kj ∈ 0, 1, 2. |Ai,j | = 2i a plat´ı: kdyˇz Ai,0 existuje pro i > 0, pak existuj´ı Ai−1,0 , Ai−1,1 . Struktura: 1. reprezentace A (pomoc´ı (a,b)-strom˚ u, ˇcerveno-ˇcern´ ych strom˚ u, ...) 2. ∀ existuj´ıc´ı Ai,j je S struktura reprezentuj´ıc´ı Ai,j 3. ∀ existuj´ıc´ı Ai,j je spojov´ y seznam reprezentuj´ıc´ı Ai,j 4. kdyˇz Ai,0 a Ai,1 existuj´ı pro nˇejak´e i, pak je ”rozpracovan´a” S struktura pro mnoˇzinu Ai−1,ki +1 = Ai, 0 ∪ Ai,1 . tj. bylo provedeno nˇekolik krok˚ u pro jej´ı vytvoˇren´ı, ale nen´ı dokonˇcena. A ⊆ U2 , i0 ∈ N ∀i = 0, 1, ..., i0 je d´ ano ji ∈ 0, 1, 2 takov´e, ˇze ji > 0 kdyˇz i < i0 . ∀i = 0, 1, ..., i0 a ∀j = 0, 1, ..., ji je Ai,j ∈ A takov´a, ˇze |Ai,j | < 2i . Definice 11.2.1. Ai,j , i = 0, 1, ..., i0 , j = 1, 2, ..., ji je rozklad A. Pro kaˇzd´e Ai,j je d´ ana S struktura reprezentuj´ıc´ı Ai,j a spojov´ y seznam prvk˚ u z Ai,j , nav´ıc d´ana dat. struktura reprezentuj´ıc´ı A. Kdyˇz Ai,1 existuje, pak je rozpracovan´a S struktura pro Ai+1,ji+1 +1 = A1,0 ∪ Ai,1 . Pozn´ amka 11.2.4. Struktura je rozpracovan´a, jestliˇze bylo provedeno nˇekolik krok˚ u pro postavern´ı S struktury, ale jeˇstˇe nen´ı dokonˇcena. - toto je definice nov´e semidynamick´e struktury. Pamˇet’ov´e n´ aroky log|A|
|A| +
X
4S(2i )
i=0 log|A|
log|A| X S(2i ) X S(|A|) i 2 ≤ |A| + 4 2i i 2 |A| i=0 i=0 4S(|A|) X i = |A| + ( 2 ) = |A| + 4S(|A|) |A| = O(S(|A|))
= |A| +
Pozn´ amka 11.2.5. |A| - pamˇet’ pro pom. struktury Plog|A| 4S(2i ) - pamˇet’ potˇrebn´ a na S struktury i=0
(11.3)
Id: dynam.tex,v 1.16 2005/05/08 14:42:26 techie Exp
132
Algoritmus pro v´ ypoˇcet : spoˇc´ıt´ame f (x, Ai,j ) pro kaˇzdou Ai,j a pomoc´ı operace ⊕ spoˇc´ıt´ame f (x, A). ˇ potˇrebn´ Cas y pro v´ ypoˇcet A log|A|
X
log|A|
3Q(2i ) + 3 log |A| ≤ 3
i=0
X
Q(|A|) + 3 log |A| = 3Q(|A|)log|A| = O(Q(|A|) log |A|)
(11.4)
i=0
Plat´ı: Q(n) ≥ n pro nˇejak´e , pak ˇcas potˇrebn´ y pro v´ ypoˇcet f je O(Q(N )). INSERT(x) viz alg. 11.1 Algoritmus 11.2 INSERT pro semidynamizaci (rozklad A na Ai,j ) INSERT(x) if x 6∈ A then postav´ıme S-strukturu pro mnoˇzinu A0,j0 = x j0 ++ i=1 while j[i] > 0 do if S-struktura pro Ai,ji −1 nen´ı dostavˇena then provedeme dalˇs´ıch P (2i )/2i krok˚ u pro vystavˇen´ı S-stry pro Ai,ji −1 if S-stra pro Ai,ji −1 je dostavˇena then Ai−1,0 = Ai−1,2 Ai−1,1 = Ai−1,3 if i − 1 > 0 then // na vˇsech u ´rovn´ıch kromˇe 0-t´e, dojde k tom, ˇze ji = 5 // tj. S-struktura pro Ai,4 je rozestavˇena // poprv´e k tomu dojde pˇri 10. INSERTu, takˇze trpˇelivost Ai−1,2 = Ai−1,4 end if ji−1 = ji−1 − 2 Ai,ji = Ai−1,0 + Ai−1,1 provedeme prvn´ı krok pro vystavˇen´ı S-stry pro A[i,j[i]] ji ++ end if end if i++ end while if j[i − 1] > 1 a S-struktury pro Ai−1,0 a Ai−1,1 jsou dostavˇeny then Ai,0 = Ai−1,0 + Ai−1,1 provedeme prvn´ı krok pro vystavˇen´ı S-struktury pro Ai,0 ji ++ end if end if
Pozn´ amka 11.2.6. M˚ uˇze st´ at, ˇze se vytvoˇr´ı nov´a mnoˇzina A[i, j(i)], pak j(i) m´a hodnotu 5, tj. mus´ı se po dokonˇcen´ı struktury A[i + 1, j(i + 1) − 1] zmenˇsit o dvˇe hodnoty A(i, 2), A(i, 3) a i A(i, 4) (nestaˇc´ı jen pro prvn´ı dvˇe hodnoty). ˇ pro INSERT(x) je Cas
Alg. INSERT pro semidyn. byl ovˇ eˇ ren doktorem Koubkem
Id: dynam.tex,v 1.16 2005/05/08 14:42:26 techie Exp
133
log|A| X 2P (|A|) X P (2i ) ( i + 1) = 2log|A| + = 2 |A| i=0 i=0
log|A|
log|A| +
2log|A| +
log|A| 2P (|A|) 2P (|A|) 2P (|A|) X 1 = 2log|A| log|A| = O( log|A|) |A| |A| |A| i=0
(11.5)
log|A| - ˇcas pro zjiˇstˇen´ı zda x ∈ A Kdyˇz
P (n) n
≥ nε pro ε > 0, pak INSERT vyˇzaduje ˇcas O( P (n) n ).
Pˇ r´ıklad 11.2.1. XXX INSERT(x1 ) A0,0 = {x1 }
INSERT(x2 ) A0,0 = {x1 } A0,1 = {x2 } 1. krok pro A1,0 = {x1 , x2 }
INSERT(x4 ) A0,0 = {x1 } A0,1 = {x2 } A0,2 = {x3 } → A0,0 = {x3 } A0,3 = {x4 } → A0,1 = {x4 } dokonˇc´ıme A1,0 = {x1 , x2 } 1. krok pro A1,1 = {x3 , x4 }
INSERT(x5 ) A0,0 = {x3 } A0,1 = {x4 } A0,2 = {x5 } A1,0 = {x1 , x2 } P (2) krok˚ u pro A1,1 = {x3 , x4 } 2
INSERT(x3 ) A0,0 = {x1 } A0,1 = {x2 } A0,2 = {x3 } P (2) krok˚ u pro A1,0 = {x1 , x2 } 2 INSERT(x6 ) A0,0 = {x3 } A0,1 = {x4 } A0,2 = {x5 } → A0,0 = {x5 } A0,3 = {x6 } → A0,1 = {x6 } A1,0 = {x1 , x2 } dokonˇceno A1,1 = {x3 , x4 } 1. krok pro A1,2 = {x5 , x6 } 1. krok pro A2,0 = {x1 , x2 , x3 , x4 } P (4) krok˚ u 4
Vˇ eta 11.2.3. Necht’ S je statick´ a struktura pro rozloˇziteln´y vyhled´ avac´ı probl´em f a necht’ K je ”hladk´ a” funkce. Pak existuje semidynamick´ a struktura D zaloˇzen´ a na rozkladu urˇcen´em funkc´ı K, tak ˇze plat´ı: kdyˇz K = O(logn), pak ˇcas pro vyhled´ an´ı je O(KQ(n)) 1 pro INSERT je O(K(n)n K(n) P (n) ) n Kdyˇz K = Ω(log(n)), pak plat´ı: ˇcas pro vyhled´ an´ı je O(K(n))Q(n)) P (n) Pro INSERT je O( log(n) K(n) n ). log log(n)
D˚ ukaz. viz [2].
11.3
Dynamizace
Potˇrebujeme, aby struktura S pˇripouˇstˇela faleˇsn´ y DELETE (prvek pouze ˇskrtneme, ale z˚ ustane tam. faleˇsn´ y - ˇcas. ani pamˇet’ov´e n´ aroky se nezlepˇs´ı ani nezhorˇs´ı) Definice 11.3.1. Faleˇsn´y DELETE je operace, kter´a vyˇskrtne prvek z mnoˇziny - tj. umoˇzn´ı poˇc´ıtat f (x, A − {a}) (kde a je vyˇskrtnut´ y prvek) tak, ˇze ˇcasov´e n´aroky budou stejn´e jako kdyˇz nebyl ˇz´adn´ y prvek vyˇskrtnut.
Id: dynam.tex,v 1.16 2005/05/08 14:42:26 techie Exp
134
Budeme pˇredpokl´ adat, ˇze ˇcas pro faleˇsn´ y DELETE je O(n), kde n je velikost p˚ uvodn´ı reprezentovan´e mnoˇziny.
11.3.1
Reprezentace mnoˇ ziny A
Rozloˇz´ıme A na disjunktn´ı mnoˇziny Aj , j = 0, 1, ..., log|A| + 3 takov´e, ˇze bud’ Aj = ∅ nebo 2j−3 < |Aj | ≤ 2j . kaˇzd´a mnoˇzina Aj bude reprezentov´ana strukturou, kter´a p˚ uvodnˇe (kdyˇz nebyly vyˇskrtnut´e ˇz´adn´e prvky) mˇela velikost ≤ 2j . D´ale ∀Aj 6= ∅ bude d´ an spojov´ y seznam prvk˚ u v Aj . Bude d´ ana datov´ a reprezentace mnoˇziny A. Pro kaˇzd´ y prvek a v spojov´em seznamu mnoˇziny Aj bude d´ an ukazatel na prvek a v dat. struktuˇre reprezentuj´ıc´ı A a naopak. Pro kaˇzd´ y prvek v dat. struktuˇre repr. A je d´ an ukazatel na prvek a v odpov´ıdaj´ıc´ım spojov´em seznamu.
Pamˇ et’ov´ e n´ aroky
11.3.2
log|A|+3
|A| +
X
S(2i ) = |A| +
i=0
X S(2i ) 2i
log|A|+3
2i ≤ |A| +
X i=0
S(8|A|) i 2 = 8|A|
S(8|A|) i S(8|A|) X i |A| + 2 = |A| + 2 = |A| + S(8|A|) = O(S(8|A|)) 8|A| 8|A|
(11.6)
|A| - pomocn´e struktury suma - pamˇet’ pro S struktury Z´avˇer: Kdyˇz S je omezen´ a polynomem, pak pamˇet’ov´e n´aroky jsou O(S(n)). Pokud S je superpolynomi´aln´ı, pak pamˇet’. n´ aroky jsou O(S(8n)) (a plat´ı S(n) = o(S(8n))) V´ ypoˇcet f : spoˇc´ıt´ame f (x, Aj ) a pomoc´ı operace ⊕ spoˇc´ıt´ame f (x, A).
11.3.3
ˇ pro v´ Cas ypoˇ cet f Plog|A|+3
P Q(2i ) = log(n) + Q(8|A|) = O(Q(8|A|)log|A|). ( kdyˇz Q je subpolynomi´aln´ı O(Q(n)log(n)) polynomi´aln´ı O(Q(n)) Z´avˇer: ˇcas na v´ ypoˇcet f je superplynomi´aln´ı O(Q(8n)) INSERT(x) viz alg. 11.3
log(n) +
i=0
Algoritmus 11.3 Operace INSERT (f) if x 6∈ A then S j nalezneme nejmenˇ S s´ı j takov´e, ˇze | i ≤ jAi | < 2 poloˇz´ıme Aj = i ≤ jAi ∪ {x} Ai = ∅proi < j vytvoˇr´ıme S-strukturu a spojov´ y seznam pro Aj (x pˇrid´ame do struktury reprezentuj´ıc´ı A a pˇrid´ame poˇzadovan´e ukazatele) end if Pozorov´ an´ı: Kdyˇz vytv´ aˇr´ıme pˇri INSERTu S-strukturu pro Aj , pak 2j−1 < |Aj | ≤ 2j .
Id: dynam.tex,v 1.16 2005/05/08 14:42:26 techie Exp
(kdyˇz toto neplat´ı, pak pro j − 1 je splnˇena nerovnost | minimalitou j. DELETE(x) viz alg. 11.4
135
S
i < j − 1Ai | < 2j−1 a to je spor s
Algoritmus 11.4 Operace INSERT (f) if x 6∈ A then odstran´ıme x ze struktury pro A nalezneme j takov´e, ˇze x ∈ Aj (budeme zn´at pˇr´ımo m´ısto x v seznamu pro Aj ) if |Aj | = 1 then smaˇzeme Aj (odpov´ıdaj´ıc´ı S-strukturu a spojov´ y seznam) → Aj = ∅ end if if |Aj | > 1 a z´ aroveˇ n |Aj | > 2j−3 + 1 then na S strukturu pro Aj provedeme faleˇsn´ y DELETE(x), x smaˇzeme ze spojov´eho seznamu pro Aj → Aj = Aj − {x} end if if |Aj | > 1 a z´ aroveˇ n |Aj | = 2j−3 + 1 then if Aj−1 = ∅ then Aj−1 = Aj−1 − {x}, Aj = ∅ vybudujeme novou S-strukturu pro Aj−1 (x odstran´ıme ze spojov´eho seznamu pro Aj−1 − 1) end if if Aj−1 = ∅ a z´ aroveˇ n |Aj−1 | > 2j−2 then vymˇen´ım Aj aAj−1 z Aj−1 odstran´ıme x a vytvoˇr´ıme novou S-strukturu pro Aj−1 (p˚ uvodn´ı struktura mohla m´ıt aˇz 2j prvk˚ u) end if if Aj−1 = ∅ a z´ aroveˇ n |Aj−1 | ≤ 2j−2 then B = (Aj ∪ Aj−1 ) − {x} zruˇs´ıme S-struktury pro Aj , Aj−1 a vybudujeme S-strukturu a spojov´ y seznam pro B if |B| ≥ 2j−2 then Aj = B, Aj−1 = ∅ else Aj−1 = B, Aj = ∅ end if end if end if end if Pozorov´ an´ı: Kdyˇz operace DELETE buduje S-strukturu pro mnoˇzinu Aj , pak plat´ı: 2j−1 ≤ |Aj | ≤ 2j−1 .
11.3.4
Amortizovan´ yˇ cas operace DELETE
(log|A| + D(2j ) + P (2j ) = (log|A| + D(2j ) + • log|A| - zjiˇstˇen´ı zda x ∈ A • D(2j ) - faleˇsn´ y DELETE
P (2j ) P (|A|) ) = O(log|A| + D(|A|) + 4 ) j−3 2 |A|
Id: dynam.tex,v 1.16 2005/05/08 14:42:26 techie Exp
•
P (2j ) 2j−3
136
- budov´ an´ı S-struktury pro Ai
Aby DELETE znovu vytv´ aˇrel S-strukturu pro mnoˇzinu v Ai , mus´ım prov´est aspoˇ n 2j−3 operac´ı DELETE.
11.3.5
Amortizovan´ yˇ cas operace INSERT
Kdyˇz INSERT vytv´ aˇrel S-strukturu pro Ai , pak Aj = ∅ pro j < i a aby se znovu vytv´aˇrela struktura pro Ai , mus´ı platit: X 1+ |Aj | > 2j−1 j≤i
DELETE zapln´ı Aj jen do poloviny. To znamen´a, ˇze se mus´ı prov´est alespoˇ n 2j−2 INSERT˚ U, tedy amortizovan´ a sloˇzitost je O(log|A| +
X P (2i ) 2i−2
) = O(
P (|A|) logn) |A|
Pr´ace s pomocn´ ymi stukturami zabere pr´ave log|A| ˇcasu. Kdyˇz P (n) = n pro > 0, pak amortizovan´a sloˇzitost je O( P (|A|) |A| ).
Literatura [1] Mehlhorn, Kurt. (1983): Data Structures And Algorithms, Springer Verlag [2] Mehlhorn K., Overmars M. H. (XXX): Optimal Dynamization of Decomposable Searching Problems [3] Douglas C. Schmidt (1990): GPERF: A Perfect Hash Function Generator, in Proceedings ˇ anek se d´a of the 2nd C++ Conference, San Francisco, California, USENIX, pp. 87–102. Cl´ st´ahnout z citeseer. [4] Adel’son-Velskii G. M., Landis E. M. (1962): An Algorithm for the Organization of Information, Soviet Math. Dockl. [5] Topfer P. (1995): Algoritmy a programovac´ı techniky, nakl. Prometheus, ISBN 80-85849-83-6 [6] Chen Wen-Chin, Vitter Jeffrey Scott (1984): Analysis of new variants of coalesced hashing, ACM Transactions on Database Systems (TODS) archive Volume 9 , Issue 4 (December 1984) table of contents Pages: 616 - 645, Year of Publication: 1984, ISSN:0362-5915, Publisher ACM Press New York, NY, USA.
137