Kirly Zoltn
2.55 verzi
2014. jlius 3.
Tartalomjegyzk
1. Alapvet adatszerkezetek
1.1. Adatstruktrk tervezse
1.2. Lncolt lista . . . . . . .
1.3. Sor s verem . . . . . . .
1.4. Grfok . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
4
4
5
6
.
.
.
.
.
11
12
12
12
15
15
3. (Binris) Kupac
16
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
20
20
22
29
30
32
33
5. Amortizcis elemzs
34
5.1. Potencil s amortizcis id . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.1.1. Amortizcis id s a strigulzs kapcsolata . . . . . . . . . . . . . 35
5.2. Konvex burok keresse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
6. Fejlettebb kupacok
6.1. Fibonacci kupac . . . . . . . . . . . . . . . . . .
6.1.1. Szigor Fibonacci-kupac . . . . . . . . .
6.2. Prosts kupacok . . . . . . . . . . . . . . . . .
6.2.1. A prosts kupacok hatkony vltozata
6.2.2. A prosts kupacok legjabb vltozatai
6.3. r-kupacok . . . . . . . . . . . . . . . . . . . . .
6.4. Thorup kupaca . . . . . . . . . . . . . . . . . .
7. Sztrak
7.1. Binris keresfa . . . . . . . . . . . . . . . . . .
7.1.1. Mveletek ltalnos binris keresfban .
7.1.2. Optimlis binris keresfa . . . . . . . .
7.2. 2-3 fk . . . . . . . . . . . . . . . . . . . . . . .
7.3. B-fk . . . . . . . . . . . . . . . . . . . . . . . .
7.4. Piros-fekete fk . . . . . . . . . . . . . . . . . .
3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
36
37
42
42
45
45
46
49
.
.
.
.
.
.
49
51
52
54
55
58
58
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
67
67
68
68
70
71
72
73
73
74
75
76
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
84
84
86
88
88
89
92
92
93
1. Alapvet adatszerkezetek
1.1. Adatstruktrk tervezse
A programozsi feladatok megoldsa sorn elszr az algoritmus vzlatt ksztjk el,
majd a szksges adatstruktrk defincijt: milyen objektumokat akarunk trolni, s
ezekkel milyen mveleteket akarunk vgezni.
Specifikci:
A lista els elemre a listafej mutat, a lista utols elemnek mutatja pedig nem
mutat sehov (nil mutat).
Listval ltalban a kvetkez mveleteket akarjuk elvgezni: res-e?, els elem, kvetkez elem (alapmveletek). Ezen kvl: elem keresse, elem beszrsa, elem trlse. A
lpsszm az elemi mveleteknl O(1), a tbbinl ltalban O(l), ahol l a lista hossza, de
pld. az ppen megtallt elem trlse O(1) lps, s a lista elejre val beszrs (ha eltte
nem kell keresni) is O(1) lps.
Ksbb fogunk egyb lncolt lista vltozatokkal is tallkozni, pld.
listafej
nil
Hzi feladat: Lncolt listban a keress lpsszma legrosszabb esetben a lista hossza.
A beszrs 1 lps, ha tudjuk, hogy nincs benne; s a lista hossza, ha eltte ellenrizni
kell. A trls lpsszma a lista hossza; kivve, ha a lista ktszeresen lncolt s hvskor
a trlend elemre mutat pointert kaptunk, ekkor O(1) lps.
ST
1
3 6 1
ELEJE
VGE
jsor(S, n):
jtmb(ST,n)
ELEJE:=1; VGE:=0
S 6=?:
ELEJE VGE
S v:
VGE++
ST(VGE):=v
u S:
u:=ST(ELEJE)
ELEJE++
2. Ha csak egy n |S| fels becslst tudunk:
n + 1 mret tmbben ciklikusan oldjuk meg a mveleteket.
Hzi feladat: rjuk meg ezt a vltozatot.
A verem megvalstsa hasonl, itt a msodik eset is knnyen megvalsthat s nem
kell az ELEJE mutat (mivel mindig 1).
1.4. Grfok
Cl: adatstruktra egy V = {1, 2, . . . n} cscshalmaz m l grf trolsra. (Ha a
grfunk nem ilyen mdon adott, akkor feltesszk, hogy ltezik egy olyan jl szmolhat
bijektv fggvnynk, ami ilyen cscshalmazv szmozza t a grf cscsait. Ezen kvl
vagy jl szmolhat az inverze, vagy azt egy n hossz tmbben troljuk.)
7
Megjegyzs: Multigrf (olyan grf, amelyben lehetnek huroklek is, s a cscsok kzt tbb prhuzamos l is mehet) esetn:
ai,j = k, ha i-bl j-be k db prhuzamos l megy
ai,i = 2k, ha az i-edik cscson k darab hurokl van (gy az i-edik sor sszege tovbbra is a
cscs fokszma lesz).
2. llista: Egy L[1 : n] tmbben troljuk a cscsokbl kiindul leket felsorol lncolt
listk listafejeit.
L
1
nil
n
LISTAFEJEK
Az i. cscsbl legalbb 3 l megy ki: pld. a 2-es,. . . , az 5-s s a 8-as szm cscsba.
Trhely: n+m mutat (irnytatlan esetben n+2m, mivel minden l ktszer szerepel)
s m (ill. 2m) szm.
Mveletek :
Megjegyzsek.
Az lfelsorols (ltalban a leggyakrabban hasznlt) mvelet ideje kis fokszm esetn
sokkal jobb, mint a szomszdsgi mtrixnl.
Irnytott grfbl a megfelel irnytatlan G grf generlsa: vgigmegynk az leken s egy j llistba tmsoljuk az leket is s a fordtottjukat is, ez O(m) idben
megoldhat.
Multi- s slyozott grfok esetn: A lncolt listban minden gond nlkl trolhat.
Mivel egy listaelem adatrsze akrhny adatbl llhat, mg az se gond, ha az lekhez
tbb szm (kapacits, sly s hossz) is tartozik.
Irnytatlan grf esetn, ill. irnytottnl, ha a fordtott lekre is szksge van az algoritmusnak, akkor egy uv l szerepel az u cscs s a v cscs llistjn is. Sokszor hasznos
minden listaelembe egy j pointert felvenni, s az ilyen prokat egymsra linkelni. Pl.
ha u listjn megtalltuk az let, s mondjuk a hosszt vltoztatni szeretnnk, akkor
persze a v listjn a prjnak hosszt is vltoztatni kell.
Input formtumknt mg hasznlatos az mlesztett llista: az els sor az n cscsszmot
tartalmazza, utna a grf lei tetszleges sorrendben vannak felsorolva, egy sorban egy l
kezdcscsa s vgcscsa, utna esetleg az adott l slya, hossza, kltsge.
3. Mtrixban trolt llista (egyszer grfokra)
Egy n D mret mtrixot hasznlunk. A mtrix i-edik sorban felsoroljuk az i-edik
cscsbl kiindul lek vgpontjait. Ha k darab l megy ki, akkor a mtrix i-edik sorban
a k + 1-edik oszloptl a D-edik oszlopig nullk szerepelnek.
D
i 2 5 8 0 0
Nem regulris grfokra, ha az algoritmus sorn nem vltoznak, jobban megri az albbi
vltozat: a mtrix sorai vgrl vgjuk le a 0-kat, majd a sorokat fzzk egyms utn egy
T tmbbe. Kzben egy K[1 : n] tmbbe felrjuk, hogy melyik cscs llistja hol kezddik,
azaz K(1) = 1, K(2) = d(1) + 1, K(3) = d(1) + d(2) + 1, . . .. A for uv E . . . ciklus
ekkor gy nz ki: for i = K(u)..K(u + 1) 1 v := T (i); . . . . A trhely pl. irnytott
grfok esetn m + n-re cskkent.
A feladattl fggen sokszor megri, ha az akrmilyen formtumban (pl. szomszdsgi
mtrixban) kapott grfot az algoritmus elejn ilyenn alaktjuk. Fleg, ha a grfnak
lnyegesen kevesebb, mint n2 le van, s radsul egy-egy cscs llistjn az algoritmus
sorn sokszor kell vgigmenni.
Specilis esetek
Pros grfok trolsa szomszdsgi mtrix-szal: elg
sorok s a felsnek megfelel oszlopok).
Fk trolsa:
n2
4
llista
Prfer kd: Egy n cscs grf esetn n 2 darab szm (melyek 1 s n kzttiek).
Ez a trols nagyon alkalmas vletlen fk generlsra (ami egybknt nem egyszer
feladat).
Pointerekkel (gykeres fknl alkalmazzuk, ahol a felfel men let meg akarjuk
klnbztetni a tbbitl; lsd ksbb). Ha a gyerekek szmra nincs j fels korlt,
akkor a cscsban az els gyerekre mutat csak pointer, s a gyerekek egy lncolt
listban vannak.
Kupacoknl (teljesen kiegyenslyozott fk): tmbben.
11
k := 0
for i = 1 . . . n
if L(i) = 0 then k++; L(i) := k; S i
while S 6=
uS
for uv E
if L(v) = 0 then L(v) := k; S v; p(v) := u
SZ(v) := SZ(u) + 1
1. llts. Szlessgi keress esetn
1. Brmelyik idpontban az S sorban balrl jobbra a szintszm monoton n
2. Ha x, y S, akkor |SZ(x) SZ(y)| 1
Bizonyts: Idre vonatkoz indukcival.
SZ:
Ekkor x a v bettele eltt is benne volt a sorban, ami ellentmond annak, hogy u
kivtele eltt teljeslt a 2. tulajdonsg.
2. tulajdonsg:
SZ:
Ekkor is x a v bettele eltt is benne volt a sorban, ami ellentmond annak, hogy u
kivtele eltt teljeslt az 1. tulajdonsg.
3. Ttel. Szlessgi keressnl (sszefgg irnytatlan grf esetn)
1. A grf lei nem ugorhatnak t szintet, vagyis, ha uv E, akkor |SZ(u)SZ(v)| 1
2. Minden x cscsra SZ(x) az 1 cscsbl az x-be vezet legrvidebb t hossza.
14
*
v
1. Nem lehet uv tpus (lsd az brn) l a grfban, mivel amikor u-t kivettk a sorbl,
v mg nem lehetett benne a sorban, gy u tvizsglsa sorn be kellett kerlnie eggyel
nagyobb szintszmmal.
2. s 3. A 3. lltsban felrt (jobbrl balra generlt) cscssorozat valban egy t lesz, s az
1. llts miatt egy legrvidebb t is, mivel a grf lei nem tudnak szintet ugrani.
A hossza nyilvn SZ(x).
4. Jellje d(1, x) egy x cscs tvolsgt az 1-tl. Indirekten tegyk fel, hogy ltezik
olyan cscs, ami 1-bl elrhet, s ahol nem jrtunk. Legyen x az ilyenek kzl
egy olyan, amelyre d(1, x ) minimlis.
1
d(1,x*)
y
x*
Jellje az 1-bl x -ba vezet d(1, x ) hossz t utols eltti cscst y, ekkor y kzelebb van 1-hez, gy x vlasztsa szerint y-ban jrtunk, ezrt valamikor y szerepelt
a sorban. Amikor megvizsgltuk a szomszdait, akkor x -ot is megtalltuk volna.
15
2. llts. {(p(u), u)|p(u) 6= u} E(G) egy fesztfa lesz. Ha a grf irnytott, akkor a
gykrtl elfel irnytott fkat (fenyket) kapunk.
Bizonyts: Ez n 1 darab l, ha nem fesztfa lenne, akkor lenne benne kr, ez azonban
nem lehet, mert a kr cscsai kzl a sorba leghamarabb berakottnak a szlje nem lehet
egy ksbb berakott.
2.4. Ktsznezhetsg
Tudjuk (de most jra be is bizonytjuk), hogy egy grf akkor s csak akkor nem ktsznezhet, ha van benne pratlan kr. Sznezzk a grf cscsait az albbi mdon: Legyen
piros, ha SZ rtke pros s kk, ha SZ pratlan.
Mikor nem j ez a sznezs? Felhasznljuk, hogy a grf lei nem ugorhatnak t szintet.
Problma csak az egy szinten bell men lekkel lehet. Legyen egy ilyen szinten belli l
u s v kztt.
Gyenge sszefggsg: Ha eltekintnk az irnytstl, akkor sszefgg-e a grf (azaz, ha pldul a grfok lei kzlekedsi utakat jellnek, eljuthatunk-e mindenhonnan
mindenhov egy biciklin)?
16
majd mg egy szlessgi keresst a fordtott G grfban szintn 1-bl. gy sszessgben 2 szlessgi keress elegend az ers sszefggsg eldntshez, mivel G
ersen sszefgg akkor s csak akkor, ha mindkt keressben minden cscs ltott
vlik.
3. (Binris) Kupac
Egy fa kupacrendezett, ha igazak r a kvetkez tulajdonsgok:
Megjegyzs: Igazbl legtbbszr 3 tmbre van szksgnk. Az A-ban troljuk a cscsok kulcsait,
a B tmbben vagy az i-edik cscsban trolt objektum nevt, vagy a megfelel rekordra mutat
pointert, s C(j) pedig a j nev cscs (ill. rekord) indexe az A-ban s B-ben. ltalban csak az A
tmbbel val opercit adjuk meg, a tbbi kitallhat. De pldaknt a FELBILLEGTET eljrsban
megadjuk ezeket is. Persze ha a nevek nem 1 s n kztti szmok, akkor a C tmb helyett egy
sztrra van szksgnk, ld. ksbb.
17
Plda:
2
5
12
A:
10
15
2 4 5 6 7 8 9 12 10 15
Mveletek :
jkupac(A, n): egy j, res kupacot hoz ltre (n az egy idben a kupacban szerepl
elemek maximlis szma).
Beszr(A, j): egy j elemet szr be a kupacba.
Mintrls(A): a minimlis kulcs elemet kiveszi a kupacbl s visszaadja.
Kulcs-cskk(A, elem, ): a kupacban lv elem kulcst cskkenti -val. (Csak 0
esetn kell mkdnie). Az elem-et gy hatrozzuk meg, hogy rmutatunk egy pointerrel
(nem tudjuk megkeresni, mivel a kupacban nem tudunk hatkonyan keresni), azaz a
C(elem)-edik kupacelem kulcst cskkentjk.
Mveletek megvalstsa:
jkupac(A, n):
jtmb(A, n); VGE:= 0
Beszr(A, j):
tlet: nyilvn az A tmb els res helyre kell beraknunk az j elemet, ez meghatrozza, hogy a fban hov kerl az j levl. A kupactulajdonsg csak egy l mentn
romolhatott el (az j levl s a szlje kzttin). Ezen l mentn javtjuk a kupactulajdonsgot, ekkor felette egy msik l mentn romolhat el, gy ismteljk, amg mindenhol
helyre nem ll (lehet, hogy egszen a gykrig el kell mennnk).
Beszr(A, j):
VGE++
A(VGE) :=K(j)
B(VGE) :=j; C(j) :=VGE
FELBILLEGTET(A,VGE)
18
FELBILLEGTET(A, i):
AA := A(i); BB := B(i)
while i > 1 && A(bi/2c) > AA
A(i) := A(bi/2c)
B(i) := B(bi/2c)
C(B(i)) := i
i := bi/2c
A(i) := AA
B(i) := BB
C(BB) := i
Lpsszm: A fa mlysge blog nc, amibl kvetkezik, hogy a FELBILLEGTET lpsszma O(log n).
3. llts. Beszrs utn a kupactulajdonsg helyrell.
Bizonyts: gy tekintjk, hogy mindig i s szlje tartalmt felcserljk egy-egy lpsben. llts: mindig csak i s a szlje kzti l mentn lehet baj a kupactulajdonsggal.
Ez kezdetben igaz. Ha i gykr, vagy szljnek kulcsa kisebb-egyenl, akkor itt sincs baj,
teht ksz vagyunk. Klnben csere utn ezen l mentn a kupactulajdonsg helyrell,
s mivel a szlben lv kulcs cskken, a msik gyereke fel men l sem romlik el, teht
csak az j i s szlje kztti len lehet baj.
Mintrls(A): Kicserljk a gykeret s az utols elemet, majd trljk az utols
elemet. Itt kt len is elromolhatott a kupactulajdonsg. Ha cserlni kell, akkor a kt
gyerek kzl mindig a kisebb kulcsval cserlnk.
Mintrls(A):
csere(A(1), A(VGE)); VGE
LEBILLEGTET(A, 1)
return(A(VGE+1))
LEBILLEGTET(A, i):
AA := A(i); j := 2i + 1 / j a jobb gyerek
while j VGE
if A(j 1) < A(j) then j / tlltjuk j-t a bal gyerekre
if A(j) < AA then A(i) := A(j); i := j; j := 2i + 1
else j :=VGE+2 / kilpnk, kszen vagyunk
j / mg kezelnnk kell azt az esetet, ha i-nek csak bal gyereke van
if j VGE && A(j) < AA then A(i) := A(j); i := j
A(i) := AA
4. llts. Mintrls utn a kupactulajdonsg helyrell.
Bizonyts: gy tekintjk, hogy mindig i s kisebbik kulcs gyereke tartalmt felcserljk egy-egy lpsben. llts: mindig csak az aktulis i s a gyerekei kzti lek mentn
19
lehet baj a kupactulajdonsggal. Ez kezdetben igaz. Ha i-nek nincs gyereke, vagy mindkt gyereknek kulcsa nagyobb-egyenl, akkor itt sincs baj, teht ksz vagyunk. Klnben
csere utn ezen lek mentn a kupactulajdonsg helyrell, s csak az j i s gyerekei kztt
romolhat el.
Lpsszm: O(log n)
Kulcs-cskk(A, elem, ):
i := C(elem)
A(i) := A(i)
FELBILLEGTET(A, i)
Lpsszm: O(log n)
Alkalmazsok:
Rendezs: res kupacba sorban Beszrjuk az elemeket, majd sorban Mintrlnk, ez
O(n log n) lps. Az albbi, lineris idej Kupacpts segtsgvel kicsit jobb lesz. Ezt
fleg olyan esetekben rdemes hasznlni, amikor a feladat pldul az els k legkisebb elem
kiratsa (nagysg szerinti sorrendben), ekkor a futsi id O(n + k log n) lesz.
KUPACPTS (nem alapmvelet): n darab elem kupacba szervezse.
Tetszlegesen feltltjk a tmbt, majd alulrl felfel rakjuk rendbe a kupacot. A levelek j egyelem kupacok. Az egy magassg rszfk egy lebillentssel kupac-rendezett
alakthatak. ltalban, ha v gyerekeinek rszfi mr kupacrendezettek, akkor v LEBILLEGTETsvel v rszfja is azz vlik.
20
Az algoritmus:
az adatok betltse tetszlegesen az A tmbbe.
for i = dn/2e . . . 1 (1)
LEBILLEGTET(A, i)
Lpsszm: (sszes lebillentsek szma)=
3
n
0 + n4 1 + n8 2 + + 1 dlog ne n ( 14 + 28 + 16
+ ...)
2
1
2
3
a := ( + + + . . . ), knnyen lthatan ez a sor abszolt konvergens (majorlja a
P 3 i 4 8 16
3
2
mrtani sor), ezrt az a szm ltezik. Ekkor a a2 = ( 14 + 28 + 16
+ . . . ) ( 18 + 16
+
4
3
1
1
1
1
+
.
.
.
)
=
(
+
+
+
.
.
.
)
=
=
a
=
1.
32
4
8
16
2
Azaz legfeljebb n darab lebillents kell, gy O(n) elemi lps lesz a lpsszm.
Kvetkezmny: Ha n elembl a k darab legkisebbet keressk rendezve, akkor ennek a
lpsszma O(n + k log n) lesz.
Tovbbi alkalmazsok tallhatk a kvetkez fejezetekben.
T:
e1
e2
e3
21
+/- jeleket tesznk aszerint, hogy az adott l benne van-e T -ben (T az algoritmus ltal
adott fa).
Legyen T olyan optimlis fa, melyre a +/ sorozat a lehet leghosszabban megegyezik
T -vel. Legyen az els klnbsg az i. oszlopban.
1. eset (/+):
ei
T:
T*:
Ez nem lehetsges, mivel ha a T -be az algoritmus sorn nem vettk be az ei let, akkor
ei kt vgpontja ssze van ktve kisebb sorszm lekkel, azonban: j < i-re ej T , teht
ej T . Ekkor ei mr a T eddigi leivel is krt alkot, ez pedig ellentmonds.
2. eset (+/):
ei
T:
T*:
Mi lesz T + ei ? Mivel T fesztfa, ebben lesz pontosan egy C kr. Legyen ej a maximlis
index le a C-nek.
5. llts. j > i.
Bizonyts: klnben T -ben is ott lenne a C kr, hiszen T az i-nl kisebb index leken
megegyezik T -gal.
Kvetkezmny: c(ej ) c(ei )
T +ei ej fesztfa lesz (hiszen az egyetlen krbl hagyunk el egy lt). c(T +ei ej )
c(T ) = OPTIMUM. Teht T + ei ej is optimlis megolds, de ez ellentmonds, mert
ez mr az i. oszlopban is megegyezik T -vel.
Kvetkezmnyek :
1. Ha G-ben brmely kt l kltsge klnbzik, akkor egyrtelm az optimlis fesztfa.
2. Ha az sszes lehetsges j (kltsg szerint monoton nv) l-rendezst vesszk, majd
ezekre lefuttatjuk az algoritmust, akkor megkapjuk az sszes optimlis (minimlis
kltsg) fesztft.
22
n
H2
H2
H2
H2
INIT: for i := 1 . . . n
A(i) := i
Lpsszm: O(n).
HOLVAN(i): return(A(i))
Lpsszm: O(1).
D-UNI(H1 , H2 ):
for i := 1 . . . n
if A(i) = H2 then A(i) := H1
Lpsszm: O(n)
A II. FZIS sszlpsszma: O(m + n2 ) = O(n2 ).
Megjegyzs: Sr grfokra ez a j megolds.
3
1
6
1
8
1
20
1
20
INIT:
for i := 1 . . . n
A(i) := i; L(i) := 0; K(i) := i; M (i) := 1
HOLVAN(i): return(A(i))
D-UNI(H1 , H2 ):
if M (H1 ) < M (H2 ) then csere(H1 , H2 )
/ felcserljk a halmazok neveit = H1 lesz a nagyobb mret
M(H1 ):= M(H1 )+M(H2 )
i := K(H2 )
while L(i) 6= 0
A(i) := H1 ; i := L(i)
A(i) := H1
L(i) := K(H1 )
K(H1 ) := K(H2 )
Elemzs: most nem 1 darab D-UNI mvelet lpsszmt vizsgljuk, hanem azt, hogy
az algoritmus az n 1 darab D-UNI mvelet sorn sszesen hny lpst tesz.
Az elemzs mdszere a strigulzs lesz: egy tblzatot ksztnk elre, s az algoritmus minden egyes Lpsnl hzunk egy strigult a tblzat megfelel helyre. A vgn
sszeszmoljuk, hogy sszesen hny strigult hztunk s ez lesz az algoritmus Lpsszma.
A Lps konstanst gy lltjuk be, hogy egy D-UNI annyi Lps legyen, mint a
kisebbik halmaz mrete. gy egy mvelet min(|H1 |, |H2 |) Lps lesz. (Egy konkrt DUNI mvelet esetn ennek a lpsszma picit rosszabb a konstans nagyobb is lehet,
mint az elz megvalstsban.)
Strigulzs:
1
1. D-UNI
2. D-UNI
3. D-UNI
A j. D-UNI mveletnl a j. sorban i al hzunk egy strigult, ha A(i) tartalma megvltozott. gy pont min(|H1 |, |H2 |) strigult hzunk be ennl a mveletnl.
24
HOLVAN(x) : x-bl indulva mindig a szlre lpnk, mg a gykrbe nem rnk, ott
kiolvassuk a halmaz nevt. Az eddigi lustasgunk (unik egy lpsben) miatt ez nagyon
sok lps is lehet. Ilyenkor viszont inkbb mg egyszer annyit dolgozva kicsit javtunk a
fa alakjn, hogy a jvbeni HOLVAN krdseknl mr jobb legyen a helyzet.
D-UNI: r rang segtsgvel. A rang lnyegben a fa magassga lesz, pontosabban egy
fels becsls lesz a fa magassgra. Igazbl a rangokat nem csak a fkhoz (gykerekhez),
25
hanem minden egyes cscshoz hozzrendeljk, egy v cscsnl a v magassgra lesz fels
becsls. Nem gykr cscsok esetn az algoritmushoz nem, csak az elemzshez hasznljuk, teht ilyeneknl trolni sem kell. A rangokat kezdetben csupa nullra inicializljuk.
Mindig a kisebb rang halmazt ktjk t a nagyobba:
H1
H2
H2
H1
r(H1 )++
(A H1 rangjt megnveljk.)
Kitr: Egy cscs (v) mlysge: a gykrbl a v-be vezet t hossza. Egy cscs (v)
magassga: ha l a v alatt a legtvolabbi levl, akkor a v-bl l-be vezet t hossza. A fa
magassga:=gykr magassga= maxv v mlysge=:a fa mlysge.
HOLVAN javtsa: tlet: ha mr sokat kell dolgoznunk, akkor dolgozhatunk egy
kicsivel tbbet, ha ezzel a tovbbiakban idt sprolunk. (A tbbletmunka sorn kicsit
helyrepofozzuk az adatstruktrt.) Ez a mdszer a lustasg kompenzlsra szmtalan
adatstruktrnl be fog mg vlni!
26
trvidts:
Az x-tl a gykrig vezet ton minden cscs szl pointert tlltjuk a nagyszljre (kivve a gykrt s a kzvetlenl alatta lvt). Ehhez nem kell mg egyszer
vgigmenni az ton, egyszeren egy lpssel tovbb megjegyezzk a szl pointereket. Ez
a mdszer akr jobb is lehet, mint az trvidts, mivel itt elg egyszer vgigmenni a fban
a kereston. trvidts esetn pedig jabb ciklust kell kezdennk, amely megkezdse
(elksztse) idt ignyel.
Termszetesen az trvidts s az tfelezs sorn semelyik cscs rangja nem vltozik.
Az trvidts s az tfelezs elemzse
A Kruskal algoritmus n 1 darab D-UNI s m0 = 2m darab HOLVAN mveletet
vgez. Azt fogjuk elemezni, hogy sszesen hny lpsben valsthatjuk ezt meg. Most a
D-UNI O(1) lps, gy a HOLVAN mveletek idejt kell elemeznnk.
7. llts. Adott v-re r(v) az elejn 0 s monoton n. Ha v nem gykr egy adott pillanatban, akkor sose lesz az, s az r(v) mr soha tbb nem vltozik.
8. llts. r(v) < r(p(v)) (ha v nem gykr).
27
{v | r(v) = k} n .
2k
Rangcsoportok:
0
R0
R1
R2
16
R3
17
65536
R4
Csak akkor kezdnk el strigulkat hzni egy v cscs mell, ha mr nem gykr, s
a szlje sem az. Ezutn mr v rangja nem vltozik.
tfelezs/trvidts esetn, ha sem v sem p(v) nem gykr, akkor a v cscs szl
pointere egy szigoran rgebbi sre fog mutatni. gy a rang szigor monotonitsa
miatt r(p0 (v)) > r(p(v)), azaz v j p0 (v)-vel jellt szljnek rangja szigoran
nagyobb, mint az tkts eltti szlj.
Ha r(v) = r, akkor v a g := log (r)-edik rangcsoportban van.
11. llts. Ilyen strigulzsi szablyok mellett egy tetszleges g-edik rangcsoportbeli v
cscs mell legfeljebb T (g)T (g 1) strigula kerlhet g 1 esetn, g = 0 esetn pedig
maximum 1.
Bizonyts: g 1 esetn T (g) T (g 1) szm van a g. rangcsoportban. Ha mr
kerlt strigula v mell, akkor r(v) nem vltozik, mg r(p(v)) idben n. Azonban ha
a g. rangcsoporton tlntt, akkor az adott v cscs mell mr soha tbb nem hzunk
tbb strigult. Teht egy g rangcsoportbeli v cscshoz maximum T (g)T (g 1) strigula
kerlhet.
Strigulk sszeszmolsa:
N (g) jellje azt, hogy maximlisan hny cscs lehet a g-edik rangcsoportban. A 10. llts
miatt:
T (g)
X
n
1 1
n
n
n
T (g1)+1 (1 + + + . . . ) = T (g1) =
.
N (g)
r
2
2
2 4
2
T (g)
r=T (g1)+1
gy sszesen a cscsok mell legfeljebb log (n)n strigula kerlt, mivel log (n) rangcsoport
van.
Lpsszm: O(n 1 + m0 (log (n) + 1) + n log (n)) = O((n + m0 ) log (n)), ahol m0
a HOLVAN mveletek szma.
Ha a Kruskal algoritmus II. FZIST gy valstjuk meg sszefgg grfra (ekkor:
0
m = 2m > n), akkor a lpsszm O(m log (n)) lesz, ami gyakorlati szempontbl lnyegben linerisnak tekinthet. Valjban a legrosszabb esetben tnyleg nem lineris, nem
csak mi voltunk nagyvonalak az elemzsnl.
min
T : aktulis fa
S: T-nek a cscshalmaza
P := {v V S | uv E, u S}
M := V S P
A P -beli cscsokra kt dolgot tartunk nyilvn:
Az algoritmus:
INIT: P := {1}; S := ; M := V {1}; T :=
K(1) := 0; p(1) := 1
while P 6=
v legyen a P -ben minimlis K(.) rtk cscs
S v P / v-t trakjuk S -be
if p(v) 6= v then T := T + {p(v), v} / A fa megfelel lt megptjk
for vu E
30
Vgrehajtsok szma
n
m
n
31
Az algoritmus:
INIT: P := {s}; S := ; M := V {s}
K(s) := 0; p(s) := s
while P 6=
v legyen a P -ben minimlis K(.) rtk.
SvP
for vu E
if u P && K(v) + c(vu) < K(u) then
K(u) := K(v) + c(vu); p(u) := v
if u M then K(u) := K(v) + c(vu); p(u) := v; P u M
1. Definci. Egy s
S
r
h
>=0
Indirekt tegyk fel, hogy ltezik ennl rvidebb Q t, ekkor az indukcis feltevs szerint
ez nem S-t, legyen az els P -beli cscsa w 6= r. Ekkor r defincija miatt K(r) K(w),
s gy az indukcis feltevs miatt a Q t s-tl w-ig terjed rsze nem rvidebb, mint az
r-be vezet legrvidebb S-t K(r) hossza. Mivel az lhosszak nemnegatvak, a Q t w-tl
r-ig terjed rsze is nemnegatv, teht sszesen Q hossza legalbb K(r), ami ellentmond
Q vlasztsnak.
Az lltsok tbbi rsze hasonlan bizonythat.
6. Ttel. (a) Ha az S-be kerls sorrendjben veszem a cscsokat
(vi : i.-nek kerlt S-be), akkor K(v1 ) K(v2 ) K(vn ).
(b) Ha utoljra v kerlt S-be, akkor minden u P -re K(v) K(u) K(v) +
maxxyE c(xy).
32
Bizonyts: szintn indukcival, elszr (b)-t rdemes. Ha utoljra v kerlt S-be, akkor
minden u P -re K(v) K(u), mert a v-t gy vlasztottuk. A kulcsmdostsok eltt az
indukcis feltevs miatt (mind a kt rszt hasznlva) a msodik egyenltlensg is fennllt,
s kulcsmdosts kzben nyilvn nem romolhat el egyik egyenltlensg sem. Ebbl az
(a) rsz rgtn kvetkezik.
12. llts. Az x cscsba vezet egyik legrvidebb t (htulrl elre lltjuk el):
s, . . . , p(p(x)), p(x), x.
Megjegyzsek.
Figyeljk meg, hogy itt implicit outputot ad meg az algoritmus. Ha fel akarnnk rni az
sszes cscsba vezet legrvidebb utat, az akr c n2 hossz is lehetne. Ehelyett a p tmbt
adjuk ki outputknt (ami a legrvidebb utak fjnak egy lersa), melybl brmely legrvidebb
t annyi idben krdezhet le, mint az leinek a szma.
Az algoritmus mdosthat gy, hogy pld. legszlesebb, ill. legbiztonsgosabb utat keressen.
Ha a fordtott grfon futtatjuk, minden cscsbl egy adott t cscsba vezet legrvidebb utakat
keressk meg.
Ha kt klnbz slyfggvny (c1 s c2 ) adott az leken, akkor meg tudjuk keresni a c1 szerinti
legrvidebb s
t utak kzl azt, amelyik a c2 szerint a legrvidebb. Elszr futtassunk c1
szerinti Dijkstrt a grfon s-bl, s a fordtottjn t-bl. Ezutn minden v cscsra tudjuk a
d(s, v) s d(v, t) tvolsgokat. A c2 szerinti Dijkstra futtatsnl az olyan leket hagyjuk
figyelmen kvl, amelyekre c1 (uv) > d(s, t) d(s, u) d(v, t).
Ha megengedjk a negatv lhosszakat, akkor a feladat N P -nehz lesz (pld. csupa 1 lhossz
esetn Hamilton-t ltezst is el kellene dnteni).
Irnytott grfok esetn, ha brmely irnytott kr nemnegatv, akkor van msik algoritmus
(Bellman-Ford), amely helyes s polinomilis, de lassabb: O(m n).
Viszont aciklikus irnytott grfok esetn negatv lslyra is van kicsit egyszerbb, O(m) idej
algoritmus, ezt hasznljk pld. a PERT mdszerben.
Irnytatlan esetben, ha nincs negatv kr, akkor szintn ltezik polinomilis algoritmus, de az
bonyolultabb.
Elemzs
Ugyangy, mint a Prim algoritmusnl, teht szomszdsgi mtrix esetn O(n2 ) a lpsszm, llista esetn, ha valamilyen kupacot hasznlunk, akkor pedig legfeljebb n darab
Beszrs, n darab Mintrls, s m darab Kulcs-cskk kell.
33
n d logd n = m logd n
m
d =
n l m
m
d := max 2,
n
rtket rdemes hasznlni, mert d-nek egsznek kell lennie s nem akarunk 1-et.
gy a lpsszm O(m logd n). Ez ritka grf esetn (ha m c n) nem nagyon segt,
de srnl igen:
Ha m n1+ d n logd n 1/ a lpsszm: O 1 m = O(m), ha
konstans.
34
5. Amortizcis elemzs
Bemelegts: A Szmll egy egyszer adatstruktra, kt mvelettel:
INIT(n): jtmb(A, n); for i = 1..n A(i) := 0
NV(A): Az A bit-tmb tartalmt azonostjuk a bitek sszeolvassval kapott kettes
szmrendszerbeli a szmmal. Ezt kell eggyel megnvelni. Feltesszk, hogy ez a mvelet
maximum 2n 1 alkalommal lesz meghvva. A NV mveletet is knny megvalstani:
NV(A):
for i = n..1 (1)
if A(i) = 1 then A(i) := 0
else A(i) := 1; i := 0
Mennyi egy NV mvelet lpsszma? Nyilvn a legrosszabb esetben n. De mennyi
lesz tlagosan, azaz m darab NV mvelet sszlpsszma m-mel osztva?
13. llts. Egy NV mvelet tlagosan kt lpsben vgrajthat.
Kpzeljk el a kvetkezt. Minden NV hvskor kapunk kt dollrt. Ki kell fizetnnk
annyi dollrt, amennyit lpnk, teht ahny elemet trunk. Azonban ha marad pnznk,
azt betehetjk a bankba, s ksbb, ha szksges, a bankbl kivett pnznkkel is fizethetnk a lpseinkrt. Ha sose mehet le negatvba a bankszmlnk, akkor ez bizonytja,
hogy m darab NV mvelet sszlpsszma maximum 2m.
Ezt egy kicsit finomabban is csinlhatjuk: nem egy bankot hasznlunk, hanem az
A(i) cellkra rakunk dollrokat. Az a clunk, hogy minden olyan i-re legyen A(i)-n egy
dollr, amelyre A(i) = 1. Az elejn nincs ilyen cella, gy ez teljesl. Ha egy NV
mveletet vgznk, akkor az 1 tartalm rintett cellkbl felvesszk az egy dollrt s
rgtn ki is fizetjk a lpsrt. Amikor elszr rnk 0 tartalm cellhoz, akkor a kapott
kt dollrunkbl az egyiket rrakjuk a most 1 tartalmv trt cellra, a msikkal fizetnk
ezrt az utols lpsrt.
35
Ha most egy adatstruktrhoz ksztnk egy grfot, melynek cscsai a lehetsges llapotok, az lei pedig
a mveletek T I kltsggel, akkor a reduklt kltsgek pont az AI mennyisgek lesznek.
Megjegyzs: Tipikusan olyan lltsokat bizonytunk, hogy pld. egy-egy mvelet amortizcis ideje
legfeljebb O(log n), ebbl kvetkezik hogy m mvelet elvgzsnek tnyleges sszideje legfeljebb
O(m log n). De persze 1 adott mvelet elvgzsnek tnyleges ideje lehet akr c n is, ezrt az
amortizcis elemzssel garantlt lpsszm adatstruktra nem hasznos vals idej folyamatokban
(pld. egy replgp navigcis rendszertl nem azt vrjuk, hogy tlagosan gyorsan dntsn, hanem
azt, hogy minden egyes vszhelyzetre azonnal reagljon). Azonban egy algoritmus teljes futsa sorn
vgrehajtott adatstruktra-mveletek sszidejre a fentiek alapjn korrekt becslst kapunk.
Megjegyzs: Persze korrekt becslseket kapunk nemcsak az sszidre, hanem minden m0 < m esetn az
els m0 mvelet sszidejre is (a fenti pldban O(m0 log n)).
IIIIIIIII
IIIIIIII IIII
AI'
BANK
TI<AI
TI'-AI'
IIIII
AI-TI
TI'>AI' -(TI'-AI')
Kell: A bank pnze ne mehessen le negatvba. Ezt pont azzal biztostjuk, hogy megkveteljk, hogy P 0 legyen, ugyanis egy adott pillanatban a bankban lev pnz ppen az
aktulis potencil.
(x1,y1)
(x k,yk)
A tmb
36
Megolds:
I. Rendezzk a pontokat xi -k szerint (x1 x2 xn ).
Id: O(n log n).
II. Egy adott ciklusban tudjuk a p1 , . . . , pi1 pontok konvex burkt, kln troljuk
balrl jobbra rendezetten az F fels s az A als vet.
for i = 2..n
Felez keresssel az als s a fels ven vgigmenve megkeressk az ugrpontot (az
utols olyat, ami mg a p1 , . . . , pi halmaz konvex burkn is rajta van)
A s F tovbbi rszt elfelejtjk, majd vgkre rakjuk pi -t. (Ha xi = xi1 , akkor vagy pi
rajta van az utols pontok kztti szakaszon, ekkor nincs tennivalnk, vagy pl. yi nagyobb
az F utols pontjnak y koordintjnl, ekkor csak F -et kell vltoztatnunk).
Megjegyzs: F (j) az ugrpont, ha az F (j 1) s F (j) pontokat sszekt egyenes pi felett megy,
de az F (j) s F (j + 1) pontokat sszekt egyenes mr alatta.
Id: 1 pont hozzadsa legfeljebb O(log n), gy az sszid: O(n log n).
sszefoglalva: skban a konvex burok keress O(n log n) idben megoldhat.
Itt is rdemes a msodik fzist gyorstani (pld. lehet, hogy x szerint rendezve kaptuk
a pontokat).
7. Ttel. Ha a felez keress helyett jobbrl indulunk, s sorban megvizsgljuk, hogy az
adott pont-e az ugrpont, akkor a msodik fzis ideje csak O(n).
Bizonyts:
A potencil definilsa: P := |F | + |A|.
1 Lps definilsa: F-ben az ugrpont megkeresse l + 1 Lps legyen, ha F vgrl
l cscsot trltnk ki.
(Ugyangy definiljuk a Lpseket A esetn is, ekkor l0 a trlt cscsok szma). Az elemzs
alaptlete az, hogy a kitrlt cscs mr soha nem fog szerepelni.
Amortizcis elemzs: AIi = T Ii +P = ((l+1)+(l0 +1)+1+1)((l1)+(l0 1)) = 6
Azaz egy cscs beszrsnak amortizcis ideje 6. Ez azt jelenti, hogy 6n Lpsben,
azaz O(n) idben megoldhat a feladat. Az elemzs persze attl mkdik, hogy ha egy
cscsot F -bl vagy A-bl kidobunk, akkor azzal ksbb mr sose kell foglalkoznunk, hiszen
mr az aktulis ponthalmaz konvex burknak is bels pontjai. sszesen persze a kt
tmbbl kevesebb mint 2n esetben dobhatunk ki pontot.
6. Fejlettebb kupacok
A kupacokat angolul egyarnt hvjk heap-nek s priority queue-nak, azaz prioritsos
sornak.
37
Tbb kupacrendezett fbl ll, amelyekben egy cscs gyerekeinek szma nincs korltozva, s nem is kiegyenslyozottak,
a gykerek ciklikusan kt irnyban krbe vannak lncolva,
a kupacot egy H pointerrel azonostjuk, amely a minimlis kulcs gykrre mutat.
Trols:
Minden elemhez 4 pointert trolunk: szlje, bal testvr, jobb testvr, egy gyereke
(mindegy, hogy melyik gyerek: k is ciklikusan kt irnyban krbe vannak lncolva,
gy gyorsan (lineris idben) vgigjrhatjuk ket).
r(v) N: a v elem rangja (a gyerekeinek a szma).
m(v) {0, 1}: jell bit.
Mveletek:
Beszrs(H,j):
Id: O(1).
A Mintrlshez szksgnk lesz az albbi bels mveletre:
LINK(u, v) mvelet:
Ha K(u) K(v), akkor v-t ktjk u al s u rangjt nveljk eggyel, klnben u-t v al
(ebben az esetben v rangja n eggyel). Visszaad egy pointert arra a cscsra, amely gykr
maradt. Egy LINK mvelet ideje: O(1). Az 1 Lpst gy definiljuk, hogy belefrjen kt
LINK mvelet s mg nhny adminisztrcis lps.
38
Mintrls(H):
M IN := H, a vgn return(M IN ).
I. fzis: H-t kivesszk, helyre befzzk a gyermekeit, s ezek szl pointereit nil-re
lltjuk.
II. fzis: Amg ltezik 2 azonos rang gykr, addig LINK mvelettel sszekapcsoljuk
ezeket.
III. fzis: vgigmegynk a gykereken s a minimlis kulcs gykrre lltjuk H-t.
Megjegyzs: A rangra nem ktttnk ki direkt fels korltot. De magtl igaz lesz, s ezt
a vgn bizonytani fogjuk, hogy minden cscs rangja legfeljebb R = O(log n). (Emlkeztet:
n a kupacban trolt elemek szmra fels becsls.)
I. fzis ideje:
a gyerekek befzse a gykerek listjba konstans idben megy, a szl pointerek nil-re
lltsa R = O(log n) lpsben (H-nak legfeljebb R gyereke lehet).
II. fzis megvalstsa:
T segdtmb segtsgvel: T [0 : R].
T indexelse a rangokkal, T (i) rtke: mutat egy i rang gykrre, ha van az eddig
vizsgltak kztt, nil klnben.
Az algoritmus:
for i = 0 . . . R
T (i) := nil / Ez itt fontos! Minden Mintrlsnl jra hasznljuk.
for v gykerek / ld az albbi megjegyzst.
w := v
while T (r(w)) 6= nil
w :=LINK(w, T (r(w)))
T (r(w) 1) := nil
T (r(w)) := w
Id: T I = O(log n) + #LINK.
Megjegyzsek: A gykereken gy lpdelnk vgig, hogy a H pointert ideiglenesen az els fzisban
egy tetszleges gykrre lltjuk (pl. a kitrlt H bal testvrre, vagy utols gyerekre), majd H-t
egy v gykr sorravtelekor annak jobb testvrre tlltjuk. Azonban valahogy szre kell vennnk,
hogy krbertnk, s ez azrt nem egyszer, mert ciklikusan lncolt listnk van, s a kezd gykeret
pedig lehet, hogy egy LINK mveletnl kiszedtk a gykerek kzl. Taln a legegyszerbb megolds
az, hogy ha a LINK mveletet kt identikus pointerrel hvjuk, akkor kiszllunk a ciklusbl.
Egy adott ilyen LINK-elsi sorozat elemzshez clszer bevezetni egy ideiglenes Q potencilt,
legyen Q a fele a tmbben lev nil pointerek szmnak. Elg beltni, hogy erre nzve ezen algoritmus
amortizcis ideje O(log n) + #LINK. Az inicializlsnl a Q potencil legfeljebb (R+1)/2-vel n,
a Lpsek szma (R + 1)/2, teht az amortizcis id R + 1 O(log n). A fciklus egy
lefutsnak amortizcis ideje 0, ha nem vgznk LINK-elst, mivel Q fllel cskken, s a tnyleges
id bven belefr fl Lpsbe. Ha a while ciklusban k 1 db. LINK-elst vgznk, akkor a Q potencil
(k1)/2-vel n, a tnyleges id k/2, gy az amortizcis id legfeljebb k.
39
A II. Fzis vgn legfeljebb R + 1 darab gykr marad. (Minden lehetsges ranghoz
legfeljebb 1.)
III. fzis ideje: Legfeljebb R sszehasonltssal, gy O(log n) Lpsben megy.
Ezeket sszeadva: T I = O(log n) + #LINK.
1. potencil (ksbb vltoztatnunk kell mg): gykerek szma
Beszrs: AI = O(1) + 1 = O(1).
Mintrls: AI (O(log n) + #LINK) + (1 + R #LINK) = O(log n).
Megjegyzs: A LINK-elsek utn az albbi alak n. kanonikus fk (vagy msnven binomilis
kupacok) keletkeznek (mindaddig, mg csak Beszrs s Mintrls mveleteket vgeztnk).
1. rang
2. rang
3. rang
K(v):=K(v) -
if K(v) < K(H) then H := v
Kaszkd-vgs: addig vgunk, amg a szljnek jelzbitje nem 0. (Utna ezt a 0-t
1-re lltjuk, ha nem gykren van.)
v
0
v
1
1
1
1
v
y1
y2
yr(x)
41
Bizonyts:
Amikor yi az x gyereke lett (utoljra):
LINK mveletet vgeztnk, teht rangjuk egyenl volt. Teht ekkor a rangjuk legalbb i 1 volt (x-nek ekkor gyerekei voltak y1 , . . . , yi1 ), s azta yi rangja csak egyet
cskkenhetett, klnben levgtuk volna x-rl.
3. Definci. Sk jellje azt, hogy egy legalbb k-adrang cscsnak minimum hny leszrmazottja lehet (brmikor).
Megjegyzs: minden elem leszrmazottja sajt magnak. S0 = 1, S1 2.
8. Ttel. Sk
k2
X
Si + 2
i=0
Bizonyts:
x
y1
y2
S0
yi
yk
Si-2
Sk-2
Legyen = 5+1
.
Tudjuk,
hogy
2
k
k
Fk+2 , ebbl Sk .
Emlkeztet: n jelli a kupacban szerepl elemek maximlis szmt. Teht brmely
v elemnek legfeljebb n leszrmazottja lehet, gy r(v) log n 1, 44 log n. Ez lesz R
rtke.
Azaz belttuk, hogy a Fibonacci-kupaccal:
n db Beszrs
n db Mintrls
m db Kulcs-cskk
sszes ideje: O(n log n + m).
Ebbl kvetkezik:
9. Ttel. A Dijkstra s Prim algoritmus lpsszma Fibonacci-kupaccal O(n log n + m).
Megjegyzsek.
A Dijkstra-ban semmilyen adatstruktrval nem lehet ez al lemenni (mivel tud rendezni, pl.
egy csillag leire rjunk ai slyokat; msrszt sszefggsget is el tud dnteni).
A Prim-nek is ez a legjobb futsi ideje (ugyanezrt), de minimlis kltsg fesztfa keressre
m < n log n esetn ismernk gyorsabb algoritmust (rdekes mdon az is a Fibonacci-kupacon
alapul).
42
43
v
a
a
Binris fa.
A gykrnek (ami H-nak felel meg) nem lehet jobb gyereke.
Flig kupacrendezett: K(v) K(x) a v bal finak minden x leszrmazottjra.
gy cscsonknt akr 2 pointert is nyerhetnk, ha hasznljuk mg a binris fk memriatakarkos megvalstst: cscsonknt 2 pointer s 1 bit, mely azt jelli, hogy bal
vagy jobb gyerek (ez a bit egybknt is hasznos, ltni fogjuk, hogy binris fkban sokszor
fontos ez az informci).
1. pointer:
2. pointer:
Knny Hf: egy eredeti pointer szerinti mozgshoz gy kt lps (+vizsglat), s esetleg
egy harmadik kiolvass s vizsglat kell.
Vissza a prosts kupachoz: definilnunk kell mg a mveleteket.
LIN K mvelet: (ha pld. K(x) K(y))
y
y 3
x 4
a
x
LINK
Id: O(1).
44
Kupacmveletek :
Ekkor T I = O(1).
Mintrls:
vgs
8
7
2
6
3
5
v
A gykeret levgjuk, majd az j gykrtl jobbra lefel haladva minden let elvgunk. gy sok kisebb prosts kupacunk keletkezik. ssze kell LINK-elni a sztvgott
kupacokat.
A leghatkonyabb megolds: Elindulunk lefel s prosval sszeLINKeljk a kupacokat, majd ezutn alulrl felfel haladva vgznk LINK-elseket (mindig a kvetkezt az
elz eredmnyhez).
Mirt ez a legjobb? Az a rossz, ha a kt linkelend kupacnak nagyon eltr a mrete. Az
a j, ha kb. egyenl nagysgakat linkelnk, ezt prbljuk elrni. Msrszt vegyk szre,
45
hogy az els fzisban egy tfelezsnek megfelel dolgot csinlunk, melynek hatkonysgt
mr lttuk.
P
Ami bizonythat: a P = v log(#v leszrmazottai) potencillal O(log n) az amortizcis ideje minden mveletnek.
Azonban a gyakorlati futtatsok sokig azt mutattk, hogy igazbl a Kulcs-cskkentsek
tlagos ideje konstans. Fredman 99-ben megmutatta. hogy ez mgsem igaz, konstrult
olyan mvelet-sorozatokat, melyekben tlagosan log log n id kell a Kulcs-cskkentsekhez.
6.2.1. A prosts kupacok hatkony vltozata
tlet: Mg lustbban. Nem j kicsiket sokkal nagyobbakkal LINK-elni. Ezt tipikusan a
Beszrs s Kulcs-cskk mveleteknl tesszk. Ezrt ennl a kt mveletnl LINK-els
helyett egy kln segdterletre rakjuk ket.
segdterlet
Beszrs
Beszrs
. . .
Elszr a segdterleten vgznk LINK mveleteket. Prosval keletkezsi sorrendben LINK-elnk, majd jra ellrl prosval, mg az egsz segdterlet 1 kupac nem
lesz.
sszelinkeljk az eredeti s a segdkupacot.
Majd hagyomnyos Mintrls.
6.3. r-kupacok
Ha a kulcsok kis egszek, akkor tudunk jobb kupacot is csinlni. A naiv megkzelts
a vdrs kupac: ha a kulcsok egszek a [0, C] intervallumbl, felvesznk C + 1 vdrt a
kulcsokkal megcmkzve. Egy i cmkj vdrbe rakjuk az sszes olyan rekordot, melynek
kulcsa i. Ezeket egy ktszeresen lncolt listban troljuk (minden vdrhz). Beszrsnl
berakjuk a megfelel vdrbe (a lista elejre, O(1) lps), Kulcs-cskkentsnl kifzzk
(ezrt kell ktszeresen lncolt lista), cskkentjk, az j vdrbe berakjuk (ez is O(1)
lps). A Mintrlsnl a nehzsg az els nem-res vdr megtallsa, a tbbi knny,
gy a Mintrls ideje legrosszabb esetben O(C) lps. Ez gy egsz jl mkdik a Prim
algoritmusra, ha a kltsgek egszek a [0, C] intervallumbl (O(m + nC) sszes lpsben,
de ksbb sokkal jobbat fogunk csinlni). Azonban a Dijkstra algoritmushoz gy nem
igazn j, mivel ilyen kltsgek esetn a kulcsok akr (n 1)C nagysgak is lehetnek. A
Dijkstra algoritmus tulajdonsgait kihasznlva ez is levihet O(m + nC) lpsre: vegynk
nC vdrt, s vegyk szre, hogy a 6. ttel miatt kt egyms utni Mintrls esetn a
msodiknl nagyobb a minimlis kulcs, de legfeljebb C-vel. gy egy Mintrlsnl legfeljebb
C jobbra lps utn (az elz Mintrls kulcsa szerinti vdrtl indulva) tallunk nem
res vdrt. Most ezen fogunk lnyegesen javtani.
Teht legrvidebb utakat keresnk, s feltesszk, hogy az lek hossza a [0, C] tartomnybeli egszek, azaz a kulcsok a [0, (n 1)C] tartomnyban lesznek.
Monoton kupac tulajdonsgai:
Megjegyzs: a 6. ttel miatt a Dijkstrnl hasznlt kupac ezeket teljesti, teht monoton.
u2
B2
u4
u3
B3
B4
47
u5
B5
Vdrk:
B1 , B2 , . . . , Bc vdrket ksztnk. A Bi vdrhz az ui fels korltot s a range(Bi )
szmintervallumot rendeljk. Egy Bi vdrbe azokat az elemeket rakjuk, amelyek kulcsa
eleme a range(Bi )-nek.
range(Bi ) = [ui1 + 1, ui ].
K(v) := K(v)
if K(v) uj1 then kivesszk, elindulunk balra s megkeressk a j vdrt.
Mintrls:
Majd Bj minden elemt (egyesvel balra mozgatva) berakjuk a neki megfelel vdrbe, kivve v-t, amelyet trlnk.
16. llts. Ezutn Bj minden elemnek a helye Bi lesz valamilyen i < j-re, azaz a Bj
vdr kirl.
Bizonyts: Mivel a Bj eltti vdrk resek voltak, az tcmkzs leglis. Mivel a
mvelet vgrehajtsa eltt dmin range(Bj ), ezrt dmin uj 2j2 + 1. Emiatt az
tcmkzsek utn uj1 = min(uj , dmin +1+2+ +2j3 ) = min(uj , dmin +2j2 1) = uj .
gy minden elemet tnyleg balra kell mozgatni, mivel range(Bj ) res lett. Mivel Bj ben semelyik elem kulcsa nem kisebb, mint dmin , mindenkit jl el tudunk helyezni. (A
|range(Bi )| rtkek nyilvn teljestik a megkvnt fels korltokat minden i j-re, mshol
pedig nem vltoztatjuk ket.)
Amortizcis elemzs
X
A potencil : P =
b(v),
vkupac
Egy Lps legyen (elszr) 1 elem eggyel balra traksnak ideje (kivesszk, ellenrizzk,
hogy oda val-e, berakjuk).
Mveletek:
Beszrs(v): T I = (c + 1 b(v))
P = b(v)
gy AI = c + 1.
Kulcs-cskk : T I = 1 + (b(v) buj (v))
P = buj (v) b(v).
Teht AI = 1.
Mintrls: Ha B1 nem
AI = 0. Egybknt:
volt res,
X akkor nyilvn
T I = j + |Bj | + j + 1 +
j buj (u) , ahol
uBj ,u6=v
(j buj (u)) |Bj | 1, mivel (j buj (u)) 1 minden u-ra a 16. llts
uBj ,u6=v
miatt.
X
uBj ,u6=v
uBj ,u6=v
49
j buj (u)
Mivel P = j
j buj (u) , ezrt AI 1.
uBj ,u6=v
Teht
s n0 n Mintrlst vgznk,
P ha pldul
P n Beszrst, m Kulcs-cskkentst,
0
akkor:
TI
AI n (c + 1) + m + n n (log C + 4) + m darab Lps, gy
O(m + n log C) sszes futsidt kapunk (ha C 2). Teht a Dijkstra futsi ideje
[0, C]-beli egsz hosszak esetn r-kupaccal: O(m + n log C).
7. Sztrak
Legyen adott egy U univerzum s egy ezen a halmazon rtelmezett < rendezs.
Feladat: adatstruktra ksztse S U elemek trolsra. S (a pillanatnyi sztr)
minden elemt csak egyszer troljuk.
Megjegyzs: Igazbl persze legtbbszr nemcsak magt az s sztr-elemet kell trolni, hanem s
mell vagy egy pointert is az s kulcs rekordra; vagy, amennyiben ez a rekord az s-en kvl csak a
j(s) jelentst tartalmazza, akkor ezt a j(s) szt is. Ezt a tovbbiakban nem rszletezzk, de az s
helynek megkeresse pont azt jelenti, hogy ezt is meg kell tallnunk.
Mveletek :
Keress(x, S):
Knnytett: x ?S
Nehezebb: keressk meg x-et ha x S, klnben pedig N IN CS.
Ha egy sztr csak ezt az egy mveletet tudja megvalstani, akkor statikus sztrnak
nevezzk.
Ha a sztr nem statikus, akkor a msodik legfontosabb mvelet a
50
Beszrs(x, S):
Trls(x, S):
Ha x S, akkor S := S x.
Ha mindhrom mvelet megoldott, akkor az adatstruktra sztr trlssel.
Ezen mveleteken kvl az albbi mveletek is hasznos kiegsztk lehetnek:
min(S)
max(S)
Kv (S, a): visszaadja a-t, ha a S, klnben pedig a legkisebb b S sztrelemet,
melyre b a.
Tlig (S, a, b): {x S | a x b}
Fsl (S1 ,S2 ): Tudjuk, hogy S1 S2 = . Legyen S := S1 S2 .
Olvaszt (S1 , a, S2 ): Tudjuk, hogy S1 < a < S2 . Legyen S := S1 {a} S2 .
Sztvg (S, a): Sztvgja S-et olyan S1 s S2 -re, hogy S1 < a < S2 .
Sztrak megvalstsa: Ha |U | kicsi: trolhatjuk karakterisztikus vektorban pointerekkel az elemeket. Az indexek U elemei lesznek. Persze ha U nem a [0, |U |1] termszetes
szmokbl ll, akkor kell egy h fggvny, mely U elemeit ezekbe kpezi, legtbbszr ilyet
knnyen konstrulunk; de elfordulhat az is, hogy nem, ekkor sokszor rdemesebb az
ltalnos esetre vonatkoz algoritmusok egyikt hasznlni.
Mostantl feltesszk, hogy |U | nagy.
Statikus sztrak esetn: S elemeit rendezett tmbben trolhatjuk s felez keresst
hasznlhatunk. Ltni fogjuk, hogy ennl az ltalnos megoldsnl sokszor jobbat is tallunk.
x<?T[n/2]
i
x<?T[n/4]
i
. . .
. . .
. . .
51
Keress(x, r):
v := r
while bal(v) 6= nil
if x u(v) then v := bal(v)
else v := jobb(v)
if x = u(v) then return(V AN, v, bal)
nem hasznljuk
s'
52
Keress(x, r):
v := r
repeat
if x = u(v) then return(V AN, v, bal) / bal-jobb mindegy
if x < u(v) then
if bal(v) 6= nil then v := bal(v)
else return(N IN CS, v, bal)
else / x > u(v)
if jobb(v) 6= nil then v := jobb(v)
else return(N IN CS, v, jobb)
Bels
n kulcs +n rekord,
s 3n pointer
dlog(n + 1)e 1
dlog(n + 1)e sszehasonlts, de 3 irny!
Kls trolsnl: ha x
/ S, akkor megkapunk egy v levelet s egy irnyt. Ltrehozunk v helyre egy j w cscsot, az irnytl fggen x vagy u(v) tjelzvel, az
irny szerinti gyereke egy x-et tartalmaz levl lesz, a msik gyereke pedig v.
Bels trolsnl: ha x
/ S, akkor megkapunk egy v cscsot s egy irnyt (ez gy
egytt egy fiktv levl neve). Ltrehozzuk a v cscs irny szerinti gyerekt, s ebbe
a levlbe troljuk le x-et.
Trls(x, r):
1. eset Ha x-nek legfeljebb egy gyereke van, akkor a gyereke jn a helyre. Ekkor
az j fa is j keresfa lesz.
x
y
y
xy
54
Egy adott T keresfa esetn egy keress vrhat lpsszma, melyet a fa kltsgnek
hvunk:
n
n
X
X
E(keress)=c(T ):=
pi (d(ai ) + 1) +
qi d(i), ahol
i=1
i=0
d(ai ): az ai -t tartalmaz cscs mlysge; a +1 azrt kell, mert a gykr keresse sem
0 lps.
d(i): az i. (balrl jobbra szmozva) fiktv levl mlysge.
Feladat: Minimlis kltsg binris keresfa konstrukcija, azaz olyan T , amelyre c(T )
minimlis.
Megolds: Ha ak lenne az optimlis T fa gykerben:
ak
T1
a 1 ...
T2
a k-1
ak+1 ...
an
Ti,j := optimlis fa az ai+1 . . . aj szavakon. Ennek gykere ri,j , kltsge ci,j , slya pedig
wi,j := qi + pi+1 + qi+1 + + pj + qj (wi,j az a valsznsg, hogy belpnk egy Ti,j fba).
Inicializls:
Ti,i = ; ci,i = 0; wi,i = qi .
Neknk a T0,n ft kell megkeresni. Vegyk szre, hogy ha tudnnk, hogy ri,j = k, akkor
a szuboptimalits elve miatt a Ti,j fa gykernek bal rszfja Ti,k1 , jobb rszfja pedig
Tk,j lesz. Ezrt ekkor a kltsge ci,j = (ci,k1 +wi,k1 )+pk +(ck,j +wk,j ) = ci,k1 +ck,j +wi,j
55
lesz, mivel a Ti,j fban minden cscs mlysge eggyel nagyobb, mint a Ti,k1 , ill. a Tk,j
fkban. Vegyk szre, hogy a kltsgben wi,j lland, nem fgg a k-tl.
Ezek alapjn knnyen kszthetnk egy rekurzv algoritmust:
R(i, j) :
:=
for k := i + 1 . . . j
C1 := R(i, k 1)
C2 := R(k, j)
if C1 + C2 < c0i,j then c0i,j := C1 + C2 ; ri,j := k
return(ci,j := c0i,j + wi,j )
Ez az algoritmus azrt exponencilis, mert ugyanazt a dolgot sokszor szmoljuk
ki. A hvsok szma az n. Catalan-szm lesz, ami kb. cn1n 22n . Hogy ezt elkerljk,
dinamikus programozssal fogjuk megoldani a feladatot.
c0i,j
a4
q3
a6
q4
q5
q6
Az algoritmus (a fenti Inicializls utn), az argmin itt azt a k rtket adja vissza, amelyre
a min felvtetik:
for l = 1 . . . n
for i = 0 . . . n l
j := i + l
ci,j := wi,j + mini<kj (ci,k1 + ck,j )
ri,j := argmini<kj (ci,k1 + ck,j )
3
Id: O(n ).
7.2. 2-3 fk
Definci (2-3 fa):
Teht egy v cscsban troljuk a p(v) szl pointeren kvl a bal(v) bal gyerekre mutat
pointert, az u1 (v) els tjelzt, a koz(v) msodik gyerekre mutat pointert, az u2 (v)
msodik tjelzt s a jobb(v) harmadik gyerekre mutat pointert (nil, ha csak kt gyereke
van). Itt u1 (v) egy tetszleges olyan elem, hogy a bal gyerek alatti minden levlben
szerepl KULCS u1 (v), de a msodik gyerek alatti minden levlben a KULCS > u1 (v).
Az u2 (v) szerepe hasonl, ha csak kt gyerek van, akkor rtke az univerzum legnagyobb
eleme.
Egy v levlnl jellje u(v) az ott trolt rekord (sztrbeli) kulcst.
Keress(x, r):
v := r
while bal(v) 6= nil
if x u1 (v) then v := bal(v)
else if x u2 (v) then v := koz(v)
else v := jobb(v)
if x = u(v) then return(V AN, v)
else return(N IN CS, v)
Ez mindig legfeljebb O(log n) lps lesz, mivel a fa mlysge nyilvn legfeljebb log n.
Beszrs(s, r):
x
Megkeressk, hogy hov kell beszrni s-et, jellje x a keressi ton az utols nemlevl cscsot, azaz p(v)-t.
Ha x-nek 2 gyereke volt, akkor beszrjuk s-et, s gy x-nek 3 gyereke lesz, de x-ben
tlltjuk az tjelzket (mshol nem kell Hf).
Ha x-nek 3 gyereke volt, akkor sztszedjk x-et 2 darab 2 gyerekes csccs.
x1
x2
Ha x szljnek 2 gyereke volt, akkor nincs gond (csak ott kell tjelzket lltani),
ha 3, akkor ezt a cscsot is sztvgjuk s gy folytatjuk a gykr fel. Ha eljutunk a
gykrig s a gykrnek 3 gyereke volt, akkor a gykeret is kettszedjk, beszrunk
egy j gykeret, s gy n a fa magassga.
Id: O(log n)
57
Ehhez csak azt kell szrevennnk, hogy egy aktulis x kettszedsnl tudjuk, hogy ki
a szl, x neki hnyadik gyereke, s magban x-ben tudunk (ideiglenesen) 3 elhatrol
tjelzt s 4 gyerek-pointert. Ezekbl knnyen konstans idben kiszmolhat a sztszeds
utni llapot a szl j 3 tjelzjvel egytt.
Trls(s, r):
Itt pl. u2 (y) j lesz j tjelznek p(x)-ben y s x kz, x pedig rklheti p(x)
megfelel tjelzjt.
2. Ha nem ltezik, akkor x-et sszevonjuk valamelyik szomszdos (s gy ktgyerekes) testvrvel.
y
y
x
Lehet, hogy ekkor az j x szljnek lesz csak 1 gyereke, teht felfel folytatni
kell. Hogyan r vget az algoritmus?
A szl 3 gyerekes volt, s most kett maradt neki, ekkor megllhatunk.
Sikerlt elkrnnk egy 3 gyerekes szomszdos testvr egy gyerekt, ekkor
is megllhatunk.
Feljutunk egszen a gykrig, trljk az 1 gyerekes gykeret s gy cskken
a fa magassga.
Hzi feladat meggondolni, hogy ez is megy O(log n) idben, minden lehetsges esetben
knny lltgatni az tjelz tblkat s a pointereket.
58
7.3. B-fk
Tulajdonsgai:
l m
B
2
l m
B
2
).
Kls traknl hasznljk: Ezek a trolk 1 olvass sorn egy egsz lapot olvasnak
be. Az tart sok ideig, mg a fejet a megfelel lapra pozicionlja a vezrls. Az a cl, hogy
minl kevesebb lapot kelljen olvasni ahhoz, hogy megtalljuk a troln keresett adatot.
gy rdemes B-t megvlasztani, hogy a B 1 tjelz s B pointer elfrjen egy lapon. s
persze a levelekben sem egy, hanem annyi egyms utni rekordot trolunk, amennyi rfr
egy lapra.
Plda: Tegyk fel, hogy egy lapra rfr 31 kulcs s 32 pointer, illetve 10 rekord. Ekkor
ha n = 10 232 43 millird s B = 32, akkor a fa mlysge legfeljebb 8 lesz. Ha a fels 4
szintet a memriban troljuk (ez maximum 323 + 322 + 33 = 33825 lap), akkor minden
mvelet legfeljebb 5 lapolvass lesz (azaz legfeljebb 5-szr kell olvasni a winchestert).
7.4. Piros-fekete fk
Eredetk : Binris faknt trolt 2-4 fk:
x
fekete
piros
Tulajdonsgai:
0.
1.
2.
3.
Bill(x )
C
A
Knny vgiggondolni, hogy ha egy ltalnos binris keresfra alkalmazunk egy Billents mveletet, akkor jra binris keresft kapunk. Azonban piros-fekete fknl ez
nem mindig lesz j, elronthatja a 2. s 3. tulajdonsgokat. Radsul egy kicsit elrontott
piros-fekete fra akarjuk alkalmazni, ami azt jelenti, hogy egyetlenegy cscsra megengedjk, hogy a 2. tulajdonsg ne teljesljn. Gondoljuk meg, hogy a kvetkez kt esetben a
Billents ilyenkor is alkalmazhat.
i) Ha y = p(x) s x is piros. Ekkor a 3. tulajdonsg nyilvn egy cscsra sem romlik el,
s tovbbra is csak egy helyen nem fog a 2. tulajdonsg teljeslni.
ii) Ha y fekete, x piros, de x testvre s y felli gyereke (az brn a B rszfa gykere)
fekete. Ekkor azonban mg t is kell sznezni x-et s y-t, hogy teljesljn a 3. tulajdonsg.
Lsd az brn, knny leellenrizni, hogy ezutn a 3. tulajdonsg valban megmarad, a
2. se romlik el sehol, st, ha x-nek a baloldali a nev gyereknl volt elrontva, akkor az
meg is javul.
y
Bill(x )
a
C
piros
a
A
fekete
60
Beszrs(s, r): A beszrs egy fekete szn x fiktv levl (amit a Keress(s, r) visszaad)
helyre trtnik, alatta ltrejn kt j fekete fiktv levl. Ezt a cscsot (x-et) pirosra kell
szneznnk a 3. tulajdonsg fenntartsa miatt.
y
y
x
Akkor van problma, ha a beszrt x elem y szlje piros szn ha fekete, vagy nem
ltezik (x az elsnek beszrt cscs ekkor feketre sznezzk), akkor kszen vagyunk.
Ezen bell hrom esetet klnbztetnk meg:
y
x
y
x
Bill( y)
D
C
A
x
y
x
x
D
Bill( x)
C
B
61
Bill( x)
17. llts. A 2a. esetben tett billents, ill. a 2b. esetben tett dupla billents utn rendben
van a fa.
sszefoglalva: Egy Beszrs(s, r) legfeljebb log n tsznezs s legfeljebb 2 Billents mvelettel megvalsthat.
Trls(s, r): Elszr vgrehajtjuk a hagyomnyos trlst, mely egy esetleges csere utn
trli ki az s cscsot, amelynek legfeljebb 1 gyereke van (jellje ezt x; ha nincs gyereke,
jellje x a helyre kerl fiktv levelet). Ha s piros volt, akkor kszen is vagyunk. Ha s
fekete, s a helyre kerl x piros, akkor x-et tsznezve feketre szintn kszen vagyunk.
Az alfejezet elejn tett () megjegyzs miatt, mindig ez az eset ll fent, ha s nem valdi
levl volt.
Teht az az eset maradt, amikor s egy fekete valdi levl. Ekkor egy x fiktv levl
kerl a helyre. Jelljk z-vel a trls utn x szljt, s y-nal a trls utn x testvrt (ez nyilvn ltezik, s nem fiktv levl). Sajnos z-bl az x fel lefele vezet utakon
eggyel kevesebb fekete cscs van, mint az y fel lefele vezet utakon. Ekkor x-et tekintjk
problms cscsnak, neki ktszeresen feketnek kellene lennie, hogy a tulajdonsgok teljesljenek. Ezrt adunk neki egy fekete pontot. Ezt a fekete pontot prbljuk meg felfele
vinni, ha felvittk egy piros cscsba, azt feketre sznezzk s lellhatunk. Ha pedig felr
a gykrbe, s az fekete, akkor elfelejthetjk (ekkor a fa fekete magassga eggyel cskken).
1. eset: y piros. Ekkor z is s y gyerekei is feketk. Bill(y) utn mr x j testvre
fekete, gy folytathatjuk a kvetkez esettel, de most mr x szlje biztosan piros.
z
y
y
z
Bill( y)
A
B
C
A
z
y
A
B
2b. eset: y-nak az x-szel ellenttes oldalon lev w gyereke piros. Ekkor Bill(y) utn w-t
feketre sznezve (valamint y s z sznt felcserlve) kszen vagyunk.
62
y
y
w
x
Bill(y)
A
B
A
C
2c. eset: y-nak az x-szel ellenttes oldalon lev gyereke fekete, a msik, a gyereke piros.
Ekkor egy Bill(a) segtsgvel visszavezetjk az elz esetre.
z
z
y
Bill(a)
D
B
18. llts. Legfeljebb O(log n) vizsglat s felfele lps utn legfeljebb 3 Billentssel megoldhat a mvelet.
Ehhez csak azt kell szrevenni, hogy egyedl a 2a. eset utn kell felfel folytatnunk,
s csak akkor, ha z fekete volt. Az els eset utn (s persze a 2b., 2c. esetek utn) nem
kerlnk ebbe a rszesetbe.
Binris keresfa,
m(v) a v cscs magassga, m(f ) = 1, ha f fiktv levl,
x : |m(bal(x)) m(jobb(x))| 1.
63
Mveletek :
Beszrs(s, r): Beszrjuk s-et, majd megkeressk a legkzelebbi x st, ahol a 3.
tulajdonsg elromlott; kzben persze a fenti jelzbiteket megfelelen tlltjuk. Majd itt
egy szimpla vagy egy dupla billentssel a tulajdonsg helyrellthat az albbi mdon:
1. eset: s az x bal-bal, vagy jobb-jobb unokjnak a leszrmazottja
y
x
y
x
Bill(y)
C
B
B
s
s
Bill(s)
Bill(s)
s
Bill(z)
z
Bill(z)
D
B
A
C
D
s
s
y
y
z
1. Billents(y)
D
C
A
2. Billents(x)
B
C
z
y
y
x
1. Billents(x)
D
A
B
2. Billents(x)
Felbillegtet(x):
while p(p(x)) 6= nil
Dbill(x)
if p(x) 6= nil then Bill(x)
A felbillegtets felttelezett hasznossga hasonlt az tfelezsre. Ha x mlysge h volt,
akkor Felbillegtet(x) utn x minden leszrmazottjnak mlysge bh/2c-lel cskken. Ms
cscsok mlysge egy alkalommal akr 2-vel is nhet, de mivel ekkor x leszrmazottjv
vlnak, ezrt ezutn mr minden tovbbi dupla billentsnl cskkenni fog.
Az albbiakban a vesszs mveletek az j mveletek, a vessztlenek a hagyomnyos
binris fban vgrehajtott mveletek.
Keress(x, r):
Keress(x, r)
IF x nem fiktv levl THEN Felbillegtet(x) ELSE Felbillegtet(p(x))
Beszrs(x, r):
Beszrs(x, r)
Felbillegtet(x)
Trls(x, r):
z := p(y), ahol y az x megelzje (lsd az ltalnos trlsi algoritmust)
(y = x, ha x-nek legfeljebb 1 gyereke van)
Trls(x, r)
Felbillegtet(z)
Id: Mindhrom mvelet tnyleges ideje nagyjbl ktszerese a Felbillegtet tnyleges
idejnek. A Lpst elszr gy vlasztjuk meg, hogy annyi elemi lpst tartalmazzon,
65
mint egy dupla billents, s ezzel kielemezzk a Felbillegtet mvelet amortizcis idejt.
Majd vgl megduplzzuk a Lps konstanst, ekkor egy mvelet tnyleges ideje legfeljebb
2+ a Felbillegtetsnl vgrehajtott (dupla vagy szimpla) billegtetsek szma.
Potencil :
x slya: w(x) := x leszrmazottainak szma (sajt magt is belertve)
x rangja: r(x) := blog
P w(x)c
A potencil: P := r(x)
11. Ttel. AI(Felbillegtet(x)) 1 + 3 (r(gykr) r(x)) 1 + 3 blog nc = O(log n).
Bizonyts: Beltjuk minden egyes billent lpsre, hogy teljesl a fenti llts megfelelje. sszeadva ezeket egy teleszkpikus sszeget kapunk, amelybl minden tag kiesik,
kivve 1+3(r(gykr)r(x)). A tovbbiakban r jelli a billents eltti, mg r0 a billents
utni rangot.
1. Szimpla billents: (y = p(x) gykr):
AI 1 + 3 (r(y) r(x)).
y
1. Billents(x)
C
A
r'
1. Billents(y)
D
C
A
2. Billents(x)
B
C
66
y
x
1. Billents(x)
D
A
B
2. Billents(x)
67
8. Hash-els
Cl : A sztrmveleteket akarjuk megvalstani gy, hogy tlagosan j megoldst kapjunk. Ehhez elszr is egy olyan h : U [0, 1 . . . M 1] fggvnyt keresnk, amely
az x U elemekre ad egy cmet. A clunk az, hogy ezen a cmen troljuk x-et. M -et
N
.
tblamretnek hvjuk, N pedig az aktulisan trolt adatok szmt jelli; s := M
Az az egyik intuitve nyilvnval cl, hogy a h fggvny egyenletesen tertse szt az
inputokat, vagyis Pr(h(x) = i) M1 legyen minden i < M szmra. Ha itt a valsznsg
az univerzumon egyenletes eloszls szerint rtend, akkor errl persze ltalban knny
gondoskodni. Azonban itt a valsznsget az inputnak rkez kulcsokon kell rteni,
amelyeken egy (ltalban elttnk csak legjobb esetben is krlbell ismert) eloszls van,
amely szerint rkezni fognak. Az elemzsekben fel fogjuk tenni, hogy sikerlt olyan hash
fggvnyt tallni, amelyre a Pr(h(x) = i) = M1 felttel () teljesl. Persze az igazi vletlen
nem j, minden K kulcsra s minden vgrehajtskor h(K)-nak ugyanazt az rtket kell
visszaadnia. Azonban ez a megkvnt vletlenszersg se garantl nmagban tl nagy
sikert, mint azt a jl ismert szletsnap paradoxon mutatja.
A
W
Szemlltets: egy egysgnyi kerlet krn K-szor mrem fel egyms utn -t.
2
6
5
A
W
51
2
legyen.
3. ltalnos:
Tulajdonkppen brmilyen, gyorsan szmolhat lvletlenszm-genertor megfelel.
nil
h(K)=i
nil
M-1
LISTAFEJEK
Id:
CN0 : a sikertelen keress vrhat lpsszma, ahol h(K) = i pontosan M1 valsznsggel minden i-re. (Megjegyzs: az (N + 1)-edik elem beszrsa lpsszmnak is ezt
tekinthetjk.)
CN : a sikeres keress vrhat lpsszma, ha minden trolt elemet N1 valsznsggel
keresnk. Ennek becslshez mr fel kell tennnk, hogy a Beszrsoknl igaz volt, hogy
a beszrand kulcsokra Pr(h(K) = i) = M1 teljesl minden i-re. (A ksbbi elemzseknl
a CN0 becslshez is fel kell ezt tenni a rgebben Beszrt kulcsokra is, itt mg nem.)
Emlkeztet: =
N
.
M
2
CN =
1+
=1+
=1+
=1+
1+ .
N
M
N i=1
M
NM
2M
2
i=1
A ksbbiekben szksgnk lesz mg az albbi kvetkezmnyre is:
E
X
ki2 = 2 E
X
ki (ki + 1)
2
=N+
X
E
ki = 2 E
N
X
j=1
N2 N
< (1 + ) N.
M
70
!
j
N =
egyszer,
mindig tudunk j elemet berakni, azaz nem telik be (amg tudunk helyet foglalni a
memriban),
a nagyon sok elemet tartalmaz vdrbe nem megy nagyobb valsznsggel elem,
mint egy res vdrbe,
knny trlni,
ha pldul 1, akkor CN 1, 5 s CN0 2,
kls tras megoldsknt kifejezetten j. Ekkor a listafej tmb a memriban van,
a pointerek a kls tr lapjaira mutatnak, s egy lapon annyi rekordot trolunk,
amennyi elfr (meg egy pointernek is kell hely!). Pldul ha egy lapra 10 rekord fr
s -t 8-nak vlasztjuk, akkor a lapelrsek vrhat szma sikeres keressnl 1.4,
beszrsnl 1.8 alatt marad.
Ha sokkal tbb keress van, mint egyb mvelet, akkor clszer lehet a lncolt
listkat valamilyen rtelemben rendezve trolni.
Ha kulcs szerint nvekven rendezve troljuk, az a sikertelen keresseket gyorstja meg, ha a lncban nagyobb kulcsot talltunk, mint a keresett, akkor
megllhatunk.
Ha tudjuk a keressi valsznsgeket, s ezek szerint cskken sorrendben
troljuk a rekordokat, akkor a sikeres keressek vrhat ideje lesz kisebb.
Ha ezeket nem tudjuk, de feltesszk, hogy egy idben lland eloszls ltal
determinltak, akkor rdemes mindig a megtallt rekordot a lista elejre rakni.
Ha az ismeretlen eloszls idben is vltozik, akkor a legjobb recept az, hogy a
megtallt rekordot cserljk fel a megelzvel (lsd a [4] knyvben).
Htrnya:
M-1
71
h(K)
Elny:
Gyors s egyszer.
Lpsszmok : CN = 21 1 +
CN s CN0 nhny rtke:
1
1
CN
CN0
s CN0 =
1
2
2
3
1.5
2.5
2
5
1
2
1 2
1 + ( 1
) .
0.8
3
13
0.9
5.5
50.5
Htrnyok :
Ha kialakul egy hossz teltett rsz (lnc), akkor nagy annak a valsznsge, hogy
a kvetkez elem is ebbe a lncba rkezik.
A lncok ssze tudnak nni (teht nagyon rzkeny a j h vlasztsra, az ismeretlen
input eloszls korrelcii is fontosak).
72
Ez azonban nem olyan nagy baj, ha amortizlt idben szmolunk. St, rdemes mr
pl. N M/2 esetn j, ktszer akkora tblt nyitni.
Gondoljuk meg az albbiakat (erre a gondolatmenetre mg szksgnk lesz ksbb
is). Ha a vgs tbla mrete M , akkor N M/4. Az sszes tblnk egyttesen
2 + 4 + . . . + M < 2M 8N helyet foglal el. A beszrsok sszes szma (belertve az
j tblkba val beszrsokat is) legfeljebb N plusz a kisebb tblamretek sszegnek
(2 + 4 + . . . M/2 < M ) fele, ez pedig legfeljebb M/2 + N 3N . Teht egy elemet
tlagosan maximum hromszor szrunk be (egy maximum 50%-os teltettsg tblba).
Egy j tblba val tpakolskor persze a rgi tbln vgig kell menni, hogy sszeszedjk
az addig beszrt elemeket, de ez is csak 2 + 4 + . . . + M/2 < M 4N lps.
Ennl a mdszernl mg elg egyszeren lehet trlni.
Trls: Az okoz gondot, ha a ksbbiekben egy olyan K 0 -t keresnk, hogy K 0 a trlt
elem felett (ciklikusan rtend!), h(K 0 ) pedig alatta van.
K'
K1
trlt
h(K')
Megolds: Elindulunk a trlt elemtl felfel. Ha gondot okoz K 0 elemet tallunk, azt
nyugodtan trakhatjuk a trlt elem helyre, s K 0 eredeti helyt tekintve trlt helynek,
rekurzvan folytatjuk az eljrst. Ha viszont elrnk egy res helyet, akkor nyugodtan
megllhatunk, mindent rendbe raktunk.
A*K
1
Lpsszmok : CN = 1 ln 1
s CN0 =
CN s CN0 nhny rtke:
CN
CN0
1
2
h(K)
1
.
1
2
3
0.8 0.9
1.39 1.65 2.01 2.56
2
3
5
10
Megjegyzs: Ez egy elg j mdszer (ha h s h0 teljestik a feltteleket), ennl sokkal jobbat nem
is igen vrhatunk a nylt cmzseken bell.
Trls dupla hash-elsnl : Az elz trkkt itt nem alkalmazhatjuk. Amikor trlnk
egy elemet, akkor egy specilis szimblumot helyeznk el a helyre, ami azt jelli, hogy az
adott elem trlt. A beszrsnl ide beszrhatunk, de a keressnl tovbb kell lpnnk.
Az a problma, hogy sok trlsnl gyorsan megtelik a tbla ilyen szimblumokkal.
ai xi mod M =
ai yi mod M
1
,
M
ha
75
CN0
M
X
k Pk = M + 1
k=1
M
X
M
X
(M + 1 k) Pk =
k=1
M k
M
M +1
(M + 1 k)
=
M N 1
N
k=1
M
X
M +1k
M
M +1
(M N )
=
M
N
N
k=1
M +1
M
M + 1 (M N )
=
M N +1
N
M +1
M
M + 1 (M N )
=
N
N
M +1
M +1
=
=
M + 1 (M N )
M N +1
M N +1
N
1
1+
= 1 + + 2 + 3 + . . .
M N +1
1
Ez alapjn a sikeres keress vrhat lpsszma is meghatrozhat a lncolt hashelsnl ltott alapelv alapjn:
N 1
M +1
1
1
1
1
1 X 0
C =
+
+
+ +
=
CN =
N k=0 k
N
M +1 M
M 1
M N +2
M +1
1
1
(HM +1 HM N +1 ) ln
,
N
1
ahol Hn a termszetes szmok reciproksszege n-ig, amirl ismert, hogy Hn ln n + ,
ahol az Euler-lland.
A vgs struktra gy fog kinzni, hogy egy 0-tl (M 1)-ig indexelt T tmbben
nem lncfejek lesznek, hanem az i. sorban nhny szm, s egy link egy Ti hash-tblra,
melynek mrete Mi ki2 . A Ti tbla fogja tartalmazni a lncolt hash-elsnl az i. lncba
P i (i) (i)
aj xj mod Mi hashkerlt elemeket. Ezekbe a tblkba jabb univerzlis hi = rj=0
(i)
k1
Elszr is felrjuk i-t a C + b alakban, ahol a, b < 22 . Ez valjban egy egyszer
mvelet: a lesz i els 2k1 bitje, mg b a msodik 2k1 bitje. Ezutn egyszeren az also(a)
pointer ltal mutatott k 1 tpus vEB struktrban keressk rekurzvan a b szmot. A
78
felso struktra a Kv mvelethez kell: azon a szavakat tartalmazza, melyekre also(a) nem
res.
Analgia: kpzeljnk el egy 2k mlysg teljes binris ft, melyben a bal gyereknek
a 0 bett, a jobb gyereknek az 1 bett feleltetjk meg. Ekkor a levelek felelnek meg az
univerzum elemeinek. A tbbi cscsba a leszrmazott levelek kzl a sztrelemek (nem
res levelek) szmt, minimumt s maximumt rjuk. A Keress s Kv mveleteknl, a
paramterknt kapott szhoz (levlhez) vezet ton binris keresst vgznk, ez k lps.
Ez mg magban nem j, egy elem Beszrsakor pl. az t minden cscsn (2k db) kellhet
adatot frissteni. A rekurzv definci s az els megvalsts utni trkk pont ezt hivatott
kijavtani. Vglis egy bels cscsban ktfle hozztartoz rszfa (felso s also) adatait is
trolnunk kell. s mindkett fajtbl tbb, klnbz mlysgre is szksgnk lesz.
A fentiek alapjn az els rekurzv megvalstsunk a kvetkez. Legyen T egy troland vEB struktrra mutat pointer. A struktra tpust a msodik paramterben adjuk
meg. Egy p pointer ltal mutatott struktra max vltozjt p.max-szal fogjuk jellni, s
persze hasonlan a min s meret vltozkat is.
Kv(T, l, i):
l1
G := 22 ; i = a G + b
if also(a).max b then return(a G+Kv(also(a), l 1, b))
else c :=Kv(felso, l 1, a + 1)
return(c G+also(c).min)
Ha a Kv eljrst meghvjuk egy k tpus struktrra, O(1) lpst tesznk, plusz egy
darab rekurzv hvs egy k 1 tpus struktrban. Ez nyilvn a kvnt O(k) lpst adja
sszesen.
Beszrs(T, l, i):
l1
G := 22 ; i = a G + b
if also(a).meret= 0 then Beszrs(felso, l 1, a)
Beszrs(also(a), l 1, b)
T.meret, T.max, T.min frisstse
Trls(T, l, i):
l1
G := 22 ; i = a G + b
Trls(also(a), l 1, b)
if also(a).meret = 0 then Trls(felso, l 1, a)
T.meret, T.max, T.min frisstse
A Beszrsnl az utols sor vgrehajtsa nyilvnval, a Trlsnl a rsz-struktrk
trls utni rtkeibl minden knnyen szmolhat, pl. T.min=also(felso.min).min. Sajnos ezen kt utbbi mveletnl a konstans lps mellett KT darab rekurzv hvs is lehet
legrosszabb esetben, ez pedig csak O(2k ) lpsszmot garantl.
A kijavtshoz elszr is szrevesszk, hogy amikor kt rekurzv hvs van, akkor az
egyik vagy egy res struktrba beszrs, vagy egy 1-elembl val trls. Ezeket kellene
rekurzv hvs helyett konstans idben megvalstani. A kvetkez, meglepen egyszer
79
trkk segt: a min vltozban trolt szt nem troljuk a rsz-struktrkban! Ez persze
egy picit elbonyoltja a fenti kdokat, de mivel garantltan csak egy rekurzv hvs lesz
mindig, ezrt kiadja az O(k) lpsszmot.
Kv(T, l, i):
l1
G := 22 ; i = a G + b
if i min then return(min)
if also(a).max b then return(a G+Kv(also(a), l 1, b))
else c :=Kv(felso, l 1, a + 1)
return(c G+also(c).min)
Beszrs(T, l, i):
if meret= 0 then meret:= 1; max:=min:= i; return
if min> i then csere(min, i)
l1
G := 22 ; i = a G + b
if also(a).meret= 0 then Beszrs(felso, l 1, a)
Beszrs(also(a), l 1, b)
T.meret, T.max frisstse
Trls(T, l, i):
if meret= 1 then meret:= 0; return
l1
G := 22
if min= i then i :=min:=felso.minG+also(felso.min).min
i=aG+b
Trls(also(a), l 1, b)
if also(a).meret = 0 then Trls(felso, l 1, a)
T.meret, T.max frisstse
Ltszlag itt is megmaradt a kt rekurzv hvs, azonban az egyik nem eredmnyez
tovbbi rekurzv hvsokat s konstans idben vgrehajtdik.
Megjegyzs: a 0 tpus struktra maximum kt elemet trol. Erre elg a max s min, gy ezekhez
nem tartoznak pointerek (rszstruktrk). Persze a kdba is bele kellene rni ezt a kivtelt...
mret 2-re n, de mg ezzel is tbb baj van. Egyrszt ilyenkor mennyi a futsi id? Mit
csinlunk trlskor, ha egy rszstruktra mrete 1-re cskken? Ha trljk, akkor lehet,
hogy ugyanazt sokszor kell jra inicializlni, ha meg nem, akkor a trhelynk lehet tl
nagy az aktulisan trolt elemek n szmhoz kpest.
Egy c < 2t termszetes szmhoz rendeljk hozz a ct {0, 1}t szt, mely a c binris
alakja az elejn elegend szm 0-val. Egy-egy troland vEB struktrhoz hozzrendelnk egy (ct , l) nevet. (ct , l) egy l-tpus vEB struktra neve, ha
0 l k, s
0 t s t + 2l 2k . (t egy k bites szm, a vgn legalbb l db. 0-val).
A (ct , 0) nev struktrknak nincsenek rszstruktri.
Ha l > 1, akkor a (ct , l) nev struktra felso pointere a (ct , l 1) nev struktrra
mutat,
l1
v) s ha a < 22 , akkor az also(a) pointere a (ct a2l1 , l 1) nev struktrra mutat.
(Itt nem szorzs van, hanem konkatenci!)
vi) A fstruktra neve (, k), ahol most az res sz.
i)
ii)
ii)
iv)
Egy (ct , l) nev vEB struktra indexe legyen a kvetkez kettes szmrendszerbeli
k
szm: 1ct 01 . . . 1, ahol a vgn l darab egyes van. Mivel t+l 2k , ezrt maximum 22 +2 =
4C darab struktrra van szksgnk. Ha ezeket egy tmbben troljuk (az i index
struktra meret, min, s max rtkeit az i-edik sorban), akkor a struktra pointereit mr
nem kell trolni, nevk s cmk a fentiek alapjn szmolhat. gy a tmb mrete 4C, az
sszes trigny 12C.
Nem beszltnk mg az inicializlsrl: sajnos legalbb a fenti tmbben lev meret
rtkeket 0-ra kell lltani. Ez a gyakorlatban egy utastsnak ltszik (calloc), s tnyleg
gyors is, de elmleti szempontbl kicsit ront a vEB struktrk szpsgn.
Azonban a 12C trhely nem mindig elfogadhat. A log log C futsi id mg nagyon j
pl. C = n5 esetn is, de n adatot nem szeretnk n5 helyen trolni. Erre az ad megoldst
(s az inicializlsi problmt is kikszbli), ha a fenti tmb helyett dinamikus tkletes
hash-elst hasznlunk. Ennek univerzuma a cmtartomny (a szmok 0-tl 4C-ig), s
minden nemres struktra cme szerepel, mint kulcs, mellette rtkknt a meret,max,min
hrmas. Kezdhetnk egy, csak a f struktrt tartalmaz egyelem hash-tblval, s
csak ha a keresett rszstruktra indexe nem szerepel a hash tblban, akkor szrjuk oda
be a dinamikus hash-els Beszrs mveletvel. Mivel a dinamikus hash-els mveletei
vrhatan tlagosan konstans idejek, ez nem rontja el a vEB mveletek lpsszmt, a
trat viszont leviszi O(n)-re.
A Beszrs mveletet elemezve lthat, hogy n elem Beszrsa utn legfeljebb (k +
1) n olyan index lesz, amely nem res struktrra mutat, teht a dinamikus hash-els
sorn ezt az indexet be kell szrni, ezrt a hash-elsnl a beszrsok szma s a trigny
O(n log log C).
Ennl sokkal rafinltabb megolds (mg mindig az ltalnos RMQ feladatra) az albbi:
Nem kell minden i j prra kiszmtani a megoldst, elg az olyan i j prokra,
ahol j i + 1 kettnek egy hatvnya. Egy adott i-hez maximum log n ilyen j van, teht ez
csak nlog n trat ignyel. Meg kell gondolni, hogy ezeket az rtkeket tnyleg ki is tudjuk
szmtani O(n log n) idben, ez megint csak dinamikus programozssal megy: ha mr
adott k-ra minden i-re kiszmtottuk az (i, i + 2k 1) krdsekre a vlaszt, akkor ezekbl
k + 1-re minden i-re megkaphatjuk a vlaszt egy sszehasonltssal:
A(i : i + 2k+1 1)
minimuma a min min A(i : i + 2k 1), min A(i + 2k : i + 2k+1 1) lesz.
Htra van mg, hogy ezekbl az eltrolt rtkekbl hogyan vlaszolunk meg konstans
idben egy krdst.
Legyen (i, j) egy krds, s k = blog(j + 1 i)c. Ezt azrt knny kiszmolni,
mert pont a j + 1 i legszignifiknsabb bitjnek
a helye. Nyilvn: min A(i : j) =
min min A(i : i + 2k 1), min A(j 2k + 1 : j) .
Most rtrnk a 1-RMQ feladatra. Legyen k = b(log n)/2c. Osszuk fel az A tmbt
B1 , B2 , . . . , Bdn/ke blokkokra, minden blokk k hossz (kivve esetleg az utolst). Csinlunk egy dn/ke hossz A0 tmbt, ahol A0 (i) tartalmazza a Bi blokk minimlis rtkt.
Szksgnk lesz mg egy dn/ke hossz B tmbre is: B(i) tartalmazza azt a relatv j
indexet a Bi blokkon bell, ahol A((i 1)k + j) felveszi az A0 (i) minimum-rtket.
Egy adott (i, j) krdsre kiszmoljuk a kvetkez rtkeket: i0 az i indexet tartalmaz
blokk neve, j 0 a j indexet tartalmaz blokk neve, l az i-t tartalmaz blokk utols indexe,
f a j-t tartalmaz blokk els indexe, irel az i relatv indexe a Bi0 blokkon bell, vgl
jrel a j relatv indexe a Bj 0 blokkon bell. Megjegyzs: ezeket nem felttlenl kell s
rdemes a krdseknl kiszmtani, az elfeldolgozs sorn is szmthatjuk s trolhatjuk.
Hrom eset van: ha i0 = j 0 , akkor a krdst a Bi0 blokkon bell kell megvlaszolni,
lsd ksbb. Ha j 0 = i0 + 1, akkor a Bi0 blokkon belli (irel , l) s a Bj 0 blokkon belli
(f, jrel ) krdsekre adott vlaszokbl az eredmny knnyen szmthat (a kt minimumrtk minimuma lesz az rtk, a helye is knnyen szmthat). A harmadik esetben
kiszmtjuk RM QA0 (i0 + 1, j 0 1) helyt (a B tmb segtsgvel) s rtkt, ebbl, s az
RM QBi0 (irel , l), valamint az RM QBj0 (f, jrel ) krdsekre adott vlaszokbl a vgs vlasz
ismt knnyen szmolhat.
Mivel az A0 tmb mrete csak O(n/ log n), a fenti msodik megoldssal az A0 -re vonatkoz RMQ krdsek O(1) idben megvlaszolhatk O(n) elfeldolgozs utn. Htra
van mg, hogy az egyes blokkokon belli krdsekre tudjunk vlaszolni. Kt blokkot nevezznk hasonlnak, ha minden i-re a msodik blokk i-edik eleme pont c-vel nagyobb,
mint az els blokk i-edik eleme (ugyanazzal a c egsz szmmal). A kulcs szrevtel az,
hogy kt hasonl blokk esetn minden i j-re az RM Q(i, j) krdsre ugyanaz a vlasz.
Egy blokk normalizlt blokkjnak nevezzk a hozz hasonl blokkok kzl azt, amelyik
els eleme 0. Egy Bi blokk normalizlt indexe kettes szmrendszerben az a k 1 hossz
0-1 sorozat, melynek j. betje 0, ha Bi (j + 1) = Bi (j) 1, s 1 egybknt, ha teht
Bi (j + 1) = Bi (j) + 1. Az elfeldolgozs sorn minden blokkhoz kiszmtjuk a normalizlt indext, s mind a 2k1 indexhez kiszmtjuk a hozz tartoz normalizlt blokk
minden
lehetsges 1 i j k krdshez
a vlaszt a naiv megolds szerint. Mivel csak
k1
2
2
< n normalizlt blokk van, ez n k < n idben s trban kiszmolhat.
83
1
2
2 3 4 5 6
1 5 3 7 6
DFa(A[1:8])
7 8 9
9 8 5
DFa(A[1:9])
( i ,A(i))
(2,1)
(2,1)
(4 ,3)
(1,2)
(6,6)
( 3,5)
(8 ,8)
(5,7)
( 7,9)
(1,2)
( 3,5)
(5,7)
( 7,9)
(4 ,3)
(9,5)
(6,6)
(8 ,8)
Elszr azt lltjuk, hogy ez a fa O(n) idben megkonstrulhat. Szpen sorban minden i = 1 . . . n-re megkonstruljuk az A(1 : i) rsztmb Descartes-fjt. Ha i-re mr
megvan, akkor i + 1-re gy jrunk el: Legyenek a gykrtl szigoran jobbra men t cscsai: v0 , v1 , . . . , vt . Nyilvn A(v0 ) A(v1 ) . . . A(vt ). Tegyk fel, hogy k a legnagyobb
olyan index, melyre A(vk ) A(i + 1). Ekkor az j fa gy nz ki, hogy vk jobb gyereke
helyre berakjuk i + 1-et, akinek nem lesz jobb gyereke, a bal gyereke pedig vk+1 lesz (ha
k = t, akkor bal gyereke sem lesz). A k indexet binris keresssel is megkereshetnnk, de
a mr megszokott mdon jobb lesz, ha alulrl felfel egyesvel lpkedve keressk. Legyen
a potencil a gykrtl szigoran jobbra men t cscsainak a szma. Ekkor l keres
lps esetn, a potencil (l 1) + 1 = l + 2 -vel vltozik, a beraks 1 lps, gy az
amortizcis id 3. Innen a teljes fa felptse O(n).
Azt is knny meggondolni, hogy az RM Q(i, j) krdsre adand vlasz a Descartesfban az LCA(i, j) krdsre adott vlasz. Gondoljunk a rekurzv defincira. Kezdetben
i s j egy rsztmbben van. lltsuk meg a rekurzv konstrukcit akkor, amikor nem
lesznek abban. Ekkor egy A(i0 : j 0 ) rsztmb legkisebb elemnek k indexe lesz az aktulis
cscs, s az ettl balra/jobbra ll rsz megy a bal/jobb gyerekbe; aholis i0 i s j 0 j.
Teht egyrszt k lesz a vlasz az LCA(i, j) krdsre, msrszt pedig i k j (mivel
84
A feladat: Adott egy fix trkp s arra vagyunk kvncsiak, hogy hogyan nz ki a trkp
egy adott krnyezetnkben. A krds, hogy hogyan rdemes trolni a trkpet, hogy ezt
a feladatot gyorsan meg tudjuk valstani.
Felttelezsek (egyszerstsek):
1. a trkp objektumai pontokbl s szakaszokbl llnak (krkkel nem rdemes foglalkozni, mert vagy csak akkor akarjuk kirajzolni, ha a kzppontjuk is a tglalapba
esik, vagy pedig egy trkpen csak 2-3 fle mret kr van, amelyek kzppontjait
a megfelelen megnvelt tglalapban kereshetjk),
2. a nevek az objektumokhoz tartoznak, amikor megjelentnk egy objektumot, kirjuk
a hozz tartoz nevet is,
3. a szakaszok nem metszik egymst (ez csak azt jelenti, hogy ha mgis metszenk,
akkor a metszspontot is troland pontnak kell tekintennk),
4. a krds-ablakrl feltesszk, hogy tengelyirny tglalap. Sajnos a valsgban ez
nem tehet fel (ahogy fordulunk, a trkprszlet is fordul), de egyrszt csak ezt van
esly megvalstani, msrszt pedig a fordulsnl gyorsan kell tudnunk forgatni a
kirajzoland rszletet, teht mindenkppen rdemes az adott ferde tglalapot tartalmaz kicsit nagyobb, tengelyirny tglalapot lekrdezni a trkpbl, s a gyors
memriban trolni.
Megjegyzs: Rengeteg tovbbi alkalmazs van, pld. VLSI ramkrk tervezse, CAD rendszerek, ill.
tbb dimenziban VR alkalmazsok (replgp-szimultor, jtkok), vagy akr adatbzisok bizonyos
tulajdonsg elemeinek kilistzsa.
85
I. TROLNI : x1 , x2 , . . . xn R pontokat.
KRDS : P ON T OK(xb , xj ) felsorolni azokat a pontokat, amelyek ebbe az intervallumba esnek, vagyis a vlasz: {xi : xb xi xj }.
Az output hosszt nem tudjuk elre. Jellje ezentl k az output hosszt. A futsi
idket ezentl k s n fggvnyben fogjuk vizsglni. Az ilyen algoritmusokat output
rzkeny algoritmusoknak nevezzk. (Ilyennel mr tallkoztunk, pl. a legrvidebb t
kiratsa is ilyen volt, az O(k) idben futott.)
Megolds: rendezett tmbben troljuk a pontokat; xb -t megkeressk felez keresssel,
majd innentl listzunk, mg xj fel nem rnk.
ID: O(log n + k)
TR: O(n)
FELPTS : O(n log n)
II. TROLNI : I1 , I2 , . . . In R intervallumokat, ahol Ii = [xib , xij ].
KRDS : IN T ERV (x) felsorolni Ii -ket, amelyekre x Ii .
Megolds: intervallum fa. A 2n darab xij , xib kzl legyen x0 a kzps (az n-edik).
Az albbi lpsszmokat/trhelyet clozzuk meg:
ID: O(log n + k)
TR: O(n)
FELPTS : O(n log n)
Rekurzvan ft ptnk:
v0
x0,Lb,L j
x0 -tl jobbra
lv elemek
x0 -tl balra
lv elemek
x0
Tegyk fel, hogy az IN T ERV (x) krdsnl pld. x x0 . Az x-et tartalmaz intervallumok
ktfajtk lehetnek:
86
Megolds: A v0 cscsban x0 rtke mellett I(v0 )-t is troljuk, mgpedig ktszer, egy
Lb (v0 ) s egy Lj (v0 ) tmbben.
Lb (v0 ): x0 -t tartalmaz intervallumok, a bal vgpont szerinti nvekv sorrendben.
Lj (v0 ): x0 -t tartalmaz intervallumok, a jobb vgpont szerinti cskken sorrendben.
Ha x < x0 , akkor Lb elemeit felsoroljuk az els elemtl, amg a bal vgpont x. Ha
pedig x x0 , akkor Lj elemeit felsoroljuk az els elemtl, amg a jobb vgpont x.
Ha x < x0 , akkor rekurzvan folytatjuk a bal fban, ha x > x0 , akkor a jobb rszfban,
ha pedig x = x0 , akkor megllhatunk. Lpsszm v0 -ban: 1 + kv0 , ha kv0 darab kirand
intervallum tallhat itt (azaz I(v0 )-ban). A fa mlysge a felezs miatt legfeljebb
log n lesz. gy a vlaszols sszlpsszma O(log n + k).
A felptsi eljrs lnyege: az elejn rendezzk az intervallumokat kt tmbbe: a
bal vgpont szerint nvekven rendezve, s jobb vgpont szerint cskkenen rendezve.
Egy adott vi cscsnl elszr akr a kt tmb virtulis sszefslsvel, akr a tanult
lineris medins szmtsi mdszerrel megkapjuk az xi kzps szmot. Utna a kt
tmbt lineris idben sztszedjk hrom rszre (az els rszbe kerlnek a bal gyerekbe
tovbbmen intervallumok, a kzpsbe az adott xi -t tartalmazk, a harmadikba a jobb
gyerekbe menk). A kt kapott kzps tmb pontosan Lb s Lj lesz. Egy-egy szinten
az I(v) halmazok diszjunktak, gy a listk sszhossza legfeljebb n. Teht minden jabb
szintet O(n) idben el tudunk kszteni.
87
x b keresse
x j keresse
Legyen vsplit az a cscs, ahol a kt keress elgazik. Egy cscs fontos, ha a vsplit tl az xb keressekor elrt levlbe vezet ton lv olyan cscs jobb gyereke, ahol balra
lptnk, illetve, ha a vsplit -tl az xj keressekor elrt levlbe vezet ton lv olyan cscs
bal gyereke, ahol jobbra lptnk. Ezeken kvl a kt megtallt levl is fontos.
Knny ltni, hogy a kilistzand pontok mind ASSOC(v)-ben vannak valamely fontos v cscsra. (Valamint a definci alapjn az a tny is nyilvnval, hogy ha u s v fontos
cscsok, akkor ASSOC(u) s ASSOC(v) diszjunktak.) Teht minden fontos v cscsban
ki kell vlogatni ASSOC(v) elemeibl a krdsnek megfeleleket.
A fa mlysge log n, gy legfeljebb 2 log n fontos cscs van.
Minden fontos v-re ya -t megkeressk felez keresssel L(v)-ben s kilistzzuk a pontokat yf -ig.
Egy darab v-nl legfeljebb log n + 1 + kv lps kell, ahol kv a v-nl kilistzott elemek
szma.
ID: O(log2 n + k)
FELPTS : O(nlog n) Hint: rendezzk a pontokat x s y koordinta szerint is. Ha
r a gykr neve, nevezzk ezeket AXr ill. AYr -nek, s legyen ar = n. ltalban, ha a fa egy
v cscsnl jrunk, fellrl megkapjuk AXv -t, ami ASSOC(v) az x koordinta szerint
rendezve, AYv -t, ami ASSOC(v) az y koordinta szerint rendezve, s az av = |ASSOC(v)|
mretet. Ekkor v tjelzje az AXv (bav /2c) pont x koordintja lesz. Vgigmenve az AXv
s AYv tmbkn, minden pont x koordintjt ezzel hasonltva a tmbket knnyen
sztszedhetjk a rendezett AXbal(v) s AXjobb(v) , ill. AYbal(v) s AYjobb(v) tmbkre.
Megjegyzs: ez az algoritmus mkdik tbb dimenziban is, ha gy mdostjuk, hogy d
dimenziban az els koordinta szerinti keresfban az ASSOC(v) halmazt rekurzvan egy
d 1 dimenzis tartomnyfban troljuk (a pontok els koordintjt elfelejtve, mint ahogy
eddig is tettk, hiszen a fenti mdszerben az I. feladatnl trgyalt 1-dimenzis tartomnyft
hasznltuk). Ekkor a lekrdezsi id O(logd n + k) lesz, a szksges trhely pedig O(n
logd1 n).
Krds: az O(log2 n + k) idt lehet-e cskkenteni?
A cl : O(log n+k) keressi id, ehhez az kell, hogy a v-nl csak O(1+kv ) idt tltsnk.
88
10
19
23
30
37
59
62
70
80 100
nil
10
19
30
62
70
80
89
De persze lehetnek olyan, a tglalapot metsz szakaszok is, melyeknek mindkt vgpontjuk kvl van. Elszr azt a specilis esetet oldjuk meg, amikor minden trolt szakaszunk vzszintes vagy fggleges, s csak a kvetkez fejezetben kezeljk a ferde szakaszok
esett (pld. VLSI tervezsnl ilyenek nincsenek is). Teht most azokat a vzszintes s fggleges szakaszokat szeretnnk kiratni, melyek teljesen tmetszik az ablakot. Az ilyenek
vagy vzszintesek s metszik a jobb oldalt, vagy fgglegesek s metszik a fels oldalt.
Ez a kt feladat nyilvn szimmetrikus, teht elg az els esetet kezelni. Azonban jra
figyelni kell arra, hogy most ki fogjuk vlogatni az sszes vzszintes szakaszt, mely metszi
a jobb oldalt, teht azokat is, amelyek bal vgpontja benne van az ablakban ezeket
azonban mr egyszer kirtuk, nem szabad jra.
Hint a ktszeri kirs megakadlyozsra: egyszer, de kicsit knyelmetlen megolds
lehet, ha egyrszt felvesznk egy n hossz tmbt (n a szakaszok szma) s egy sort. Ha
brmely fzisban megtalljuk az i. szakaszt, akkor megnzzk, hogy a tmb i. eleme 1-e,
ha igen megynk tovbb, ha nem, akkor egyre lltjuk s i-t berakjuk a sorba. A vgn
a sorbl ki tudjuk ratni az sszes megtallt szakaszt, s kzben a tmbt jra le tudjuk
nullzni.
IV. TROLNI : Vzszintes szakaszok a skon.
KRDS : METSZ([x] [ya , yf ]).
VLASZ : felsoroljuk az sszes olyan vzszintes szakaszt, mely metszi a krdezett fggleges szakaszt.
Intervallum-ft ksztnk az x tengelyre es vetletek szerint. DE az eredeti megoldssal ellenttben az I(v) halmazokat nem kt listban troljuk, hanem helyette kt
kupacos keresfban (lsd albb). Az elsben az intervallumokat a bal, a msodikban
a jobb vgpontjuk szerint. A keress majdnem ugyangy megy, mint a hagyomnyos
intervallum-fban, csak amikor az adott v cscs I(v) halmazbl ki akarjuk vlogatni a
minket rdeklket, akkor pld. x < x0 esetn az els kupacos keresfban keressk meg
azokat, akiknek a bal vgpontja a (, x] [ya , yf ] vgtelen tglalapba esik. (Hasonlan, x > x0 esetn, a msodik kupacos keresfban keressk meg azokat, akiknek a jobb
vgpontja a [x, ) [ya , yf ] vgtelen tglalapba esik, ehhez a msodik kupacos keresft
MAX-kupaccal kell definilni.)
Teht a kvetkez feladatot kell mg megoldanunk, melyre a tartomny-fa is megolds
lenne, de most egy mg hatkonyabb megoldst adunk (kisebb trhellyel). Amit meg
tudunk valstani a IV. feladatra (mivel I(v)-bl kirats gy nem lehet O(kv ) idej):
ID: O(log2 n + k)
TR: O(n)
FELPTS : O(n log n)
11.3.1. Kupacos keresfk
V. TROLNI : p1 , p2 , . . . pn R2
KRDS : PONTOK((, x] [ya , yf ]).
90
yf
ya
xj
A Kupacos keresfa egy kiegyenslyozott binris fa, amelynek minden v cscsban egy
q(v) pont s egy y(v) tjelztbla van.
Ez az szvr adatstruktra egyszerre lesz x koordinta szerint kupac, s y koordinta
szerint binris keresfa; pontosabban csak annak hasonmsa, azt a fontos keresfa tulajdonsgot fogja teljesteni, hogy egy adott v cscsnl a bal rszfban csupa olyan pontot
trolunk, melyek y koordintja y(v), a jobb rszfban pedig csupa olyan pontot trolunk, melyek y koordintja > y(v), (de magban a v cscsban trolt q(v) pontnak
semmi kze nem lesz y(v)-hez). Ezektl a q(v) pontoktl eltekintve ez nagyon hasonlt
a mr trgyalt Descartes-fra, ahol az A(i) elem x koordintjnak i-t tekintettk, y
koordintjnak pedig az A(i) rtket.
Felvesznk egy v0 gykeret, q(v0 ) := a legbaloldalibb pont (ha tbb ilyen van, akkor
kzlk brmelyik).
y(v0 ) := y 0 , amelyre S = {p1 , p2 , . . . pn } \ {q(v0 )} halmaznak legfeljebb a fele van az
y = y 0 egyenes felett. Legyen Sa = {pi S | yi y 0 } s Sf = {pi S | yi > y 0 }. Ezeket
rekurzvan ugyangy troljuk a gykr bal, ill. jobb rszfjban.
91
Megjegyzs: ha egy adott pillanatban minden pont y koordintja azonos, akkor az adott
cscsot megjelljk (a keresfnak egy levele lesz), s a pontokat mr egyszeren x szerinti
kupacban troljuk a rszfjban. Ezzel elrjk, hogy a keresfa mlysge akkor is maximum
log n, ha vannak azonos y rtkek, s a keresfa levelein is maximum log n mlysg kupacok
lgnak.
A f fa kiegyenslyozott binris fa, gy mlysge dlog ne. Az ilyen fkat (ez az egsz
fejezetre rvnyes!) trolhatjuk tmbben, gy, mint a kupacokat (legfeljebb 2n hossz
tmb kell). A keresfa levelei alatti kupacokat kln-kln tmbben rdemes ekkor
trolni.
rekurzvan y'
alatti nem q(v)
pontok
rekurzvan y'
feletti nem
q(v) pontok
ya
yf
A keressi utak sorn bejrt cscsokban trolt q(v) pontokat egyesvel leellenrizzk,
hogy benne vannak-e a krdezett tglalapban. Ezeken kvl minden ms j pont valamely
fontos cscs alatt lesz. Radsul egy v fontos cscs alatti minden pont y koordintja
az [ya , yf ] intervallumba esik, gy a fontos cscsok rszfit mr kupacknt kezelhetjk, s
az elbb ltott mdon a Kir(v, x) hasznlatval ki tudjuk rni a j pontokat O(1 + kv )
idben, ahol most kv az output sszes, a v rszfjba es pontjainak szmt jelli.
ID: O(log n + k)
Ez ugyanolyan gyors, mint a tartomny-fa kaszkdolssal, de egyszerbb a megvalsts s kisebb a trigny:
TR: O(n)
FELPTS : O(n log n)
92
yf
ya
x
Megjegyzs: Most elszr fogjuk kihasznlni, hogy a szakaszok nem metszhetik egymst.
93
-)
. ()
.()
.()
20. llts. Egy adott Ii intervallumot a fa egy szintjn maximum ktszer troljuk, gy
az sszes trigny O(n log n).
Bizonyts: Ha Ii egy szinten hromszor lenne trolva, akkor legyenek balrl jobbra a, b, c
a cscsok, amiben troltuk. Mivel Int(a) Ii s Int(c) Ii , ezrt a keresfa tulajdonsgai miatt nyilvn b szljre Int(p(b)) Ii , teht Ii nem lehet benne ASSOC(b)-ben.
Keress: a fban itt is x-et keressk, s a keressi t sorn rintett minden v cscsra
a teljes ASSOC(v)-t kilistzzuk. Teht a keress ideje O(log n + k).
A szakasz-fa elnye az intervallum-fhoz kpest, hogy a keressi t cscsaiban trolt
ASSOC(v) halmazok unija pontosan az, ami a kvnt output, ezekbl itt nem kell
vlogatni. Pont ezrt, ha az ASSOC(v) tmbket alkalmasan rendezzk, akkor mg egy
msik szempont szerint tudunk majd bellk szelektlni.
Meggondolhat, hogy ez is felpthet O(n log n) idben.
11.4.2. Egy fggleges szakaszt metsz ferde szakaszok
A szakaszokat az x tengelyre es vetletk szerint szakasz-fban troljuk, s ebben keressk x-et.
x
Int(v)
94
Hivatkozsok
[1] Cormen-Leiserson-Rivest-Stein j Algoritmusok, Mszaki Kiad, 2000.
[2] Aho-Hopcroft-Ullman Szmtgpalgoritmusok tervezse s analzise,
Mszaki Knyvkiad, 1982.
[3] Robert Endre Tarjan Data Structures and Network Algorithms, Philadelphia: Society for Industrial and Applied Mathematics, 1983.
[4] Rnyai-Ivanyos-Szab Algoritmusok, Typotex Kiad, 1998.
[5] D. E. Knuth A szmtgp-programozs mvszete, III. ktet, Mszaki
Knyvkiad, 1994.
[6] L. Lovsz
Algoritmusok bonyolultsga,
http://www.cs.elte.hu/~kiraly/alg.pdf
95