Professional Documents
Culture Documents
Programozas 1 Jegyzet
Programozas 1 Jegyzet
INFORMATIKAI KAR
Sergyn Szabolcs
Algoritmusok, adatszerkezetek I.
E-NIK 5014
Budapest, 2015.
Kszlt az budai Egyetem Neumann Jnos Informatikai Karn az E-NIK 5014. sz. jegyzetszerzds keretein bell 2014-ben.
2.0.3. verzi
2016. februr 16.
c
Copyright
Sergyn
Szabolcs, 2015
A m egyni tanulmnyozs cljra szabadon letlthet. Minden egyb felhasznls csak a szerz rsos
engedlyvel lehetsges.
Tartalomjegyzk
Bevezets
1. Algoritmusok alapjai
1.1. Algoritmus fogalma . . . . . . . .
1.2. Vltozk, tpusok s kifejezsek .
1.3. Tmbk . . . . . . . . . . . . . .
1.4. Vezrlsi szerkezetek . . . . . . .
1.5. Algoritmusok lersa, pszeudokd
1.6. Hatkonysg, futsi id elemzse
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6
6
8
10
11
15
17
2. Programozsi ttelek
2.1. Egyszer programozsi ttelek . . . . . . . . . . . . . . .
2.1.1. Sorozatszmts programozsi ttel . . . . . . . .
2.1.2. Eldnts programozsi ttel . . . . . . . . . . . .
2.1.3. Kivlaszts programozsi ttel . . . . . . . . . .
2.1.4. Lineris keress programozsi ttel . . . . . . . .
2.1.5. Megszmlls programozsi ttel . . . . . . . . .
2.1.6. Maximumkivlaszts programozsi ttel . . . . .
2.2. sszetett programozsi ttelek . . . . . . . . . . . . . .
2.2.1. Msols programozsi ttel . . . . . . . . . . . .
2.2.2. Kivlogats programozsi ttel . . . . . . . . . .
2.2.3. Sztvlogats programozsi ttel . . . . . . . . .
2.2.4. Metszet programozsi ttel . . . . . . . . . . . .
2.2.5. Uni programozsi ttel . . . . . . . . . . . . . .
2.2.6. sszefuttats programozsi ttel . . . . . . . . .
2.3. Programozsi ttelek sszeptse . . . . . . . . . . . . .
2.3.1. Msols s sorozatszmts sszeptse . . . . .
2.3.2. Msols s maximumkivlaszts sszeptse . .
2.3.3. Megszmols s keress sszeptse . . . . . . .
2.3.4. Maximumkivlaszts s kivlogats sszeptse .
2.3.5. Kivlogats s sorozatszmts sszeptse . . .
2.3.6. Kivlogats s maximumkivlaszts sszeptse
2.3.7. Kivlogats s msols sszeptse . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
20
21
21
23
27
28
31
33
35
35
37
41
50
54
61
67
68
70
74
76
80
82
85
3. Rendezsek
3.1. Egyszer csers rendezs . . . .
3.2. Minimumkivlasztsos rendezs
3.3. Buborkrendezs . . . . . . . .
3.4. Javtott buborkrendezs . . .
3.5. Beillesztses rendezs . . . . . .
3.6. Javtott beillesztses rendezs .
3.7. Shell rendezs . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
87
89
92
97
101
105
109
114
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4. Rekurzv algoritmusok
4.1. Faktorilis szmts . . . . . . . . . . . . . . . . . . .
4.2. Rekurzv algoritmusok jellemzi . . . . . . . . . . . . .
4.3. Fibonacci sorozat . . . . . . . . . . . . . . . . . . . . .
4.4. Hatvnyozs rekurzvan . . . . . . . . . . . . . . . . .
4.5. Hanoi tornyai . . . . . . . . . . . . . . . . . . . . . . .
4.6. Egyszer programozsi ttelek rekurzv megvalstsa
4.6.1. Sorozatszmts . . . . . . . . . . . . . . . . .
4.6.2. Lineris keress . . . . . . . . . . . . . . . . . .
4.6.3. Megszmlls . . . . . . . . . . . . . . . . . . .
4.6.4. Maximumkivlaszts . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
121
122
126
127
131
135
139
139
144
147
152
5. Rendezett tmbk
5.1. Keressek rendezett tmbkben . . . . . . .
5.1.1. Lineris keress . . . . . . . . . . . .
5.1.2. Logaritmikus keress . . . . . . . . .
5.2. Programozsi ttelek rendezett tmbkben
5.2.1. Eldnts . . . . . . . . . . . . . . . .
5.2.2. Kivlaszts . . . . . . . . . . . . . .
5.2.3. Kivlogats . . . . . . . . . . . . . .
5.2.4. Megszmlls . . . . . . . . . . . . .
5.3. Halmazok . . . . . . . . . . . . . . . . . . .
5.3.1. Halmaztulajdonsg vizsglata . . . .
5.3.2. Halmaz ltrehozsa . . . . . . . . . .
5.3.3. Tartalmazs vizsglata . . . . . . . .
5.3.4. Rszhalmaz . . . . . . . . . . . . . .
5.3.5. Uni . . . . . . . . . . . . . . . . . .
5.3.6. Metszet . . . . . . . . . . . . . . . .
5.3.7. Klnbsg . . . . . . . . . . . . . . .
5.3.8. Szimmetrikus differencia . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
157
158
159
161
173
174
176
177
181
182
183
184
186
187
190
191
192
193
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
195
196
203
209
218
7. Optimalizlsi problmk
7.1. Dinamikus programozs . . . . . . . . . . . .
7.1.1. 0-1 htizsk problma . . . . . . . . .
7.1.2. A dinamikus programozs elve . . . .
7.1.3. Leghosszabb kzs rszsorozat . . . .
7.2. Moh algoritmusok . . . . . . . . . . . . . . .
7.2.1. Pnzkifizets . . . . . . . . . . . . . .
7.2.2. 0-1 htizsk problma . . . . . . . . .
7.2.3. Moh algoritmus szemben a dinamikus
7.2.4. Moh stratgia . . . . . . . . . . . . .
7.2.5. temezsi feladatok . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
programozssal
. . . . . . . . .
. . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
222
224
225
230
231
238
239
241
244
250
251
8. Kupacrendezs
8.1. Defincik . . . .
8.2. Kupacols . . . .
8.3. Kupac ptse . .
8.4. Kupac rendezse
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
258
259
263
267
270
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Magyar-angol sztr
Sergyn Szabolcs
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
275
budai Egyetem
Neumann Jnos Informatikai Kar
Angol-magyar sztr
Sergyn Szabolcs
277
budai Egyetem
Neumann Jnos Informatikai Kar
Bevezets
Ez a jegyzet az budai Egyetem Neumann Jnos Informatikai Karn Mrnk informatikus alapszakon
tanul hallgatk szmra kszlt. A jegyzet a Programozs I. els flves trgyhoz rdott. A trgy clja
a hallgatk algoritmikus gondolkodsnak fejlesztse, a leggyakrabban hasznlt alapvet algoritmusok
megismertetse, valamint a C# programozsi nyelv alapjainak megismerse. Jelen jegyzet ebbl a hrom
clbl csak az els kett elrsben nyjt segtsget a hallgatknak. Ezrt konkrt programozsi nyelvvel
nem is foglalkozik, a kzlt algoritmusok programozsi nyelvi implementcijt nem adja meg. A C#
programnyelv rszletes ismertetse szmos magyar vagy angol nyelv szakknyvben megtallhat, illetve
egy konkrtan ezzel foglalkoz ksbbi jegyzet tmja lehet.
A jegyzet anyaga nagy mrtkben lefedi az eladsokon ismertetsre kerl algoritmusokat. Az eladsok ltogatsa viszont a jegyzet anyagnak megrtse s elsajttsa mellett is szksges, hiszen az
elad ott tud rmutatni a legfontosabb sszefggsekre.
A jegyzetben minden algoritmus azonos mdszerrel kerl lersra. Az egyes algoritmusok bemutatsa a megoldand problma ismertetsvel kezddik. Ezt kveti a megoldsra javasolt mdszer szveges
kifejtse, a tervezett algoritmus lpseinek nagy vonalakban trtn ismertetse. Ezutn pszeudokd formtumban bemutatsra kerl a konkrt algoritmus, a bemeneti s kimeneti vltozk megadsa mellett.
A pszeudokd minden egyes utastst szvegesen is lerjuk, hogy jl rthet legyen, melyik lpsnek
pontosan mi a szerepe. Az algoritmus alapos bemutatst kveten egy konkrt pldn keresztl is vgigvezetjk az algoritmus mkdst. A pldk nyomon kvetst szolgljk az egyes lpsek eredmnyeit
bemutat brasorozatok. Az algoritmus lerst a futsi id elemzsvel zrjuk.
A tananyag elsajttsa rdekben az albbi feldolgozsi mdszer kvetst ajnljuk. A szorgalmi idszakban az egyes eladsok eltt szksges egyszer tolvasni az eladson ismertetsre kerl anyagot,
hogy az elads keretben a hallgat valban az sszefggsek megrtsre tudja a figyelmt sszpontostani. Az eladst kveten az algoritmusok jbli tnzst javasoljuk akr szmos plda megoldsn
keresztl. A jegyzetben kzlt mintapldk mellett rdemes ms feladatokon is vgigkvetni az egyes
algoritmusok mkdst. gy a hallgat meggyzdhet arrl, hogy ms esetekben is helyes megoldst
szolgltat a megismert mdszer. A vizsgkra kszlve ajnlott a jegyzet alapos vgigolvassa, minden algoritmus mkdsi elvnek megrtse, az algoritmusok memorizlsa. A vizsga eltti napokban clszer
az algoritmusok pszeudokdjait mg egyszer tzetesen tnzni, azokat vakon reproduklni.
Amennyiben az olvas hibt tall a jegyzetben, krjk, hogy azt a szerz fel jelezze. Ha valami
nehezen rthet, valamely tma mlyebb kifejtst, vagy ms megkzeltst kvet lerst kvn, akkor
ezt is jelezze a szerz fel. Kzs clunk, hogy olyan jegyzet kerljn az olvas kezbe, ami a tananyag
megrtst s elsajttst szolglja.
A jegyzet felptse
Az 1. fejezetben az algoritmusok alapjait ismertetjk. Elsknt definiljuk, hogy mit is rtnk algoritmus
alatt, majd bevezetjk az ezek lershoz szksges vltozk, tpusok s kifejezsek fogalmt. Bemutatsra kerl az is, hogy miknt rjuk le ezeket a fogalmakat a jegyzetben hasznlt pszeudokdokban. Ezt
kveten definilunk egy sszetett adatszerkezetet, a tmbt. A tmbk feldolgozsa kpezi lnyegben a
jegyzet teljes anyagt. Bevezetjk az algoritmusokban hasznlt vezrlsi szerkezeteket, valamint megadjuk ezek pszeudokddal trtn lersi mdjt. Ezt kveten sszegezzk a pszeudokdokkal kapcsolatos
megllaptsokat, majd megadjuk azt a lersi mdot, amit a jegyzet tovbbi rszeiben kvetnk. A
fejezet vgn az algoritmusok futsi idejnek elemzsi mdszert mutatjuk be.
A 2. fejezetben a leggyakrabban elfordul problmkra adunk hatkony megoldsi mdszereket,
melyeket programozsi tteleknek neveznk. Ismertetsre kerl hat egyszer, valamint hat sszetett
programozsi ttel. A fejezet vgn lerunk nhny olyan esetet, amikor kt programozsi ttel sszeptsvel tudunk egy problmt megoldani.
A programozsi gyakorlatban gyakran elfordul problma, hogy egy tmbben trolt rtkeket rendezni kell. Szmos rendez algoritmust dolgoztak ki, melyek kzl a legismertebb elemi mdszereket
mutatjuk be a 3. fejezetben. Az ismertetsre kerl ht algoritmus kzl ltalban csak ngyet hasznlnak, de didaktikai szempontbl fontosnak rezzk mindegyik bemutatott algoritmus megismerst.
A 4. fejezetben bevezetjk a rekurzi fogalmt. Bemutatunk nhny algoritmust annak rdekben,
hogy a hallgat megrtse a rekurzv algoritmusok mkdst, lssa azok elnyeit s htrnyait. A fejezet
vgn lerjuk, hogy a korbban mr megismert egyszer programozsi ttelek miknt valsthatk meg
rekurzv mdon.
Az 5. fejezetben rendezett tmbk feldolgozsval foglalkozunk. Bemutatjuk, hogy ilyen tmbk
esetn miknt lehetsges hatkony keresst megvalstani. Nhny programozsi ttel esetn ismertetjk, hogy a tmb rendezettsge mellett hogyan tudjuk a problma megoldsnak futsi idejt javtani.
A fejezet vgn pedig bemutatunk egy mdszert halmazok brzolsra s ismertetjk a halmazokkal
kapcsolatos mveletek megvalstsait.
A 6. fejezetben a tmbknek egy olyan feldolgozsi mdjt mutatjuk be, mely lnyegesen klnbzik
a korbbi fejezetekben ismertetett mdszerektl. Az Oszd meg s uralkodj! nven ismert megkzelts
a tmbk rekurzv feldolgozsnak egy specilis mdjt adja. A fejezetben egy konkrt programozsi
ttel megvalstst mutatjuk be az j mdszerrel, majd kt hatkony s szles krben hasznlt rendez
algoritmust ismertetnk. A fejezet vgn egy specilis kivlasztsi problmt is megoldunk.
A jegyzet 7. fejezetben n. optimalizlsi problmkat oldunk meg. A fejezet clja, hogy a hallgatk
megismerjenek specilis problma megoldsi mdszereket is. Kt megkzelts kerl bemutatsra: a
dinamikus programozsi mdszer s a moh stratgia.
Az utols fejezetben egy specilis adatszerkezetre, a kupacra pl rendezsi mdszert mutatunk
be. Ez a fejezet mr elre mutat a Programozs II. trgy irnyba, hiszen tovbbi adatszerkezetek ott
kerlnek ismertetsre.
A jegyzetben minden fogalmat a magyar elnevezsvel runk le. Annak rdekben, hogy az angol
nyelv szakirodalom megrtsben segtsk a hallgatt a legfontosabb fogalmak angol megfelelit az
els elfordulsuknl lbjegyzetben kzljk. A jegyzet vgn kis sztrba gyjtttk az ismertetett
fogalmakat.
A korbbi vek elads anyagainak kidolgozsa, valamint a jegyzet rsa sorn szmos magyar s
angol nyelv szakirodalmat ismertnk meg s dolgoztunk fel. Ezeket a jegyzet vgn tallhat irodalomjegyzkben gyjtttk ssze. Ha valaki mlyebben kvnja megismerni a bemutatott algoritmusokat,
akkor javasolt az ajnlott szakirodalmak tovbbi tanulmnyozsa.
Ksznetnyilvnts
A Programozs I., illetve korbban Algoritmusok, adatszerkezetek, objektumok eladsokat hrom ven
keresztl tartottam Dr. Vmossy Zoltnnal kzsen. A trgyat Dr. Csink Lszltl vettem t, aki kidolgozta a trgy alapjait. Ezek kis mdostsval rleldtt ki az a tananyag, ami a jegyzetben lersra
kerlt. Ksznm Csink tanr r tantrgy kialaktsi munkjt, a tle megrklt tananyagot, mdszereket.
Dr. Vmossy Zoltn az elmlt hrom vben vgig kvette eladsaimat, melyekre adott rtkes szrevtelei bepltek az anyagba. Ezen kvl a dinamikus programozsi mdszer eladst tartja, gy a
jegyzetben kzlt anyagot is dolgozta ki. A jegyzetet lektorlta, szmos javtsi javaslatot fogalmazott
meg, amelyek segtettek abban, hogy ilyen formban lljon el a jegyzet. Ksznetet mondok mindezrt
a munkrt.
A Programozs I. trgyat kveti a msodik flvben a Programozs II. A kt trgy tematikjt,
egymsra plst Dr. Sznsi Sndorral dolgoztuk ki. Ezen m szletsvel egytt is megrta az Algoritmusok, adatszerkezetek II. jegyzetet. Az egysges trgyalsmd rdekben szmos tmban egyeztettnk, rm volt vele egytt dolgozni. Ksznet a sok segtsgrt, amit tle kaptam.
Szeretnk mg ksznetet mondani az Alkalmazott Informatikai Intzet munkatrsai kzl Bedk
Dvidnak, Cseri Orsolya Eszternek, Dr. Erdlyi Krisztinnak, Kertsz Gbornak, Kiss Dnielnek, Lgrdi
Gbornak, Simon-Nagy Gabriellnak, Nagy Tibor Istvnnak, Szab Zsoltnak, Sznt Balzsnak s Urbn
Andrsnak, akik a Programozs I. trgy laborjait tartottk. Szmos rtkes szrevtelt fogalmaztak meg
az eladsok tananyagval kapcsolatban, amelyek bepltek a jegyzetbe is.
Sergyn Szabolcs
budai Egyetem
Neumann Jnos Informatikai Kar
1. fejezet
Algoritmusok alapjai
1.1. Algoritmus fogalma
Algoritmusokkal1 az let szmos terletn tallkozhatunk. Pldul, amikor elmegynk autt mosatni,
akkor egy adott algoritmus fut le. Kifizetjk a moss rt, amirt kapunk egy mgneskrtyt. Bellunk
az autmosba, majd a mgneskrtyt behelyezzk egy terminlba s megnyomjuk a start gombot. Ekkor
elindul az albbi folyamat.
1. Elmoss. Az autt mosszeres lvel bespriccelik.
2. Kefs moss. A forg kefk letiszttjk az autt.
3. blts. Az autt tiszta vzzel lebltik.
4. Szrts. Az autt leveg ramoltatssal megszrtjk.
Termszetesen ez a folyamat lehet ennl sokkal bonyolultabb is, hiszen klnbz programokra fizethetnk el. Ilyenkor az egyes vgrehajtand tevkenysgek megvalsulsa attl fgg, hogy milyen
programot vlasztottunk. Nzznk erre is egy pldt:
1. Ha aktvhabos mossra fizettnk el, akkor az autt bespriccelik aktv habbal. Klnben csak
mosszeres lvel spriccelik be az autt.
2. Ha alvz mossra is elfizettnk, akkor az alvzat is vgigspriccelik aktv habbal.
3. Ha kerkmossra elfizettnk, akkor forg kefk letiszttjk az autt, a kerekeknl pedig specilis
kerktisztt kefk mossk a kerekeket. Klnben csak a forg kefk letiszttjk az autt.
4. Az autt tiszta vzzel lebltik.
5. Ha elfizettnk viaszvdelemre, akkor az autt forr viasz rteggel bevonjk.
6. Az autt levegramoltatssal megszrtjk.
Lthat, hogy ez az algoritmus mr dntseket is tartalmaz, hiszen annak fggvnyben, hogy milyen
programot vlasztottunk ms-ms trtnik az autmoss sorn.
Az elbbi pldhoz hasonlan szmos tovbbit tudunk mondani arra, hogy a mindennapokban hol s
milyen algoritmusokkal tallkozhatunk. rdemes megismernnk, hogy mi volt az els olyan algoritmus,
amelyre azt mondtk, hogy az valban algoritmusnak tekinthet. Az els ilyen algoritmust az kori
grgknl tallhatjuk meg. Euklidsz alkotta meg azt a mdszert, amely kt pozitv egsz szmrl
meghatrozza a legnagyobb kzs osztjukat. Ezt az eljrst ma Euklideszi algoritmusnak nevezzk, s
a kvetkezt mondja ki.
1. Adott kt pozitv egsz szm, jelljk ezeket m-mel s n-nel. A kett kzl legyen m a nagyobbik.
2. Osszuk el m-et n-nel, az oszts maradkt jelljk r-rel.
1 Angolul:
algorithm
3. Ha r rtke 0, azaz m oszthat n-nel, akkor az algoritmus vgre rtnk. Ilyenkor a kt szm
legnagyobb kzs osztja az n rtkvel egyezik meg, az algoritmus pedig befejezdik.
4. Ha r rtke nem 0, akkor m-be troljuk el az n jelenlegi rtkt, n-be pedig az r rtkt. Majd
ugorjunk vissza a 2. pontra.
1.1. Plda. Az elbb bemutatott Euklideszi algoritmus hasznlatval nzzk meg, hogy mi lesz
az m = 150 s az n = 36 szmok legnagyobb kzs osztja. Az algoritmus 2. pontja alapjn el kell
osztanunk m-et n-nel. 150-ben 4-szer van meg a 36, a maradk pedig 6. Ezrt az r-be eltroljuk a 6-ot.
Az algoritmus 3. pontjra lpnk, megvizsgljuk, hogy r rtke 0-e. Mivel nem nulla, ezrt tovbblpnk
a 4. pontra. Az m-et fellrjuk, mostantl 36 lesz benne eltrolva. Az n rtkt is mdostjuk, ez 6 lesz.
Ezutn visszaugrunk az algoritmus 2. pontjra. Elosztjuk a 36-ot 6-tal. Az eredmny 6 lesz, a maradk
pedig 0. gy r-be a 0 rtkt troljuk el. A 3. sorba lpve megvizsgljuk r rtkt. Mivel r = 0, ezrt
lell az algoritmus futsa s eredmnyl megkapjuk az n-ben eltrolt aktulis rtket teht a 6-ot. Ez
az rtk a 150 s a 36 legnagyobb kzs osztja.
Az eddigi pldk figyelembe vtelvel j lenne megfogalmazni, hogy mit is tekintnk algoritmusnak,
egy algoritmusnak milyen elvrsokat kell teljestenie.
Az algoritmus tekinthet egy olyan gp-nek, amely valamilyen bemenetekbl meghatrozott lpseken keresztl elllt valamilyen kimenetet. A bemenetek2 termszetesen az algoritmus elejn mr
ismertek. Az Euklideszi algoritmus bemenete pldul a kt pozitv egsz szm, melyek legnagyobb kzs
osztjt akarjuk megismerni. A kimenetek3 a bemenetek ltal egyrtelmen meghatrozottak. Olyan
nem llhat el, hogy egy algoritmus ugyanazon bemenetek esetn ms-ms kimenetet produkl. Ez gy is
kifejezhet, hogy az algoritmus mkdse jl meghatrozott, azaz az algoritmus determinisztikus. Fontos
mg, hogy az algoritmus egyrtelm, jl definilt lpsekbl ll, melyek szma minden esetben vges. Ha
vgtelen lpst is megengednnk, akkor az algoritmus lellsa nem lenne biztostva.
2 Angolul:
3 Angolul:
input
output
Sergyn Szabolcs
budai Egyetem
Neumann Jnos Informatikai Kar
variable
local variable
6 Angolul: type
5 Angolul:
Sergyn Szabolcs
budai Egyetem
Neumann Jnos Informatikai Kar
Ebben a kifejezsben kt szm rtk vltoz a bal s a jobb szerepel, melyek klnbsgnek felhez
adunk hozz hrmat.
Ahogy mr emltettk a logikai tpus vltozk csak igaz vagy hamis rtket vehetnek fel. gy
egy logikai vltoznak csak olyan kifejezs adhat rtkl, amely kifejezs vagy egyrtelmen igaz vagy
hamis. Pldul mondhatjuk azt, hogy az l logikai vltoznak rtkl adjuk a 2/2 = 1 kifejezst. Mivel
2-ben a 2 pontosan 1-szer van meg, ezrt ez a kifejezs igaz.
Logikai rtkek, illetve logikai kifejezsek kztt logikai mveleteket is rtelmezhetnk, melyek kzl
hrmat hasznlunk ebben a jegyzetben. Logikai rtkek tagadsra a szimblummal jellt negls
mveletet hasznljuk. Az igaz rtk negltja a hamis, mg a hamis negltja a igaz, ahogy az az 1.1
tblzatban is lthat.
l logikai rtke
igaz
hamis
l logikai rtke
hamis
igaz
l2 logikai rtke
hamis
igaz
hamis
igaz
l1 l2 logikai rtke
hamis
hamis
hamis
igaz
l1 l2 logikai rtke
hamis
igaz
igaz
igaz
Sergyn Szabolcs
budai Egyetem
Neumann Jnos Informatikai Kar
1.3. Tmbk
Gyakran fordul el, hogy sok azonos tpus adatot akarunk trolni, illetve ezeken az adatokon valamilyen
mveletet elvgezni. Pldul egy meteorolgiai llomson minden rban eltroljk az aktulis hmrsklet rtket. Ilyenkor egy nap adatainak trolsra nem clszer 24 klnbz vltozt ltrehozni,
heti adatok esetn pedig 168-at. Sokkal clravezetbb egyetlen vltozban sszegyjteni az sszes mrsi
adatot. Ezt valsthatjuk meg tmbk hasznlatval.
A tmbk hasznlata esetn teht egyetlen vltozban tbb adatot is el tudunk trolni. A tmbben
trolt adatoknak azonos tpusaknak kell lennik. Az 1.1. brn lthatunk egy x nev tmbt, melyben
a 20-nl kisebb prm szmokat troltuk el. Ebben az esetben a tmb egsz tpus. Minden tmbnek van
elemszma is, pldnkban ez 8.
x:
11
13
17
19
1.1. bra. A 20-nl kisebb prm szmokat tartalmaz tmb s az elemek indexei.
A tmbben trolt rtkek elrse rdekben valamilyen mdon hivatkoznunk kell a tmb elemeire.
Ezt indexelssel valstjuk meg gy, hogy minden egyes tmbelemhez egyrtelmen hozztartozik egy
index. Az indexek logikus rendet kvetnek: az els tmbelem indexe 1, a msodik 2, . . . , az utols
pedig a tmb elemszmval azonos. Az 1.1. brn lthat, hogy melyik tmbelemnek mi az indexe.
A tmbk indexelse a [ ] indexkpz opertor hasznlatval trtnik. Ha pldul az x tmb harmadik
elemre akarunk hivatkozni, akkor azt a x[3] mdon tehetjk meg. Konkrt pldnkban x[3] rtke 5.
Gyakran fogunk tmbelemekre olyan mdon hivatkozni, hogy indexknt egy vltozt hasznlunk. Pldul
x[i] az x tmb i-edik elemt azonostja. Ilyenkor mindig figyelni kell arra, hogy az alkalmazott indexnek
olyan rtke legyen, ami valban hasznlhat indexknt. azaz mindenkpp pozitv egsz szmnak kell
lennie, s rtke nem haladhatja meg a tmb mrett. Ezek szerint az 1.1. brn lthat plda esetn
csak az 1 s 8 kztti egsz szmok hasznlhatk indexknt.
Algoritmusainkban kln jelezni fogjuk, ha j tmbt hozunk ltre. Ilyenkor meg kell adnunk, hogy
mi lesz az j tmb neve, milyen tpus adatokat trolunk benne, illetve hogy mekkora a tmb mrete.
Pldul egy x nev egszeket tartalmaz nyolc elem tmbt az x Ltrehoz(egsz)[8] utastssal
hozhatunk ltre.
Lehetsgnk van tbbdimenzis tmbk hasznlatra is. Ezek kzl most csak a ktdimenzis
tmbket ismertetjk. A ktdimenzis tmbk adott szm sorral, illetve oszloppal rendelkeznek. Az
elemek indexelse kt indexszel, a sor- s az oszlopindexszel trtnik.
Az 1.2. brn megadunk egy 4 sorbl s 6 oszlopbl ll ktdimenzis tmbt. A kkkel kiemelt elem
sorindexe 2, oszlopindexe pedig 5, ezrt x[2, 5] mdon hivatkozhatunk r.
1
Sergyn Szabolcs
10
budai Egyetem
Neumann Jnos Informatikai Kar
11
budai Egyetem
Neumann Jnos Informatikai Kar
ha felttel akkor
utasts1
utasts2
..
.
utastsN
elgazs vge
Az elgazsnl az algoritmus futsa gy trtnik, hogy elszr kirtkeldik a felttel. Ha a felttel
igaz, akkor a vezrls az elgazsban megadott utastsok vgrehajtsval folytatdik, majd ezt kveten
tovbbhalad az elgazs vge kulcsszt kvet rszre. Amennyiben viszont a felttel hamis, akkor a
felttel kirtkelse utn a vezrls rgtn az elgazs vge kulcsszt kvet rszre ugrik.
Nzzk egy konkrt pldt:
ha a < 0 akkor
a a
elgazs
vge
b a
A pldban a kirtkelend felttel az a < 0. Ha az a vltozaktulis rtke negatv, akkor a vezrls
az a a utastsra ugrik, majd innen halad tovbb a b a sorra.
Amennyiben a mr a felttel
kirtkelsnl se volt negatv, akkor viszont a vezrls rgtn a b a sorra ugrik.
Az elgazsbl megengednk n. ktirny elgazst is. Ilyenkor ms utasts vagy utastsokbl
felptett szekvencia hajtdik vgre, ha az elgazs felttele igaz, s ms ha hamis. A ktirny
elgazst az albb mdon adhatjuk meg:
ha felttel akkor
utastsigazesetben
klnben
utastshamisesetben
elgazs vge
Ha a felttel igaz, akkor a ha gban tallhat utastsigazesetben utasts hajtdik vgre, majd
a vgrehajtst kveten a vezrls az elgazs vge kulcsszt kvet sorra ugrik. A felttel hamis
logikai rtke esetn viszont a felttel kirtkelst kveten a vezrls a klnben gban tallhat
utastshamisesetben sorra ugrik. Az ott tallhat utasts vgrehajtst kveten az algoritmus futsa
az elgazs vge kulcsszt kvet sorban folytatdik.
Nzznk egy pldt a ktirny elgazsra is:
ha a < 0akkor
b a
klnben
b a
elgazs vge
Ha az a vltoz aktulis rtke negatv, akkor az ellentettjnek gyke kerl b-be, egyb esetben viszont
az a gyke lesz b rtke.
Az elgazsok egymsba is gyazhatk, amibl egy specilis esetet szeretnnk kiemelni. Az albbi
pldban megjelenik egy klnben ha g:
ha a > 0akkor
b a
klnben
ha a < 0 akkor
b a
klnben
b0
elgazs vge
Sergyn Szabolcs
12
budai Egyetem
Neumann Jnos Informatikai Kar
13
budai Egyetem
Neumann Jnos Informatikai Kar
Szmlls ciklusokat tipikuson tmbk bejrsra hasznlhatunk. A kvetkez pldban egy tmbbe
elhelyezzk az els t darab ngyzetszmot:
x Ltrehoz(egsz)[5]
ciklus i 1-tl 5-ig
x[i] i2
ciklus vge
Az eddig emltett vezrlsi szerkezetekkel, teht a szekvencival, szelekcival s itercival minden
algoritmus lerhat. Ezt az lltst kln nem bizonytjuk.
Sergyn Szabolcs
14
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
15
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
16
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
17
budai Egyetem
Neumann Jnos Informatikai Kar
Mit mondhatunk az 1.4. algoritmus futsi idejrl? Ehhez vizsgljuk meg elszr, hogy hnyszor
kerl a x[i] + x[j] = 0 felttel kirtkelsre. Ha i = 1, akkor j (n 1) darab klnbz rtket vesz fel,
hiszen 2, 3, . . . , n lehet. Amennyiben i = 2, akkor j mr csak (n 2)-fle lehet. Amikor viszont i mr
n 1 rtk, akkor j csak egy rtket az n-t veszi fel. gy a vizsglt felttel kirtkelseinek szma:
(n 1) + (n 2) + . . . + 2 + 1 =
(n 1) + 1
n (n 1)
(n 1) =
.
2
2
(1.2)
Hnyszor fogjuk elvgezni a db db + 1 rtkadst? Ez attl fgg, hogy hnyszor volt igaz a
x[i] + x[j] = 0 felttel. Lehetsges, hogy a felttel mindig igaz volt, lehet viszont, hogy soha. Futsi id
szempontjbl a legrosszabb eset, ha mindig igaz a felttel, ilyenkor a db db+1 rtkads is n(n1)
-szer
2
kerl vgrehajtsra. gy, ha minden elemi utastst egy lpsnek tekintnk, akkor legrosszabb esetben a
futsi id mr
n (n 1)
2
= n (n 1) .
(1.3)
2
Futsi id szerint legjobb esetben viszont a db db + 1 rtkads egyszer sem trtnik meg, gy
ilyenkor a futsi id
n (n 1)
.
(1.4)
2
Azt mg nem vettk figyelembe, hogy az algoritmus elejn van egy db 0, illetve a vgn egy vissza
db utasts, ami minden esetben kettvel nveli a szksges lpsek szmt. Emellett mg a ciklusok
megvalstsnak is van valamennyi futsi ideje.
Mi az ami ezek alapjn biztosan kijelenthet az algoritmus futsi idejrl? Ami egyrtelmen ltszik
az annyi, hogy a futsi id biztosan arnyos a feldolgozand tmb mretnek ngyzetvel, hiszen az 1.3. s
az 1.4. kpletbl is ez olvashat ki. Teht, ha a feldolgozand tmb mrett ktszeresre nveljk, akkor
a futsi id mr ngyszeres lesz, hromszoros mret esetn pedig kilencszeres.
Hogyan lehet eldnteni, hogy egy algoritmus futsi ideje jobb-e egy msik algoritmus futsi idejnl?
Ha a futsi id elemzsnl azt kapjuk pldul eredmnyl, hogy egy algoritmus futsi ideje
9
n2 ,
100
(1.5)
T2 (n) = n log2 n,
(1.6)
T1 (n) =
egy msik algoritmus pedig
akkor melyik tekinthet hatkonyabbnak? Az 1.3. brn megadjuk a kt fggvny grafikonjt. Lthat, hogy kisebb n rtkek esetn az els, mg nagyobb n rtkeknl a msodik algoritmus eredmnyez
Sergyn Szabolcs
18
budai Egyetem
Neumann Jnos Informatikai Kar
gyorsabb futst. Mivel szmunkra az a fontos, hogy n nvekedsvel miknt vltozik a futsi id, ezrt
a nagy n rtkekre koncentrlunk. Emiatt a msodik algoritmus futsi idejt tekintjk jobbnak, hiszen
minl tbb adatot kell feldolgozni, annl gyorsabban szolgltat eredmnyt az els algoritmushoz kpest.
800
T (n)
600
400
n2
n log2 n
9
100
200
0
0
20
40
60
80
100
9
100
9
Knnyen belthat, hogy ha az els algoritmus futsi idejnl a konstans szorz nem 100
, hanem
annl mg kisebb lenne, akkor is elg nagy n esetn a T1 (n) mr nagyobb lenne T2 (n)-nl. Teht a futsi
id nagy n esetn lnyegben fggetlen a konstans szorz rtktl. Ezt fejezi ki a nagy ord jells, amit
gyakran hasznlunk algoritmusok futsi idejnek jellemzsre.
Hogyan definiljuk az O-val jellt nagy ordt? Azt mondjuk, hogy a T (n) futsi id O (f (n))-es, ha
ltezik olyan c konstans, hogy elg nagy n rtkek esetn a
T (n) c f (n).
(1.7)
Ezek alapjn mondhatjuk pldul, hogy az 1.4. algoritmus futsi ideje O(n2 )-es.
Az 1.3. tblzatban sszefoglaltuk a leggyakrabban elfordul futsi idket. A tblzat tetejtl lefel
haladva egyre nagyobb futsi idkkel tallkozunk.
Futsi id nagysgrendje
O(1)
O(log n)
O(n)
O(n log n)
O(n2 )
O(n3 )
O(2n )
Sergyn Szabolcs
19
budai Egyetem
Neumann Jnos Informatikai Kar
2. fejezet
Programozsi ttelek
A programozsi ttelek az algoritmus alkots sorn gyakran elfordul problmkra adnak megoldsokat. Azrt nevezzk ezeket a mdszereket tteleknek, mert matematikailag is bizonythat az ismertetett
mdszerek helyessge s hatkony futsi idejk. A programozsi ttelek nhny esetben mr els olvassra is nagyon egyszernek tnnek, esetleg megkrdjelezhet pontos ismeretk szksgessge is. Fontos
szerepk van viszont abban, hogy ezeket a tteleket ltalban minden programoz ismeri, gy a napi rutinban egy adott feladat megoldsra ezeket hasznlja. gy kijelenthet, hogy a programozsi ttelek ltal
adott megoldsok hasznlatval az elll algoritmusok, illetve programok olvashatsga s megrtse is
sokkal egyszerbb vlik.
A programozsi tteleket jegyzetnkben tmbk hasznlatval mutatjuk be, mert jelenleg csak ezt az
adatszerkezetet ismerjk. Tanulmnyaink elrehaladtval knnyen meg tudjuk majd oldani, hogy ms
adatszerkezetek (pldul listk) esetn is megadjuk a megfelel ttel megvalstst, de ez nem kpezi
ezen jegyzet trgyt.
A programozsi ttelek elnevezsnek jelents szerepe van a ksbbi algoritmus alkotsi gyakorlatban. Az itt bevezetett fogalmak ltalban mindig ugyanazzal a jelentssel brnak. Ezen fogalmak kzl
szeretnnk kiemelni prat az albbiakban.
Eldnts Eldnti, hogy a bemeneti tmbben van-e adott tulajdonsg elem.
Kivlaszts Megadja, hogy hol van a bemeneti tmbben egy adott tulajdonsg elem, felttelezve, hogy
van ilyen a tmbben.
Keress Az elz kett kombincija, teht eldnti, hogy a bemeneti tmbben van-e adott tulajdonsg
elem, s ha van, akkor megadja, hogy hol talljuk meg azt.
Megszmlls Megadja, hogy hny darab adott tulajdonsg elem van a bemeneti tmbben.
Msols Egy tmb elemeinek egyik tmbbl msik tmbbe msolsa, melynek sorn a tmbbeli elemek
rtkei vltozhatnak.
Kivlogats A bementi tmb adott tulajdonsg elemeinek tmsolsa egy msik tmbbe.
Sztvlogats A bemeneti tmb klnbz tulajdonsg elemeinek tmsolsa klnbz tmbkbe.
A programozsi tteleket jegyzetnkben kt nagy csoportra bontjuk. Az els csoportba tartoznak azok
a ttelek, melyek egy bemeneti tmbbl lltanak el egyetlen (vagy esetleg tbb) rtket. Ezeket egyszer
programozsi tteleknek nevezzk s a 2.1. alfejezetben trgyaljuk. A msodik csoportba tartoznak azok
a ttelek, amelyek bemenete egy vagy tbb tmb, s a kimenete is egy vagy tbb tmb. Ezek alkotjk
az sszetett programozsi tteleket, melyek trgyalsra a 2.2. alfejezetben kerl sor. A fejezet vgn
mutatunk pr pldt a programozsi ttelek sszeptsre is (ld. 2.3. alfejezet).
20
summation
A programozsi ttelt megvalst algoritmus pszeudokdjt a 2.1. algoritmusban rjuk le. Az algoritmus bemenete a feldolgozand tmb, melynek termszetesen az elemszmt is ismernnk kell. Az
algoritmus konkrt megvalstsnl tudnunk kell azt is, hogy a tmb elemei kztt milyen mveletet
kvnunk vgrehajtani, ezt jelljk ltalnosan az szimblummal. A mveletet nem adjuk t bemenetknt az algoritmusnak, mivel ltalban a konkrt programozs nyelvi implementcikban sem tudunk
gy eljrni. Az algoritmus kimenete egyetlen eredmny, melynek tpusa megegyezik a tmb elemeinek
tpusval, rtke pedig a tmb sszes elemn elvgzett mvelettel kaphat meg:
rtk = x[1] x[2] . . . x[n].
2.1. Algoritmus Sorozatszmts programozsi ttel
Bemenet: x T tmb, n egsz (tmb mrete)
Kimenet: rtk T
1: fggvny Sorozatszmts(x : T tmb, n : egsz)
2:
rtk rtk0
3:
ciklus i 1-tl n-ig
4:
rtk rtk x[i]
5:
ciklus vge
6:
vissza rtk
7: fggvny vge
Felhasznlt vltozk s fggvnyek
x: Vizsglt tmb.
n: A tmb mrete.
: T tpus adatokon rtelmezett mvelet, amit a tmb sszes eleme kztt hajtunk vgre.
rtk: Az adott mveletnek () a tmb sszes elemre trtn alkalmazst kveten elll
eredmny.
rtk0 : Az alkalmazott mvelettl fgg kiindulsi rtk.
Az algoritmus elszr kezdeti rtket ad az rtk vltoznak (2. sor). A kiindulsi rtk (rtk0 ), attl
fgg, hogy milyen mveletet hajtunk vgre a tmb elemei kztt. Pldul sszeads esetn 0, szorzs
esetn pedig 1 az rtke. Ha az mvelet az uni kpzs, akkor az reshalmazzal, szvegek sszefzse
esetn pedig az res szveggel inicializljuk az rtk vltozt.
Az algoritmus 3. s 5. sorai kztti ciklussal bejrjuk a teljes x tmbt, gy biztostva, hogy minden
elemn el tudjuk vgezni a kvnt mveletet. A 4. sorban a rtk vltoz korbbi rtke s a tmb
aktulis x[i] eleme kztt elvgezzk az mveletet, melynek eredmnyvel fellrjuk az rtk vltoz
korbbi rtkt. Itt vlik vilgoss, hogy a 2. sorban mirt azt a kezdeti rtket hasznltuk, amit az
adott mvelethez vlasztottunk. sszeads esetn pldul i = 1 esetn a nullhoz akarjuk hozzadni a
tmb els elemt, szorzsnl viszont az egyet kell megszoroznunk az els elemmel.
Sergyn Szabolcs
21
budai Egyetem
Neumann Jnos Informatikai Kar
x:
i
Kimenet
Kimenet
rtk : 0
rtk : 3
i
Kimenet
Kimenet
rtk : 10
rtk : 9
x:
Kimenet
Kimenet
rtk : 18
rtk : 22
2.1. bra. Sorozatszmts programozsi ttel. A pldban egy t elem tmb elemeinek sszegt
szmtjuk ki. A kiindulsi rtk (rtk0 itt 0, az eredmny pedig az rtk vltozba kerl.
Elszr az rtk vltoz kezdeti rtket kap (2.1a. bra), ami esetnkben az sszeads miatt 0. Ezt
kveten a tmb minden elemn vgighaladva az rtk vltozt mindig az aktulis tmbbeli rtkkel
nveljk (2.1b-2.1f. bra). Az utols elem figyelembe vtelt kveten az rtk vltozban pont a tmb
elemeinek rtke llt el (2.1f. bra).
Futsi id elemzse. A sorozatszmts programozsi ttel futsi idejrl knnyen lthat, hogy a
tmb mretvel egyenesen arnyos, azaz O(n)-es. Ennek oka, hogy minden elemet pontosan egyszer
olvasunk ki, s mivel nincs semmifle felttel vizsglat az algoritmusban, gy nem llhat el olyan eset,
amikor valamelyik lps kimaradna az algoritmusbl.
Sergyn Szabolcs
22
budai Egyetem
Neumann Jnos Informatikai Kar
decision
property
Sergyn Szabolcs
23
budai Egyetem
Neumann Jnos Informatikai Kar
Megjegyzs
A ciklus felttele kapcsn fontos megemlteni, hogy a kt vizsglt felttel sorrendje nem
felcserlhet. Ennek akkor van jelentsge, ha a tmbben nincs egyetlen P tulajdonsg
elem sem. Ilyenkor ugyanis i rtke meg fogja haladni n rtkt, konkrtan n + 1 lesz. Viszont (n + 1)-gyel nem indexelhetjk a tmbt, mert ez mr nem ltez index. Felttelek
rvidzr kirtkelsrl tudjuk, hogy egy s kapcsolatban () az els tag hamis rtke
esetn a msodik tagot mr felesleges vizsglni, mivel ha az els tag hamis, akkor az
egsz felttel is hamis lesz. gy i = n + 1 esetn a tmbt nem fogjuk hibsan indexelni,
mert az els tag akkor mr hamis rtkknt kirtkelsre kerlt.
A ciklusbl kt esetben tudunk kilpni. Ha i n igaz, akkor a P (x[i]) lett hamis, azaz P (x[i])
igaz. Ekkor a tmb i-edik eleme P tulajdonsg, teht van a tmbben vizsglt tulajdonsg elem. Ha
viszont az els felttel hamis, azaz i > n, akkor a tmb minden elemt megvizsgltuk mr a ciklusban
s sehol nem talltunk P tulajdonsg elemet. Ezek alapjn kijelenthet, hogy a vizsglt tulajdonsg
elem elfordulsrl az i index n-hez val viszonya egyrtelm informcit szolgltat. gy az algoritmus
6. sorban a van vltoznak ezen vizsglat eredmnyt adjuk t. Az algoritmus vgn a fggvny a van
vltoz rtkvel tr vissza (7. sor).
Megjegyzs
Az eldnts ttel kis talaktssal alkalmass tehet annak vizsglatra, hogy egy tmb
minden egyes eleme teljest-e egy adott tulajdonsgot. Ehhez a 2.2. algoritmusban kt
mdosts szksges. Elsknt a 3. sorban lv felttelt kell gy mdostani, hogy addig
maradjunk a ciklusban azaz addig jrjuk be a tmb elemeit , amg a vizsglt elem P
tulajdonsg: (i n) P (x[i]). Ha a vizsglt elem nem P tulajdonsg, akkor be kell
fejeznnk a tmb bejrst.
A msik mdostsi pont a 6. sorban tallhat vizsglat, mely rtket ad a van vltoznak. Akkor mondhatjuk, hogy minden elem P tulajdonsg a tmbben, ha a ciklusbl
azrt lptnk ki, mert minden elemet megvizsglva mindig teljeslt az P (x[i]) felttel,
azaz i n lett hamis.
Az talaktott esetet a 2.3. algoritmusban tallhatjuk meg teljes egszben.
Futsi id elemzse. A futsi id szempontjbl azt rdemes vizsglni, hogy hnyszor kell a ciklus
felttelt kirtkelni. Ez termszetesen fgg attl, hogy a tmb elemei milyenek, melyik az els olyan
ha van egyltaln , amely teljesti az P tulajdonsgot.
Sergyn Szabolcs
24
budai Egyetem
Neumann Jnos Informatikai Kar
Abban az esetben, ha nincs vizsglt tulajdonsg elem a tmbben, akkor a ciklus felttelt (n + 1)-szer
rtkeljk ki, illetve minden egyes tmbelem egyszer lesz vizsglva.
Ha van P tulajdonsg elem a tmbben, akkor a futsi id attl fgg, hogy a legkisebb index ilyen
elem hol helyezkedik el a tmbben. Ha pldul mr az els elem teljesti a P tulajdonsgot, akkor a
ciklusfelttel csak egyszer kerl kirtkelsre. Ha viszont az n-edik elem az els ilyen, akkor n darab
kirtkels szksges.
sszessgben kijelenthet, hogy az algoritmus igaz visszatrsi rtke esetn tlagosan n2 -del arnyos
a futsi id, mg hamis visszatrsi rtk esetn n-nel. Az algoritmus futsi ideje gy O(n)-es.
2.2. Plda. Feladatunk, hogy egy hat elem, egsz szmokat tartalmaz tmb esetn eldntsk, van-e
pros szm a tmbben. A feladat eldnts ttellel trtn megoldst a 2.2. bra szemllteti. Elszr
megvizsgljuk a tmb els elemt, hogy pros-e (2.2a. bra), mivel nem az, ezrt tovbblpnk a soron
kvetkez tmbelemre. A msodik s harmadik elemet is megvizsgljuk (2.2b-2.2c. bra), de ezek sem
pros szmok. A negyedik elem viszont pros, gy tovbbi vizsglat nem szksges, az algoritmus igaz
rtkkel tr vissza (2.2d. bra).
x:
x:
i
(a) Bejrs 1. lps.
x:
x:
van : igaz
2.2. bra. Eldnts programozsi ttel. A plda azt vizsglja, hogy van-e pros rtk elem a tmbben.
2.3. Plda. Az eldnts ttel logikja olyan problmk megoldsa esetn is hasznlhat, amikor
nem egy tmbrl kell eldntetnk, hogy van-e vizsglt tulajdonsg eleme. Pldaknt tekintsk azt a
feladatot, amikor egy pozitv egsz szmrl (N ) meg kell vizsglnunk,
hogy prm3 vagy nem prm. Ennek
eldntse rdekben meg kell vizsglnunk, hogy van-e kett s N kztt olyan egsz rtk, amely osztja
N -nek. Ha van ilyen, akkor a szm nem lehet prm, mert osztja az 1, a megtallt rtk s maga az N
szm is, gy mr tbb mint kt osztja van. A prm tesztelst a 2.4. algoritmussal valsthatjuk meg.
2.4. Plda. Az eldnts ttel kis mdostssal olyan krdsek megvlaszolsra is alkalmas, amelyek
egyszerre egy tmb tbb elemt is vizsgljk. Tekintsk azt a feladatot, amikor el kell dntennk, hogy
egy tmb elemei nvekv mdon rendezettek-e, azaz
x[1] x[2] . . . x[n].
(2.1)
Ennek eldntse rdekben meg kell vizsglnunk minden szomszdos elemprt, hogy a nagyobb index
elem nem kisebb-e a kisebb index elemnl, azaz
x[i] x[i + 1].
(2.2)
3 Prm
szmok azok a pozitv egsz szmok, melyeknek pontosan kett klnbz osztjuk van.
Sergyn Szabolcs
25
budai Egyetem
Neumann Jnos Informatikai Kar
3:
ciklus amg (i N ) Osztja(i, N )
4:
ii+1
5:
ciklus vge
6:
prm (i > N )
7:
vissza prm
8: fggvny vge
Felhasznlt vltozk s fggvnyek
N : 2-nl nem kisebb pozitv egsz szm, melynek a prm tulajdonsgt vizsgljuk.
prm: Logikai tpus kimeneti vltoz, amely pontosan akkor lesz igaz, ha N prm szm.
Osztja(i, N ): Logikai rtket visszaad fggvny, amely pontosan akkor igaz, ha i osztja N nek. A fggvny megvalstsa tbbflekppen is trtnhet, ennek tgondolst az olvasra bzzuk.
2.5. Algoritmus Nvekv rendezettsg vizsglata
Bemenet: x T tmb, n egsz; ahol T sszehasonlthat
Kimenet: rendezett logikai
1: fggvny Rendezett_E(x : T tmb, n : egsz)
2:
i1
3:
ciklus amg (i n 1) (x[i] x[i + 1])
4:
ii+1
5:
ciklus vge
6:
rendezett (i > n 1)
7:
vissza rendezett
8: fggvny vge
Felhasznlt vltozk s fggvnyek
x: A vizsglt tmb, melynek elemei sszehasonlthatak.
n: Az x tmb mrete.
rendezett: Logikai vltoz, melynek rtke pontosan akkor igaz, ha az x elemei nvekv mdon
rendezettek.
x:
i+1
10
15
x:
21
10
i+1
15
x:
21
10
15
i+1
10
15
21
10
15
i+1
21
x:
10
15
21
21
Kimenet
rendezett : igaz
i+1
26
budai Egyetem
Neumann Jnos Informatikai Kar
4 Angolul:
selection
Sergyn Szabolcs
27
budai Egyetem
Neumann Jnos Informatikai Kar
linear search
Sergyn Szabolcs
28
budai Egyetem
Neumann Jnos Informatikai Kar
Futsi id elemzse. Mivel a lineris keress programozsi ttel nagyon hasonl az eldnts ttelhez,
csak egy tovbbi opcionlis rtkadsban tr el attl, ezrt a futsi idejrl is ugyanaz mondhat. gy a
futsi id itt is O(n)-es.
2.5. Plda. Egy t elem egsz rtkeket tartalmaz tmbben vizsgljuk, hogy van-e benne pros szm,
s amennyiben van, akkor hol tallhat az els ilyen. A feladat megoldst a lineris keress programozsi
ttellel a 2.4. bra szemllteti. Az els s msodik elem mg nem pros, ezrt azok vizsglatt kveten
tovbblpnk a tmbben (2.4a-2.4b. bra). A harmadik elem viszont pros, ezrt itt vget r a keress,
az algoritmus visszatr a van vltoz igaz rtkvel, az idx vltoz pedig megkapja a tmbbeli aktulis
helyet, azaz i aktulis rtkt (2.4c. bra).
x:
x:
x:
i
(c) Bejrs 3. lps.
2.4. bra. Lineris keress programozsi ttel. Keressk, hogy van-e pros elem egy tmbben, s ha van,
akkor hol tallhat az els ilyen.
Megjegyzs
Gyakran elfordul, hogy a keress sorn egy konkrt rtk x tmbbeli elfordulst vizsgljuk. Ilyenkor a figyelembe vett tulajdonsg fggvny az x[i] = rtk egyenlsg vizsglatval helyettesthet. Mivel az 5.1. fejezetben konkrt rtk keresst vizsgljuk majd,
ezrt a 2.8 algoritmusban megadjuk az rtk keress pszeudokdjt is.
Sergyn Szabolcs
29
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
30
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
31
budai Egyetem
Neumann Jnos Informatikai Kar
x:
x:
i
Kimenet
Kimenet
db : 0
db : 0
Kimenet
db : 1
db : 1
Kimenet
x:
Kimenet
Kimenet
db : 2
db : 3
2.5. bra. Megszmlls programozsi ttel. Az x tmbben meghatrozzuk a pros szmok darabszmt.
Sergyn Szabolcs
32
budai Egyetem
Neumann Jnos Informatikai Kar
Megjegyzs
Az algoritmus a legnagyobb rtk tmbbeli elem indext adja kimenetknt, nem pedig
a legnagyobb elem rtkt. Ennek az az oka, hogy az max index (s az x eredeti tmb)
ismeretben a maximlis rtk brmikor lekrdezhet, viszont ha a maximlis rtket
ismernnk, akkor csak kivlaszts ttellel tudnnk azt meghatrozni, hol is tallhat az
az elem a tmbben.
Megjegyzs
Sergyn Szabolcs
33
budai Egyetem
Neumann Jnos Informatikai Kar
Megjegyzs
A ttel kis talaktssal minimum rtk (illetve ahhoz tartoz index) kivlasztsra is
alkalmass tehet. Ehhez szintn a 4. sorban tallhat felttelt kell mdostanunk a
relci <-re cserlsvel.
2.7. Plda. Adott egy hat elem egsz szmokat tartalmaz tmb. Adjuk meg, hogy melyik elem a
legnagyobb rtk. A feladat maximumkivlaszts programozsi ttellel trtn megoldst a 2.6. bra
szemllteti.
Els lpsben feltesszk, hogy az els elem a legnagyobb, ezrt a max vltoz az els elemet indexeli
(2.6a. bra). Ezt kveten megvizsgljuk, hogy a msodik elem nagyobb-e az elsnl, s mivel nem
nagyobb, ezrt max rtkt vltozatlanul hagyjuk (2.6b. bra). A kvetkez lpsben a tmb harmadik
elemt vetjk ssze az els elemmel (2.6c. bra). Mivel a harmadik elem nagyobb az elsnl, ezrt a max
vltoz rtkt mdostjuk, innentl kezdve mr a harmadik elemet indexeljk vele. A soron kvetkez
lpsekben hasonl mdon a negyedik, tdik s hatodik elemet hasonltjuk ssze a tmb max index
elemvel, s ha az aktulis tmbelem nagyobb x[max]-nl, akkor max rtkt megvltoztatjuk (2.6d2.6f. bra). Az sszes elem vizsglatt kveten max rtke 5, azaz az tdik elem a legnagyobb a
tmbben, ezrt ezt az rtket adja vissza az algoritmus.
x:
x:
max
(a) A max vltoznak kezdeti rtk adsa.
x:
max
x:
max
max
Kimenet
x:
max
x:
max
max : 5
2.6. bra. Maximumkivlaszts programozsi ttel. Maximlis rtk elem indexnek keresse egy hat
elem egszeket tartalmaz tmbben.
Futsi id elemzse. A maximumkivlaszts programozsi ttel pszeudokdjbl (2.10. algoritmus)
lthat, hogy egy n elem tmb feldolgozsa sorn minden esetben n 1 darab sszehasonltst vgznk.
A cikluson belli rtkadsok szma fgg attl, hogy a vizsglt felttel teljesl-e vagy sem. Futsi id
szempontjbl legrosszabb esetben (n 1)-szer hvdik meg az emltett rtkad utasts. Lthat hogy
a futsi id n-nel arnyos, gy az algoritmus O(n)-es.
Sergyn Szabolcs
34
budai Egyetem
Neumann Jnos Informatikai Kar
6 Angolul:
copy
Sergyn Szabolcs
35
budai Egyetem
Neumann Jnos Informatikai Kar
x:
-2
-1
x:
-2
i
y:
y:
-1
-2
-1
i
y:
-1
x:
i
y:
2.7. bra. Msols programozsi ttel. Az x tmb minden egyes elemnek abszolt rtkt tmsolja az
y tmb megfelel helyre.
Sergyn Szabolcs
36
budai Egyetem
Neumann Jnos Informatikai Kar
37
budai Egyetem
Neumann Jnos Informatikai Kar
nem pros, ezrt azokat nem msoljuk t az y tmbbe (2.8b-2.8c. brk). Az x tmb negyedik s tdik
eleme pros, ezrt db nvelst kveten ezeket msoljuk y-ba (2.8d-2.8e. brk). Mivel x utols eleme
nem pros, ezrt nem trtnik sem db nvels, sem msols (2.8f. bra).
x:
x:
i
y:
y:
x:
y:
x:
i
4
db
(c) Bejrs 3. lps.
y:
db
x:
db
i
y:
db
x:
i
y:
db
db
2.8. bra. Kivlogats programozsi ttel. Egy hat elem tmbbl kivlogatjuk a pros szmokat.
Futsi id elemzse. Az algoritmus bejrja az x tmbt s minden elem esetn megvizsglja, hogy
teljesti-e a P tulajdonsgot. Ez pontosan n darab tulajdonsgvizsglatot jelen. A db vltoz nvelse
s az rtkmsols az y tmbbe csak abban az esetben trtnik meg, ha x[i] P tulajdonsg volt. Ezek
minimlis szma 0, maximlis pedig n. sszessgben kijelenthet, hogy a futsi id a feldolgozand
tmb mretvel egyenesen arnyos, teht az algoritmus O(n)-es.
Abban az esetben, ha a kivlogatst kveten mr nincs szksgnk az eredeti tmbre, akkor a kivlogatst gy is elvgezhetjk, hogy az eredeti tmb elejre gyjtjk ki a P tulajdonsg elemeket. Ennek
megvalstst a 2.13. algoritmus adja meg. Az algoritmus bemenete megegyezik a 2.12. algoritmusnl
ismertetettekkel. Kimenetknt viszont nem egy j tmbt adunk vissza, hanem az eredeti x tmb mdostott vltozatt, valamint a db szmllt. A kimeneti x tmb els db darab elemei azok, amelyek az
eredeti x tmbben teljestettk a P tulajdonsgot. Termszetesen a tmbben bennmaradnak tovbbi
elemek (a db + 1 s n indexek kztti rsz), de ezek nem hordoznak semmilyen relevns informcit.
A lnyeges eltrsek a 2.12. algoritmushoz kpest a kvetkezk. Nem kell helyet foglalnunk az j
y-nak, hiszen nincs szksg kln kimeneti tmbre. Amikor az x tmb bejrsa sorn tallunk egy P
tulajdonsg elemet, akkor azt az x tmb elejre, a db index helyre msoljuk t, ahogy ez a 2.13. algoritmus 6. sorban lthat. Az x tmb feldolgozst kveten csak a db vltoz rtkt adjuk vissza
(9. sor), az x tmb mdostott vltozata pedig a cm szerinti paramtertads miatt lesz elrhet az
algoritmust futtat krnyezetben.
Sergyn Szabolcs
38
budai Egyetem
Neumann Jnos Informatikai Kar
2.10. Plda. Oldjuk meg a 2.9. pldban ismertetett feladatot gy, hogy a kivlogats eredmnyt
az eredeti x tmbben troljuk el. A megolds egyes lpseit a 2.9. brn lthatjuk. Elszr vizsgljuk a
tmb els elemt (2.9a. bra), amelyik pros, gy 1-re nveljk a db vltoz rtkt s a tmb els elemt
helyben hagyjuk. A msodik elem pratlan, gy nem tesznk vele semmit (2.9b. bra). Ugyanez trtnik
a harmadik elem vizsglatnl (2.9c. bra). A negyedik elem pros, ezrt 2-re nveljk db rtkt s a
msodik helyre tmsoljuk a negyedik elemet (2.9d. bra). Ebben a lpsben elvesztjk a tmb korbbi
msodik elemt. Hasonl trtnik az tdik elem vizsglatakor (2.9e. bra). Az utols elem pratlan
ezrt nem tesznk semmit, az algoritmus futsa vget r. Lthat, hogy az elll tmb els hrom
eleme mind pros, a tovbbi elemek pedig csak ottmaradt rtkek a korbbi tmbbl, amelyek relevns
informcit a pros-pratlansgrl nem hordoznak.
Megjegyzs
A 2.10. pldban lthattuk, hogy a helyben trtn kivlogats esetn elemeket vesztnk
az eredeti tmbbl. Ha az algoritmusunkat gy mdostannk, hogy P tulajdonsg elem
megtallsa esetn kicserlnnk kt elemet, akkor nem vesztennk el elemeket az eredeti
tmbbl, csak az elemek sorrendje vltozna meg. gy elrhetjk, hogy a tmbnk elejre
kerlnek a P tulajdonsg elemek, a vgre pedig a nem P tulajdonsgak. Ez egybknt
a 2.2.3. alfejezetben trgyalt sztvlogats ttel feladata.
A 2.14. algoritmusban megadjuk az elemek cserlsvel vgrehajtott sztvlogatst.
Az emltett csere az algoritmus 6. sorban trtnik meg. A ksbbiekben egy ennl
hatkonyabb algoritmust is bemutatunk majd a helyben trtn sztvlogatsra.
Sergyn Szabolcs
39
budai Egyetem
Neumann Jnos Informatikai Kar
db
x:
db
x:
x:
db
8
db
x:
db
4
x:
db
8
x:
2.9. bra. Kivlogats az eredeti tmbben. Egy hat elem egszeket tartalmaz tmb elejre gyjtjk ki
a pros elemeket. Az algoritmus vgn csak az els db darab elem hordoz relevns informcit.
2.14. Algoritmus Kivlogats programozsi ttel az eredeti tmbben az eredeti elemek megtartsval
Bemenet: x T tmb, n egsz (tmb mrete), P logikai
Kimenet: x T tmb, db egsz
1: fggvny Sztvlogats(cmszerint x : T tmb, n : egsz, P : logikai)
2:
db 0
3:
ciklus i 1-tl n-ig
4:
ha P (x[i]) akkor
5:
db db + 1
6:
x[db] x[i]
7:
elgazs vge
8:
ciklus vge
9:
vissza db
10: fggvny vge
Felhasznlt vltozk s fggvnyek
x: A vizsglt tmb.
n: Az x tmb mrete.
P : Logikai rtk tulajdonsgfggvny. Az x tmb P tulajdonsg elemeit vlogatja szt az
algoritmus az x tmb elejre. A P tulajdonsg elemek a tmb elejre, a nem P tulajdonsgak
pedig a vgre kerlnek.
db: A sztvlogatst kveten az x tmbben az els s db-edik elemek kztt vannak a P tulajdonsgak, a db + 1 s n indexek kztti elemek pedig a nem P tulajdonsgak.
Sergyn Szabolcs
40
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
41
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
42
budai Egyetem
Neumann Jnos Informatikai Kar
x:
x:
i
y1 :
y1 :
y2 :
db2
x:
y1 :
db1
y2 :
db2
db2
x:
i
4
i
y1 :
db1
y2 :
db2
db1
y1 :
x:
y2 :
db1
y2 :
y1 :
db1
x:
db1
y2 :
db2
db2
2.10. bra. Az x tmb elemeinek sztvlogatsa. A pros elemek kerlnek az y1 tmbbe, a pratlanok
pedig az y2 -be.
Sergyn Szabolcs
43
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
44
budai Egyetem
Neumann Jnos Informatikai Kar
2.12. Plda. Feladatunk, hogy a hat elem egsz szmokat tartalmaz x tmb elemeit vlogassuk szt
az y tmbbe gy, hogy y elejre kerljenek a pros szmok, a vgre pedig a pratlan szmok. A pros
szmok szmt a db vltoz adja meg. A feladat 2.16. algoritmussal trtn megoldst a 2.11. bra
szemllteti.
x:
x:
i
y:
y:
jobb
db
jobb
x:
db
jobb
db
jobb
i
y:
x:
i
y:
x:
y:
db
x:
db
jobb
i
y:
db jobb
2.11. bra. Az x tmb elemeinek sztvlogatsa egyetlen tmbbe. A pros elemek kerlnek az y tmb
elejre, a pratlanok pedig a vgre.
A sztvlogats memria helyfoglals szempontjbl leghatkonyabb megoldsa az, amikor az eredeti
tmbn bell vgezzk el. Ezt tbbfle mdon is megvalsthatjuk. Egyik lehetsg a kivlogats programozsi ttel trgyalsakor mr bemutatott 2.14. algoritmus. Ebben az esetben az eredeti tmbn kvl
egyetlen plusz elemre van szksg, mivel a csere csak ilyen mdon vgezhet el. Ennl az algoritmusnl
viszont van egy futsi id szempontjbl gyorsabb lehetsg is, melyet a 2.17. algoritmus ad meg.
Az algoritmus a szoksos bemenetekkel rendelkezik. Kimenetknt egyrszt visszaadja a bemeneti
tmbt, melynek elejn lesznek a P tulajdonsg elemek, vgn pedig a nem P tulajdonsgak. A msik
kimeneti vltoz (db) megadja, hogy melyik a tmb utols P tulajdonsg eleme, azaz az els db elem
P tulajdonsg, a tbbi pedig nem.
Az algoritmus mkdsnek lnyege, hogy a tmb elejrl, illetve vgrl kt irnybl vgznk bejrst. Ha a tmb elejn nem P tulajdonsg elemet tallunk, akkor azt htra mozgatjuk, ha pedig
htul tallunk P tulajdonsg elemet akkor azt elre mozgatjuk. A kt irny bejrs megvalstshoz
szksgnk van kt indexelre. A tmb elejrl htrafel halad indexelt bal-nak, a htulrl elre fel
haladt pedig jobb-nak nevezzk az algoritmusban. Ezen indexek rtke az algoritmus kezdetn 1, illetve
n lesz (ld. az algoritmus 2. s 3. sort). Az elemek ksbbi mozgatsakor hatatlanul fell fogunk rni
egy elemet, ezrt a tmb els elemt kimentjk egy segdvltozba (4. sor).
A tmb ktirny bejrst egymsba gyazott ciklusokkal valstjuk meg. A kls ciklus az algoritmus 5. s 20. sora kztt tallhat. A ciklus belpsi s bennmaradsi felttele, hogy a bejrs kzben
Sergyn Szabolcs
45
budai Egyetem
Neumann Jnos Informatikai Kar
vltoz indexek mg ne rjenek ssze, azaz bal kisebb legyen jobb-nl. Ezt a felttelt a cikluson belli
elgazsokban s a bels ciklusokban is mindig vizsgljuk, hiszen ha mr nem teljesl, akkor nem kell
folytatnunk a bejrst, gy kilphetnk a ciklus(ok)bl. Ezen felttel teljeslst a tovbbiakban nem
fogjuk minden esetben kln kifejteni.
A 6. s 8. sor kztti ciklus valstja meg a tmb htulrl trtn bejrst. A ciklusban addig
vagyunk bent, amg a jobb indexszel meghatrozott hts elem nem P tulajdonsg, azaz a helyn van.
Ilyenkor a ciklus magjban csak annyit tesznk, hogy az indexet 1-gyel balra mozgatjuk, azaz rtkt
1-gyel cskkentjk (7. sor).
A ciklusbl kt ok miatt lphetnk ki. Ha a bal index mr nem kisebb a jobb indexnl, akkor be
kell fejeznnk a bejrst, amit a felptett teljes ciklus s elgazs szerkezet megvalst. Amennyiben
viszont bal < jobb mg igaz, akkor azrt lptnk ki a ciklusbl, mert P (x[jobb]) igaz z vlt, azaz
talltunk a tmb hts rszben egy P tulajdonsg elemet, aminek ell lenne a helye. Ilyen esetben
a 9. sorbeli elgazs felttele igaz, teht belpnk az elgazsba s a htul lv elemet a tmb elejre
msoljuk (10. sor). Mivel az x[bal] elem P tulajdonsg, gy mostantl mr biztos a helyn van, ezrt nem
kvnjuk a ksbbiekben mdostani. Ennek rdekben a bal indexet 1-gyel jobbra mozgatjuk (11. sor).
Ezt kveten a tmbt az elejtl (konkrtan a bal index aktulis rtktl) jrjuk be a vge fel,
amit a 12. s 14. sorok kztti ciklus valst meg. Amg a ciklus felttele teljesl, azaz a bal indexnl
tallhat elem P tulajdonsg, addig bal rtkt 1-gyel nveljk (13. sor).
Ebbl a ciklusbl is kt esetben lphetnk. Ha a bal index mr nem kisebb a jobb indexnl, akkor be
kell fejeznnk a bejrst. Ha viszont bal < jobb teljesl (15. sor), akkor azrt lpnk ki, mert a bal index
elem nem P tulajdonsg. Ekkor ezt az elemet htra kell mozgatnunk a jobb index helyre (16. sor) s
a jobb index rtkt 1-gyel cskkentennk kell (17. sor).
A fent ismertetett ktirny bejrst addig folytatjuk, amg a kt index, bal s jobb ssze nem r.
Amennyiben egyenlv vlik a kt index rtke, akkor kilpnk a ciklusokbl, s az indexek aktulis
helyre bemsoljuk a kezdetben kln vltozba (segd) kimentett tmbelemet (21. sor). Ebben a
pillanatban az x tmb mr teljesti azt az elvrst, hogy a tmb elejn minden elem P tulajdonsg, a
vgn pedig minden elem nem P tulajdonsg, valamint pontosan az eredeti tmb elemeit tartalmazza
az talaktott tmb is. Szksges viszont mg megadni, hogy hol is tallhat a vlaszt vonal a P s
a nem P tulajdonsg elemek kztt. Abban biztosak lehetnk, hogy az utoljra tmbbe mozgatott
elem eltt minden elem P tulajdonsg, utna pedig mindegyik nem P tulajdonsg, teht csak az
utols elemet (x[bal]) kell megvizsglnunk. Amennyiben ez az elem P tulajdonsg (22. sor), akkor az
utols P tulajdonsg elem helyt megad db vltoz rtkt bal-ra lltjuk (23. sor). Ha x[bal] nem P
tulajdonsg, akkor az 1-gyel elbb lv elem lesz az utols, teht db-t (bal 1)-re lltjuk (25. sor).
Az algoritmus vgn nem kell visszaadnunk kln az talaktott x tmbt, mert cm szerinti paramter tadssal kapta meg ezt a tmbt az algoritmus. gy csak a msik kimeneti vltozt, a db-t adja
visszatrsi rtkknt a fggvny (27. sor).
2.13. Plda. Egy egsz szmokat tartalmaz tmb elemeit vlogassuk szt gy, hogy az eredeti tmb
elejre kerljenek a pros szmok, vgre pedig a pratlan szmok! A sztvlogats sorn csak az eredeti
tmbt hasznlhatjuk.
A feladat 2.17. algoritmussal trtn megoldst a 2.12. bra szemllteti.
Futsi id elemzse. A 2.17. algoritmus futsi idejnek elemzse sorn vizsgljuk meg, hogy hny
darab tulajdonsgvizsglat trtnik, illetve hnyszor mozgatjuk az egyes elemeket.
A P tulajdonsg teljeslst minden elem esetn pontosan egyszer vizsgljuk. Az 5. s 20. sorok
kztti ciklus az els elem kivtelvel minden elem esetn egyszer vizsglja meg az P tulajdonsg teljeslst. Az els elemet az algoritmus elejn kimentjk a segd vltozba, majd az algoritmus vgn a
visszamozgatst kveten megvizsgljuk ezen elem esetn is a P tulajdonsg teljeslst (22. sor). gy
sszesen n darab tulajdonsg vizsglatot hajtunk vgre.
Az elemek mozgatsa tekintetben nem tudjuk pontosan megmondani, hogy hny mozgats trtnik,
de a legrosszabb esetbeli mozgatsok szmt meg tudjuk hatrozni. Legrosszabb esetnek azt tekinthetjk,
amikor a tmb elemei mr kezdetben is szt voltak vlogatva, de pont fordtott mdon, mint azt mi
elvrtuk volna, azaz a tmb elejn a nem P tulajdonsg, a vgn pedig a P tulajdonsg elemek
vannak. Ebben az esetben a tmb bejrsa sorn minden esetben mozgatunk egy elemet vagy a tmb
vgrl az elejre, vagy az elejrl a vgre. Ezen mozgatsok szma n 1 lesz, mivel pontosan ennyi
lps alatt fog a kezdetben egymstl n 1 tvolsgra lv bal s jobb vltoz ugyanarra az elemre
mutatni. Ezen mozgatsokon tl mg figyelembe kell vennnk, hogy az algoritmus elejn az els elemet
Sergyn Szabolcs
46
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
47
budai Egyetem
Neumann Jnos Informatikai Kar
Vltoz
x:
segd = 4
x:
segd = 4
jobb
bal
Vltoz
x:
segd = 4
jobb
bal
x:
segd = 4
jobb
bal
Vltoz
x:
segd = 4
segd = 4
jobb
bal
x:
bal
jobb
(f) Bejrs 5. lps.
2.12. bra. Sztvlogats programozsi ttel megvalstsa az eredeti tmbben. A pros szmok kerlnek
a tmb elejre, a pratlanok pedig a vgre.
Sergyn Szabolcs
48
budai Egyetem
Neumann Jnos Informatikai Kar
Vltoz
x:
segd = 4
jobb
bal
x:
segd = 4
bal jobb
(h) Bejrs 7. lps.
Vltoz
x:
bal
db
segd = 4
jobb
(i) Bejrs 8. lps.
2.12. bra. Sztvlogats programozsi ttel megvalstsa az eredeti tmbben. A pros szmok kerlnek
a tmb elejre, a pratlanok pedig a vgre (folyt.).
tmsoljuk a segd vltozba, majd az algoritmus vgn onnan visszamozgatjuk a tmb bal index
helyre. gy sszessgben legrosszabb esetben n + 1 darab mozgats trtnik.
A fentiek figyelembe vtelvel kijelenthet, hogy az algoritmus futsi ideje minden esetben O(n)-es.
A futsi idt rdemes mg sszehasonltani az ugyanezen feladatot megold 2.14. algoritmus futsi
idejvel. Abban az esetben az a lnyeges klnbsg, hogy mindig, amikor egy elemrl megllaptjuk,
hogy rossz helyen van a tmbben, akkor megcserljk egy msik elemmel. Az 1. fejezetben lttuk,
hogy egy csert hrom darab mozgatssal tudunk megvalstani, gy a legrosszabb esetben sszesen
3 (n 1) darab mozgats szksges, ami a 2.17. algoritmus (n + 1)-es maximlis mozgats szmnl
tbb. A tulajdonsg vizsglatok szma mindknt algoritmusnl azonos, gy kijelenthet, hogy futsi id
szempontjbl a 2.17. algoritmus hatkonyabb.
Sergyn Szabolcs
49
budai Egyetem
Neumann Jnos Informatikai Kar
intersection
Sergyn Szabolcs
50
budai Egyetem
Neumann Jnos Informatikai Kar
Az x1 tmb minden egyes elemre meg kell vizsglnunk, hogy benne van-e az x2 tmbben. Ennek
rdekben az 5. s 8. sorok kztti rszen bejrjuk az x2 tmbt az eldnts ttelnl megismert mdon.
Az x2 tmb bejrsa mindig a tmb elejrl indul, ezrt a j index rtkt 1-re lltjuk (5. sor). A 6. s
8. sorok kztti ciklusban addig maradunk bent, amg van mg az x2 tmbnek nem megvizsglt eleme,
illetve amg nem tallunk az x1 tmb aktulis x1 [i] elemvel megegyez elemet az x2 tmbben. A cikluson
bell mindig eggyel lpnk tovbb az x2 tmbben (7. sor).
A ciklusbl kilpve megvizsgljuk, hogy mi a kilps oka. Ha j n2 teljesl (9. sor), akkor az
x1 [i] 6= x2 [j] felttel lett hamis, azaz talltunk egy x1 [i]-vel egyenl elemet az x2 tmbben. A megtallt
elemet t kell msolnunk az y tmbbe. A msols rdekben az y tmb indexeljt, a db vltozt eggyel
nvelnnk kell (10. sor), majd a megtallt elemet mr t tudjuk msolni az y tmb megfelel helyre
(11. sor).
Ha az x1 tmb minden elemre megvizsgltuk mr, hogy benne van-e az x2 tmbben, akkor vissza
kell adni az ellltott y tmbt s a db vltozt (14. sor).
Megjegyzs
A metszet fogalmat a matematikai halmazok esetn mr megismertk. Lnyeges klnbsg viszont a most trgyalt metszet s a matematikai metszet kztt, hogy matematikban
a halmazokban nem lehet ismtlds, az ltalunk trgyalt tmbkben viszont igen. gy
ha az x1 tmbben van olyan tbbszr is elfordul elem, amely benne van az x2 tmbben
is, akkor ezt az elemet az sszes elfordulsval tmsoljuk az y tmbbe. Ha viszont egy
elem az x1 tmbben egyszer van bent, de az x2 tmbben tbbszr is elfordul, akkor csak
egyszer msoljuk t az y tmbbe.
Ebbl kvetkezik, hogy a jelenleg trgyalt metszetnk mint matematikai mvelet, nem
tekinthet kommutatvnak, azaz nem felcserlhet x1 s x2 szerepe.
2.14. Plda. Adott kt ngy elem tmb a 2.13. brn lthat mdon. Hatrozzuk meg a kt tmb
kzs elemeit a metszet ttel alkalmazsval! A megvalsts egyes lpseit a 2.13. bra szemllteti.
Jl lthat, hogy az x1 tmb tbbszr elfordul azon elemei, amelyek x2 -ben is bent vannak, minden
elfordulsukkor bemsoldnak az y tmbbe. Az x2 tbbszr elfordul s x1 -ben is elfordul elemei
viszont csak egyszer msoldnak az y tmbbe.
Futsi id elemzse. A metszet ttel algoritmusnak futsi ideje a kt bemeneti tmb mrettl,
n1 -tl s n2 -tl is fgg, hiszen mindkt tmbt be kell jrnunk. Az algoritmus sorn az x1 tmb minden
egyes elemt keressk az x2 tmbben. Ez a keress tallat esetn legalbb egy, legfeljebb n2 , illetve
tlagosan n22 darab vizsglatot jelent. Ha a keresett elem nincs bent az x2 tmbben, akkor az egsz
tmbt vgig kell nzni, teht n2 darab vizsglat szksges. Ezek alapjn kijelenthetjk, hogy az x1
tmb egy elemnek keresse az x2 tmbben O(n2 ) futsi idej.
Mivel x1 minden egyes elemre vgre kell hajtanunk a keresst, ezrt sszessgben n1 O(n2 ) =
O(n1 n2 ) lesz a futsi ideje az algoritmusnak.
A metszet ttelt az eddigiekben arra hasznltuk, hogy kt tmbbl kivlogassuk a kzs elemeket. Kis
talaktssal lehetsgnk van arra, hogy a kzs elemekkel kapcsolatos ms jelleg feladatokra adjunk
megoldst. Megvizsglhatjuk pldul, hogy az x1 s x2 tmbnek van-e kzs eleme. Ekkor lnyegben
kt eldnts ttelt kell egymsba gyaznunk, hiszen azt keressk, hogy van-e az x1 tmbnek olyan eleme,
amely benne van az x2 tmbben is. Erre a feladatra ad megoldst a 2.19. algoritmus.
Hasonlan vizsglhatjuk azt is, ha tudjuk, hogy van kzs eleme a kt tmbnek, akkor hol tallhat
ez a kzs elem az els tmbben. Ez egy kivlaszts s egy eldnts sszeptst jelenti. Ha az a
feladatunk, hogy hatrozzuk meg a kt tmb kzs elemeinek szmt, akkor pedig egy megszmllst s
egy eldntst kell egymsba ptennk. Ezen feladatok megvalstst nem rszletezzk, de ajnljuk a
hallgatknak gyakorlsknt az algoritmusok nll megalkotst.
Sergyn Szabolcs
51
budai Egyetem
Neumann Jnos Informatikai Kar
x1 :
x1 :
i
x2 :
x2 :
y:
db
x1 :
x2 :
y:
x2 :
j
y:
i
2
x2 :
i
2
db
i
2
db
y:
y:
x2 :
x1 :
j
y:
db
db
db
x1 :
x1 :
i
x2 :
x1 :
i
2
x2 :
j
y:
i
x2 :
j
y:
j
2
db
db
y:
db
(i) x1 [4] keresse az x2 tmbben, 2. lps.
2.13. bra. Metszet programozsi ttel. Az x1 tmb minden elemre egy eldnts ttellel megvizsgljuk,
hogy benne van-e az x2 tmbben. Ha bent van, akkor x1 vizsglt elemt tmsoljuk az y tmb soron
kvetkez helyre.
Sergyn Szabolcs
52
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
53
budai Egyetem
Neumann Jnos Informatikai Kar
union
Sergyn Szabolcs
54
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
55
budai Egyetem
Neumann Jnos Informatikai Kar
x1 :
x2 :
y:
db
(a) Az y tmbt 9 elem tmbknt hozzuk ltre. Az x1
tmb minden elemt tmsoljuk az y tmb azonos megfelel
helyre, majd a db vltozt az utols bemsolt elem indexre
vltoztatjuk.
x1 :
i
x2 :
j
y:
db
(b) Az x2 [1] elemet keressk az x1 tmbben. Mivel x2 [1] =
x1 [1], ezrt nem kell az x2 [1] elemet az y tmbbe bemsolni.
x1 :
i
x2 :
j
y:
db
(c) Az x2 [2] elem keresse az x1 tmbben, 1. lps.
Sergyn Szabolcs
56
budai Egyetem
Neumann Jnos Informatikai Kar
x1 :
i
x2 :
j
y:
db
(d) Az x2 [2] elem keresse az x1 tmbben, 2. lps. Mivel
x2 [2] = x1 [2], ezrt az x2 [2] elemet nem msoljuk be az y
tmbbe.
x1 :
i
x2 :
j
y:
db
(e) Az x2 [3] elem keresse az x1 tmbben. Mivel nem tallhat meg a keresett elem az x1 -ben, ezrt az i index meghaladja az x1 mrett. x2 [3]-at bemsoljuk az y tmbbe.
x1 :
i
x2 :
j
y:
db
(f) Az x2 [4] elem keresse az x1 tmbben. Mivel x2 [4] =
x1 [1], ezrt nem msoljuk be a keresett elemet az y tmbbe.
Sergyn Szabolcs
57
budai Egyetem
Neumann Jnos Informatikai Kar
x1 :
i
x2 :
j
y:
db
(g) Az x2 [5] elem keresse az x1 tmbben. Mivel nem tallhat meg a keresett elem az x1 -ben, ezrt az i index meghaladja az x1 mrett. x2 [5]-t bemsoljuk az y tmbbe.
Megjegyzs
Sergyn Szabolcs
58
budai Egyetem
Neumann Jnos Informatikai Kar
2.16. Plda. A 2.15. brn lthat egy plda, amelyben egy hat elem tmbbl szrjk ki a tbbszr
is elfordul elemeket.
Futsi id elemzse. Futsi id szempontjbl legrosszabb esetben a 2.21. algoritmus 5. sorban
kezdd bels ciklus j vltozja minden esetben j > db-vel szll ki a ciklusbl. Ez azt jelenti, hogy
minden elem pontosan egyszer fordul el a tmbben. Ilyenkor a bels ciklus magja mindig db-szer kerl
vgrehajtsra, a db pedig a ciklusbl kilpve 1-gyel nvekszik. gy a futsi id:
T (n) = 1 + 2 + . . . + (n 1) =
n (n 1)
,
2
(2.3)
teht az algoritmus O n2 -es.
Sergyn Szabolcs
59
budai Egyetem
Neumann Jnos Informatikai Kar
db
x:
db
x:
db
1
x:
db
2
x:
db
x:
db
4
x:
db
db
x:
x:
db
x:
Sergyn Szabolcs
60
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
61
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
62
budai Egyetem
Neumann Jnos Informatikai Kar
tovbbra is megmarad. Ennek a trkknek az alkalmazsval elrjk azt, hogy ha az egyik tmbben
trolt valdi elemeket mr mind feldolgoztuk, a tmb aktulis eleme (ez a kibvtskor bevezetett +
rtk elem) mg sszehasonlthat a msik tmb elemeivel, s mivel a + nagyobb minden elemnl,
gy teljesl, hogy a msik tmb mg fel nem dolgozott elemei msoldnak t az y tmbbe. A konkrt
megvalstst 2.23. algoritmus mutatja. A 10. sorban lthat ciklusfelttelt is kis mrtkben mdostani
kell, mert addig kell a ciklusban bent maradni, amg mindkt tmbben az sszes eredeti elemet fel nem
dolgoztuk.
2.23. Algoritmus Mdostott sszefuttats programozsi ttel
Bemenet: x1 T rendezett tmb, n1 egsz (tmb mrete), x2 T rendezett tmb, n2
egsz (tmb mrete)
Kimenet: y T rendezett tmb, db egsz
1: fggvny Mdostottsszefuttats(x1 : T rendezett tmb, n1 : egsz, x2 : T rendezett
tmb, n2 : egsz)
2:
y Ltrehoz(T)[n1 + n2 ]
3:
n1 n1 + 1
4:
x1 [n1 ] +
5:
n2 n2 + 1
6:
x2 [n2 ] +
7:
i1
8:
j1
9:
db 0
10:
ciklus amg (i < n1 ) (j < n2 )
11:
db db + 1
12:
ha x1 [i] < x2 [j] akkor
13:
y[db] x1 [i]
14:
ii+1
15:
klnben ha x1 [i] > x2 [j] akkor
16:
y[db] x2 [j]
17:
j j+1
18:
klnben
19:
y[db] x1 [i]
20:
ii+1
21:
j j+1
22:
elgazs vge
23:
ciklus vge
24:
vissza (y, db)
25: fggvny vge
Felhasznlt vltozk s fggvnyek
x1 : Egyik rendezett bemeneti tmb.
n1 : Az x1 tmb mrete.
x2 : Msik rendezett bemeneti tmb.
n2 : Az x2 tmb mrete.
y: Rendezett kimeneti tmb, melynek minden egyes eleme vagy az x1 vagy az x2 tmbnek is eleme.
db: Az y tmbben a relevns elemek szma.
Ltrehoz(T)[n1 + n2 ]: Utasts, mely ltrehoz egy (n1 + n2 ) elem T tpus tmbt.
Futsi id elemzse. Az sszefuttats ttel bevezetsekor mr emltettk, hogy f clunk az uni ttel
futsi idejnek nagymrtk javtsa. Vizsgljuk meg, hogy a bemutatott algoritmusokkal sikerlt-e ezt
a clt megvalstanunk! Knnyen lthat, hogy a futsi id a kt bemeneti tmb mretnek sszegvel
arnyos, hiszen minden bemeneti tmbbeli elemet legfeljebb egyszer msolunk be a kimeneti tmbbe s
minden msolsnl legfeljebb kett sszehasonltst vgznk csak (ld. 12. s 15. sorok). gy kijelenthet,
hogy az sszefuttats ttel futsi ideje O(n1 + n2 )-es, ami tnyleg jelents javuls az uni ttel O(n1 n2 )es futsi idejhez kpest. Ne felejtsk viszont el, hogy ezt csak a bemeneti tmbk rendezettsge miatt
tudtuk elrni.
Sergyn Szabolcs
63
budai Egyetem
Neumann Jnos Informatikai Kar
2.17. Plda. A 2.16. brn lthatunk egy pldt arra, hogy a 2.23. algoritmussal miknt futtathat
ssze kt rendezett tmb.
x1 :
10
i
x2 :
j
y:
db
(a) A y tmbt ltrehozzuk 9 elem tmbknt, valamint az
x1 s x2 tmbket kibvtjk egy-egy rtk j elemmel.
Mivel x1 [1] > x2 [1], ezrt x2 [1]-et msoljuk y[1]-be.
x1 :
10
i
x2 :
j
y:
db
(b) Mivel x1 [1] < x2 [2], ezrt x1 [1]-et msoljuk y[2]-be.
Sergyn Szabolcs
64
budai Egyetem
Neumann Jnos Informatikai Kar
x1 :
10
i
x2 :
j
y:
db
(c) Mivel x1 [2] = x2 [2], ezrt x1 [2]-t msoljuk y[3]-ba.
x1 :
10
i
x2 :
j
y:
db
(d) Mivel x1 [3] > x2 [3], ezrt x2 [3]-at msoljuk y[4]-be.
x1 :
10
i
x2 :
j
y:
db
(e) Mivel x1 [3] < x2 [4], ezrt x1 [3]-at msoljuk y[5]-be.
Sergyn Szabolcs
65
budai Egyetem
Neumann Jnos Informatikai Kar
x1 :
i
x2 :
10
j
y:
db
(f) Mivel x1 [4] = x2 [4], ezrt x1 [4]-et msoljuk y[6]-ba.
x1 :
i
x2 :
10
j
y:
10
db
(g) Mivel x1 [5] > x2 [5], ezrt x2 [5]-t msoljuk y[7]-be. A
bemeneti tmbk minden eredeti elemt feldolgoztuk, gy
vget r az algoritmus futsa.
Sergyn Szabolcs
66
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
67
budai Egyetem
Neumann Jnos Informatikai Kar
(2.4)
Sergyn Szabolcs
68
budai Egyetem
Neumann Jnos Informatikai Kar
x:
-3
-1
-8
x:
-3
-1
-8
i
Kimenet
Kimenet
rtk : 0
rtk : 3
-3
-1
-8
-3
Kimenet
rtk : 9
rtk : 10
-8
Kimenet
x:
-1
-1
-8
-3
-1
-8
Kimenet
Kimenet
rtk : 18
rtk : 22
2.17. bra. Msols s sorzatszmts sszeptse. A pldban egy t elem tmb elemei abszolt
rtknek sszegt szmtjuk ki, az eredmny az rtk vltozba kerl. Mivel az sszeads mveletet
hasznljuk, ezrt rtk0 = 0.
Sergyn Szabolcs
69
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
70
budai Egyetem
Neumann Jnos Informatikai Kar
Megjegyzs
rdemes megvizsglni az algoritmus azon vltozatt, amikor a kiszmtott f (x[i]) rtkeket nem troljuk el segdvltozkban, ahogy az a 2.26. algoritmusban lthat. A 2.25. algoritmusban egy n elem tmb feldolgozsa sorn sszesen n-szer hvjuk meg az f fggvnyt, mg a rvidebbnek s ezrt egyszerbbnek tn 2.26. algoritmusban 2 (n 1)-szer.
Emiatt az utbbi algoritmus futsi ideje jelentsen megnvekedhet.
2.19. Plda. Feladatunk, hogy egy hat elem, egsz szmokat tartalmaz tmbbl kivlasszuk azt az
elemet, melynek a ngyzete a legnagyobb. A feladat megoldshoz a msols s maximumkivlaszts
ttelek sszeptsnek 2.25. algoritmust hasznljuk. A megolds sorn az f fggvny a ngyzetfggvny.
A megolds lpsenknti menett a 2.18. bra szemllteti.
Sergyn Szabolcs
71
budai Egyetem
Neumann Jnos Informatikai Kar
Vltoz
x:
-1
-4
-7
-8
maxrtk : 1
max
(a) Els lpsknt a max vltoz az x tmb els elemt indexeli, a
maxrtk pedig felveszi az els elem ngyzetnek rtkt.
Vltoz
Vltoz
x:
-1
max
-4
-7
-8
segd : 25
maxrtk : 1
Vltoz
x:
-1
-4
max
-7
-8
segd : 25
maxrtk : 25
(c) Mivel a segd nagyobb volt, mint a maxrtk ezrt a max felveszi az i rtkt, a
maxrtk pedig a segd rtkt kapja meg.
Vltoz
Vltoz
x:
-1
-4
max
-7
-8
segd : 16
maxrtk : 25
(d) Folytatdik a bejrs a 3. elemmel. A 3. elem ngyzete kisebb mint a max index
elem ngyzete.
Vltoz
Vltoz
x:
-1
-4
max
-7
-8
segd : 49
maxrtk : 25
2.18. bra. Feladatunk, hogy megkeressk az x azon elemt, melynek legnagyobb a ngyzete. A megoldshoz a msols s maximumkivlaszts ttelek sszeptst hasznljuk gy, hogy az f fggvny a
ngyzetfggvny.
Sergyn Szabolcs
72
budai Egyetem
Neumann Jnos Informatikai Kar
Vltoz
Vltoz
x:
-1
-4
-7
max
-8
segd : 49
maxrtk : 49
Vltoz
x:
-1
-4
-7
max
-8
maxrtk : 49
Vltoz
segd : 81
x:
-1
-4
-7
max
-8
maxrtk : 81
Vltoz
segd : 81
Vltoz
x:
-1
-4
-7
-8
max
maxrtk : 81
Vltoz
segd : 64
(i) Az utols elem ngyzete nem nagyobb az x[max] ngyzetnl. A bejrs vget r, az
algoritmus visszaadja a max s a maxrtk vltozk aktulis rtkt.
2.18. bra. Feladatunk, hogy megkeressk az x azon elemt, melynek legnagyobb a ngyzete. A megoldshoz a msols s maximumkivlaszts ttelek sszeptst hasznljuk gy, hogy az f fggvny a
ngyzetfggvny (folyt.).
Sergyn Szabolcs
73
budai Egyetem
Neumann Jnos Informatikai Kar
74
budai Egyetem
Neumann Jnos Informatikai Kar
a keresst. Az i index nvelst kveten megvizsgljuk, hogy az aktulis x[i] tmbelem P tulajdonsg-e
(ld. 6. sor). Amennyiben P tulajdonsg elemet talltunk, akkor a megtallt P tulajdonsg elemek
szmt trol db vltoz rtkt eggyel nveljk (ld. 7. sor).
A ciklusbl kilpve megvizsgljuk, hogy talltunk-e a tmbben k darab P tulajdonsg elemet. Erre
egyrtelm vlaszt ad a db = k vizsglat, aminek eredmnyt el is troljuk a van vltozban (ld. 10. sor).
Fontos megjegyezni, hogy nem az i < n felttelt vizsgljuk, mivel ha a tmb utols eleme pp a k-adik
P tulajdonsg elem a tmbben, akkor br talltunk k darab P tulajdonsg elemet, az i < n felttel
mgis hamis rtket ad. Ha a van vltoz igaz volt (11. sor), akkor a k-adik P tulajdonsg elem
pont a jelenlegi i-edik helyen van a tmbben, ezrt az idx vltoznak tadjuk i rtkt (12. sor), majd
visszatrnk a kt kimeneti vltozval (13. sor). Ha van hamis (14. sor), akkor csak a van rtkt kell
visszaadnunk (15. sor).
2.20. Plda. A 2.19. brn lthatunk egy pldt arra, amikor egy tmbben keressk a harmadik pros
elemet.
Vltoz
x:
db : 1
i
(a) A tmb els eleme pros, ezrt db rtkt 1-re nveljk.
Vltoz
x:
db : 1
i
(b) A msodik tmbbeli elem nem pros, ezrt mdostsok nlkl folytatjuk a bejrst.
Vltoz
x:
db : 2
i
(c) A harmadik tmbelem pros, ezrt db rtke eggyel
nvekszik.
Vltoz
x:
db : 3
Kimenet
i
(d) A negyedik elem is pros, gy db rtke mr 3 lesz. Mivel megtalltuk a harmadik
pros elemet, ezrt az algoritmus futsa vget r.
2.19. bra. Plda a megszmols s keress programozsi ttelek sszeptsre. Feladatunk megkeresni
az x tmb harmadik (k = 3) pros elemt, ha van egyltaln hrom pros eleme.
Sergyn Szabolcs
75
budai Egyetem
Neumann Jnos Informatikai Kar
76
budai Egyetem
Neumann Jnos Informatikai Kar
Ezt kveten be kell jrnunk az x tmb tbbi elemt, amit a 6. s 17. sorok kztti ciklussal valstunk
meg. A bejrs sorn minden elemet sszehasonltunk az aktulis maximlis rtkkel (maxrtk), aminek
hrom klnbz eredmnye lehet. Ha x[i] < maxrtk, akkor az aktulis elem nem maximlis rtk,
ezrt nem kell semmit sem csinlnunk. Ha viszont x[i] > maxrtk (7. sor), akkor olyan maximlis elemet
talltunk, ami minden korbbi elemnl biztosan nagyobb, ezrt ez a megtallt elem lesz a maxrtk
(5. sor). Az j maximlis rtket eddig csak egyszer talltuk meg az x tmbben mgpedig az aktulis
elemnl , ezrt a db vltoz rtkt egyre vltoztatjuk (9. sor), valamit az y tmbben eltroljuk az
aktulis elem indext (10. sor). Abban az esetben, ha az aktulis x[i] elem megegyezik az eddig vizsglt
elemek maximumval (azaz maxrtk-kel) (12. sor), akkor j, de az eddigivel azonos rtk maximumot
talltunk az x tmbben. Ilyenkor a megtallt maximlis rtk elemek szmt nveljk eggyel (13. sor)
s az aktulis indexet eltroljuk az y tmbben (14. sor). A bejrs vgn szksges mg a kimeneti
vltozkat visszaadni (18. sor).
Megjegyzs
Sergyn Szabolcs
77
budai Egyetem
Neumann Jnos Informatikai Kar
Vltoz
x:
y:
maxrtk : 6
db
(a) Kiindulsknt az els elemet tekintjk maximlisnak, ezrt x[1]-et tmsoljuk
maxrtk-be, illetve az y tmbbe is bekerl az 1-es index.
Vltoz
x:
maxrtk : 6
i
y:
db
(b) A msodik elem nem nagyobb a jelenlegi maxrtk-nl, ezrt semmit sem kell
tenni.
Vltoz
x:
maxrtk : 6
i
y:
db
(c) A harmadik elem megegyezik a maxrtk-kel, gy a db rtkt eggyel nveljk
s az y-ba bekerl a hrmas index is.
Vltoz
x:
maxrtk : 6
i
y:
db
(d) A negyedik elemnl a harmadikhoz hasonlan jrunk el.
2.20. bra. Maximumkivlaszts s kivlogats sszeptse. Egy nyolc elem tmbbl kivlogatjuk a
maximlis rtk elemek indexeit.
Sergyn Szabolcs
78
budai Egyetem
Neumann Jnos Informatikai Kar
Vltoz
x:
maxrtk : 8
i
y:
db
(e) Az tdik elem nagyobb az eddigi maxrtk-nl, ezrt x[5] kerl a maxrtkbe. Mivel csak egyetlen maximlis rtk elemet talltunk, ezrt a db vltoz
ismt 1 lesz, s az y tmb els helyre kerl a maximlis rtk elem indexe.
Vltoz
x:
maxrtk : 8
i
y:
db
(f) A hatodik elem kisebb a maxrtk-nl, ezrt semmi teend nincs.
Vltoz
x:
maxrtk : 8
i
y:
db
(g) A hetedik elem megegyezik a maxrtk-kel, ezrt db rtkt eggyel nveljk
s az y tmbbe bekerl a hetes rtk is.
Vltoz
x:
maxrtk : 8
i
y:
db
(h) A nyolcadik elem kisebb a maxrtk-nl, ezrt semmit sem tesznk. A bejrs
vgre az y tmbbe hrom elem is bekerlt, de ebbl csak az els kett hordoz
rdemi informcit.
2.20. bra. Maximumkivlaszts s kivlogats sszeptse. Egy nyolc elem tmbbl kivlogatjuk a
maximlis rtk elemek indexeit (folyt.).
Sergyn Szabolcs
79
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
80
budai Egyetem
Neumann Jnos Informatikai Kar
Kimenet
x:
rtk : 0
Kimenet
x:
rtk : 0
Kimenet
x:
Kimenet
x:
rtk : 6
Kimenet
x:
rtk : 6
Kimenet
x:
rtk : 14
rtk : 18
2.21. bra. Kivlogats s sorozatszmts ttel sszeptse. Egy tmb pros rtk elemeinek sszegt
szmtjuk ki.
Sergyn Szabolcs
81
budai Egyetem
Neumann Jnos Informatikai Kar
egy olyan rtk, amely minden tmbbeli elem rtknl biztosan kisebb.
Sergyn Szabolcs
82
budai Egyetem
Neumann Jnos Informatikai Kar
2.10. algoritmusnl figyelembe vettnk. Most nem mondhatjuk azt, hogy tekintsk kezdetben maximlis
elemnek az els elemet, mert lehet, hogy ez az elem nem P tulajdonsg. Azt mondhatnnk esetleg, hogy
tekintsk kezdetben maximlis elemnek a tmb els P tulajdonsg elemt, de nem tudjuk, hogy melyik
ez, st lehetsges, hogy egyltaln nincs a tmbben P tulajdonsg elem. Ezrt inkbb kezdetben nem
tekintnk egyetlen elemet sem maximlisnak, hanem rtelmeznk egy olyan maximlis rtket trol
maxrtk vltozt, amelynek a kezdeti rtke egy olyan kicsi rtk, amelynl minden tmbbeli elem
biztosan nagyobb.
Ezt kveten bejrjuk az x tmbt a 3. s 8. sorok kztti ciklussal. A cikluson bell az aktulis x[i]
elem esetn megvizsgljuk, hogy P tulajdonsg-e, s ha az, akkor megnzzk, hogy nagyobb-e az rtke
a maxrtk vltoz aktulis rtknl (ld. 4. sor). (Vegyk szre, hogy ha pp az els P tulajdonsg
elemnl tartunk a bejrs sorn, akkor az biztos nagyobb lesz, mint a maxrtk addigi rtke, teht
tnyleg az els P tulajdonsg elemet fogjuk elszr maximlisnak tekinteni.) Ha olyan elemet talltunk,
amely megfelel a megfogalmazott kt felttelnek ez azt jelenti, hogy a P tulajdonsg elemek kztt j
maximumot talltunk, ezrt megvltoztatjuk a max s maxrtk vltozk rtkeit (5. s 6. sorok).
A ciklusbl kilpve elszr ellenriznnk kell, hogy talltunk-e az x tmbben P elemet. Ezt eldnthetjk olyan mdon, hogy megvizsgljuk a maxrtk vltoz rtkt. Ha maxrtk = , akkor nem
talltunk, hiszen amint korbban mr emltettk tallat esetn biztos megvltozott volna a maxrtk
vltoz rtke. Szval a van kimenetnek tadjuk a maxrtk 6= rtkt (9. sor). Ezutn megvizsgljuk a van vltoz rtkt (10. sor), ha igaz, akkor hrom kimeneti vltozt adunk vissza (11. sor),
egybknt pedig csak egyet (13. sor).
2.23. Plda. A 2.22. brn bemutatunk egy pldt, ahol egy egsz szmokat tartalmaz tmbbl
kivlasztjuk a pros elemek maximumt.
Sergyn Szabolcs
83
budai Egyetem
Neumann Jnos Informatikai Kar
Vltoz
x:
maxrtk :
x:
maxrtk :
i
(b) Az els tmbbeli elem nem pros, ezrt nem tesznk vele
semmit.
Vltoz
x:
max
maxrtk : 2
Vltoz
x:
max
maxrtk : 6
(d) A harmadik elem is pros s nagyobb a korbbi maxrtknl. gy max s maxrtk ismt mdosul.
Vltoz
x:
max
maxrtk : 6
Vltoz
x:
max
maxrtk : 6
(f) Az tdik elem pros, de kisebb mint maxrtk, ezrt nem trtnik semmi. Mivel a bejrs vgre
rtnk meghatrozzuk van rtkt, ami igaz lesz.
2.22. bra. Kivlogats s maximumkivlaszts ttelek sszeptse. Egy egsz szmokat tartalmaz
tmbbl ki kell vlasztanunk a pros szmok maximumt.
Sergyn Szabolcs
84
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
85
budai Egyetem
Neumann Jnos Informatikai Kar
x:
x:
y:
db
16
db
i
y:
y:
x:
16
i
y:
64
16
64
db
db
2.23. bra. Kivlogats s msols ttel sszeptse. Az x tmb pros elemeinek ngyzett msoljuk t
az y tmbbe.
Sergyn Szabolcs
86
budai Egyetem
Neumann Jnos Informatikai Kar
3. fejezet
Rendezsek
Az algoritmus alkotsi s programozsi gyakorlatban igen gyakran elll feladat, hogy a rendelkezsre
ll adatokat amiket pldul egy tmbben trolunk el sorba kell rendezni. Emiatt szmos n. rendez
algoritmust alkottak meg, melyek kzl a leginkbb ismert, egyszeren megrthetket trgyaljuk ebben
a fejezetben.
A rendezsek sorn mindig egy tmb elemeit fogjuk sorba rendezni, mgpedig nvekv sorrendbe.
Ehhez persze szksges, hogy a tmb olyan elemeket tartalmazzon, melyek egymssal sszehasonlthatk,
azaz brmely kt elem kztt rtelmezett a < relci. A rendezs sorn nem fogunk j tmbt ltrehozni a
rendezend adatok tmeneti trolsra, hanem az eredeti bemeneti tmbn bell vgezzk el a rendezst.
Ennek kvetkezmnyeknt az elll rendezett tmb, ami egyben az algoritmus kimenete is lesz, az eredeti
tmbben ll el. Mindez gy is lerhat, hogy a rendezend n elem x tmb elemeire a rendezs vgre
teljesl, hogy
x[1] x[2] . . . x[n].
(3.1)
A fejezetben ismertetett rendezsek esetn a futsi idt hrom szempont szerint fogjuk elemezni. Egyrszt vizsglni fogjuk, hogy az adott algoritmus alkalmazsa sorn hny sszehasonltsra van szksg.
Msrszt elemezni fogjuk a tmbelemek kztt elvgzend cserk szmt, illetve az elemek msolsnak
szmt. Az elemek kztti csert a 3.1. algoritmusban rszletezett mdon valstjuk meg. A rendezseknl lert pszeudokdokban a Csere eljrs helyett a opertort hasznljuk, de ez csak jellsbeli
klnbzsg. Lthat, hogy egy csere minden esetben hrom rtkadssal, azaz hrom elem msolssal
valsthat meg, ezrt a cserk szmnak mindig hromszorosa a cserk sorn vgrehajtott rtkadsok
szma.
3.1. Algoritmus Csere
Bemenet: a T, b T
Kimenet: a T, b T
1: eljrs Csere(cmszerint a : T, cmszerint b : T)
2:
segd a
3:
ab
4:
b segd
5: eljrs vge
Felhasznlt vltozk s fggvnyek
a: Egyik cserlend vltoz.
b: Msik cserlend vltoz.
segd: A csere megvalstshoz szksges segdvltoz.
A futsi id elemzse sorn meg fogjuk vizsglni a legrosszabb esetet, ami tipikusan a fordtva rendezett tmb esete lesz, hiszen annak rdekben, hogy egy cskken mdon rendezett tmbt nvekv
mdon rendezett alaktsunk a lehet legtbb csert, illetve msolst kell vgrehajtani. Vizsglni fogjuk
azt az esetet is, amikor a tmb eleve rendezett, mert az algoritmusok ezt nem tudjk elre megllaptani,
gy rdekes lehet, hogy ilyen esetben mit tudunk mondani a futsi idrl. Termszetesen az tlagos
esettel is fogunk foglalkozni.
87
Memria helyfoglals szempontjbl minden ismertetett algoritmus ugyangy fog viselkedni. Ahogy
mr emltettk a rendezseket a bemeneti tmbn bell valstjuk meg, teht ehhez n elem tmb
esetn n elem trolshoz szksges mennyisg memriahely kell. Amikor kt tmbbeli elemet meg
fogunk cserlni, akkor a Csere eljrs ltrehoz egy j tmeneti elemet, amit a csere lefutsnak idejre
a memriban trolnunk kell, ezrt sszessgben n + 1 elem trolshoz szksges memria helyre van
szksgnk. Kt ismertetett algoritmusban cserk hasznlata nlkl fogunk rendezni, ekkor viszont egy
segdvltozt hasznlunk majd, gy ebben az esetben is n + 1 elemnyi memrira lesz szksgnk. Azzal
kln nem foglalkozunk, hogy a tmbk indexelsre hasznlt indexvltozk trolsra mennyi memrira
van szksgnk, mert az indexek mrete ltalban elenysz a tmbelemek mrethez kpest.
A fejezetben ht klnbz rendez algoritmust mutatunk be, melyek hrom nagy csoportba oszthatk. Elsknt a 3.1. alfejezetben bemutatjuk az egyszer csers rendezst, mely egy alapvet tletet
valst meg. Ennek az algoritmusnak a tovbbfejlesztseknt vezetjk be a minimumkivlasztsos rendezst, melyet a 3.2. alfejezetben mutatunk be. A 3.3. alfejezetben egy msik egyszer tleten alapul
rendezst, a buborkrendezst ismertetjk. Ennek a rendezsnek is ltezik javtott vltozata, a 3.4. alfejezetben bemutatott javtott buborkrendezs. tdik rendezsi algoritmusknt a beillesztses rendezst
ismertetjk a 3.5. alfejezetben. Itt is lesz majd javtsi lehetsg, gy a 3.6. alfejezetben lerjuk a javtott
beillesztses rendezst is. Ezen utbbit mg tovbb lehet fejleszteni, gy kapjuk meg a 3.7. alfejezetben
ismertetett Shell rendezst.
Az emltett ht rendez algoritmus kzl a szakirodalomban ltalban csak ngyet tallunk meg, a
minimumkivlasztsos rendezst amit szoks egyszeren csak kivlasztsos rendezsnek nevezni , a
javtott buborkrendezst, a javtott beillesztses rendezst, illetve a Shell rendezst. A msik hrom
algoritmus trgyalst didaktikai szempontok miatt tartjuk fontosnak.
A jegyzet ksbbi rszben, a 6. fejezetben bemutatunk kt tovbbi rendez algoritmust is, az
sszefuttat- s a gyorsrendezst. Viszont ezek olyan algoritmus alkotsi eszkzket hasznlnak, melyekre most mg nem alapozhatunk.
Sergyn Szabolcs
88
budai Egyetem
Neumann Jnos Informatikai Kar
89
budai Egyetem
Neumann Jnos Informatikai Kar
x:
x:
1
x:
x:
x:
x:
x:
x:
x:
x:
x:
x:
x:
x:
x:
x:
3.1. bra. Egyszer csers rendezs. A pldn a 3.2. algoritmusnak megfelelen nyomon kvethetjk az
i s j indexek alakulst, valamint az elvgzett cserk eredmnyeit.
Sergyn Szabolcs
90
budai Egyetem
Neumann Jnos Informatikai Kar
Ezutn a bels ciklusban j rtke 3-ra nvekszik. Mivel most x[i] < x[j], teht az algoritmus 4. sorban tallhat felttel hamis, ezrt nem kell csert vgrehajtanunk (ld. 3.1b. bra). A bels ciklusban
j rtke 4-re nvekszik, viszont ekkor is x[i] < x[j], ezrt nem hajtunk vgre csert (ld. 3.1c. bra). Ezt
kveten j rtke 5-re nvekszik. Mivel ekkor x[i] > x[j], ezrt meg kell cserlni az i-edik s j-edik
elemet (ld. 3.1d. bra). Vegyk szre, hogy a tmb els elemt minden ms elemmel sszehasonltottuk,
ha kellett cserltnk, gy a tmb els helyn a legkisebb elem tallhat.
Mivel a bels ciklus vgre rtnk, ezrt a vezrls ismt a kls ciklus fejhez kerl, ahol i rtke
2-re vltozik. A bels ciklus jra elindul, de most j kiindulsi rtke mr 3 lesz. Mivel x[2] < x[3],
ezrt nem trtnik csere (ld. 3.1e. bra). A kvetkez lpsben j rtke 4-re nvekszik s ekkor sem kell
csert vgrehajtani, ahogy az a 3.1f. brn is lthat. Ezutn j = 5 esetn x[i] > x[j], ezrt csert kell
eszkzlni (ld. 3.1g. bra). A bels ciklusnak ismt a vgre rtnk, mostanra a tmb msodik legkisebb
eleme is a helyre kerlt.
A kls ciklusban nveljk i rtkt 3-ra, majd a bels ciklusban j felveszi a 4 rtket. Mivel
x[3] > x[4], ezrt cserlni kell (ld. 3.1h. bra). Ezutn j 5-re vltozik s ismt csert kell vgrehajtani,
amint az a 3.1i. brn is lthat. Mivel a bels ciklus ismt a vgre rt, gy rdemes szrevenni, hogy a
harmadik legkisebb elem is a helyre kerlt.
A kls ciklus utoljra fut le ezt kveten i = 4 rtkkel. Ekkor j csak az 5 rtket veszi fel. Mivel
x[i] > x[j], ezrt egy csert mg vgre kell hajtani (ld. 3.1j. bra). Minden ciklus vgre rtnk, gy az
algoritmus futsa vget r, a tmbnk pedig rendezett vlt.
Futsi id elemzse. Vizsgljuk meg, mit mondhatunk az egyszer csers rendezs futsi idejrl.
Ahogy a fejezet elejn, a rendezsek bevezetsnl mr emltettk, a futsi idt az sszehasonltsok,
cserk s msolsok szmnak vizsglatval elemezzk, legrosszabb, legjobb s tlagos esetben.
szrevehetjk, hogy az algoritmus 4. sorban tallhat sszehasonltst pontosan annyiszor vgezzk
el, ahnyszor a bels ciklus lefut. Meg kell teht hatroznunk, hogy ez hnyszor trtnik meg. Amikor
i = 1, akkor a bels ciklus j vltozja n 1 klnbz rtket vesz fel, teht ennyiszer fut le a bels
ciklus. Az i = 2 esetn (n 2)-szer fut a bels ciklus, i = 3-nl pedig (n 3)-szor. Azt kell teht
meghatroznunk, hogy mivel egyenl az
(n 1) + (n 2) + (n 3) + . . . + 2 + 1
(3.2)
(3.3)
rtkkel. Ez lesz teht az sszehasonltsok szma, brmilyen is volt a rendezs eltt a tmbnk.
Nzzk meg ezt kveten, mi a helyzet az algoritmus 5. sorban tallhat cserk szmval. Ezek szma
mr fgg attl, hogy az aktulisan vizsglt kt tmbelemnek milyen a viszonya. Ha a tmbnk kezdetben
cskken mdon rendezett volt, akkor minden sszehasonltsnl igaz lesz az x[i] > x[j] felttel, ezrt
ugyanannyi csert kell vgeznnk, mint amennyi az sszehasonltsok szma. gy kijelenthetjk, hogy
legrosszabb esetben a cserk szma is n(n1)
lesz. Vizsgljuk meg most a legjobb esetet, azaz amikor a
2
tmbnk eleve nvekv mdon rendezett volt. Mivel ilyenkor minden lehetsges i s j esetn x[i] < x[j],
gy az algoritmus 4. sorban lv felttel mindig hamis lesz, teht soha nem fogunk cserlni. tlagos
esetben a cserk darabszma 12 n(n1)
lesz.
2
Mivel a msolsok szma a cserk szmnak hromszorosa, ezrt legrosszabb esetben 3 n(n1)
,
2
legjobb esetben pedig nulla msols fog vgrehajtdni.
sszessgben azt mondhatjuk az egyszer csers rendezs algoritmusrl, hogy minden esetben a
tmb mretvel ngyzetesen arnyos
a futsi id, hiszen mr az sszehasonltsok szma is ilyen. Azaz
a futsi id biztos, hogy O n2 -es.
Sergyn Szabolcs
91
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
92
budai Egyetem
Neumann Jnos Informatikai Kar
x[j]-vel (5. sor). Ha az aktulis elem kisebb mint az eddigi minimum, akkor j minimumot talltunk,
ezrt a min vltozban trolt indexet fellrjuk az aktulis elem j indexvel (ld. 6. sor).
Amikor a bels ciklus vgre rnk, akkor a min index az i-edik s az n-edik elem kztti elemek
minimumnak indext tartalmazza. Mivel a minimlis rtk elemet az i-edik helyre szeretnnk helyezni,
hiszen ez az algoritmusunk f clja, ezrt kicserljk az i-edik s a min-edik elemet (ld. 9. sor). Ha ezt
minden i-re megvalstjuk, akkor vgeredmnyben a tmbnk rendezett vlik.
Megjegyzs
selection sort
3.2. Plda. Nzzk vgig egy konkrt pldn hogyan rendez egy tmbt a minimumkivlasztsos
rendezs 3.3. algoritmusa. A 3.2. brn kvethetjk nyomon a 4, 3, 8, 6, 1 elemeket tartalmaz x tmb
rendezsnek lpseit.
Elsknt belpnk az algoritmus 2. sorban kezdd ciklusba, az i index rtke 1 lesz. Meg kell
keresnnk a tmb legkisebb elemt, hogy ezzel cserlhessk majd ki a jelenlegi els elemet. Ehhez
minimumkivlasztst hajtunk vgre, ami a min index inicializlsval kezddik, gy min is felveszi az 1
rtket. Belpnk a 4. sorban kezdd bels ciklusba, j kezdeti rtke 2 lesz. Kvetkezeik az 5. sorbeli
felttel vizsglat. Mivel a msodik elem kisebb, mint az els, ezrt min rtkt kettre vltoztatjuk,
ahogy ez a 3.2a. brn is lthat.
A bels ciklusban tovbblpnk, j rtke hromra n. Mivel a harmadik elem nagyon, mint x[min],
ezrt nem kell a min rtkt mdostani (ld. 3.2b. bra). Ezutn ismt n j rtke s x[min] < x[j]
teljesl, ezrt most sem mdostunk semmit (ld. 3.2c. bra). Kvetkez lpsben a j index 5-re nvekszik.
Mivel x[5] < x[min], ezrt min rtkt 5-re mdostjuk (ld. 3.2d. bra). A j rtke elrte az 5-t, gy a
bels ciklus vgre rtnk. Ekkor megcserljk az i s a min index elemeket (ld. 3.2e. bra). Jl lthat,
hogy a kls ciklusmag els vgrehajtsnak vgre a tmb legkisebb eleme a tmb elejre kerlt.
A kls ciklusban i rtkt 2-re nveljk, teht kezddik a tmb msodik legkisebb elemnek megkeresse, amely a jelenlegi msodik s utols elem kztti elemek minimuma. Ennek rdekben min felveszi
a 2 rtket, a bels ciklus elejn pedig j a 3-at. Mivel x[2] < x[3], ezrt min rtkn az sszehasonlts
utn nem mdostunk (ld. 3.2f. bra). A bels ciklusban j 4-re, majd 5-re nvekszik, de mindkt elem
nagyobb a msodiknl, gy nem mdostjuk a min indexet (ld. 3.2g. s 3.2h. brk). Mivel a bels
ciklusnak ismt a vgre rtnk, ezrt vgrehajtunk egy csert az i-edik s a min index elemek kztt
(ld. 3.2i. bra). Ez a csere most semmilyen tnyleges vltozst nem fog eredmnyezni, hiszen min = i.
Mr az els kt elem a helyn van a tmbben, ismt kvetkezik a kls ciklusban i nvelse. A
min rtke egyenl lesz i-vel, azaz 3-mal. A bels ciklusban j kezdeti rtke 4 lesz, majd kvetkezik a
j-edik s a min-edik elem sszehasonltsa. Mivel a negyedik elem kisebb a harmadiknl, ezrt a min
index 4-re mdosul (ld. 3.2j. bra). Amikor j-t 5-re nveljk, akkor hasonl esettel tallkozunk, ahogy
az a 3.2k. brn is lthat. A bels ciklus vgre rtnk, ezrt meg kell cserlni az i s a min index
elemeket, aminek eredmnyeknt mr a tmb els hrom eleme a rendezettsgnek megfelel helyre kerlt
(ld. 3.2l. bra).
Kvetkezik a kls ciklus utols lefutsa i = 4 rtk mellett. A min is 4 lesz, j pedig 5-t vesz fel
kezdeti rtkknt a bels ciklusban. Mivel az tdik elem nagyobb a negyediknl, ezrt nem fogjuk a
Sergyn Szabolcs
93
budai Egyetem
Neumann Jnos Informatikai Kar
x:
min j
i
x:
x:
i min
min
x:
i
x:
min
min
min
j
8
min
1
x:
min j
x:
min
x:
x:
x:
min
3.2. bra. Minimumkivlasztsos rendezs. Az brn nyomon kvethetjk az egyes indexek, valamint a
tmb elemeinek alakulst a 3.3. algoritmusnak megfelelen.
Sergyn Szabolcs
94
budai Egyetem
Neumann Jnos Informatikai Kar
x:
min j
i
x:
x:
x:
min
min
i min
x:
i
j
x:
x:
min
min
x:
min j
min
3.2. bra. Minimumkivlasztsos rendezs. Az brn nyomon kvethetjk az egyes indexek, valamint a
tmb elemeinek alakulst a 3.3. algoritmusnak megfelelen (folyt.).
Sergyn Szabolcs
95
budai Egyetem
Neumann Jnos Informatikai Kar
min indexet mdostani (ld. 3.2m. bra). Vgre kell mg hajtanunk egy csert, ami jelen esetben egy
helyben hagys lesz (ld. 3.2n. bra). Az algoritmusnak ekkor a vgre rnk, hiszen az i vltoz elrte
mr az utols rtkt. Jl lthat, hogy az x tmb nvekv mdon rendezett vlt.
Futsi id elemzse. Az algoritmus megismerst kveten vizsgljuk meg, hogy tnyleg sikerlt-e
javtanunk a rendezs futsi idejn az egyszer csers rendezshez kpest.
Vizsgljuk meg elsknt az sszehasonltsok szmt, azaz hogy hnyszor kerl a vezrls az algoritmus 5. sorhoz. Ha az i ciklusvltoz rtke 1, akkor a bels ciklus (n 1)-szer fut le, teht a felttelbeli
sszehasonltst is (n 1)-szer vgezzk el. Az i = 2 esetn ez a szm n 2 lesz. Knnyen lthat, hogy i nvekedsvel a bels cikluson belli sszehasonltsok szma mindig eggyel cskken. Teht
vgeredmnyben az sszes sszehasonltsok szma
(n 1) + (n 2) + . . . + 1
(3.4)
Sergyn Szabolcs
96
budai Egyetem
Neumann Jnos Informatikai Kar
3.3. Buborkrendezs
A buborkrendezs1 az egyik legismertebb rendezsi eljrs. Ha egy laikust megkrdeznek, hogy milyen
rendez algoritmusokrl hallott, nagy valsznsg szerint a buborkrendezst emlteni fogja. Krds
persze, hogy az ismertsg egytt jr-e a hatkonysggal.
A buborkrendezs az egyszer csers rendezshez hasonlan egy nagyon egyszer tletet valst meg.
Csak sszehasontsokat kell vgeznnk az elemek kztt, illetve ha szksges, akkor cserlnnk. Ami
viszont megklnbzteti az egyszer csers rendezstl az az, hogy az sszehasonltsokat s a cserket
is mindig szomszdos elemek kztt hajtjuk vgre.
A rendez algoritmus lnyege, hogy sszehasonltjuk a szomszdos elemet, s amennyiben a kisebb
index elem nagyobb mint a nagyobb index elem, akkor megcserljk ket a nvekv rendezettsg elrse
rdekben. Az sszehasonltsokat az els elemtl kezdjk, azaz elszr az els s msodik elemmel
foglalkozunk. Ezt kveten a msodik s harmadik elemet vetjk ssze, majd jn a harmadik s a
negyedik, s egszen gy haladunk mg a tmb vgre nem rnk. Legvgl teht az utols eltti s
az utols elemet hasonltjuk ssze, s ha szksges, csert is vgrehajtunk. Termszetesen attl, hogy
egyszer gy megvizsgltunk s szksg esetn megcserltnk minden szomszdos prt, mg nem vlik
teljesen rendezett a tmbnk. Viszont minden elem feltehetleg kzelebb kerl a vgleges helyhez,
mivel a kisebb elemek elrefel, a nagyobb elemek pedig htrafel mozdulnak el a cserk sorn. St a
legnagyobb elem biztos, hogy a vgleges helyre kerl, mivel brmely sszehasonltsnl amennyiben nla
kisebb elemet talltunk a jobbjn, akkor mindig megcserltk ket. Azt lthatjuk teht, hogy itt egy
bejrs sorn a legnagyobb elem fog a vgleges helyre kerlni. Ez egy lnyeges klnbsg az egyszer
csers rendezshez kpest, mert ott a legkisebb elem kerlt elszr a tmb elejre. Az, hogy a legnagyobb
elem eljut az els bejrs sorn a legnagyobb index helyre, indokolja a rendezs elnevezst, hiszen a
nagy buborkok szllnak felfel a folyadk felsznre.
Az els bejrst kveten hogyan folytatdik tovbb az algoritmus futsa? Ismt elkezdjk a szomszdos elemek sszehasonltst s esetleges cserjt a tmb elejrl a vge fel haladva. Viszont a msodik
bejrsnl mr nem fogunk a tmb vgig elmenni, hiszen a legutols elemmel kr foglalkozni, az mr
biztos a helyn van. gy egy n elem tmb esetn a msodik bejrs sorn az utols sszehasonlts az
(n 2)-edik s az (n 1)-edik elem kztt fog megtrtnni. A msodik bejrs vgre biztosak lehetnk
abban, hogy a msodik legnagyobb elem is biztosan a helyre, az n 1 index pozciba kerl.
Az algoritmus egy jabb bejrs folytatdik, amikor is az els prtl indulva hasonltunk s szksg
esetn cserlnk mindaddig, amg el nem jutunk az (n 3)-adik s (n 2)-edik elemekbl ll prig.
A bejrsok ilyen sorozatt vgezzk addig, amg az utols bejrs sorn mr csak az els s msodik
elemet kell sszehasontanunk s esetleg cserlnnk. Jl lthat, hogy az ismertetett algoritmus hatsra
a rendezend tmb gy vlik nvekv mdon rendezett, hogy a rendezett llapotot htulrl elre fel
haladva ri el. A buborkos rendezs pszeudokddal trtn lerst 3.4. algoritmusban lthatjuk.
3.4. Algoritmus Buborkrendezs
Bemenet: x T tmb, n egsz (tmb mrete); ahol T sszehasonlthat
Kimenet: x T rendezett tmb
1: eljrs BuborkRendezs(cmszerint x : T tmb, n : egsz)
2:
ciklus i n-tl 2-ig
3:
ciklus j 1-tl (i 1)-ig
4:
ha x[j] > x[j + 1] akkor
5:
x[j] x[j + 1]
6:
elgazs vge
7:
ciklus vge
8:
ciklus vge
9: eljrs vge
Felhasznlt vltozk s fggvnyek
x: A rendezni kvnt tmb. Az x tmb elemeinek sszehasonlthatnak kell lennie. Az eljrs a
tmbt helyben rendezi.
n: A paramterknt tadott tmb mrete.
1 Angolul:
bubble sort
Sergyn Szabolcs
97
budai Egyetem
Neumann Jnos Informatikai Kar
Az algoritmus a 2. sorban kezdd kls ciklussal indul. Az i ciklusvltoz a tmb mrettl (n)
halad 1-esvel 2-ig. Az i vltoz mindig azt jelzi, hogy az sszehasonltsok sorn, melyik az utoljra
sszehasonltand elem. Kezdetben ez n, hiszen a tmb vgig haladva minden szomszdos prt meg
akarunk vizsglni. Ahogy haladunk elre az algoritmusban, gy i rtke folyamatosan cskkenni fog,
hiszen a tmb vgn a helykre kerl elemekkel mr nem kell a ksbbiekben foglalkozni.
A 3. sorban egy jabb ciklus veszi kezdett. Ennek j ciklusvltozja 1-tl (i 1)-ig halad elre. A j
vltozt fogjuk a tmb indexelsre hasznlni, mindig a j-edik s a (j + 1)-edik elemet vizsglva. A bels
ciklus magjban ssze kell hasonltanunk az aktulis kt szomszdos elemet (ld. 4. sor). Amennyiben
x[j] > x[j +1], akkor csert kell vgrehajtanunk, ahogy azt az 5. sorban meg is tesszk. Ha x[j] x[j +1],
akkor az elvrt rendezettsgnek megfelel a kt szomszdos elem viszonya, ezrt semmilyen teendnk
nincs.
3.3. Plda. Nzzk vgig, hogy miknt rendezi a buborkos rendezs 3.4. algoritmusa a 6, 1, 4, 3, 8
elemekbl ll tmbt. Az algoritmus egyes lpsei nyomon kvethetk a 3.3. brn is.
Elszr belpnk a 2. sorban kezdd kls ciklusba, az i vltoz felveszi a tmb mretnek rtkt.
Tudjuk, hogy i azt jelli, hogy az els bejrs sorn meddig fogjuk a prokat vizsglni. Az els bejrsnl
tehet vgigmegynk egszen az tdik elemig. Az algoritmusban tovbbhaladva belpnk a 3. sorbeli
bels ciklusba, a j index 1-tl indul. sszehasonltjuk az els s a msodik elemet (ld. 4. sor). Mivel az
els elem a nagyobb, ezrt megcserljk a kt elemet (ld. 5. sor). Ezek a lpsek lthatk a 3.3a. brn
is.
A bels ciklusban j rtkt 2-re nveljk, majd sszehasonltjuk a msodik s a harmadik elemet.
Mivel a kisebb index elem a nagyobb rtk, ezrt megcserljk a kt elemet (ld. 3.3b. bra). Ezutn j
rtke 3-ra n, majd sszehasonltjuk a harmadik s a negyedik elemet. Mivel a harmadik elem a nagyobb,
ezrt ismt cserlnk (ld. 3.3c. bra). A bels ciklusban j rtkt 4-re vltoztatjuk, s sszehasonltjuk
a negyedik s az tdik elemet. Mivel a negyedik elem mr eleve kisebb volt mint az tdik, ezrt nincs
szksg cserre (ld. 3.3d. bra). A bels ciklus vgre rtnk. Vegyk szre, hogy a legnagyobb elem
biztosan a helyre kerlt, gy ezzel az elemmel a tovbbi feldolgozs sorn mr nem foglalkozunk.
A kls ciklusban i rtkt 4-re cskkentjk, azaz a tmbnek mr csak az els ngy elemre fkuszlunk mostantl. A bels ciklusban j rtke felveszi az 1 rtket. sszehasonltjuk az els s a msodik
elemet, s mivel a nvekv rendezettsgnek megfelel a viszonyuk, ezrt nem cserlnk (ld. 3.3e. bra).
A j rtkt 2-re nveljk, majd sszehasonltjuk a msodik s a harmadik elemet. Mivel x[2] > x[3], gy
megcserljk ket (ld. 3.3f. bra). Ezutn j 3-ra n, kvetkezik a harmadik s negyedik elem sszevetse.
Mivel a harmadik elem kisebb, ezrt nincs szksgnk cserre (ld. 3.3g. bra). A bels ciklus vgn
lthat, hogy a negyedik elem is a helyn van mr. A konkrt pldnl azt ltjuk, hogy ugyan mr
minden elem a helyn van, de az algoritmus ettl mg nem r vget.
A kls ciklusban i rtke jra eggyel cskken, mostantl 3 lesz. A bels ciklusban j ismt 1-tl kezdi
nvekedst. sszehasonltjuk az els s msodik elemet s nem cserlnk (ld. 3.3h. bra). A j rtke
2-re n, sszehasonltjuk a msodik s harmadik elemet, s most sem vgznk csert (ld. 3.3i. bra).
A bels ciklusnak ismt vge, a kls ciklusban pedig i 2-re cskken. A bels ciklusban j felveszi az 1
rtket. sszehasonltjuk az els s a msodik elemet, amelyek mr rendezettek, ezrt nem cserlnk
(ld. 3.3j. bra). Ekkor mindkt ciklus vgre rtnk, a tmbnk rendezett vlt.
Megjegyzs
Az elz pldban lthattuk, hogy a 3.3f. brn szemlltetett csert kveten a tmbnk
mr rendezett lett, de az algoritmusunk ezt nem vette szre, pedig itt befejezdhetett
volna. A 3.4. fejezetben meg fogjuk vizsglni, hogy miknt lehetne ezt a hinyossgt az
algoritmusnak kikszblni.
Futsi id elemzse. A futsi id elemzst ismt kt rszre bontjuk. Elszr az sszehasonltsok
szmt, majd a cserk s msolsok szmt vizsgljuk meg.
A 3.4. algoritmus 4. sorban lv sszehasonlts a bels ciklus minden lefutsakor kirtkelsre
kerl. A bels ciklus i = n esetn (n 1)-szer fut le, i = n 1 esetn (n 2)-szer s gy tovbb. Az
sszehasonltsok szma gy az elz kt fejezetben mr megismert rtk lesz, azaz
(n 1) + (n 2) + . . . + 1 =
Sergyn Szabolcs
98
n (n 1)
.
2
(3.6)
budai Egyetem
Neumann Jnos Informatikai Kar
x:
x:
j+1
x:
i
4
x:
x:
x:
j+1
x:
j+1
x:
j j+1
x:
j j+1
i
3
j+1
j+1
j j+1
x:
1
x:
j+1
j j+1
Sergyn Szabolcs
99
budai Egyetem
Neumann Jnos Informatikai Kar
Az sszehasonltsok szma most sem fgg attl, hogy milyen tulajdonsgokkal rendelkezik az algoritmus
bemeneti tmbje.
Az algoritmus sorn az 5. sorban lv csere csak akkor hajtdik vgre, ha az eltte lv felttel igaz
volt. Teht a cserk szma mr fgg attl, hogy milyen a feldolgozand tmb. Legrosszabb esetrl
akkor beszlhetnk, ha a bemeneti tmb cskken mdon rendezett. Ilyenkor ugyanis minden vizsglt
szomszdos pr esetn igaz lesz a 4. sorbeli felttel, gy a csere is vgrehajtdik. Ebben az esetben a cserk
szmval. Mivel a csere mvelethez hrom msolst kell
szma megegyezik az sszehasonltsok n(n1)
2
n(n1)
alkalmaznunk, ezrt legrosszabb esetben 3 2 msolst fogunk vgezni. Legjobb esetnek tekinthetjk
azt, amikor a tmb eleve nvekv mdon rendezett. Ilyenkor az x[j] > x[j + 1] felttel mindig hamis,
teht egyetlen csert sem hajtunk vgre. Persze gy msolst sem fogunk eszkzlni. tlagos esetben
azt mondhatjuk, hogy a cserk szma
1 n (n 1)
,
(3.7)
2
2
a msolsok szma pedig
3 n (n 1)
.
(3.8)
2
2
sszessgben azt llapthatjuk meg, hogy a buborkrendezs futsi id szempontjbl ugyanolyan
mrszmokkal rendelkezik,
mint a 3.1. fejezetben trgyalt egyszer csers rendezs. gy ez a rendez
algoritmus is O n2 -es futsi idej.
A buborkrendezsrl azt llapthatjuk meg, hogy az ismertsge nincs sszefggsben a hatkonysgval. A kvetkez fejezetben megvizsgljuk miknt lehet javtani ezen a rendez algoritmuson.
Sergyn Szabolcs
100
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
101
budai Egyetem
Neumann Jnos Informatikai Kar
Amikor a bels ciklus vgre rtnk, akkor megtrtnt egy konkrt bejrs. Ekkor meg kell hatroznunk, hogy a soron kvetkez bejrs meddig tartson majd. Ennek az utols csere helyig kell majd
mennie, ezrt az i vltoz felveszi az idx vltozban eltrolt rtket (ld. 11. sor).
rdemes az algoritmus kapcsn megvizsglni, hogy mi trtnik akkor, ha valamely i mellett egyetlen
csert sem hajtunk vgre. Ekkor az idx vltoz kezdetben 0 lesz (4. sor), s mivel egyetlen csert sem
vgznk, gy soha nem lpnk a 8. sorba. Teht a bels ciklusban az idx rtke nem vltozik meg, vgig
0 marad. gy viszont a kls ciklus magjnak vgn, a 11. sorban az i vltoz rtke is 0 lesz. Emiatt
viszont a kls ciklusbl is ki fogunk lpni, hiszen a bennmaradsi i 2 felttel mr nem lesz igaz. Az
lthat gy, hogy elrtk azt a clunkat, hogy az algoritmus felismeri, ha a vizsglt rsztmb (elstl az
i-edik elemig) mr rendezett, mivel rendezett tmbben nem vgznk cserket.
3.4. Plda. Nzzk vgig, hogy a javtott buborkrendezs 3.5. algoritmusa miknt rendezi a 3.3. pldban mr vizsglt 6, 1, 4, 3, 8 tmbt. A buborkrendezsnl lttuk, hogy szmos felesleges lps volt
a rendezs sorn, mivel a 3.4. algoritmus nem ismerte fel, hogy mr rendezett vlt a tmb. A konkrt
megvalsts lpseit a 3.4. brn is nyomon kvethetjk.
Az algoritmus elejn az i vltoz rtke 5 lesz (ld. 2. sor). Mivel a kls ciklus belpsi felttele
teljesl (ld. 3. sor), ezrt belpnk a ciklusba. Az utols csere helyt jelz idx vltoz kezdeti rtke 0
lesz (ld. 4. sor). Belpnk a bels ciklusba s a j vltoz rtke kiindulsknt 1 lesz (ld. 5. sor). Mivel
az algoritmus 6. sorban lv x[j] > x[j + 1] felttel igaz lesz, ezrt megcserljk az els s a msodik
elemet (ld. 7. sor). Az idx vltozban eltroljuk az utols csere helyt (ld. 8. sor). Mindez nyomon
kvethet a 3.4a. brn is.
Ezt kveten a bels ciklusban a j vltoz 2-re n. sszehasonltjuk a msodik s harmadik elemet,
s mivel a msodik elem a nagyobb, ezrt megcserljk ket. A csert kveten az idx vltoz rtkt
is aktualizljuk (ld. 3.4b. bra). A j megint nvekszik 1-gyel, majd sszehasonltjuk a harmadik s a
negyedik elemet. Mivel a rendezettsgk nem megfelel, ezrt cserlnk, s az idx vltoz rtke is 3 lesz
(ld. 3.4c. bra). A bels ciklus utols futsakor j rtke mr 4. A negyedik elem kisebb az tdiknl,
ezrt nem cserlnk s idx sem vltozik (ld. 3.3d. bra). A bels ciklus vget rt, gy megvalstottuk
a tmb els bejrst. Amint azt a buborkos rendezsnl is megismertk a legnagyobb elem a helyre,
a tmb vgre kerlt. A 3.3d. brn lthat, hogy a negyedik elem is a helyn van mr, teht teljesen
felesleges lenne a kvetkez bejrsnl az els ngy elembl ll rsztmbt vgigjrni. Az idx vltoz
jelenlegi rtke 3, hiszen a harmadik s negyedik elem kztt trtnt utoljra csere. Az i vltoz rtkt
az algoritmus 11. sorban az idx rtkre vltoztatjuk, teht a kvetkez bejrsnl mr csak az els
hrom elemmel foglalkozunk.
Mivel i jelenlegi rtke 3, ezrt bent maradunk a kls ciklusban. Az idx rtke ismt 0-ra mdosul,
majd j = 1-gyel elindul a bels ciklus vgrehajtsa. Mivel az els elem kisebb a msodiknl, ezrt nem
hajtunk vgre csert (ld. 3.4e. bra). A j vltoz rtkt 2-re nveljk. A msodik elem nagyobb a
harmadiknl, ezrt megcserljk ket, majd az idx vltoz rtke 2-re mdosul (ld. 3.4f. bra). A bels
ciklus vgre rtnk, az i rtke is 2-re vltozik.
A kls ciklus bennmaradsi felttelt ismt kirtkeljk s bennmaradunk a ciklusban. Az idx ismt
0 lesz, a bels ciklus kezdetn pedig j rtke 1 lesz. Mivel az els elem kisebb a msodiknl ezrt nem
kell cserlnnk (ld. 3.3j. bra). A bels ciklus vgt kveten i is felveszi az idx vltoz 0 rtkt. Mivel
gy mr nem teljesl a kls ciklus bennmaradsi felttele, ezrt az algoritmus futsnak vgre rnk.
A tmbnk rendezett vlt.
Futsi id elemzse. Vizsgljuk meg a javtott buborkrendezs futsi idejt az sszehasonltsok,
valamint a cserk s msolsok szmnak figyelembevtelvel.
A korbbi hrom rendez algoritmus esetn lttuk, hogy az sszehasonltsok szma mindig n(n1)
2
volt. Most viszont ms lesz a helyzet, mert a 3. s 12. sorok kztti kls ciklusnl nem tudjuk pontosan
megmondani, hogy hnyszor fut le a ciklus. Legrosszabb esetben (n 1)-szer hajtdik vgre ez a ciklus.
Ez pontosan akkor kvetkezik be, ha a rendezend tmbnk kezdetben cskken mdon volt rendezett.
Ilyenkor az sszehasonltsok szma a maximlis n(n1)
rtk lesz. Legjobb esetnek azt tekinthetjk, ha
2
egyetlen csere sem trtnik az algoritmus futsa kzben, azaz ha a tmbnk eleve rendezett. Ilyenkor a
kls ciklusba egyszer lpnk be, a bels ciklusban pedig (n 1)-szer vgznk sszehasonltst. Mivel
az sszehasonltsok eredmnye mindig hamis lesz, ezrt nem cserlnk s az idx vltoz rtkt sem
mdostjuk. gy viszont az idx 0 marad, gy az algoritmus 11. sorban az i is a 0 rtket veszi fel. Ennek
viszont az a kvetkezmnye, hogy a kls ciklus csak egyszer fut le, tbbszr nem. Nvekv mdon rendezett tmbk esetn teht az sszehasonltsok szma n 1 lesz. tlagos esetben nem tudjuk pontosan
Sergyn Szabolcs
102
budai Egyetem
Neumann Jnos Informatikai Kar
x:
idx
x:
j+1
x:
i
4
x:
idx
j+1
idx
x:
idx
j+1
x:
j+1
j j+1
x:
j j+1
idx
4
x:
idx
idx
idx
x:
idx
x:
i
4
idx
idx j j + 1
3.4. bra. Javtott buborkrendezs. A pldn a 3.5. algoritmusnak megfelelen nyomon kvethetjk az
i, j s idx indexek alakulst, valamint az elvgzett cserk eredmnyeit.
Sergyn Szabolcs
103
budai Egyetem
Neumann Jnos Informatikai Kar
meghatrozni, hogy hny sszehasonlts lesz, m tapasztalat szerint az sszehasonltsok szma inkbb
a legrosszabb esetbeli rtkhez van kzelebb, mint a legjobbhoz.
Mit mondhatunk a cserk szmrl? Az biztos, hogy a cserk szma nem haladhatja meg az sszehasonltsok szmt, hiszen csert mindig sszehasonltsok utn vgznk. Legrosszabb esetben, azaz
amikor cskken mdon rendezett a tmb, minden sszehasonlts utn kell cserlni. Ilyenkor teht
lesz. Legjobb esetben, vagyis amikor eleve nvekv mdon rendezett a tmb,
a cserk szma n(n1)
2
egyetlen csert sem kell vgrehajtanunk. tlagosan a cserk szma a kt szls rtk kztt lesz. A msolsok szmra pedig ugyanaz igaz, mint minden ms esetben, teht a cserk szmnak hromszorosval
egyenl.
sszessgben az lthat, hogy legrosszabb esetben a javtott buborkrendezs futsi ideje O n2 -es.
Legjobb esetben viszont jelents javulst sikerl elrni, ilyenkor az algoritmus O (n)-es. Bizonyts nlkl
kzljk, hogy tlagos esetben az algoritmus futsi ideje O n2 -es.
A futsi id elemzs alapjn gy rezhetjk, hogy a javtott buborkrendezs algoritmusa elg hatkony, hiszen legjobb esetben a tmb mretvel egyenesen arnyos a futsi id. Ne feledjk viszont, hogy
leggyakrabban az tlagos esettel kell foglalkoznunk, illetve szembeslhetnk a legrosszabb esettel is. Lnyeges javulst egybknt a buborkrendezs hatkonysghoz kpest abban az esetben tudunk elrni, ha
a tmbnk mr eleve nvekv mdon rendezett, vagy csak nhny helyen van eltrs a rendezettsgtl.
Sergyn Szabolcs
104
budai Egyetem
Neumann Jnos Informatikai Kar
insertion sort
Sergyn Szabolcs
105
budai Egyetem
Neumann Jnos Informatikai Kar
x:
x:
x:
x:
(a) Az els elemet beillesztjk a neki megfelel helyre, (b) A msodik elemet beillesztjk az egy elem renazaz nem tesznk semmit.
dezett tmbbe gy, hogy kt elem rendezett tmbt
kapjunk.
x:
x:
x:
x:
(c) A harmadik elemet beillesztjk a kt elem rende- (d) A negyedik elemet beillesztjk a hrom elem renzett tmbbe gy, hogy hrom elem rendezett tmbt dezett tmbbe gy, hogy ngy elem rendezett tmbt
kapjunk.
kapjunk.
x:
x:
x:
x:
(e) Az tdik elemet beillesztjk a ngy elem ren- (f) A hatodik elemet beillesztjk az t elem rendedezett tmbbe gy, hogy t elem rendezett tmbt zett tmbbe gy, hogy hat elem rendezett tmbt
kapjunk.
kapjunk.
x:
x:
x:
x:
(g) A hetedik elemet beillesztjk a hat elem rendezett tmbbe gy, hogy ht elem rendezett tmbt
kapjunk.
(h) A nyolcadik elemet beillesztjk a ht elem rendezett tmbbe gy, hogy nyolc elem rendezett tmbt
kapjunk.
3.5. bra. Beillesztses rendezs bevezetse. A beszrand (vilgos kk) elemek a mr rendezett (stt
kk) tmbkben a megfelel helyre kerlnek.
Sergyn Szabolcs
106
budai Egyetem
Neumann Jnos Informatikai Kar
A kls ciklus belsejben kell megoldanunk azt, hogy az i-edik tmbelem a helyre kerljn. Ahogy
emltettk ennek rdekben a tle balra lv elemmel fogjuk sszehasonltani, s ha szksges akkor
cserlni. Az i-edik elem bal oldaln lv elemet indexeljk a j vltozval, melynek kezdet rtke i 1
lesz (ld. 3. sor). A 4. sorban kezdd elltesztels ciklus valstja meg a beillesztend elem baljn lv
elemmel val sszehasonltsokat s cserket. A ciklus belpsi, illetve bennmaradsi felttele egyrszt,
hogy a beszrand elem baljn lv elem indexe (ezt jelli a j vltoz) mg vals index legyen, azaz
nagyobb legyen 0-nl. Msik felttel, hogy a beillesztend elem baljn lv elem nagyobb legyen a
beillesztend elemnl, ugyanis ilyenkor kell cserlni s tovbb vizsgldni. Mivel a beillesztend elem
baljn a j-edik elem van s a beillesztend elem pedig folyamatosan halad a tmb eleje fel, ezrt a
beillesztend elemet nem vgig i-vel, hanem (j + 1)-gyel tudjuk indexelni. Ezrt a ciklusfelttelben a
x[j] > x[j + 1] vizsglatot vgezzk el. (Vegyk szre, hogy kezdetben j + 1 pont az i-vel azonos.)
Ha belptnk a bels ciklusba, akkor mindkt megvizsglt felttelnk igaz volt, teht cserlnnk kell
a kt szomszdos elemet (ld. 5. sor). A csert kveten a j indexet is cskkentennk kell 1-gyel, hiszen a
beillesztend elem eggyel elrbb kerlt a tmbben, gy a bal oldali szomszdja indexnek (azaz j-nek)
is 1-gyel kisebbnek kell lennie.
Ha a bels ciklus felttele mr nem igaz, akkor biztosak lehetnk benne, hogy a beillesztend elem a
helyre kerlt, mivel vagy a tmb elejn van (ekkor lesz j = 0), vagy a bal szomszdja nem nagyobb mr
nla. Ekkor viszont lphetnk tovbb a kvetkez beillesztend elemre, amit a kls ciklus automatikusan
megvalst.
x:
j j+1
x:
x:
x:
x:
j+1
x:
8
i
4
6
1
j j+1
j j+1
x:
x:
j j+1
x:
x:
i
8
j+1
3.6. bra. Beillesztses rendezs. A pldn a 3.6. algoritmusnak megfelelen nyomon kvethetjk az i s
j indexek alakulst, valamint az elvgzett cserk eredmnyeit.
3.5. Plda. A 3.6. brn nyomon kvethetjk, hogy a beillesztses rendezs 3.6. algoritmusa miknt
rendezi a 3, 4, 1, 8, 6 elemekbl ll x tmbt.
Sergyn Szabolcs
107
budai Egyetem
Neumann Jnos Informatikai Kar
Az algoritmus kezdetn belpnk a 2. sorban indul ciklusba. A beillesztend elemet jell i index
rtke 2 lesz. A ciklusbon bell j felveszi az 1 rtket (ld. 3. sor). Ezt kveten megvizsgljuk a 4. sorban
kezdd bels ciklus belpsi felttelt. A j index rtke nullnl nagyobb, illetve a j-edik elem nagyobb a
(j + 1)-edik elemnl, gy belpnk a ciklusba. A cikluson bell felcserljk a j s a j + 1 index elemeket
(ld. 5. sor), majd j rtkt eggyel cskkentjk (6. sor). Ezeket a lpseket szemllteti 3.6a. bra. A
vezrls ezt kveten ismt a 4. sorba kerl. Mivel j rtke nullra cskkent, ezrt nem lpnk be jra
a bels ciklusba.
A kls ciklusban i rtke 3-ra n, majd j 2 lesz. sszehasonltjuk a msodik s harmadik elemet,
s mivel a harmadik elem kisebb, ezrt megcserljk ket (ld. 3.6b. bra). Ezutn j 1-re cskken, majd
sszehasonltjuk az els s a msodik elemet. Mivel az els elem a nagyobb, ezrt ismt cserlnk
(ld. 3.6c. bra). Ezt kveten j rtkt tovbb cskkentjk, s mivel 0 lesz az rtke, gy nem maradunk
bent a bels ciklusban. Lthatjuk, hogy a beillesztend 1 rtk elem a tmb legelejre kerlt.
A kls ciklusban i-t 4-re nveljk, j kezdeti rtke pedig 3 lesz. Mivel a beillesztend negyedik elem
nagyobb, mint a bal szomszdja, ezrt helyben hagyjuk, a bels ciklusba be sem lpnk (ld. 3.6d. bra).
Elrkeznk az utols elem beillesztshez, azaz i rtke mr 5. A j kezdeti rtke 4, s a bels ciklusba
belpnk, mivel x[4] > x[5]. Megcserljk a negyedik s tdik elemet (ld. 3.6e. bra), majd j-t 3-ra
cskkentjk. Mivel a negyedik elem nagyobb a harmadiknl, ezrt nem maradunk bent a bels ciklusban
(ld. 3.6f. bra). A kls ciklusbl is kilpnk, mivel az i rtkt mr nem tudjuk tovbb nvelni. Az
algoritmus vgre rtnk a tmbnk nvekv mdon rendezett vlt.
Futsi id elemzse. A futsi id elemzsnl az algoritmus kt mvelett fogjuk elemezni, mivel ezek
tekinthetk a leglassabbaknak. (A tbbi lps ugyanis csak indexekkel dolgozik, ami egsz rtkekkel
vgzett mvelet, gy ltalban gyorsan megvalsthat.) Egyrszt vizsglni fogjuk, hogy a 4. sorbeli
felttelek kzl a tmbelemek viszonyt vizsgl x[j] > x[j + 1] sszehasonltst hnyszor hajtjuk vgre.
Msrszt elemezzk az 5. sorban lv cserk szmt.
Kezdjk az elemzsnket a legjobb esettel, teht amikor a tmbnk eleve nvekv mdon rendezett.
Ilyenkor minden i rtk mellett egyszer megvizsgljuk az x[j] > x[j + 1] felttel teljeslst. A felttel
minden esetben hamis lesz, gy a bels ciklusba nem lpnk be. Ezek szerint sszehasonltsbl (n 1)et, cserbl pedig egyet sem fogunk elvgezni.
Legrosszabb esetnek azt tekinthetjk, ha a tmbnk fordtott mdon rendezett. Ilyenkor az aktulis
beillesztend elem mindig a tmb elejre fog kerlni. Ehhez a maximlis szm sszehasonltst s
ugyanannyi csert kell vgeznnk. Teht az sszehasonltsok s cserk szma is
n (n 1)
2
(3.9)
A beillesztses rendezs legnagyobb elnye, hogy a megismert mkdsi elv olyan esetekben is mkdik, amikor nem tmbkkel, hanem ms adatszerkezetekkela dolgozunk. A
tmbk egyik jellemzje, hogy a feldolgozand adatokat (a tmb elemeit) mr kezdetben
is ismerjk, tudjuk, hogy pontosan hny adatot kell rendeznnk.
Ksbb megjelen adatszerkezeteknl (pldul a listknl) viszont lehetsges, hogy a
lista folyamatosan bvl, az adott program futsa kzben vesznk fel j elemeket a listba. Amennyiben a listnk rendezett, akkor az jonnan megjelen elemet a beillesztses
rendezs algoritmusnak alaptletre tmaszkodva illeszthetjk be a listba a megfelel
helyre.
a Ld. Sznsi Sndor: Algoritmusok, adatszerkezetek II. (E-NIK-503). 2014, budai Egyetem, Neumann Jnos Informatikai Kar
Sergyn Szabolcs
108
budai Egyetem
Neumann Jnos Informatikai Kar
109
budai Egyetem
Neumann Jnos Informatikai Kar
4. sorban lv felttelekkel.) Ha belpnk a bels ciklusba, akkor htrbb mozgatjuk a j-edik elemet
(6. sor), majd elrbb lpnk a tmbben, azaz j-t 1-gyel cskkentjk (ld. 7. sor).
A bels ciklusbl kt esetben lpnk ki. Az egyik, ha j rtke nullra cskken. Ilyenkor mg a tmb
els eleme is nagyobb volt a beillesztend elemnl. Emiatt az els elemet is htrbb toltuk egy hellyel.
Most kvetkezne a soron kvetkez, azaz a nulladik elem vizsglata ilyen elem viszont nincs a tmbben.
Mindez azt jelenti, hogy a beillesztend elemnek az els helyre kell kerlnie, amely helyrl mr htrbb is
toltuk a korbbi els elemet. A msik lehetsg a ciklusbl val kilpsre, amikor a j-edik elem mr nem
nagyobb a beillesztend elemnl. Ilyenkor a beillesztend elemet a j-edik elem utn, azaz a (j + 1)-edik
helyre kell beszrni.
A ciklusbl kilpve a beillesztend elemet, amelyet tmenetileg a segd vltozban troltunk bemsoljuk a tmb (j + 1)-edik helyre (9. sor). Ezt kveten a kls ciklusban tovbblpnk a kvetkez
beillesztend elemre, amit szintn a helyre tesznk az eltte lv mr korbban rendezett rsztmbben.
Amikor a tmb utols elemt is beszrtuk a megfelel helyre, kilpnk a kls ciklusbl, s az algoritmus
vgre rnk. A tmbnk pedig rendezett vlt.
Megjegyzs
A 3. fejezetben emltettk, hogy az ismertetsre kerl rendezsek mind n. helyben rendezsek. Emiatt az algoritmusok memriabeli helyignye megegyezik a rendezend tmb
elemszmval, plusz mg egy tmbben trolt T tpus elemet kell eltrolni a memriba,
hiszen a cserk megvalstshoz szksges egy tmeneti vltoz. A javtott beillesztses
rendezsnl viszont nem hajtunk vgre cserket. Ennl az algoritmusnl azonban hasznlunk egy tmeneti vltozt (segd) a beillesztend elem trolsra. gy vgeredmnyben
ennl az algoritmusnl is n + 1 darab T tpus vltozt kell egyszerre a memriban
trolni.
3.6. Plda. Nzzk vgig, hogy a javtott beillesztses rendezs 3.7. algoritmusa hogyan rendezni a 4,
3, 1, 8, 6 elemekbl ll x tmbt. A rendezs lpseit a 3.7. bra is szemllteti.
Az algoritmus kezdetn belpnk a kls ciklusba (2. sor), az i kezdeti rtke 2 lesz. Elszr teht
a msodik elemet szeretnnk a helyre illeszteni az t megelz egy elem rsztmbben. A j vltoz
kezdeti rtke 1 lesz (3. sor). Az algoritmus 4. sorban a segd vltozba bemsoljuk a beillesztend
elemet (ld. 3.7a. sor). Megvizsgljuk a bels ciklus belpsi feltteleit (ld. 5. sor), amelyek jelenleg
teljeslnek, mivel az els elem rtke nagyobb a beillesztend elem rtknl. Belpnk a bels ciklusba
s az els elemet tmsoljuk a msodik helyre (ld. 6. sor). Termszetesen ettl mg az els helyen is
megmarad a korbbi rtk, teht a 4 rtk jelenleg ktszer fordul el a tmbben. (Vegyk itt szre, hogy
ha a beillesztend elemet nem msoltuk volna be a segd vltozba, akkor az els elem msolsnl
fellrtuk s gy el is vesztettk volna.) A bels ciklusban eggyel cskkentjk mg j rtkt (ld. 7. sor).
A bels ciklusban vgbemen folyamatokat a 3.7b. brn is nyomon kvethetjk. A vezrls ismt a
bels ciklus bennmaradsi felttelnek kirtkelshez ugrik. Mivel a j = 0, ezrt nem maradunk bent
a ciklusban. A ciklusbl kilpve, a segd vltozban trolt beillesztend elemet bemsoljuk a tmb els
helyre (ld. 9. sor). Ezzel a beillesztend elem a helyre kerlt, a tmb els kt elembl ll rsztmb
rendezett vlt (ld. 3.7c. bra).
A vezrls a kls ciklus elejre ugrik, i rtkt 3-ra nveljk. A cikluson bell j kezdeti rtke 2
lesz, a harmadik (beillesztend) elemet kimsoljuk a segd vltozba (ld. 3.7d. bra). Megvizsgljuk a
bels ciklus belpsi feltteleit. Mivel a beillesztend elem kisebb mint a msodik elem, ezrt belpnk
a bels ciklusba. A msodik elemet tmsoljuk a harmadik helyre, majd j rtkt eggyel cskkentjk
(3.7e. bra). A ciklusban marads feltteleit kirtkeljk s ltjuk, hogy az els elem is nagyobb, mint a
beillesztend elem. gy bent maradunk a ciklusban s az els elemet is eggyel htrbb msoljuk, majd j
rtkt ismt cskkentjk (ld. 3.7f. bra). A ciklus bennmaradsi felttele most mr nem teljesl, mert
a j nullra cskkent. gy a bels ciklus utni sorra ugrik a vezrls, ahol a beillesztend elemet az els
helyre msoljuk (ld. 3.7g. bra). Most mr az els hrom elembl ll rsztmb is rendezett.
A kls ciklusban i rtke 4-re nvekszik. A j vltoz rtkt hromra lltjuk, a negyedik elemet
pedig kimsoljuk a segd vltozba (ld. 3.7h. bra). Mivel a harmadik elem kisebb mint a beillesztend
elem, ezrt nem lpnk be a bels ciklusba (ld. 3.7i. bra). A beillesztend elemet a segd vltozbl
visszarjuk a kezdeti helyre (ld. 3.7j. bra).
Kvetkezik az i = 5 eset, azaz az tdik elemet szeretnnk a helyre illeszteni. Ennek rdekben j-t
4-re lltjuk, az tdik elemet pedig kimentjk a segd-be (3.7k. bra). Megvizsgljuk a bels ciklus
Sergyn Szabolcs
110
budai Egyetem
Neumann Jnos Informatikai Kar
belpsi felttelt, ami most igaz lesz. Belpve a ciklusba a negyedik elemet az tdikbe msoljuk, majd
j rtkt 3-re cskkentjk (3.7l. bra). A bels ciklus bennmaradsi felttele hamis lesz (ld. 3.7m. bra),
ezrt kilpnk a ciklusbl. A negyedik helyre visszarjuk a beillesztend elemet (ld. 3.7n. bra). A kls
ciklusnak is a vgre rtnk, a tmbnk rendezett vlt.
Futsi id elemzse. A futsi id vizsglatnl nzzk meg elszr, hogy hnyszor vgezzk el a bels
ciklus felttelben lv x[j] > segd sszehasonltst. Knnyen belthat, hogy ez pont annyiszor kerl
kirtkelsre, mint a beillesztses rendezsnl vizsglt x[j] > x[j + 1] felttel. gy legrosszabb esetben
n(n1)
, mg legjobb esetben n 1 darab sszehasonltst fogunk elvgezni. Minden ms esetben valahol
2
a kt szlsrtk kztt lesz az sszehasonltsok szma.
A javtott beillesztses rendezsnl egyetlen csert sem hajtunk vgre. Ezrt itt csak a msolsok
szmt vizsgljuk. Az algoritmus 6. sorban lv msolst annyiszor hajtjuk vgre ahnyszor belptnk
a bels ciklusba. Ezek szma lnyegben ugyanannyi mint a beillesztses rendezsnl a cserk szma
, legjobb esetben pedig nulla.
volt, teht legrosszabb esetben n(n1)
2
Vegyk szre, hogy a kls ciklusban mindig elvgznk kt mozgatst a 4. s a 9. sorokban. Mivel a
kls ciklus (n 1)-szer fut le, gy ezen msolsok szma 2 (n 1) lesz.
gy sszessgben legrosszabb esetben
2 (n 1) +
n (n 1)
2
(3.10)
darab msolst hajtunk vgre. Ez a szm ltalban kisebb a beillesztses rendezsnl vgrehajtott
msolst vgeztnk. Legjobb esetben a
msolsok szmnl, hiszen ott legrosszabb esetben 3 n(n1)
2
msolsok szma 2 (n 1), ami termszetesen tbb mint a beillesztses rendezsnl tallt nulla darab
msols.
sszegezve a futsi idrl tett megllaptsokat azt mondhatjuk, hogy a javtott beillesztses rendezs
futsi ideje valamelyest javult ms algoritmusok futsi idejhez kpest, aminek
oka, hogy nem hajtunk
vgre cserket. Ettl az algoritmus futsi ideje sajnos mg mindig O n2 -es.
Megjegyzs
A hat legismertebb rendez algoritmus trgyalsnak vgn felmerlhet bennnk a krds, hogy a bemutatott algoritmusok kzl melyiket rdemes hasznlni. Korrekt vlasz
csak a konkrt feladat ismeretben adhat, de ltalnossgban kijelenthet, hogy kt algoritmus hasznlata ajnlott. Egyik a minimumkivlasztsos rendezs, amelynl a cserk
szmt sikerlt minimalizlnunk. Teht ha olyan krnyezetben dolgozunk, ahol a cserk megvalstsa lass (pl. fjlon bell kell rendezst vgrehajtani), akkor rdemes a
minimumkivlasztsos rendezst hasznlni. A msik ajnlott algoritmus a javtott beillesztses rendezs, amelynek f erssge, hogy ltalban nem kell a maximlis szm
sszehasonltst elvgezni, valamint cserk helyett msolsokkal tudunk operlni.
Sergyn Szabolcs
111
budai Egyetem
Neumann Jnos Informatikai Kar
Vltoz
x:
segd : 3
Vltoz
x:
x:
segd : 3
i
(b) Msodik elem beillesztse. Mivel x[1] > segd,
ezrt x[1]-et htrbb mozgatjuk.
Vltoz
x:
Vltoz
x:
segd : 3
i
(c) Msodik elem beillesztse. A segd-ben trolt
rtket az x[1]-be mozgatjuk.
Vltoz
x:
x:
Vltoz
x:
segd : 1
j
8
x:
Vltoz
segd : 1
x:
segd : 1
Vltoz
x:
segd : 1
i
(g) Harmadik elem beillesztse. A segd-ben trolt
rtket az x[1]-be mozgatjuk.
segd : 8
3.7. bra. Javtott beillesztses rendezs. A pldn a 3.7. algoritmusnak megfelelen nyomon kvethetjk
az i s j indexek alakulst, valamint a segd vltoz s az aktulis tmbelemek kztti mozgatsok
eredmnyeit.
Sergyn Szabolcs
112
budai Egyetem
Neumann Jnos Informatikai Kar
Vltoz
x:
Vltoz
x:
segd : 8
segd : 8
x:
segd : 6
Vltoz
x:
x:
segd : 6
Vltoz
x:
Vltoz
x:
segd : 6
segd : 6
3.7. bra. Javtott beillesztses rendezs (folyt.). A pldn a 3.7. algoritmusnak megfelelen nyomon
kvethetjk az i s j indexek alakulst, valamint a segd vltoz s az aktulis tmbelemek kztti
mozgatsok eredmnyeit.
Sergyn Szabolcs
113
budai Egyetem
Neumann Jnos Informatikai Kar
16
10
15
12
14
13
11
x:
15
12
10
16
14
13
11
(a) d = 5
x:
15
12
10
16
14
13
11
x:
12
10
13
11
14
16
15
(b) d = 3
x:
12
10
13
11
14
16
15
x:
10
11
12
13
14
15
16
(c) d = 1
3.8. bra. Shell rendezs tletnek bemutatsa klnbz tvolsgok hasznlatval. Az egyes sznrnyalatok az egymstl d tvolsgra lv elemeket emelik ki. Lthat, hogy a d tvolsgra lv elemekbl
alkotott rsztmbk mindig rendezett vlnak.
Foglaljuk ssze, hogyan is mkdik a Shell rendezs. Kezdetben vlasztunk egy kiindulsi tvolsg rtket (d). A vlasztott tvolsgra lv elemekbl ll rsztmbn bell elrjk, hogy az elemek
rendezett vljanak. Ehhez lnyegben a rsztmbn bell egy javtott beillesztses rendezst hajtunk
vgre. A javtott beillesztses rendezs algoritmusn ehhez csak annyit kell mdostanunk, hogy nem a
szomszdos elemekkel, hanem az egymstl d tvolsgra lv elemekkel foglalkozunk. Amikor a vizsglt
rsztmbk rendezett vltak, akkor cskkentjk a d tvolsg rtkt, s ismt rendezzk a kialakult,
egymstl d tvolsgra lv elemekbl ll rsztmbket. A d cskkentst addig folytatjuk, amg el nem
ri az egy rtket. Termszetesen d = 1-gyel is vgrehajtjuk a rendezst (a teljes tmbn), s a tmbnk
rendezett vlik.
A Shell rendezs konkrt megvalstst a 3.8. algoritmusban rjuk le.
Els lpsknt meghatrozzuk, hogy mi legyen a kezdeti tvolsgrtk. Ehhez a rendezend x tmb n
elemszmtl fgg KezdetiTvolsg fggvnyt hvjuk meg (ld. 2. sor). (A kezdeti tvolsg rtknek
Sergyn Szabolcs
114
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
115
budai Egyetem
Neumann Jnos Informatikai Kar
n
2
3k 1
2
alak szmok hasznlatt javasolta, ahol k pozitv egsz szmot jell, teht gy a d tvolsgrtkek
az {1, 4, 13, 40, 121, . . .} halmaz elemei. A kiindulsi d ekkor is az n elemszm felhez legkzelebbi
megengedett rtk.
3.7. Plda. Feladatunk a 14 elem 4, 9, 1, 10, 8, 6, 12, 2, 7, 3, 5, 14, 13, 11 x tmb rendezse a Shell
rendezs 3.8. algoritmusnak hasznlatval. Az algoritmus futst lpsenknt vgig kvetjk s kzben
a 3.9. brn lthatjuk, hogy miknt alakul t a rendezend tmb. Helytakarkossgi clbl a d = 1 esetet
mr nem trgyaljuk rszletesen, mivel ilyenkor a vgrehajtand lpsek pontosan megegyeznek a javtott
beillesztses rendezs 3.7. algoritmusval. A pldban d rtkei a 2k 1 alak szmok kzl kerlnek ki.
Az algoritmus 2. sorban meghatrozzuk a d tvolsg kezdeti rtkt, ami 7 lesz. Mivel d 1,
ezrt belpnk a 3. sorban kezdd kls ciklusba. A 4. sorban belpnk egy msik ciklusba, melynek i
ciklusvltozja 8-tl 14-ig vesz fel rtkeket. Az 5. sorban j az 1 rtket veszi fel, majd a segd vltozba
eltroljuk az x[8] rtket (6. sor). A 7. sorban kezdd elltesztels ciklusba belpnk, mert teljesl
a belpsi felttel. A 8. sorban a tmb els elemt tmsoljuk a nyolcadik helyre, majd a 9. sorban j
rtkt httel cskkentjk, gy rtke 6 lesz. A bels ciklusbl kilpnk, mert j rtke negatv lett.
A 11. sorban a segd-ben eltrolt rtket bemsoljuk a tmb els helyre. Az eddigi lpseket jelentettk
meg a 3.9a. brn. Lthat, hogy az x[1] s x[8] elemekbl ll rsztmb rendezett vlt.
Ezt kveten az i rtke 9-re nvekszik, j rtke pedig 2 lesz. A segd vltozba kirjuk az x[9]
rtket. Belpnk a bels ciklusba s x[2]-t tmsoljuk x[9]-be, majd j rtkt 5-re cskkentjk. Mivel
3 Ld.
4.3. fejezet
Sergyn Szabolcs
116
budai Egyetem
Neumann Jnos Informatikai Kar
j negatv lett, ezrt kilpnk a bels ciklusbl, s x[2]-be msoljuk a segd-ben eltrolt rtket. gy az
x[2] s x[9] elemekbl ll rsztmb is rendezett vlt. A lpseket a 3.9b. brn kvethetjk nyomon.
Kvetkezik az i = 10 eset. A j rtke 3 lesz, a segd-be kimentjk az x[10] elemet. Mivel x[3] < segd,
ezrt nem lpnk be a bels ciklusba. Az x[10]-be visszamsoljuk a segd vltozban eltrolt rtket.
Most az x[3] s x[10] elemekbl ll rsztmb vlt rendezett (ld. 3.9c. bra).
Az i vltoz rtkt 11-re nveljk, j rtkt 4-re lltjuk s a segd vltozba kirjuk az x[11]-et. Mivel
a bels ciklus belpsi felttelei teljeslnek, ezrt belpnk a ciklusba. A negyedik elemet tmsoljuk
a tizenegyedik helyre, majd j-t httel cskkentjk. Mivel j negatv lett, ezrt nem maradunk bent a
ciklusban, x[4]-be visszarjuk a segd-ben trolt rtket. A 3.9d. brn is lthat, hogy az x[4] s x[11]
elembl ll rsztmb lett rendezett.
Elrkeznk az i = 12 esethez. A j vltoz rtke 5 lesz, a segd-be az x[12]-t rjuk ki. Mivel nem
teljesl a bels ciklus belpsi felttele, ezrt a ciklust tugorjuk, majd x[12]-be visszarjuk a segd-ben
trolt rtket. Az tdik s tizenkettedik elembl ll rsztmb rendezett (ld. 3.9e. bra).
Az i = 13-nl, j kezdetben 6 lesz, a segd-be pedig az x[13] elemet msoljuk t. Mivel most sem
teljesl a bels ciklus belpsi felttele, ezrt a ciklust kvet visszamsolst hajtjuk vgre. A hatodik
s tizenharmadik elembl ll rsztmb is rendezett (ld. 3.9f. bra).
Kvetkezik az i = 14 eset. Ekkor j elszr 7 lesz s a segd vltozba x[14]-et rjuk ki. Teljesl a
bels ciklus belpsi felttele, gy x[14]-be tmsoljuk x[7]-et, majd j rtkt nullra cskkentjk. Ekkor
mr nem teljesl a bels ciklus bennmaradsi felttele, kilpnk ebbl a ciklusbl s x[7]-be rjuk vissza
a segd-ben eltrolt rtket. gy az x[7] s x[14] elemekbl ll tmb is rendezett vlt (ld. 3.9g. bra).
Mivel a 4. s 12. sorok kztti ciklus vgre rtnk, ezrt meg kell hatroznunk az d tvolsg soron
kvetkez rtkt (ld. 13. sor). A kvetkez 2k 1 alak szm a 3. Mivel d rtke mg nem cskkent egy
al, ezrt bennmaradunk a kls ciklusban.
Ismt belpnk a 4. sorban kezdd ciklusba, i kezdeti rtke 4 lesz. A j 1 lesz, segd-be pedig az
x[4]-et msoljuk. Mivel nem teljesl a bels ciklus belpsi felttele, ezrt a vezrls a ciklust kvet sorra
ugrik, ahol x[4]-be visszamsoljuk a segd rtkt. Az x[1] s x[4] elemekbl ll rsztmb rendezett
vlt (ld. 3.9h. bra).
A kvetkezkben hasonlan jrunk el mikzben az i rtke sorra 5-re, 6-ra, majd gy tovbb 14re nvekszik. A 3.9i-3.9r. brk szemlltetik az egyes fzisokat. A d = 3 esetet kveten d-t egyre
cskkentjk. Ezt az esetet mr nem mutatjuk be rszletesen, mivel megegyezik a javtott beillesztses
rendezs konkrtan trgyalt algoritmusval. Az eljrs vgre a tmbnk teljesen rendezett vlik.
Futsi id elemzse. A futsi id vizsglatnl a f krds, hogy sikerlt-e a javtott beillesztses
rendezs futsi idejn cskkenteni. A Shell rendezs esetn nagyon bonyolult vizsglni a konkrt sszehasonltsi s msolsi utastsok szmt, ezrt erre most nem is vllalkozunk. A futsi id nagy mrtkben
attl fgg, hogy a d tvolsgrtkeket milyen mdszerrel hatrozzuk meg. Legrosszabb
esetben brmely
tvolsg esetn az llapthat meg, hogy az algoritmus futsi ideje O n2 -es, ami sajnos nem jelent
javulst.
Mi a helyzet az tlagos esettel? Ha az alkalmazott
d tvolsgok a 2k 1 alak szmok, vagy a Fibonacci
n
sorozat elemei, illetve a Shell ltal javasolt 2k rtkek, akkor a futsi id mg mindig O n2 -es lesz.
Ha viszont a Pratt-fle 2p 3q alak szmok kzl vlasztjuk a megfelel d rtkeket, akkor a futsi id
k
2
O n log
n
-esre cskkenthet. A Knuth ltal javasolt 3 21 alak szmok hasznlata mellett pedig
3
Sergyn Szabolcs
117
budai Egyetem
Neumann Jnos Informatikai Kar
Vltoz
x:
10
12
id
x:
14
13
11
14
13
11
segd : 2
i
9
10
12
x:
10
12
id
x:
14
13
11
14
13
11
segd : 7
i
1
10
12
x:
10
12
id
14
13
11
segd : 3
x:
10
12
id
x:
14
13
11
14
13
11
segd : 5
i
8
12
10
x:
10
12
id
14
13
11
segd : 14
x:
10
12
id
14
13
11
segd : 13
Sergyn Szabolcs
118
budai Egyetem
Neumann Jnos Informatikai Kar
Vltoz
x:
10
12
14
13
id
x:
10
11
11
segd : 11
i
4
14
13
12
x:
id
10
11
14
13
12
segd : 10
i
(h) A tvolsg: d = 3. A negyedik s az els elembl ll rsztmbt rendezzk.
Vltoz
x:
10
id
11
14
13
12
segd : 8
x:
10
id
11
14
13
12
segd : 6
x:
10
id
11
14
13
12
segd : 11
x:
10
i 2d
x:
11
id
1
10
14
13
12
14
13
12
segd : 4
i
6
11
x:
10
id
11
14
13
12
segd : 9
119
budai Egyetem
Neumann Jnos Informatikai Kar
Vltoz
x:
i 3d
x:
10
i 2d
4
11
id
7
10
14
13
12
14
13
12
segd : 3
i
8
11
x:
i 3d
x:
10
i 2d
1
11
id
6
10
14
13
12
14
13
12
segd : 5
11
x:
10
11
14
id
13
12
segd : 14
x:
10
11
14
id
13
12
segd : 13
(q) A tvolsg: d = 3. A tizenharmadik, tizedik, hetedik, negyedik s els elembl ll rsztmbt rendezzk.
Vltoz
x:
10
11
14
13
id
12
segd : 12
T (n)
8,000
O n2
O n log2 n
O n3/2
6,000
4,000
2,000
O (n log n)
0
0
20
40
60
80
100
120
budai Egyetem
Neumann Jnos Informatikai Kar
4. fejezet
Rekurzv algoritmusok
Az eddigiekben trgyalt algoritmusok csak az 1. fejezetben bevezetett hrom vezrlsi szerkezetet, a
szekvencit, a szelekcit (elgazs) s az itercit (ciklus) hasznltk. Ezzel a hrom vezrlsi szerkezettel
minden eddig problmt meg tudtunk oldani, st minden ltez algoritmizlsi problma meg is oldhat.
Nha viszont a gondolkodsmdunkhoz kzelebb ll egy negyedik vezrlsi szerkezet, mely lnyegben az
itercit helyettestheti.
A most bevezetsre kerl j vezrlsi szerkezet a rekurzi. Ennek lnyege, hogy egy fggvny vagy
eljrs nmagt hvja meg, gy a benne lv utastsok tbbszr is vgrehajtdnak.
Konkrt pldkat a rekurzira a fejezet tovbbi rszben mutatunk. Elszr egy termszetes szm
faktorilisa meghatrozsnak pldjn (ld. 4.1. alfejezet) nzzk vgig, hogy miknt lehet ugyanazt a
feladatot iteratv (ciklust hasznl) s rekurzv mdon megoldani. A faktorilisnl tapasztaltak alapjn
a 4.2. alfejezetben megfogalmazzuk a rekurzv algoritmusok ltalnos jellemzit. Ezt kveten hrom
pldt vesznk sorra a rekurzi jobb megrtse rdekben. Elsknt a Fibonacci sorozat elemeinek
meghatrozst tekintjk t (ld. 4.3. alfejezet), msodikknt pedig egy szm pozitv egsz kitevs hatvnynak kiszmtsi mdjt mutatjuk be (ld. 4.4. alfejezet). Harmadik pldnk a 4.5. alfejezetben egy
jtk, a Hanoi tornyai megoldst mutatja be.
A fejezet lezrsaknt (ld. 4.6. alfejezet) sorra vesszk, hogy az egyszer programozsi ttelek miknt
valsthatk meg rekurzv mdon, iterci hasznlata nlkl. A jegyzetben nem trnk ki annak trgyalsra, hogy miknt lehet brmely iteratv algoritmust rekurzvv, illetve rekurzv algoritmust iteratvv
alaktani. Ezzel ltalnosan az Algoritmusok, adatszerkezetek II. jegyzet foglalkozik.
121
(4.2)
10! = 1 2 . . . 9 10.
(4.3)
10! = 10 9!.
(4.4)
s
Ebbl mr ltszik, hogy
ltalnosan azt mondhatjuk, hogy az N faktorilisa kiszmthat gy, hogy az N 1 faktorilist
megszorozzuk N -nel. Persze ha csak gy definilnnk a faktorilis fogalmt, akkor pldul a 2 faktorilisnak meghatrozsnl problmba tkznnk. A 2 faktorilis ugyanis 2 1! lenne. Ahhoz, hogy
ennek rtkt meg tudjuk adni ismernnk kell az 1 faktorilist. Errl viszont csak annyit tudunk, hogy
1! = 1 0!. Most viszont a 0 faktorilist kne ismernnk. Mondhatjuk errl is, hogy 0! = 1 (1)!-ral?
Sajnos nem. Ezrt szksges, hogy pldul a 0 faktorilisnak konkrt rtket adjunk, ami az 1 lesz.
Mindezek alapjn viszont az N termszetes szm faktorilist az albbi mdon is definilhatjuk:
1,
ha N = 0
N! =
(4.5)
N (N 1)!, ha N 1
Sergyn Szabolcs
122
budai Egyetem
Neumann Jnos Informatikai Kar
Ez egy tipikus rekurzv definci, mert a faktorilist faktorilissal adtuk meg. Teht pldul a 4 faktorilist az albbi mdon tudjuk meghatrozni:
4! = 4 3! = 4 (3 2!) = 4 (3 (2 1!)) = 4 (3 (2 (1 0!))) = 4 (3 (2 (1 1))) = 24.
(4.6)
123
budai Egyetem
Neumann Jnos Informatikai Kar
FaktorilisRekurzv(3)
FaktorilisRekurzv(4)
(a)
A
klvilgbl
meghvsra
kerl
a
FaktorilisRekurzv(4)
fggvny.
FaktorilisRekurzv(4)
(b) A FaktorilisRekurzv(4)
fggvny
meghvja
a
FaktorilisRekurzv(3)
fggvnyt.
FaktorilisRekurzv(3)
FaktorilisRekurzv(4)
(c) A FaktorilisRekurzv(3)
fggvny
meghvja
a
FaktorilisRekurzv(2)
fggvnyt.
Sergyn Szabolcs
124
budai Egyetem
Neumann Jnos Informatikai Kar
FaktorilisRekurzv(0)
FaktorilisRekurzv(1)
FaktorilisRekurzv(1)
FaktorilisRekurzv(2)
FaktorilisRekurzv(2)
FaktorilisRekurzv(3)
FaktorilisRekurzv(3)
FaktorilisRekurzv(4)
FaktorilisRekurzv(4)
(d)
A
FaktorilisRekurzv(2)
fggvny
meghvja
a
FaktorilisRekurzv(1) fggvnyt.
FaktorilisRekurzv(0)
1
FaktorilisRekurzv(1)
FaktorilisRekurzv(1)
1
FaktorilisRekurzv(2)
FaktorilisRekurzv(2)
FaktorilisRekurzv(3)
FaktorilisRekurzv(3)
FaktorilisRekurzv(4)
FaktorilisRekurzv(4)
(g) A FaktorilisRekurzv(1) fggvny visszaadja az 1 rtket, majd futsa vget r. A vezrls visszakerl a
FaktorilisRekurzv(2) fggvnyhez.
FaktorilisRekurzv(2)
2
FaktorilisRekurzv(3)
FaktorilisRekurzv(3)
6
FaktorilisRekurzv(4)
FaktorilisRekurzv(4)
FaktorilisRekurzv(4)
24
(h) A FaktorilisRekurzv(2)
fggvny visszaadja az 2 rtket,
majd
futsa
vget
r.
A vezrls visszakerl a
FaktorilisRekurzv(3)
fggvnyhez.
(i) A FaktorilisRekurzv(3)
fggvny visszaadja az 6 rtket,
majd
futsa
vget
r.
A vezrls visszakerl
a
FaktorilisRekurzv(4)
fggvnyhez.
(j)
A
FaktorilisRekurzv(4)
fggvny visszaadja az 24
rtket, majd futsa vget r.
A feladat vgre rtnk.
Sergyn Szabolcs
125
budai Egyetem
Neumann Jnos Informatikai Kar
Lehetsges viszont kzvetett rekurzv hvs is. Ennek egy pldja, ha van egy A fggvnynk, amely meghvja a B fggvnyt, majd a B hvja az A-t. Ekkor az A nem kzvetlenl
hvja meg nmagt, hanem kzvetetten a B-n keresztl.
2. Olyan fggvnyek vagy eljrsok lehetnek rekurzvak, melyekbe be van ptve egy olyan eset, amikor
mr nem trtnik jabb rekurzv hvs. Ez biztostja, hogy a rekurzv hvsok egyszer vget rjenek,
azaz ne alakuljon ki vgtelen hvsi lnc. A lellst biztost esetet alapesetnek nevezzk.
Megjegyzs
Konkrt implementci esetn gyakran tallkozhatunk azzal, hogy elfogy az adminisztrci szmra fenntartott memria hely, mert tl sok rekurzv hvs trtnt mr. Ez a
problma ciklusok alkalmazsval nem szokott elllni.
A fentiek alapjn gondolhatnnk, hogy felesleges rekurzv algoritmusokat hasznlni, hiszen ciklusokkal ltalban hatkonyabb algoritmusokat hozhatunk ltre. Ne felejtsk viszont el azt, hogy a rekurzv
gondolkods sok esetben sokkal kzelebb ll a problma egyszer megoldshoz, mint az iteratv megvalsts.
Sergyn Szabolcs
126
budai Egyetem
Neumann Jnos Informatikai Kar
127
budai Egyetem
Neumann Jnos Informatikai Kar
a FibonacciRekurzv(0) fggvnyt, amely visszaadja az 1 rtket, s a vezrls visszakerl a FibonacciRekurzv(2) fggvnyhez. A FibonacciRekurzv(2) fggvnybl meghvsra kerl a FibonacciRekurzv(1) fggvny is. A FibonacciRekurzv(1) fggvny visszatr az 1 rtkkel, majd a
vezrls ismt visszakerl a FibonacciRekurzv(2) fggvnyhez. A FibonacciRekurzv(2) fggvnyben kiszmtsra kerl a visszatrsi rtke, ami 2 lesz. A vezrls visszakerl a FibonacciRekurzv(3)
fggvnyhez. Itt is kiszmtsra kerl a visszatrsi rtk, ami 3 lesz. Ekkor a vezrls visszakerl
a FibonacciRekurzv(5) fggvnyhez. Innen meghvsra kerl a FibonacciRekurzv(4) fggvny.
Ennek a fggvnynek a kirtkelst mr nem nzzk vgig.
A fggvnyek kirtkelsi hierarchija nyomon kvethet a 4.2. brn. Az brn a FibonacciRekurzv fggvnyt helytakarkossg miatt csak F -fel jelltk.
A pldban jl lthat, hogy az tdik Fibonacci szm kiszmtsa rdekben a negyedik Fibonacci
szmot egyszer, a harmadik Fibonacci szmot ktszer, a msodik Fibonacci szmot hromszor, az els
Fibonacci szmot tszr, a nulladik Fibonacci szmot pedig hromszor kiszmtottuk. Az is felfedezhet, hogy egyszerre legfeljebb a FibonacciRekurzv fggvny t pldnya futott, br sszesen tizent
fggvny hvs trtnt.
F (5)
F (3)
F (1)
F (4)
F (2)
F (0)
F (1)
F (2)
F (0)
F (1)
F (3)
F (1)
F (2)
F (0)
F (1)
4.2. bra. Az tdik Fibonacci szm kiszmtsnak hvsi fja. Az F fggvny jelli a 4.3. algoritmus
FibonacciRekurzv fggvnyt.
Futsi id elemzse. Felmerl bennnk a krds, hogy az N -edik Fibonacci szm kiszmtsa rdekben hnyszor kell meghvnunk a FibonacciRekurzv fggvnyt. Ennek vizsglata rdekben jelljk
T (N )-nel az N -edik Fibonacci szm kiszmtsa rdekben bekvetkez fggvnyhvsok szmt.
Knnyen belthat, hogy
T (0) = 1,
(4.8)
mivel N = 0 az egyik alapeset. Hasonlan belthat, hogy
T (1) = 1.
(4.9)
A msodik Fibonacci szm kiszmtsa sorn egyszer meg kell hvnunk a FibonacciRekurzv(2)
fggvnyt, amely meghvja a FibonacciRekurzv(0) s a FibonacciRekurzv(1) fggvnyeket. Utbbi kett hvsi szmait mr ismerjk, hiszen ezek voltak a T (0)-lal s T (1)-gyel jellt rtkek. gy
T (2) = 1 + T (0) + T (1) = 1 + 1 + 1 = 3.
(4.10)
A harmadik Fibonacci szm kirtkelse sorn egyszer meg kell hvnunk a FibonacciRekurzv(3)
fggvnyt, amelybl meghvsra kerlnek a FibonacciRekurzv(1) s a FibonacciRekurzv(2) fggvnyek. Emiatt
T (3) = 1 + T (1) + T (2) = 1 + 1 + 3 = 5.
(4.11)
A negyedik Fibonacci szm kiszmtsa esetn hasonl gondolatmenettel addik, hogy
T (4) = 1 + T (3) + T (2) = 1 + 5 + 3 = 9.
(4.12)
Mit mondhatunk ltalnosan? Amikor az N -edik Fibonacci szmot akarjuk kiszmtani, akkor meghvjuk a FibonacciRekurzv(N ) fggvnyt, amelybl meghvdnak a FibonacciRekurzv(N 2) s
a FibonacciRekurzv(N 1) fggvnyek. gy az ltalnos hvsszmra az igaz, hogy
T (N ) = 1 + T (N 2) + T (N 1).
Sergyn Szabolcs
128
(4.13)
budai Egyetem
Neumann Jnos Informatikai Kar
Teht a Fibonacci szmok rekurzv kiszmtshoz szksges fggvnyhvsok szma egy rekurzv
formulval adhat meg, hasonlan a Fibonacci szmok defincijhoz. A pontos formula:
1,
ha N 1
T (N ) =
(4.14)
1 + T (N 2) + T (N 1), ha N 2
Nem bizonytjuk, de belthat, hogy a futsi id exponencilis. Ez azt jelenti, hogy
T (N ) aN ,
ahol a egy adott pozitv vals szm. gy tallkoztunk az els olyan algoritmussal, amely futsi ideje
O(aN )-es.
rdemes azzal is foglalkozni, hogy az N -edik Fibonacci szm kiszmtsa iteratv mdon miknt
lehetsges. Erre adunk megoldst a 4.4. algoritmusban. Az algoritmust rszletesen nem mutatjuk be,
mert az eddigi ismeretek alapjn knnyen megrthet.
4.4. Algoritmus Fibonacci sorozat N -edik elemnek iteratv meghatrozsa
Bemenet: N egsz
Kimenet: aktulis egsz
1: fggvny FibonacciIteratv(N : egsz)
2:
aktulis 1
3:
elz 1
4:
ciklus i 1-tl (N 1)-ig
5:
tmeneti aktulis + elz
6:
elz aktulis
7:
aktulis tmeneti
8:
ciklus vge
9:
vissza aktulis
10: fggvny vge
Felhasznlt vltozk s fggvnyek
N : Megadja, hogy hnyadik Fibonacci szmot akarjuk meghatrozni.
aktulis: A fggvny visszatrsi rtke, melynek rtke az N -edik Fibonacci szm.
Az iteratv algoritmus futsi idejt vizsglva ltjuk, hogy egyetlen ciklus szerepel benne, mely (N 1)szer fut le. gy a futsi id ilyenkor O(N )-es, ami jval gyorsabb, mint a rekurzv megvalsts futsi
ideje. A rekurzv algoritmus megalkotsa viszont egyszerbb, mint az iteratv vltozat, mivel maga
a 4.7. kpletben megadott definci is rekurzv volt.
A 4.3. s a 4.4. algoritmusok megadtk az N -edik Fibonacci szm rtkt. Ha viszont az els N
darab Fibonacci szmra vagyunk kvncsiak, akkor ezeket egy tmbbe kell kigyjtennk. Ennek iteratv
megvalstst lthatjuk a 4.5. algoritmusban.
Sergyn Szabolcs
129
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
130
budai Egyetem
Neumann Jnos Informatikai Kar
(4.15)
Ahhoz, hogy megvalsthat rekurzv algoritmust adjunk szksges alapeset megadsa is. Ez lehet pldul az
a1 = a.
(4.16)
Ezek ismeretben mr knnyen megadhatjuk a rekurzv megvalstst (ld. 4.7. algoritmus).
4.7. Algoritmus aN rekurzv meghatrozsa
Bemenet: a szm, N egsz
Kimenet: aN rtke
1: fggvny HatvnyRekurzv(a : szm, N : egsz)
2:
ha N = 1 akkor
3:
vissza a
4:
klnben
5:
vissza a HatvnyRekurzv(a, N 1)
6:
elgazs vge
7: fggvny vge
Felhasznlt vltozk s fggvnyek
a: Pozitv vals szm.
N : Pozitv egsz szm.
Futsi id elemzse. Hnyszor kell meghvni a HatvnyRekurzv fggvnyt az a szm N -edik hatvnynak kiszmtsa rdekben? Knnyen belthat, hogy pontosan N darab fggvnyhvs szksges
ehhez. Teht a rekurzv algoritmus futsi ideje is O(N )-es.
Nem lehetne-e valamilyen mdon gyorstani az algoritmus futsi idejt? Egy tletnk van, ami taln
gyorsthatja a futsi idt. Tudjuk, hogy
ak ak = a2k .
(4.17)
Sergyn Szabolcs
131
budai Egyetem
Neumann Jnos Informatikai Kar
Ezt az sszefggst kihasznlva hogyan szmolnnk ki pldul egy szm tizenhatodik hatvnyt. Ha
ismernnk a szm nyolcadik hatvnyt, akkor a nyolcadik hatvny ngyzeteknt mr meg is kapnnk
a tizenhatodik hatvnyt. A nyolcadik hatvny viszont megkaphat a negyedik hatvny ngyzeteknt.
A negyedik hatvny pedig a msodik hatvny ngyzeteknt. A msodik hatvny egyszeren az a szm
nmagval vett szorzataknt addik. Teht azt ltjuk, hogy
a16
= a8 a8 =
= a4 a4 a4 a4 =
=
a2 a2 a2 a2
=
(4.18)
a2 a2 a2 a2 =
Hny hatvnyt kell gy kiszmtani a tizenhatodik hatvny ismerethez. Tudni kell az els, a msodik,
negyedik, a nyolcadik s a tizenhatodik hatvnyt. Ez sszesen csak t hatvny ismerett kvnja, szemben
a korbbi megkzeltssel, ahol minden hatvnyt ismerni kellett, azaz tizenhat hatvny ismerett kvntuk
meg.
Ezek szerint, ha van egy pros N szmunk, akkor az N -edik hatvny meghatrozhat az N2 -edik
hatvny ismeretben, hiszen
N
N
(4.19)
aN = a 2 a 2 .
Mit tehetnk, akkor ha N pratlan szm. Mivel ilyenkor N 1 pratlan, ezrt
aN = a1 a
N 1
2
N 1
2
(4.20)
gy a pros s a pratlan szmokat is vissza tudjuk vezetni kisebb kitevs hatvnyokra. Mr csak az
szksges, hogy legyen valamilyen alapesetnk, hogy a rekurzi lellst biztostsuk. Tudjuk, hogy
a1 = a, ami biztostja az alapesetet.
sszefoglalva az albbi kpletet adhatjuk:
a,
ha N = 1,
N
N
a2 a2 ,
ha N pros,
aN =
(4.21)
N 1
N 1
a a 2 a 2 , ha N > 1 s N pratlan.
132
budai Egyetem
Neumann Jnos Informatikai Kar
a vissza HatvnyFelez a, N2 HatvnyFelez a, N2 mdon adnnk meg a visszatrsi rtket,
N
akkor a 2 kiszmtsa rdekben ktszer is meghvnnk a fggvnyt, ami teljesen felesleges.
4.3. Plda. A 4.8. algoritmus hasznlatval hatrozzuk meg a 2 huszonkettedik hatvnyt. Az
algoritmus futst vgigkvethetjk a 4.3. brn.
Elszr meghvjuk a HatvnyFelez fggvnyt az a = 2 s az N = 22 paramterekkel (ld. 4.3a. bra). Mivel N rtke mg nem 1 s pros, ezrt meghvdik a HatvnyFelez(2,11) fggvny s a
vezrls is tkerl a hvott fggvnyhez (ld. 4.3b. bra). Mivel N = 11 ezrt meghvdik a HatvnyFelez(2,5) fggvny (ld. 4.3c. bra). A vezrls tkerl a hvott fggvnyhez. Mivel most N = 5, ezrt
meghvdik a HatvnyFelez(2,2) fggvny (ld. 4.3d. bra). A vezrls tkerl a hvott fggvnyhez.
Mivel N pros, ezrt meghvdik a HatvnyFelez(2,1) fggvny (ld. 4.3e. bra).
Mivel N = 1, ezrt a HatvnyFelez(2,1) fggvny visszatr az 1 rtkkel. Ennek a fggvnynek
a futsa vget r, a vezrls visszakerl a HatvnyFelez(2,2) fggvny 6. sorba (ld. 4.3f. bra). A
HatvnyFelez(2,2) fggvny futsa is vget r, visszaadja a 2 2 = 4 rtket. A vezrls a HatvnyFelez(2,5) fggvny 9. sorba kerl (ld. 4.3g. bra). A HatvnyFelez(2,5) fggvny visszatr a
2 4 4 = 32 rtkkel, a vezrls a HatvnyFelez(2,11) fggvny 9. sorba kerl (ld. 4.3h. bra). A
HatvnyFelez(2,11) fggvny visszaadja a 2 32 32 = 2048 rtket, futsa vget r, a vezrls pedig a
HatvnyFelez(2,22) fggvny 6. sorba kerl (ld. 4.3i. bra). Visszatrtnk a kiindul fggvnyhez.
Ez a fggvny visszaadja a ngymilli-szzkilencvenngyezer-hromszzngy rtket, majd vget r az
algoritmusunk (ld. 4.3j. bra).
Futsi id elemzse. Vizsgljuk meg, hogy hny fggvnyhvs szksges az aN hatvny felez
mdszerrel trtn meghatrozshoz. Tudjuk, hogy N 1 esetn a HatvnyFelez(a, N ) fggvny
meghv egy msik fggvnyt, ahol N rtke N2 -re, vagy N 21 -re cskken. Teht minden egyes fggvny egy
olyan fggvnyt hv meg, ahol a vltoz paramter felezdik vagy mg az eredeti rtk felnl is kisebbre
cskken. A fggvny hvsok szmt teht meg tudjuk hatrozni, ha tudjuk, hogy az N rtket hnyszor
tudjuk gy megfelezni, hogy rtke mg 1-nl ne legyen kisebb. Matematikai tudsunkra ptnk: a
keresett szm pont az N 2-es alap logaritmusa.
A lehetsges fggvnyhvsok maximlis szma gy arnyos log2 N -nel. Pontos fels korltja:
d1 + log2 N e ,
(4.22)
ahol de a fels egszrszt jelli. gy az algoritmusunk futsi ideje O(log N )-es, ami gyorsabb mint a
korbbi kt algoritmus O(N )-es futsi ideje.
HatvnyFelez(2, 5)
HatvnyFelez(2, 11)
HatvnyFelez(2, 22)
HatvnyFelez(2, 22)
(b) A HatvnyFelez(2,22)
fggvny meghvja a HatvnyFelez(2,11) fggvnyt.
HatvnyFelez(2, 11)
HatvnyFelez(2, 22)
(c) A HatvnyFelez(2,11)
fggvny meghvja a HatvnyFelez(2,5) fggvnyt.
Sergyn Szabolcs
133
budai Egyetem
Neumann Jnos Informatikai Kar
HatvnyFelez(2, 1)
HatvnyFelez(2, 2)
HatvnyFelez(2, 2)
HatvnyFelez(2, 5)
HatvnyFelez(2, 5)
HatvnyFelez(2, 11)
HatvnyFelez(2, 11)
HatvnyFelez(2, 22)
HatvnyFelez(2, 22)
HatvnyFelez(2, 1)
2
HatvnyFelez(2, 2)
HatvnyFelez(2, 2)
22=4
HatvnyFelez(2, 5)
HatvnyFelez(2, 5)
HatvnyFelez(2, 11)
HatvnyFelez(2, 11)
HatvnyFelez(2, 22)
HatvnyFelez(2, 22)
HatvnyFelez(2, 5)
2 4 4 = 32
HatvnyFelez(2, 11)
HatvnyFelez(2, 11)
2 32 32 = 2048
HatvnyFelez(2, 22)
HatvnyFelez(2, 22)
HatvnyFelez(2, 22)
2048 2048 = 4194304
(i) A HatvnyFelez(2,11)
fggvny visszatr a 2048 rtkkel. A vezrls visszakerl
a HatvnyFelez(2,22) fggvnyhez.
(j) A HatvnyFelez(2,22)
fggvny visszatr a 4194304
rtkkel. A vezrls visszakerl a HatvnyFelez(2,11)
fggvnyhez.
Sergyn Szabolcs
134
budai Egyetem
Neumann Jnos Informatikai Kar
1
2
3
4
A
4.4. bra. Hanoi tornyai feladat alapllsa 4 korong esetn. A korongokat az A oszloprl kell a C oszlopra
thelyezni.
A feladat megoldsra olyan algoritmust kell tallnunk, amely brmilyen pozitv egsz N esetn vges
sok lpsben megvalsthat. A rekurzv gondolkods nagy segtsgnkre lesz most.
Feladatunk, hogy N darab korongot a szablyoknak megfelelen thelyezznk az A rdrl a C rdra
gy, hogy kzben a B oszlopot is hasznlhatjuk (ld. 4.4. bra). Tegyk fel, hogy N 1 korongot mr
kpesek vagyunk az egyik rdrl a msikra trakni a szablyok szerint, teht pldul 4 korong esetn el
tudjuk rni, hogy 3 korong tkerljn az A rdrl a B rdra (ld. 4.5a. bra). Ha ez megtrtnt, akkor
az A rdon csak a legnagyobb korong maradt, amit ttehetnk az ppen res C rdra (ld. 4.5b. bra).
Ezutn mr csak a B rdon lv N 1 darab korongot kell a C rdra mozgatnunk gy, hogy kzben az
A rudat is hasznlhatjuk. Ezt lthatjuk a 4.5c. brn N = 4 esetn.
Az tletnk lnyege teht, hogy N korong mozgatst visszavezetjk N 1 korong mozgatsra.
Ez tipikus rekurzv gondolat. Persze ahhoz, hogy a rekurzi mkdjn szksges egy alapeset is. Ilyet
is tudunk adni, hiszen ha N = 1, akkor egyszeren mozgatjuk a legkisebb korongunkat, amely mindig
thelyezhet brmely rdrl brmely ms rdra.
Az ismertetett rekurzv elvet a 4.9. algoritmusban rjuk le pszeudokd segtsgvel. A Hanoi eljrsnak ngy bemenete van. Az els paramter (N ) megadja, hogy hny darab korongot akarunk mozgatni.
A msodik paramter hatrozza meg azt a rudat, amelyen kezdetben rajta van az N darab korong.
Errl a forrs rdrl kell tmozgatnunk a korongokat a harmadik paramterknt megadott cl rdra. A
negyedik paramter azt a segd rudat jelli, amelyet a mozgatsok kzben segdrdknt hasznlhatunk.
Ha feladatunk N darab korong thelyezse az A rdrl a C rdra a B rd segtsgvel, akkor az eljrst
a Hanoi(N, A, C, B) mdon hvjuk meg.
Az algoritmusban elszr megvizsgljuk, hogy milyen az N rtke. Ha N = 1 (ld. 2. sor), akkor az
alapesettel llunk szemben. Ilyenkor az egyes szm korongot kell a forrs rdrl a cl rdra mozgatni.
Ezt megvalstja a megfelelen paramterezett Mozgat eljrs (ld. 3. sor).
Amennyiben az N rtke nagyobb egynl, akkor rekurzvan meghvjuk az eljrst N 1 koronggal,
amelyeket a forrs-rl a segd-re kell thelyezni a cl segtsgvel (ld. 5. sor). Amikor a rekurzvan hvott
eljrs futsa vget r, akkor a fels N 1 korong tkerlt a forrs-rl a segd-re. A forrs-on csak az N edik korong maradt, amit t tudunk egyszeren helyezni az res cl rdra. Ezt valstja meg a 6. sorban
lv Mozgat eljrs. Ezt kveten a segd-en lv N 1 darab korongot t kell mozgatni a cl rdra,
amit a Hanoi eljrs megfelelen paramterezett rekurzv hvsval rnk el (ld. 7. sor).
4.4. Plda. Vizsgljuk meg, hogy az ismertetett algoritmus miknt valstja meg ngy korong A rdrl
C rdra val mozgatst. A rekurzv eljrsok hvsi hierarchijt a 4.6. brn lthatjuk.
Elszr meghvjuk a Hanoi(4,A,C,B) eljrst, mivel ngy korongot akarunk az A rdrl a C rdra
mozgatni a B rd segtsgvel. A Hanoi(4,A,C,B) eljrs meghvja elszr a Hanoi(3,A,B,C) eljrst,
Sergyn Szabolcs
135
budai Egyetem
Neumann Jnos Informatikai Kar
1
2
4
1
2
1
2
3
4
A
Sergyn Szabolcs
136
budai Egyetem
Neumann Jnos Informatikai Kar
mivel elsknt meg kell oldani, hogy hrom korong tkerljn az A-rl a B-re C-t segdrdknt hasznlva.
A Hanoi(3,A,B,C) meghvja a Hanoi(2,A,C,B)-t, amely meghvja a Hanoi(1,A,B,C)-t. Az utolsknt
hvott eljrsban egy egyszer mozgats trtnik csak, az els korong tkerl az A rdrl a B rdra.
Ezutn a vezrls visszakerl a Hanoi(2,A,C,B) eljrshoz, ahol vgrehajtdik az algoritmus 6. sora.
Teht a msodik korong az A rdrl a C rdra kerl. Ezt kveten meghvdik a Hanoi(1,B,C,A)
eljrs, melyen bell az egyes korong tkerl B-rl C-re.
A teljes futs nyomon kvethet a 4.6. brn s egyben fentrl lefel nzve lthat, hogy milyen
mozgatsok sorozata szksges a ngy korong thelyezshez.
Hanoi(1, A, B, C)
Hanoi(2, A, C, B)
Hanoi(3, A, B, C)
2:AC
Hanoi(1, B, C, A)
1:BC
Hanoi(1, C, A, B)
1:CA
3:AB
Hanoi(2, C, B, A)
Hanoi(4, A, C, B)
1:AB
2:CB
Hanoi(1, A, B, C)
1:AB
Hanoi(1, B, C, A)
1:BC
4:AC
Hanoi(2, B, A, C)
Hanoi(3, B, C, A)
2:BA
Hanoi(1, C, A, B)
1:CA
Hanoi(1, A, B, C)
1:AB
3:BC
Hanoi(2, A, C, B)
2:AC
Hanoi(1, B, C, A)
1:BC
4.6. bra. Ngy korongos Hanoi algoritmus hvsi fja, valamint az egyes eljrsokon bell vgrehajtott
mozgatsok.
Futsi id elemzse. A futsi id vizsglatnl azt kell megnznnk, hogy N darab korong egyik
rdrl egy msikra trtn thelyezshez hny darab eljrshvsra van szksgnk. Mivel minden
egyes eljrson bell pontosan egy korongmozgats trtnik, ezrt az eljrshvsok szma pontosan
megegyezik a szksges mozgatsok szmval is. Az N korong mozgatshoz szksges eljrshvsok
szmt jelljk T (N )-nel.
Vizsgljuk meg elszr, hogy egy korong esetn hny darab eljrshvsra van szksg. Meghvjuk a
Hanoi eljrst az N = 1 rtkkel. Mivel ilyenkor nem trtnik rekurzv hvs, ezrt egy hvs trtnik
csak. gy
T (1) = 1.
(4.23)
Ha N = 2, akkor egyszer meghvjuk a Hanoi eljrst N = 2-vel, amely ktszer meghvja a Hanoi-t
N = 1 rtkkel. gy
T (2) = 1 + 2 T (1) = 3.
(4.24)
N = 3 esetn is hasonl a helyzet:
T (3) = 1 + 2 T (2) = 7.
Sergyn Szabolcs
137
(4.25)
budai Egyetem
Neumann Jnos Informatikai Kar
Mit mondhatunk ltalnosan? Amikor a Hanoi eljrst N -nel hvjuk, akkor ez egy kzvetlen hvst
jelent. Az eljrson bell viszont ktszer is megvsra kerl a Hanoi eljrs az N 1 rtkkel, ezrt
T (N ) = 1 + 2 T (N 1).
(4.26)
Teljes indukcival belthat br most ezt nem tesszk meg , hogy ltalnosan
T (N ) = 2N 1.
(4.27)
Ezek szerint a Hanoi tornyai feladatot csak O(2N )-es futsi idvel tudjuk megoldani.
Sergyn Szabolcs
138
budai Egyetem
Neumann Jnos Informatikai Kar
(4.28)
Hogyan fog lellni a rekurzv hvsok lncolata? Tudjuk, hogy az mveletnek van valamilyen kiindulsi
rtke (rtk0 ). Amikor az res tmbbel hvjuk majd meg a rekurzv fggvnynket, akkor ezt az
rtket kell visszaadnia az algoritmusnak.
Az elz tletre pl algoritmus pszeudokdjt a 4.10. algoritmusban mutatjuk be. Az algoritmust
megvalst fggvnynek kt bemenete van: a feldolgozand x tmb, illetve a jobb index. A jobb rtkvel
azt hatrozzuk meg, hogy ppen az els hny darab elem kztt akarjuk az mveletet elvgezni. Amikor
a klvilgbl meghvjuk a rekurzv fggvnyt, akkor jobb rtke a tmb n mrete lesz, hiszen az egsz
tmbre el akarjuk vgezni a kvnt mveletet. A fggvny visszatrsi rtke a mvelet eredmnye lesz.
4.10. Algoritmus Sorozatszmts programozsi ttel rekurzv megvalstsa
Bemenet: x T tmb, jobb egsz
Kimenet: A vizsglt rsztmb elemeire nzve a mvelet eredmnye.
1: fggvny SorozatszmtsRekurzv(x : T tmb, jobb : egsz)
2:
ha jobb = 0 akkor
3:
vissza rtk0
4:
klnben
5:
vissza SorozatszmtsRekurzv(x, jobb 1) x[jobb]
6:
elgazs vge
7: fggvny vge
Fggvny hvsa: SorozatszmtsRekurzv(x, n)
Felhasznlt vltozk s fggvnyek
x: Feldolgozand tmb.
n: Az x tmb mrete.
jobb: A tmb els elemtl a jobb index elemig tart rsztmbt dolgozza fel az aktulis SorozatszmtsRekurzv fggvny.
: A tmb elemei kztt elvgezend mvelet.
rtk0 : Az mvelettl fgg kiindulsi rtk.
Az algoritmus 2. sorban megvizsgljuk, hogy mennyi a jobb index rtke, azaz hogy ppen melyik
rsztmb feldolgozst vgezzk. Amennyiben jobb = 0, akkor a SorozatszmtsRekurzv fggvny az mvelet kiindulsi rtkt adja vissza (ld 3. sor). Amennyiben jobb > 0, akkor rekurzvan
meghvjuk a SorozatszmtsRekurzv fggvnyt 1-gyel kisebb jobb rtkkel, majd az gy szolgltatott eredmny s a tmb x[jobb] eleme kztt elvgezzk az mveletet. A mvelet eredmnye lesz a
fggvny visszatrsi rtke (ld. 5. sor).
4.5. Plda. Vizsgljuk meg, miknt sszegzi a 3,6,1,8,4 elemeket tartalmaz x tmb elemeit a 4.10. algoritmus! Az egyes lpseket nyomon kvethetjk 4.7. brn is.
Meghvjuk a SorozatszmtsRekurzv fggvnyt paramterknt tadva neki a feldolgozand x
tmbt s a tmb mrett (5) (ld. 4.7a. bra). Mivel az tadott jobb paramter rtke 5, ezrt a 2. sorbeli
Sergyn Szabolcs
139
budai Egyetem
Neumann Jnos Informatikai Kar
felttel klnben gba kerl a vezrls. Az 5. sorban meghvsra kerl a SorozatszmtsRekurzv(x, 4) fggvny (ld. 4.7b. bra). Hasonl trtnik mindaddig, amg a jobb paramter rtke el nem
ri a 0 rtket. Ezeket a hvsokat a 4.7c-4.7f. brk szemlltetik.
A SorozatszmtsRekurzv(x, 0) fggvny, mivel jobb rtke 0, ezrt az sszegzsnl hasznlt
rtk0 = 0 rtket adja vissza (ld. 4.7g. bra). A vezrls visszatr a SorozatszmtsRekurzv(x, 1)
fggvny 5. sorba. Ebben a fggvnyben a megkapott 0 rtkhez hozzadjuk az x[1] rtkt, az gy
elll 3 lesz a fggvny visszatrsi rtke. A vezrls visszakerl a SorozatszmtsRekurzv(x, 2)
5. sorba (ld. 4.7h. bra). Hasonl trtnik ahogy sorra visszatr a vezrls az egyes hv fggvnyekhez, ahogy a 4.7i-4.7k. brkon lthatjuk. Az algoritmus vgn a SorozatszmtsRekurzv(x, 5)
fggvnyben elll a tmb elemeinek sszege (ld. 4.7l. bra).
Futsi id elemzse. Amikor a rekurzv algoritmus futsi idejt vizsgljuk, a fggvnyhvsok szmt
elemezzk. A 4.10. algoritmusbl jl lthat, hogy egy n elem tmb feldolgozsa sorn a SorozatszmtsRekurzv fggvny (n + 1)-szer kerl meghvsra. gy a sorozatszmts rekurzv megvalstsnak
futsi ideje is O(n)-es.
SorozatszmtsRekurzv(x, 4)
SorozatszmtsRekurzv(x, 5)
x:
SorozatszmtsRekurzv(x, 5)
x:
jobb
jobb
(b) A SorozatszmtsRekurzv(x, 5)
fggvny
meghvja
a
SorozatszmtsRekurzv(x, 4) fggvnyt, mely a tmb els ngy elembl ll
rsztmbt dolgozza fel.
SorozatszmtsRekurzv(x, 2)
SorozatszmtsRekurzv(x, 3)
SorozatszmtsRekurzv(x, 3)
SorozatszmtsRekurzv(x, 4)
SorozatszmtsRekurzv(x, 4)
SorozatszmtsRekurzv(x, 5)
x:
SorozatszmtsRekurzv(x, 5)
x:
jobb
(c)
A
SorozatszmtsRekurzv(x, 4)
fggvny
meghvja
a
SorozatszmtsRekurzv(x, 3)
fggvnyt, mely a tmb els hrom elembl ll
rsztmbt dolgozza fel.
jobb
(d)
A
SorozatszmtsRekurzv(x, 3)
fggvny
meghvja
a
SorozatszmtsRekurzv(x, 2)
fggvnyt,
mely a tmb els kt elembl ll rsztmbt
dolgozza fel.
140
budai Egyetem
Neumann Jnos Informatikai Kar
SorozatszmtsRekurzv(x, 1)
SorozatszmtsRekurzv(x, 2)
SorozatszmtsRekurzv(x, 3)
SorozatszmtsRekurzv(x, 4)
SorozatszmtsRekurzv(x, 5)
x:
jobb
(e) A SorozatszmtsRekurzv(x, 2) fggvny
meghvja a SorozatszmtsRekurzv(x, 1) fggvnyt, mely a tmb els elembl ll egy elem rsztmbt dolgozza fel.
SorozatszmtsRekurzv(x, 0)
SorozatszmtsRekurzv(x, 1)
SorozatszmtsRekurzv(x, 2)
SorozatszmtsRekurzv(x, 3)
SorozatszmtsRekurzv(x, 4)
SorozatszmtsRekurzv(x, 5)
x:
jobb
(f) A SorozatszmtsRekurzv(x, 1) fggvny meghvja a SorozatszmtsRekurzv(x, 0) fggvnyt.
Sergyn Szabolcs
141
budai Egyetem
Neumann Jnos Informatikai Kar
SorozatszmtsRekurzv(x, 0)
0
SorozatszmtsRekurzv(x, 1)
SorozatszmtsRekurzv(x, 2)
SorozatszmtsRekurzv(x, 3)
SorozatszmtsRekurzv(x, 4)
SorozatszmtsRekurzv(x, 5)
x:
jobb
(g) A SorozatszmtsRekurzv(x, 0) fggvny
visszatr az rtk0 rtkkel, ami most 0. A vezrls a
SorozatszmtsRekurzv(x, 1) fggvnyhez kerl
vissza.
SorozatszmtsRekurzv(x, 1)
0+3=3
SorozatszmtsRekurzv(x, 2)
SorozatszmtsRekurzv(x, 3)
SorozatszmtsRekurzv(x, 4)
SorozatszmtsRekurzv(x, 5)
x:
jobb
(h) A SorozatszmtsRekurzv(x, 1) fggvny visszatr a 3 rtkkel.
A vezrls a
SorozatszmtsRekurzv(x, 2)
fggvnyhez
kerl vissza.
Sergyn Szabolcs
142
budai Egyetem
Neumann Jnos Informatikai Kar
SorozatszmtsRekurzv(x, 2)
3+6=9
SorozatszmtsRekurzv(x, 3)
SorozatszmtsRekurzv(x, 3)
9 + 1 = 10
SorozatszmtsRekurzv(x, 4)
SorozatszmtsRekurzv(x, 4)
SorozatszmtsRekurzv(x, 5)
x:
SorozatszmtsRekurzv(x, 5)
x:
jobb
jobb
SorozatszmtsRekurzv(x, 4)
10 + 8 = 18
SorozatszmtsRekurzv(x, 5)
SorozatszmtsRekurzv(x, 5)
18 + 4 = 22
x:
jobb
x:
(k) A SorozatszmtsRekurzv(x, 4)
fggvny visszatr a 18 rtkkel. A vezrls
a SorozatszmtsRekurzv(x, 5) fggvnyhez kerl vissza.
(l) A SorozatszmtsRekurzv(x, 5)
fggvny visszatr a 22 rtkkel, ami a
tmb elemeinek sszege.
Sergyn Szabolcs
143
budai Egyetem
Neumann Jnos Informatikai Kar
144
budai Egyetem
Neumann Jnos Informatikai Kar
A bal > n felttel 4. sorban lv klnben gban kt tovbbi lehetsget kell megvizsglnunk. Ha az
ppen vizsglt rsztmb els eleme (x[bal]) P tulajdonsg (ld. 5. sor), akkor ezen elem indexvel tr
vissza a fggvny (ld. 6. sor). Egybknt viszont egy kisebb rsztmbt kell vizsglni, ezrt rekurzvan
meghvjuk az ezt vgrehajt fggvnyt (ld. 8. sor).
4.6. Plda. A 3, 9, 4, 1, 8 tmbben keressk, hogy van-e pros elem, s ha van, akkor hol tallhat az
els ilyen. A 4.11. algoritmussal val megvalstst nyomon kvethetjk a 4.8. brn.
Elszr meghvjuk a LinerisKeressRekurzv(x, 1, 5, Pros) fggvnyt (ld. 4.8a. bra). Mivel
bal rtke 1, ami a tmb mretnl kisebb, ezrt a 2. sorbeli felttel klnben gba lpnk. Megvizsgljuk, hogy x[1] pros-e (ld. 5. sor). Mivel az els elem pratlan, ezrt a 8. sorban meghvjuk rekurzvan
a kisebb tmb vizsglatt megvalst fggvnyt.
A LinerisKeressRekurzv(x, 2, 5, Pros) fggvnyben is hasonl vizsglatokat vgznk (ld.
4.8b. bra). Mivel a msodik elem sem pros, ezrt jabb rekurzv hvs trtnik. A LinerisKeressRekurzv(x, 3, 5, Pros) fggvnyben a tmb harmadik elemrl megllaptjuk, hogy pros
(ld. 4.8c. bra). gy a vezrls az algoritmus 6. sorba kerl. A soron kvetkez LinerisKeressRekurzv(x, 3, 5, Pros) fggvny visszaadja a megtallt indexet, a vezrls pedig visszakerl a LinerisKeressRekurzv(x, 2, 5, Pros) fggvny 8. sorba. Ez a fggvny is visszaadja a 3 rtket, a
vezrls pedig a LinerisKeressRekurzv(x, 1, 5, Pros) fggvnybe kerl vissza (ld. 4.8e. bra).
Ennek a fggvnynek a futsa is vget r, visszaadja a megtallt els pros elem indext (ld. 4.8f. bra).
Futsi id elemzse. Az algoritmus futsi ideje, azaz a rekurzv hvsok szma fgg attl, hogy
van-e a keresett P tulajdonsg elem a tmbben. Ha van ilyen elem, akkor a futsi id attl fgg, hogy
hnyadik helyen tallhat az els ilyen elem. A fggvnyhvsok szma pontosan az els P tulajdonsg
elem indexvel lesz egyenl. Teht legjobb esetben csak egy hvs szksges, legrosszabb esetben pedig
amikor az utols tmbelem az egyetlen P tulajdonsg n hvs trtnik. tlagosan n2 hvs kell.
Ha nincs P tulajdonsg elem a tmbben, akkor viszont n + 1 hvs szksges.
sszessgben azt ltjuk, hogy az algoritmusunk futsi ideje O(n)-es.
Sergyn Szabolcs
145
budai Egyetem
Neumann Jnos Informatikai Kar
LinerisKeressRekurzv(x, 2, 5, Pros)
LinerisKeressRekurzv(x, 1, 5, Pros)
x:
LinerisKeressRekurzv(x, 1, 5, Pros)
x:
bal
bal
(b) A LinerisKeressRekurzv (x, 1, 5, Pros)
fggvny
meghvja
a
LinerisKeressRekurzv (x, 2, 5, Pros)
fggvnyt, mely az x tmb 2. s 5. eleme kztti
rsztmbben keres pros szmot.
(a)
Meghvsra
kerl
a
LinerisKeressRekurzv (x, 1, 5, Pros)
fggvny, mely a teljes x tmbben keres pros
szmot.
LinerisKeressRekurzv(x, 3, 5, Pros)
LinerisKeressRekurzv(x, 3, 5, Pros)
3
LinerisKeressRekurzv(x, 2, 5, Pros)
LinerisKeressRekurzv(x, 2, 5, Pros)
LinerisKeressRekurzv(x, 1, 5, Pros)
x:
LinerisKeressRekurzv(x, 1, 5, Pros)
x:
bal
bal
bal
x:
4.8. bra. Lineris keress rekurzv megvalstsa. Az x tmbben pros szmot keresnk.
Sergyn Szabolcs
146
budai Egyetem
Neumann Jnos Informatikai Kar
4.6.3. Megszmlls
A 2.1.5. fejezetben mr megismertk a megszmlls programozsi ttelt, melynek feladata egy tmbben
megszmolni a P tulajdonsg elemek darabszmt. Most megnzzk, miknt lehetsges ezt rekurzv
mdon megvalstani.
A feladatot gy oldjuk meg, hogy megvizsgljuk az x tmb utols elemt. Ha gy talljuk, hogy x[n]
P tulajdonsg, akkor a teljes tmbben a P tulajdonsg elemek szma eggyel tbb, mint az n 1 elem
tmbben. Ha viszont x[P ] nem P tulajdonsg, akkor az n elem tmbnek ugyanannyi P tulajdonsg
eleme van, mint az eggyel kevesebb elem tmbnek.
A rekurzi lellsrl az az alapeset gondoskodik, hogy egy elfajult nulla elem tmbnek egyetlen P
tulajdonsg eleme sincs.
Az ismertetett elvnek megfelel pszeudokdot a 4.12. algoritmusban adtuk meg.
4.12. Algoritmus Megszmlls programozsi ttel rekurzv megvalstsa
Bemenet: x T tmb, jobb egsz, P logikai (tulajdonsg)
Kimenet: A vizsglt rsztmbben az P tulajdonsg elemek szma.
1: fggvny MegszmllsRekurzv(x : T tmb, jobb : egsz, P : logikai)
2:
ha jobb = 0 akkor
3:
vissza 0
4:
klnben
5:
ha P (x[jobb]) akkor
6:
vissza 1 + MegszmllsRekurzv(x, jobb 1, P )
7:
klnben
8:
vissza MegszmllsRekurzv(x, jobb 1, P )
9:
elgazs vge
10:
elgazs vge
11: fggvny vge
Fggvny hvsa: MegszmllsRekurzv(x, n, P )
Felhasznlt vltozk s fggvnyek
x: A feldolgozand tmb.
n: Az x tmb mrete.
jobb: Az x tmbnek az els elemtl a jobb index elemig tart rsztmbt dolgozza fel az aktulis
MegszmllsRekurzv fggvny.
P : Logikai rtket visszaad tulajdonsg fggvny. Az algoritmus azt hatrozza meg, hogy az x
tmbnek hny darab P tulajdonsg eleme van.
A MegszmllsRekurzv fggvny bemenete a feldolgozand x tmb, az aktulisan vizsglt
rsztmb vgt jelz jobb index, valamint a vizsglt P tulajdonsg. A fggvny visszatrsi rtke az x
els jobb darab eleme kztt a P tulajdonsgak szma.
Az algoritmus 2. sorban megvizsgljuk, hogy nulla elem rsztmbbel dolgozunk-e. Ha jobb = 0,
akkor visszaadjuk a 0 rtket (ld. 3. sor), mivel egy elfajult tmbben nincs elem, teht a P tulajdonsg
elemek szma 0. gy biztostottuk a rekurzi alapesett.
A 4. sorban kezdd klnben gba lpnk akkor, ha legalbb egy elem a vizsglt rsztmbnk. Ha
a rsztmb utols eleme (x[jobb]) P tulajdonsg (ld. 5. sor), akkor az els s (jobb 1)-edik elemek
kztti rsztmb P tulajdonsg elemeinek szmhoz 1-et hozz kell adni. Ennek rdekben rekurzvan
meghvjuk a MegszmllsRekurzv(x, jobb 1, P ) fggvnyt, s az 1-gyel nvelt rtkkel ll le az
aktulis fggvny futsa (ld. 6. sor). Ha viszont a jobb index elem nem volt P tulajdonsg, akkor
az aktulis fggvny visszatrsi rtke a rekurzvan hvott fggvny visszatrsi rtkvel lesz azonos
(ld. 8. sor).
4.7. Plda. A 3, 6, 1, 8, 4 elemeket tartalmaz tmb pldjn nzzk meg hogyan is mkdik a
rekurzv megszmlls. A tmbben a pros szmokat keressk. A feldolgozs egyes lpseit a 4.9. brn
kvethetjk.
A MegszmllsRekurzv fggvnyben csak a jobb paramter fog vltozni, ezrt ennek az rtkre
trnk csak ki. Elszr meghvjuk a fggvnyt a tmb mretvel egyez rtkkel. Mivel jobb nem 0,
Sergyn Szabolcs
147
budai Egyetem
Neumann Jnos Informatikai Kar
ezrt a 4. sorban kezdd klnben gba lpnk. Megvizsgljuk az tdik elem rtkt, ami jelen esetben
pros lesz (ld. 4.9a. bra). gy az algoritmus 6. sorba lpnk, ahonnan meghvjuk a MegszmllsRekurzv fggvnyt a jobb = 4 rtkkel. A negyedik elem is pros, ahogy az a 4.9b. brn is lthat.
A vezrls ismt a 6. sorba kerl. Meghvjuk a jobb = 3 paramter fggvnyt. A harmadik elem pratlan (ld. 4.9c. bra), ezrt a vezrls a 8. sorba ugrik. A rekurzv hvsok tovbbi sort szemlltetik
a 4.9d-4.9f. brk.
A jobb = 0 esetben a fggvny visszatr a 0 rtkkel, a vezrls pedig visszatr a MegszmllsRekurzv(x, 1, Pros) fggvny 8. sorba (ld. 4.9g. bra). A tbbi fggvny visszatrsi rtkeit s
gy a pros rtkek szmnak alakulst a 4.9h-4.9l. brk szemlltetik. Vgeredmnyl 3-at kapunk,
ami tnyleg megegyezik a tmb pros rtk elemeinek szmval.
Futsi id elemzse. A futsi id vizsglatnl most is a fggvnyhvsok szmt vesszk figyelembe.
Knnyen lthat, hogy egy n elem tmb vizsglatnl n + 1 darab fggvnyhvs trtnik, gy ez az
algoritmus is O(n)-es.
MegszmllsRekurzv(x, 4, Pros)
MegszmllsRekurzv(x, 5, Pros)
x:
MegszmllsRekurzv(x, 5, Pros)
x:
jobb
(a)
Mehvsra
kerl
a
MegszmllsRekurzv(x, 5, Pros)
fggvny, mely meghatrozza, hogy hny
pros szm van a teljes tmbben.
jobb
(b) A MegszmllsRekurzv(x, 5, Pros)
fggvny
meghvja
a
MegszmllsRekurzv(x, 4, Pros)
fggvnyt, amely a tmb els 4 elemben
szmolja meg a prosakat.
MegszmllsRekurzv(x, 2, Pros)
MegszmllsRekurzv(x, 3, Pros)
MegszmllsRekurzv(x, 3, Pros)
MegszmllsRekurzv(x, 4, Pros)
MegszmllsRekurzv(x, 4, Pros)
MegszmllsRekurzv(x, 5, Pros)
x:
MegszmllsRekurzv(x, 5, Pros)
x:
jobb
(c) A MegszmllsRekurzv(x, 4, Pros)
fggvny
meghvja
a
MegszmllsRekurzv(x, 3, Pros)
fggvnyt, amely a tmb els 3 elemben szmolja
meg a prosakat.
jobb
(d)
A
MegszmllsRekurzv(x, 3, Pros)
fggvny
meghvja
a
MegszmllsRekurzv(x, 2, Pros)
fggvnyt, amely a tmb els 2 elemben szmolja meg a
prosakat.
148
budai Egyetem
Neumann Jnos Informatikai Kar
MegszmllsRekurzv(x, 1, Pros)
MegszmllsRekurzv(x, 2, Pros)
MegszmllsRekurzv(x, 3, Pros)
MegszmllsRekurzv(x, 4, Pros)
MegszmllsRekurzv(x, 5, Pros)
x:
jobb
(e) A MegszmllsRekurzv(x, 2, Pros) fggvny meghvja a MegszmllsRekurzv(x, 1, Pros)
fggvnyt, amely a tmb els 1 elemben szmolja meg a
prosakat.
MegszmllsRekurzv(x, 0, Pros)
MegszmllsRekurzv(x, 1, Pros)
MegszmllsRekurzv(x, 2, Pros)
MegszmllsRekurzv(x, 3, Pros)
MegszmllsRekurzv(x, 4, Pros)
MegszmllsRekurzv(x, 5, Pros)
x:
jobb
(f) A MegszmllsRekurzv(x, 1, Pros) fggvny meghvja a MegszmllsRekurzv(x, 0, Pros) fggvnyt.
Sergyn Szabolcs
149
budai Egyetem
Neumann Jnos Informatikai Kar
MegszmllsRekurzv(x, 0, Pros)
0
MegszmllsRekurzv(x, 1, Pros)
MegszmllsRekurzv(x, 2, Pros)
MegszmllsRekurzv(x, 3, Pros)
MegszmllsRekurzv(x, 4, Pros)
MegszmllsRekurzv(x, 5, Pros)
x:
jobb
(g)
A
MegszmllsRekurzv(x, 0, Pros)
fggvny visszatr a 0 rtkkel.
A vezrls a
MegszmllsRekurzv(x, 1, Pros)
fggvnyhez
kerl vissza.
MegszmllsRekurzv(x, 1, Pros)
0
MegszmllsRekurzv(x, 2, Pros)
MegszmllsRekurzv(x, 3, Pros)
MegszmllsRekurzv(x, 4, Pros)
MegszmllsRekurzv(x, 5, Pros)
x:
jobb
(h)
A
MegszmllsRekurzv(x, 1, Pros)
fggvny visszatr a 0 rtkkel.
A vezrls a
MegszmllsRekurzv(x, 2, Pros)
fggvnyhez
kerl vissza.
Sergyn Szabolcs
150
budai Egyetem
Neumann Jnos Informatikai Kar
MegszmllsRekurzv(x, 2, Pros)
1+0=1
MegszmllsRekurzv(x, 3, Pros)
MegszmllsRekurzv(x, 4, Pros)
MegszmllsRekurzv(x, 5, Pros)
x:
jobb
(i) A MegszmllsRekurzv(x, 2, Pros) fggvny visszatr a 1 rtkkel.
A vezrls a
MegszmllsRekurzv(x, 3, Pros) fggvnyhez
kerl vissza.
MegszmllsRekurzv(x, 3, Pros)
1
MegszmllsRekurzv(x, 4, Pros)
MegszmllsRekurzv(x, 4, Pros)
1+1=2
MegszmllsRekurzv(x, 5, Pros)
x:
MegszmllsRekurzv(x, 5, Pros)
x:
jobb
jobb
MegszmllsRekurzv(x, 5, Pros)
1+2=3
x:
Sergyn Szabolcs
151
budai Egyetem
Neumann Jnos Informatikai Kar
4.6.4. Maximumkivlaszts
A maximumkivlaszts programozsi ttel (ld. 2.1.6. fejezet) egy tmb elemei kzl megadja a maximlis
rtk elem indext. Miknt lehetsges ezt rekurzv mdon megvalstani?
Ha egy elem a tmbnk, akkor a maximlis rtk elem az els elem. Ez lehet majd a rekurzink
alapesete, vagy ms nven lellsi felttele. Ha nagyobb tmbt vizsglunk (pl. egy n elemt), akkor ha
ismerjk az els n 1 elem kzl a legnagyobb indext, akkor csak ezt az elemet kell sszehasonltani az
n-edik elemmel. A kett kzl a nagyobbik lesz a maximlis. Ezt az elgondolst megvalst algoritmus
pszeudokdjt a 4.13. algoritmusban rjuk le.
Az algoritmus bemenete a vizsgland x tmb, valamint egy jobb index. A jobb paramter adja meg,
hogy ppen melyik elemet akarjuk az eltte lvk maximumval sszehasonltani. Kezdetben jobb rtke
megegyezik a tmb n elemszmval. A rekurzv hvsok sorn jobb rtke fog egyesvel cskkenni. A
rekurzinak akkor lesz vge, ha jobb rtke elri az 1-et.
4.13. Algoritmus Maximumkivlaszts programozsi ttel rekurzv megvalstsa
Bemenet: x T tmb, jobb egsz; ahol T sszehasonlthat
Kimenet: A vizsglt rsztmbben a maximlis rtk elem indexe.
1: fggvny MaximumkivlasztsRekurzv(x : T tmb, jobb : egsz)
2:
ha jobb = 1 akkor
3:
vissza 1
4:
klnben
5:
max MaximumkivlasztsRekurzv(x, jobb 1)
6:
ha x[jobb] > x[max] akkor
7:
vissza jobb
8:
klnben
9:
vissza max
10:
elgazs vge
11:
elgazs vge
12: fggvny vge
Fggvny hvsa: MaximumkivlasztsRekurzv(x, n)
Felhasznlt vltozk s fggvnyek
x: A feldolgozand tmb, melynek elemei sszehasonlthatk.
n: Az x tmb mrete.
jobb: Az x tmbnek az els elemtl a jobb index elemig tart rsztmbt dolgozza fel az aktulis
MaximumkivlasztsRekurzv fggvny.
max: Az x tmb els jobb 1 darab eleme kzl a maximlis rtk elem indexe.
Az algoritmus 2. sorban megvizsgljuk, hogy jobb rtke 1-e. Ha igen, akkor visszaadja a MaximumkivlasztsRekurzv fggvny az 1 indexet (3. sor). Egyb esetekben meg kell vizsglnunk, hogy
az aktulis x[jobb] elem hogyan viszonyul a nla kisebb index elemek maximumhoz. Ennek rdekben
elszr meg kell hatrozni, hogy az x els jobb 1 eleme kzl melyik a maximlis, ezrt rekurzvan
meghvjuk a MaximumkivlasztsRekurzv fggvnyt, melynek visszatrsi rtkt a max vltozba
mentjk (ld. 5. sor). Ezt kveten megnzzk, hogy az x[jobb] hogyan viszonyul az t megelz elemek
maximumhoz (ld. 6. sor), s ennek megfelelen visszaadjuk vagy a jobb aktulis rtkt (7. sor), vagy a
megelz elemek maximumnak indext (9. sor).
Megjegyzs
Az algoritmus megadhat gy is, hogy a jobb indexnl korbbi elemek maximumt nem
mentjk ki egy kln vltozba (max), hanem a 6. sorban s a 9. sorban is meghvjuk
a MaximumkivlasztsRekurzv fggvnyt. gy viszont nvekedne a rekurzv fggvnyhvsok szma, amit el akarunk kerlni.
4.8. Plda. Hatrozzuk meg a 2, 1, 6, 5, 8, 3 elemeket tartalmaz x tmb legnagyobb rtk elemnek
indext a 4.13. algoritmus hasznlatval! A megolds sorn elll fggvnyhvsokat, a vizsglt rsztmb
alakulst s a visszatrsi rtkeket nyomon kvethetjk a 4.10. brn.
Sergyn Szabolcs
152
budai Egyetem
Neumann Jnos Informatikai Kar
x:
MaximumkivlasztsRekurzv(x, 6)
x:
jobb
jobb
(b) A MaximumkivlasztsRekurzv(x, 6)
fggvnybl
meghvsra
kerl
a
MaximumkivlasztsRekurzv(x, 5)
fggvny, mely a tmb els t elemnek
maximlis elemt vlasztja ki.
(a)
Meghvsra
kerl
a
MaximumkivlasztsRekurzv(x, 6)
fggvny, mely a teljes tmb maximlis
elemt vlasztja ki.
Sergyn Szabolcs
153
budai Egyetem
Neumann Jnos Informatikai Kar
MaximumkivlasztsRekurzv(x, 3)
MaximumkivlasztsRekurzv(x, 4)
MaximumkivlasztsRekurzv(x, 4)
MaximumkivlasztsRekurzv(x, 5)
MaximumkivlasztsRekurzv(x, 5)
MaximumkivlasztsRekurzv(x, 6)
x:
MaximumkivlasztsRekurzv(x, 6)
x:
jobb
jobb
(c) A MaximumkivlasztsRekurzv(x, 5)
fggvnybl
meghvsra
kerl
a
MaximumkivlasztsRekurzv(x, 4)
fggvny, mely a tmb els ngy elemnek maximlis
elemt vlasztja ki.
(d)
A
MaximumkivlasztsRekurzv(x, 4)
fggvnybl
meghvsra
kerl
a
MaximumkivlasztsRekurzv(x, 3)
fggvny,
mely a tmb els hrom elemnek maximlis elemt
vlasztja ki.
MaximumkivlasztsRekurzv(x, 2)
MaximumkivlasztsRekurzv(x, 3)
MaximumkivlasztsRekurzv(x, 4)
MaximumkivlasztsRekurzv(x, 5)
MaximumkivlasztsRekurzv(x, 6)
x:
jobb
(e)
A
MaximumkivlasztsRekurzv(x, 3)
fggvnybl
meghvsra
kerl
a
MaximumkivlasztsRekurzv(x, 2)
fggvny,
mely a tmb els kt elemnek maximlis elemt
vlasztja ki.
Sergyn Szabolcs
154
budai Egyetem
Neumann Jnos Informatikai Kar
MaximumkivlasztsRekurzv(x, 1)
MaximumkivlasztsRekurzv(x, 2)
MaximumkivlasztsRekurzv(x, 3)
MaximumkivlasztsRekurzv(x, 4)
MaximumkivlasztsRekurzv(x, 5)
MaximumkivlasztsRekurzv(x, 6)
x:
jobb
(f) A MaximumkivlasztsRekurzv(x, 2) fggvnybl
meghvsra kerl a MaximumkivlasztsRekurzv(x, 1)
fggvny, mely a tmb els elemt vlasztja ki maximlis
elemknt.
MaximumkivlasztsRekurzv(x, 1)
1
MaximumkivlasztsRekurzv(x, 2)
MaximumkivlasztsRekurzv(x, 3)
MaximumkivlasztsRekurzv(x, 4)
MaximumkivlasztsRekurzv(x, 5)
MaximumkivlasztsRekurzv(x, 6)
x:
max jobb
(g)
A
MaximumkivlasztsRekurzv(x, 1)
fggvny visszaadja az 1-et,
a vezrls pedig a
MaximumkivlasztsRekurzv(x, 2) fggvnyhez kerl
vissza.
155
budai Egyetem
Neumann Jnos Informatikai Kar
MaximumkivlasztsRekurzv(x, 2)
1
MaximumkivlasztsRekurzv(x, 3)
MaximumkivlasztsRekurzv(x, 3)
3
MaximumkivlasztsRekurzv(x, 4)
MaximumkivlasztsRekurzv(x, 4)
MaximumkivlasztsRekurzv(x, 5)
MaximumkivlasztsRekurzv(x, 5)
MaximumkivlasztsRekurzv(x, 6)
x:
max
MaximumkivlasztsRekurzv(x, 6)
x:
max jobb
jobb
(h)
A
MaximumkivlasztsRekurzv(x, 2) (i) A MaximumkivlasztsRekurzv(x, 3) fggfggvny visszaadja az 1-et, a vezrls pedig a vny visszaadja az 3-at, a vezrls pedig a
MaximumkivlasztsRekurzv(x, 3)
fggvnyhez MaximumkivlasztsRekurzv(x, 4) fggvnyhez
kerl vissza.
kerl vissza.
MaximumkivlasztsRekurzv(x, 4)
3
MaximumkivlasztsRekurzv(x, 5)
MaximumkivlasztsRekurzv(x, 5)
5
MaximumkivlasztsRekurzv(x, 6)
x:
max
MaximumkivlasztsRekurzv(x, 6)
x:
max jobb
jobb
(j) A MaximumkivlasztsRekurzv(x, 4)
fggvny visszaadja az 3-at, a vezrls pedig a MaximumkivlasztsRekurzv(x, 5)
fggvnyhez kerl vissza.
(k) A MaximumkivlasztsRekurzv(x, 5)
fggvny visszaadja az 5-t, a vezrls pedig a MaximumkivlasztsRekurzv(x, 6)
fggvnyhez kerl vissza.
MaximumkivlasztsRekurzv(x, 6)
5
x:
(l) A MaximumkivlasztsRekurzv(x, 6)
fggvny visszaadja az 5-t, ami a tmb
maximlis elemnek indexe.
156
budai Egyetem
Neumann Jnos Informatikai Kar
5. fejezet
Rendezett tmbk
Ebben a fejezetben nvekv mdon rendezett tmbkkel foglalkozunk. Azt mr korbban, a 3. fejezetben
lttuk, hogy a tmbket miknt tehetjk rendezett. Ezt most nem vizsgljuk, csak kihasznljuk.
Elszr ttekintjk, hogy miknt lehetsges keresseket vgrehajtani rendezett tmbkben (ld. 5.1. alfejezet). A mr ismert lineris keresst mdostjuk s vizsgljuk a futsi id vltozst (ld. 5.1.1. alfejezet). Ezt kveten megismerkednk egy olyan mdszerrel, a logaritmikus keresssel, amely csak rendezett
tmbk esetn hasznlhat (ld. 5.1.2. alfejezet). Ez az jfajta megkzelts a futsi id jelents javulshoz vezet.
Az 5.2. alfejezetben megvizsgljuk, hogy egyes programozsi tteleket miknt lehetsges mdostani, futsi id szempontjbl hatkonyabb tenni rendezett tmbk esetn. A keresssel rokon eldnts
(ld. 5.2.1. alfejezet) s kivlaszts (ld. 5.2.2. alfejezet) ttelek rendezett vltozatt ismertetjk, valamint megismerkednk a kivlogats(ld. 5.2.3. alfejezet) s a megszmlls (ld. 5.2.4. alfejezet) ttelek
mdostott algoritmusaival.
A fejezet harmadik rszben egy specilis adatszerkezet, a halmazok tmbkben trtn brzolst mutatjuk be (ld. 5.3. alfejezet). A halmazokat ismtld elemeket nem tartalmaz nvekv mdon
rendezett tmbkknt reprezentljuk. Algoritmust adunk annak vizsglatra, hogy egy rendezett tmb
halmaznak tekinthet-e (ld. 5.3.1. alfejezet). Megmutatjuk, hogy egy rendezett tmbt miknt lehetsges halmazz alaktani (ld. 5.3.2. alfejezet). A keresseknl megismert mdszer alapjn bemutatjuk az
elemtartalmazs vizsglatnak algoritmust (ld. 5.3.3. alfejezet). Bemutatjuk a rszhalmaz tulajdonsg
vizsglatnak hatkony eljrst (ld. 5.3.4. alfejezet). A halmazok trgyalsnak vgn ngy halmazmvelet algoritmust ismertetjk. Ezek az uni (ld. 5.3.5. alfejezet), a metszet (ld. 5.3.6. alfejezet), a
klnbsg (ld. 5.3.7. alfejezet) s a szimmetrikus differencia (ld. 5.3.8. alfejezet).
157
Utbbi kijelentsnk csak akkor igaz, ha a keresett rtk pontosan egyszer fordul el a
tmbben. Lehetsges viszont, hogy tbbszr is benne van. Ekkor abban biztosak lehetnk,
hogy az sszes elforduls szomszdos helyeken van. Az rtk-nl kisebb elemek pedig az
rtk els elfordulsa eltt, a nagyobb elemek pedig az rtk utols elfordulsa utn
tallhatk a tmbben.
Sergyn Szabolcs
158
budai Egyetem
Neumann Jnos Informatikai Kar
159
budai Egyetem
Neumann Jnos Informatikai Kar
helyen van a keresett rtk az x tmbben. Ha viszont nem tallhat meg a keresett rtk akkor a teljes
tmbt be kell jrnunk. Teht a lineris keress 2.8. algoritmusa ilyenkor n elem vizsglatt kvnja.
Mi a helyzet a mdostott 5.1. algoritmussal? Ha a keresett rtk bent van az x tmbben, akkor
megtallshoz pontosan annyi vizsglat szksges, ahnyadik helyen tallhat. Teht ebben az esetben
nem mdosul a futsi id. Viszont, ha nincs bent a keresett elem a tmbben, akkor ennek kidertshez
nem felttlenl szksges az egsz tmbt vgigjrnunk. Amint ugyanis olyan elemet tallunk, amely
mr nagyobb a keresett rtk-nl, akkor abbahagyjuk a bejrst. Teht a futsi id lehet jval kevesebb
is a tmb n elemszmnl.
sszessgben persze ilyenkor is az igaz, hogy legrosszabb, illetve tlagos esetben is a futsi id
O(n)-es.
Sergyn Szabolcs
160
budai Egyetem
Neumann Jnos Informatikai Kar
logarithmic search
binary search
Sergyn Szabolcs
161
budai Egyetem
Neumann Jnos Informatikai Kar
Az algoritmusban nyomon kell kvetnnk, hogy az x tmbnek ppen melyik rsztmbjben keresnk.
Az aktulisan vizsglt rsztmb legkisebb indext jelli a bal vltoz, legnagyobb indext pedig a jobb
vltoz. Ezek kezdeti rtkei rendre 1 s n lesznek (ld. 2-3. sorok). A vizsglt rsztmb kzps elemvel
valstjuk meg a felezst, ezrt meghatrozzuk a kzps elem center indext (ld. 4. sor).
Ezutn belpnk az 5. s 12. sorok kztti elltesztels ciklusba. Ebben a ciklusban valstjuk meg
a tmb felezst. A ciklusba akkor lpnk be, illetve addig maradunk bent (ld. 5. sor), amg legalbb
egy eleme van a vizsglt rsztmbnek (bal jobb) s a rsztmb kzps eleme nem a keresett rtk
(x[center] 6= rtk). A cikluson bell megvizsgljuk, hogy a kzps elem hogyan viszonyul a keresett
rtkhez. Ha x[center] > rtk (ld. 6. sor), akkor a tovbbiakban csak a kzps elem elttieket kell
figyelembe vennnk. Emiatt a jobb rtkt a center el thelyezzk (ld. 7. sor). Ha viszont x[center] <
rtk, akkor a keresett rtket a kzpst kvet elemek kztt kell keresni. gy a bal rtke mdosul a
kzpst kvet indexre (ld. 9. sor). Vgl meghatrozzuk, hogy hol tallhat a lekicsinytett vizsglt
rsztmb kzps eleme (ld. 11. sor).
A ciklusbl kilpve megnzzk, hogy mi a kilps oka. Ha bal jobb, akkor biztos, hogy a ciklus
bennmaradsi felttelnek msodik tagja lett hamis, teht megtalltuk a keresett elemet. Ha viszont
bal > jobb, akkor elfogyott a tmbnk, teht nem talltuk meg a keresett elemet. Ennek megfelelen
adunk rtket a van vltoznak (ld. 13. sor). Az algoritmus tovbbi soraiban mr csak a fggvny
megfelel visszatrsi rtkeit adjuk meg, majd vget r az algoritmus futsa.
Megjegyzs
Vegyk szre, hogy a 8. sorban nem vizsgljuk meg, hogy a x[center] < rtk felttel
teljesl-e. Ugyanis a ciklusba csak akkor lpnk be, ha x[center] 6= rtk, majd a 6. sorban
megvizsgljuk, hogy x[center] > rtk teljesl-e. gy a klnben gba pont akkor lpnk
be, ha az x[center] < rtk felttel igaz. A felttelt viszont tnylegesen nem rtkeljk
ki, mert ez idignyes mvelet lenne.
5.1. Plda. Az 5.1. brn adott 15 elem x tmbben keressk meg a 12 rtket a logaritmikus keress
5.2. algoritmusval.
A bal rtke kezdetben 1 lesz (2. sor), jobb pedig a tmb mretnek megfelelen 15 (3. sor). A 4. sorban meghatrozzuk a center index rtkt, ami 8 lesz, ahogy az az 5.1a. brn is lthat. Belpnk
az 5. sorban kezdd ciklusba. Mivel a nyolcadik elem nagyobb a keresett rtknl (6. sor), ezrt jobb
7-re mdosul (7. sor). j center indexet hatrozunk meg (ld. 11. sor), ez most 4 lesz (ld. 5.1b. bra).
Megvizsgljuk a ciklus bennmaradsi felttelt, ami jelenleg teljesl. A negyedik elem kisebb a keresett rtknl (8. sor), ezrt a bal rtkt mdostjuk (9. sor). A center rtke 6-ra mdosul (ld. 5.1c. bra). A ciklus bennmaradsi felttele viszont mr nem teljesl, mert a hatodik elem megegyezik a keresett
rtkkel. Kilpve a ciklusbl a van rtke igaz -z vlik, idx pedig felveszi a megtallt elem indext.
Lthat, hogy hromszori vizsglattal sikerlt megtallnunk a keresett elemet.
5.2. Plda. Az 5.2. brn adott egy 15 elem tmb. Az 5.2. algoritmus hasznlatval keressk, hogy
a 4 benne van-e s melyik helyen a rendezett tmbben.
Kezdetben az egsz tmbt vizsgljuk, ezrt bal = 1 s jobb = 15, center pedig felveszi a 8 rtket
(ld. 5.2a. bra). A vezrls belp az 5. sorban kezdd ciklusba. Mivel a nyolcadik tmbelem nagyobb a
keresett rtknl, ezrt jobb 7-re mdosul. A center rtke 4-re mdosul (ld. 5.2b. bra). A bennmaradsi
felttel ismt teljesl, ezrt nem lp ki a vezrls a ciklusbl. A negyedik elem is nagyobb a keresett
rtknl, ezrt ismt a jobb index vltozik, a harmadik elemre fog mutatni, a center pedig a msodik
elemre mutat (ld. 5.2c. bra). A ciklus bennmaradsi felttele mg most is teljesl. Mivel a msodik
elem kisebb a keresett rtknl, ezrt a bal indexvltoz mdosul, a harmadik elemre mutat r. Mivel a
bal s a jobb indexvltozk rtke azonos, gy a center rtke is meg fog velk egyezni (ld. 5.2d. bra).
A kvetkez ciklusban mivel a harmadik elem nagyobb, mint a keresett rtk, ezrt a jobb vltoz rtke
2-re cskken (ld. 5.2e. bra). Ekkor viszont a bennmaradsi bal jobb felttel hamis-s vlik, ezrt
kilp a vezrls a ciklusbl, a van vltoz rtke pedig felveszi a hamis rtket.
Futsi id elemzse. Vizsgljuk meg, hogy milyen futsi idt eredmnyez a logaritmikus keress
5.2. algoritmusa. Vizsglatunk arra irnyul, hogy hnyszor kell az algoritmusban tallhat ciklust vgrehajtani.
Legjobb esetben a ciklusfelttel egyszer kerl kirtkelsre, hiszen ha a keresett rtk pont a kzps
elemnl tallhat, akkor rgtn megtalljuk azt. Ilyenkor a ciklusba nem is lp be a vezrls.
Sergyn Szabolcs
162
budai Egyetem
Neumann Jnos Informatikai Kar
x:
12
14
17
18
19
23
25
26
28
jobb
center
bal
30
(a) Az egsz tmbt vizsgljuk, gy bal = 1 s jobb = 15. A kzps elem a nyolcadik, amelynek
rtke nagyobb a keresett 12 rtknl.
x:
12
17
18
19
23
25
26
28
30
jobb
center
bal
14
(b) Mr csak az els s a hetedik elem kztti rsszel foglalkozunk. A kzps elem ebben az
esetben a negyedik, amelynek rtke kisebb a keresett 12 rtknl.
x:
12
14
17
18
19
23
25
26
28
30
5.1. bra. Logaritmikus keress. Az x tmbben keressk a 12 rtket. A harmadik vizsglatnl megtalljuk a keresett rtket a hatodik elemnl.
Legrosszabb esetben csak akkor talljuk meg a keresett rtket, amikor a vizsglt rsztmb egy elem,
azaz a bal s a jobb rtke mr megegyez, mgpedig mindkett a keresett rtket tartalmaz tmbelemre
mutat. Ilyen esetben hnyszor kellett a ciklust vgrehajtani? Mivel a ciklus minden egyes lefutsnl a
vizsglt tmb mrete a felre vagy mg annl is kisebbre cskken, ezrt a f krds az, hogy hnyszor
lehet az n elem tmbt megfelezni. Ennek szma pedig dlog2 ne. Teht pldul egy 15 elem tmb
esetn legrosszabb esetben is csak 4 ciklus vgrehajtsra van szksg a keresett elem megtallshoz,
feltve, hogy a keresett elem benne van a tmbben.
Mi a helyzet akkor, ha nincs benne a keresett elem a tmbben? Ekkor az elbb trgyalt legrosszabb
esethez kpest eggyel tbb ciklus futs szksges, hiszen el kell llnia annak a helyzetnek, hogy a vizsglt
rsztmb mrete mr 1-nl is kisebb. Ezt jelzi az algoritmusban a bal > jobb eset. gy a futsi id ilyenkor
d1 + log2 ne.
sszessgben kijelenthet, hogy a logaritmikus keress algoritmusnak futsi ideje legrosszabb esetben d1 + log2 ne, tlagos esetben pedig dlog2 ne. Teht az algoritmus O (log n) futsi idej. Ezt knny
megjegyezni, mert errl kapta az algoritmus a nevt is.
Vegyk szre, hogy egy 1000 elem tmb esetn a logaritmikus keress minden esetben legfeljebb 11
ciklus vgrehajtssal eredmnyre vezet. A korbban megismert lineris keressnl viszont legrosszabb
esetben 1000, tlagos esetben pedig 500 vizsglatra volt szksg. Jl lthat, hogy a logaritmikus keress
jelents futsi id javulst eredmnyez, de ne felejtsk el, hogy csak rendezett tmbk esetn hasznlhat.
A fejezet tovbbi rszben azt tekintjk t, hogy a logaritmikus keress megismert algoritmust,
hogyan lehet rekurzv mdon lerni. Termszetesen az algoritmus tlete nem mdosul, csak az 5.2. algoritmusban lv ciklust kell rekurzv fggvnyhvsokkal helyettesteni. A rekurzv megvalsts pszeudokdjt az 5.3. algoritmus rja le.
A rekurzv algoritmus bemenete a rendezett x tmb, melyben keresnk egy konkrt rtk-et. Bemenetknt adjuk meg azt is, hogy az x tmb mely rsztmbjben vgezzk ppen a keresst. Ehhez a bal s
a jobb indexek ismerete szksges. A fggvny els hvsakor a teljes tmbben trtnik a keress, ezrt
bal = 1 s jobb = n, ahol n az x tmb mrete.
Az algoritmusban ngy lnyegesen klnbz esetet kell kezelni. Elsknt megnzzk, hogy az aktulisan vizsglt rsztmb ltezik-e. Ha bal > jobb (ld. 2. sor), akkor nemltez rsztmbbel kne dolgoznunk,
ami azt jelenti, hogy ebben biztos nincsen benne a keresett rtk. Ilyen esetben az algoritmust meg-
Sergyn Szabolcs
163
budai Egyetem
Neumann Jnos Informatikai Kar
x:
12
14
17
18
19
23
25
26
28
jobb
center
bal
30
(a) Els lpsben a teljes tmbt vizsgljuk, gy bal = 1 s jobb = 15. A kzps elem a
nyolcadik, amelyik a keresett 4 rtknl nagyobb.
x:
12
17
18
19
23
25
26
28
30
jobb
center
bal
14
(b) A msodik iterciban mr csak a tmb els felt vizsgljuk, teht jobb = 7. A kzps
elem a negyedik, amely nagyobb mint a keresett 4 rtk.
x:
12
14
17
18
19
23
25
26
28
30
12
14
17
18
19
23
25
26
28
30
jobb
bal
center
(d) A negyedik iterciban bal = 3 s jobb = 3, ezrt a kzps elem is a harmadik. Mivel a
harmadik elem nagyobb a keresett 4 rtknl, ezrt tovbbfolytatjuk a keresst.
x:
jobb
bal
12
14
17
18
19
23
25
26
28
30
center
(e) tdik lpsben a jobb = 2, ami kisebb mint a bal. A keresett elemet nem talltuk meg a
tmbben.
Sergyn Szabolcs
164
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
165
budai Egyetem
Neumann Jnos Informatikai Kar
valst fggvny a 0 rtket adja vissza (ld. 3. sor). Minden ms esetben valban ltez rsztmbt
vizsglunk, amit a 4. sorban kezdd klnben g valst meg.
A klnben gban elszr meghatrozzuk a vizsglt rsztmb kzps elemnek indext (ld. 5. sor).
Ezutn megnzzk, hogy a kzps x[center] elem hogyan viszonyul a keresett rtk-hez. Ez hrom
lehetsget jelent.
Amennyiben x[center] = rtk (ld. 6. sor), akkor megtalltuk a keresett elemet, ezrt ennek indexvel
(center) tr vissza a fggvny (ld. 7. sor).
Ha x[center] > rtk (ld. 9. sor), akkor a keresst a bal s center 1 indexek ltal meghatrozott
rsztmbben kell folytatni. Emiatt rekurzvan meghvjuk a LogaritmikusKeressRekurzv fggvnyt a megfelel bemeneti paramterekkel (ld. 10. sor). A hvott fggvny ltal visszaadott rtk vagy
a megtallt elem indexe lesz, vagy 0, ami azt jelenti, hogy nem talltuk meg a keresett rtk-et. Mindkt
esetben a hvott fggvny visszatrsi rtkt fogja az aktulis fggvny is visszaadni az t hv krnyezet
fel.
Utols lehetsg, amikor x[center] < rtk (ld. 11. sor). Ekkor is hasonlan jrunk el, mint az elz
esetben, csak ms rsztmbt vizsglunk (ld. 12. sor).
5.3. Plda. Nzzk meg, hogy az 5.1. pldban mr ltott feladatot miknt oldhatjuk meg rekurzv
mdon, az 5.3. algoritmus hasznlatval. Az egyes lpseket az 5.3. brn kvethetjk nyomon.
A tizent elem tmbben a 12-t keressk, ezrt a klvilgbl az albbi hvs trtnik: LogaritmikusKeressRekurzv(x, 1, 15, 12). Mivel a bal index kisebb mind a jobb index, ezrt az algoritmus
4. sorban kezdd klnben gba lp a vezrls. A kzps elem center indexe 8 lesz (ld. 5.3a. bra).
Mivel x[center] > rtk (ld. 6. sor), ezrt rekurzvan meghvdik a LogaritmikusKeressRekurzv fggvny bal = 1 s jobb = 7 rtkekkel. Mivel bal < jobb, ezrt ismt meghatrozsra kerl a
kzps elem indexe, ami 4 lesz (ld. 5.3b. bra). Mivel x[center] < rtk (ld. 11. sor), ezrt jabb
rekurzv hvs kvetkezik. Ekkor bal = 5 s jobb = 7. Az j fggvnyben is meghatrozzuk a kzps
elem indext, ami 6 lesz (ld. 5.3c. bra). A hatodik elem megegyezik a keresett 12 rtk-kel (ld. 6. sor),
ezrt az aktulis fggvny visszaadja a 6 rtket (ami a megtallt elem indexe), majd a futsa vget r
(ld. 5.3d. bra). A vezrls visszakerl a msodikknt elindult fggvnyhez. Itt nem trtnik ms, mint
a megkapott 6 rtket visszaadja ez a fggvny is, majd a futsa ennek is vget r (ld. 5.3e. bra). A
vezrls visszakerl a legkorbban hvott fggvnyhez. Ez a fggvny is visszaadja a 6 rtket, majd
ennek a futsa is lell (ld. 5.3f. bra). Az algoritmus futsa vget r, eredmnyl megkaptuk a keresett
elem indext.
5.4. Plda. A fejezet korbbi feladataiban mr vizsglt x tmbben keressk a 4 rtket az 5.2. feladathoz hasonlan. A keressnl a rekurzv 5.3. algoritmust hasznljuk. Az 5.4. brn nyomon kvethet,
hogy miknt alakul a rekurzv hvsok sorozata.
Kezdetben meghvsra kerl a LogaritmikusKeressRekurzv fggvny a bal = 1 s jobb = 15
paramterekkel (ld. 5.4a. bra). Ebben az esetben a kzps elem nagyobb a keresett 4 rtknl, ezrt
rekurzv fggvnyhvs trtnik. A bal rtke nem vltozik a jobb viszont 7-re mdosul (ld. 5.4b. bra).
A kzps elem ismt nagyobb a keresett rtknl, ezrt jabb rekurzv hvs kvetkezik. Most a jobb
3-ra cskken (ld. 5.4c. bra). A kzps elem kisebb a keresettnl, ezrt bal nvekszik 3-ra (ld. 5.4d. bra). Mivel az aktulis kzps elem nagyobb a keresett rtknl, ezrt jobb vltozik, mgpedig 2-re
(ld. 5.4e. bra).
Mivel jobb < bal, ezrt a fggvny a 0 rtket adja vissza (ld. 5.4f. bra). Ezt kveten minden
korbban meghvott fggvny a 0 rtkekkel tr vissza, ahogy ez az 5.4g-5.4j. brkon is lthat.
Futsi id elemzse. A rekurzv megvalsts futsi ideje nagysgrendileg megegyezik az iteratv
esettel, mivel a fggvnyhvsok szma azonos a ciklus vgrehajtsi szmmal.
Sergyn Szabolcs
166
budai Egyetem
Neumann Jnos Informatikai Kar
x:
12
14
17
18
19
23
25
26
28
jobb
center
bal
30
(a) Az els fggvnyhvsnl bal = 1 s jobb = 15. A kzps elem nagyobb a keresett rtknl.
LogaritmikusKeressRekurzv(x, 1, 7, 12)
LogaritmikusKeressRekurzv(x, 1, 15, 12)
x:
12
17
18
19
23
25
26
28
30
jobb
center
bal
14
(b) Rekurzvan meghvsra kerl a fggvny bal = 1 s jobb = 7 rtkkel. A kzps elem kisebb a
keresett rtknl.
LogaritmikusKeressRekurzv(x, 5, 7, 12)
LogaritmikusKeressRekurzv(x, 1, 7, 12)
LogaritmikusKeressRekurzv(x, 1, 15, 12)
x:
12
14
17
18
19
23
25
26
28
30
Sergyn Szabolcs
167
budai Egyetem
Neumann Jnos Informatikai Kar
LogaritmikusKeressRekurzv(x, 5, 7, 12)
6
LogaritmikusKeressRekurzv(x, 1, 7, 12)
LogaritmikusKeressRekurzv(x, 1, 15, 12)
x:
12
17
18
19
23
25
26
28
30
jobb
center
bal
14
(d) Az utoljra hvott fggvny visszaadja a megtallt elem indext (6), majd a futsa vget r.
LogaritmikusKeressRekurzv(x, 1, 7, 12)
6
LogaritmikusKeressRekurzv(x, 1, 15, 12)
x:
12
14
17
18
19
23
25
26
28
jobb
center
bal
30
(e) Az aktulisan fut fggvny visszaadja a megtallt elem indext (6), majd a futsa vget r.
LogaritmikusKeressRekurzv(x, 1, 15, 12)
6
x:
12
14
17
18
19
23
25
26
28
30
(f) A klvilgbl hvott fggvny visszaadja a megtallt elem indext (6), majd a futsa vget r.
5.3. bra. Logaritmikus keress rekurzv megvalstsa (folyt.). Az x tmbben keressk a 12 rtket.
Sergyn Szabolcs
168
budai Egyetem
Neumann Jnos Informatikai Kar
LogaritmikusKeressRekurzv(x, 1, 15, 4)
x:
12
14
17
18
19
23
25
26
28
jobb
center
bal
30
(a) A klvilgbl a fggvny hvsa a bal = 1 s jobb = 15 paramterekkel trtnik. A kzps elem
nagyobb a keresettnl.
LogaritmikusKeressRekurzv(x, 1, 7, 4)
LogaritmikusKeressRekurzv(x, 1, 15, 4)
x:
12
17
18
19
23
25
26
28
30
jobb
center
bal
14
(b) Az els rekurzv hvsnl a jobb paramter 7-re mdosul. A kzps elem most is nagyobb a
keresettnl.
LogaritmikusKeressRekurzv(x, 1, 3, 4)
LogaritmikusKeressRekurzv(x, 1, 7, 4)
LogaritmikusKeressRekurzv(x, 1, 15, 4)
x:
12
14
17
18
19
23
25
26
28
30
Sergyn Szabolcs
169
budai Egyetem
Neumann Jnos Informatikai Kar
LogaritmikusKeressRekurzv(x, 3, 3, 4)
LogaritmikusKeressRekurzv(x, 1, 3, 4)
LogaritmikusKeressRekurzv(x, 1, 7, 4)
LogaritmikusKeressRekurzv(x, 1, 15, 4)
x:
12
14
17
18
19
23
25
26
28
30
jobb
bal
center
(d) A harmadik rekurzv hvsnl bal 3 lesz. A vizsglt rsztmb egy elemv vlik, amely elem
nagyobb a keresettnl.
LogaritmikusKeressRekurzv(x, 3, 2, 4)
LogaritmikusKeressRekurzv(x, 3, 3, 4)
LogaritmikusKeressRekurzv(x, 1, 3, 4)
LogaritmikusKeressRekurzv(x, 1, 7, 4)
LogaritmikusKeressRekurzv(x, 1, 15, 4)
x:
12
14
17
18
19
23
25
26
28
30
jobb bal
(e) A negyedik rekurzv hvsnl jobb 2 lesz. Mivel jobb < bal, nem lesz tovbbi rekurzv hvs.
5.4. bra. Logaritmikus keress rekurzv megvalstsa (folyt.). Az x tmbben keressk a 4 rtket.
Sergyn Szabolcs
170
budai Egyetem
Neumann Jnos Informatikai Kar
LogaritmikusKeressRekurzv(x, 3, 2, 4)
0
LogaritmikusKeressRekurzv(x, 3, 3, 4)
LogaritmikusKeressRekurzv(x, 1, 3, 4)
LogaritmikusKeressRekurzv(x, 1, 7, 4)
LogaritmikusKeressRekurzv(x, 1, 15, 4)
x:
12
14
17
18
19
23
25
26
28
30
25
26
28
30
jobb
bal
center
(f) Az utoljra hvott fggvny visszatr a 0 rtkkel.
LogaritmikusKeressRekurzv(x, 3, 3, 4)
0
LogaritmikusKeressRekurzv(x, 1, 3, 4)
LogaritmikusKeressRekurzv(x, 1, 7, 4)
LogaritmikusKeressRekurzv(x, 1, 15, 4)
x:
12
14
17
18
19
23
5.4. bra. Logaritmikus keress rekurzv megvalstsa (folyt.). Az x tmbben keressk a 4 rtket.
Sergyn Szabolcs
171
budai Egyetem
Neumann Jnos Informatikai Kar
LogaritmikusKeressRekurzv(x, 1, 3, 4)
0
LogaritmikusKeressRekurzv(x, 1, 7, 4)
LogaritmikusKeressRekurzv(x, 1, 15, 4)
x:
12
17
18
19
23
25
26
28
30
25
26
28
30
jobb
center
bal
14
x:
12
14
17
18
19
23
jobb
center
bal
x:
12
14
17
18
19
23
25
26
28
30
5.4. bra. Logaritmikus keress rekurzv megvalstsa (folyt.). Az x tmbben keressk a 4 rtket.
Sergyn Szabolcs
172
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
173
budai Egyetem
Neumann Jnos Informatikai Kar
5.2.1. Eldnts
Rendezett tmbk esetn az eldnts programozsi ttel arrl ad informcit, hogy a vizsglt x tmbben
megtallhat-e egy konkrt rtk. A problmt megold 5.4. algoritmus csak kis mrtkben tr el a
logaritmikus keress 5.2. algoritmustl, ezrt sorrl sorra nem ismertetjk.
5.4. Algoritmus Eldnts programozsi ttel rendezett tmbben
Bemenet: x T rendezett tmb, n egsz (tmb mrete), rtk T; ahol T sszehasonlthat
Kimenet: van logikai
1: fggvny EldntsRendezettben(x : T rendezett tmb, n : egsz, rtk : T)
2:
bal 1
3:
jobb n j
k
4:
center bal+jobb
2
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Sergyn Szabolcs
174
budai Egyetem
Neumann Jnos Informatikai Kar
x:
12
19
23
24
26
jobb
center
bal
30
12
19
bal
23
24
26
center
30
jobb
x:
12
19
23
bal
center
24
26
30
van igaz
jobb
(c) A kzps elem az alshatr s a f elshatr kztt van, ezrt a kimeneti rtk
igaz lesz.
5.5. bra. Mdostott eldnts rendezett tmbben. Az x tmbben 17 s 23 kztti rtket keresnk.
Sergyn Szabolcs
175
budai Egyetem
Neumann Jnos Informatikai Kar
5.2.2. Kivlaszts
A kivlaszts programozsi ttel esetn tudjuk, hogy a rendezett tmbben van olyan elem, mely a keresett
rtk-kel megegyezik. A krds csak az, hogy melyik ez az elem. Ezt a problmt is a logaritmikus keress
5.2. algoritmusnak mdostsval oldhatjuk meg. A mdostott kdot az 5.6. algoritmusban mutatjuk
be.
5.6. Algoritmus Kivlaszts programozsi ttel rendezettben
Bemenet: x T rendezett tmb, n egsz, rtk T; ahol T sszehasonlthat
Kimenet: idx egsz
1: fggvny KivlasztsRendezettben(x : T rendezett tmb, n : egsz, rtk : T)
2:
bal 1
3:
jobb n j
k
4:
center bal+jobb
2
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Sergyn Szabolcs
176
budai Egyetem
Neumann Jnos Informatikai Kar
5.2.3. Kivlogats
A most trgyalsra kerl kivlogatsnl mdostunk a 2.2.2. fejezetben megismert kivlogats programozs ttel feladatn. Nem azt fogjuk vizsglni, hogy melyek azok a tmbbeli elemek, amelyek egy
adott tulajdonsgnak megfelelek, hanem azt nzzk, hogy melyek azok az elemek, amelyek egy konkrt
rtk-kel megegyeznek. Ilyen elem lehet, hogy nincs is a tmbben, lehet, hogy csak egy van, de lehet,
hogy tbb is van. Ha tbb azonos rtk elem is van a tmbben, akkor azok a rendezettsg miatt biztosan egyms kzvetlen szomszdsgban helyezkednek el. Termszetesen nem az most a clunk, hogy
ugyanazt az rtket akr tbbszr is kivlogassuk egy j tmbbe, hanem azt akarjuk megadni, hogy az
eredeti tmbben melyik kt index kztt tallhat meg a keresett rtk.
A problma hatkony megoldst az 5.7. algoritmusban adjuk meg. Az algoritmus bemenetknt
kapja meg a vizsglt tmbt, melynek a mrett is ismerjk, valamint a keresett rtket. Kimenetknt
informcit kapunk arrl, hogy a keresett rtk benne van-e a tmbben, s ha igen, akkor mely indexek
kztt.
Az algoritmus 13. sorig ugyanazt tesszk, mint a logaritmikus keress 5.2. algoritmusban, azaz
vizsgljuk, hogy a keresett rtk megtallhat-e az x tmbben. Amennyiben megtallhat, akkor a van
vltoz igaz rtk lesz. Ilyenkor meg kell vizsglni, hogy a megtallt elem bal, illetve jobb szomszdai
is megegyeznek-e az rtk-kel. Ezt a vizsglatot valstja meg a 15. s 22. sorok kztti rsz. Az algoritmus tallat esetn visszatr a van vltoz megfelel rtkvel, valamint a meghatrozott indexhatrok
rtkeivel. Ha nincs tallat, akkor csak errl szolgltat informcit.
5.6. Plda. Az 5.6. brn lthat rendezett tmb esetn szeretnnk meghatrozni, hogy van-e 3-as
rtk a tmbben, s ha van, akkor mely kt index kztti tartomnyban. A feladatot a kivlogats
5.7. algoritmusval oldjuk meg.
Kezdetben a logaritmikus keressnl megismert keressi mdszert alkalmazva egy darab 3-ast szeretnnk megtallni. Szerencsre ezt rgtn az els felttel vizsglatnl megleljk, mert a kzps elem 3-as
rtk (ld. 5.6a. bra). Ezt kveten kell a megtallt elem bal s jobb szomszdjait vgigjrva megkeresni
az sszes 3-as rtk elfordulsait. Ennek rdekben a bal indexet egyenlv tesszk a megtallt elem
center indexvel. Megvizsgljuk a bal-t megelz elem rtkt (ld. 5.6b. bra). Mivel ez az rtk is
3-as, ezrt bal rtkt eggyel cskkentjk. Ugyanezt tesszk az 5.6c. s 5.6d. brn lthat esetekben is.
Amikor a bal rtke 3-ra cskken, akkor az t kzvetlenl megelz elem mr nem 3-as (ld. 5.6e. bra),
ezrt a bal indexszel folytatott bejrst befejezzk. Ezutn megvizsgljuk a center-edik elemet kvet
elemeket. Ennek rdekben a jobb indexet tesszk egyenlv a center-rel. Mivel a jobb-adik elemet
kvet elem is 3-as (ld. 5.6f. bra), ezrt jobb rtkt eggyel nveljk. jabb vizsglat kvetkezik, de
most a jobb index elemet kvet elem mr nem 3-as (ld. 5.6g. bra), ezrt ezt a bejrst is befejezzk.
Vgeredmnyl megtalltuk azt a tartomnyt, amelyben csak 3-asok vannak.
Termszetesen a kivlogats esetn is mdosthatjuk a keressnket oly mdon, ahogy ezt az eldntsnl tettk. Itt is kereshetnk olyan elemeket, amelyek egy alshatr s egy f elshatr kz esnek.
A kivlogats ezen esetnek megvalstst az 5.8. algoritmusban mutatjuk be.
Sergyn Szabolcs
177
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
178
budai Egyetem
Neumann Jnos Informatikai Kar
x:
jobb
center
bal
(a) Els lpsben egy darab 3-ast kell tallnunk a tmbben. Mivel a kzps
elem ilyen, ezrt a keresst nem kell tovbb folytatnunk.
x:
center
bal
jobb
jobb
bal center
(c) A bal indexet eggyel cskkentettk, majd ismt vizsgljuk a bal szomszdjt.
x:
jobb
center
bal
(d) A bal indexet eggyel cskkentettk, majd ismt vizsgljuk a bal szomszdjt.
x:
jobb
center
bal
(e) A bal indexet ismt cskkentettk, viszont a bal szomszd mr nem 3-as.
x:
jobb
center
bal
bal
center jobb
(g) A jobb indexet eggyel nveltk, viszont a jobb szomszdja nem 3-as.
Visszatrnk a van = igaz, bal = 3 s jobb = 7 rtkekkel.
5.6. bra. Kivlogats rendezett tmbk esetn. A 12 elem x tmbben keressk azt a tartomnyt,
amelyben 3-asok tallhatk.
Sergyn Szabolcs
179
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
180
budai Egyetem
Neumann Jnos Informatikai Kar
5.2.4. Megszmlls
Rendezett tmbk esetn a megszmlls sorn azt szeretnnk meghatrozni, hogy egy konkrt rtk
hnyszor fordul el a rendezett tmbben. Mivel az azonos rtkek egyms kzvetlen szomszdsgban
tallhatk meg, ezrt azt kell meghatroznunk, hogy melyik kt hatrindex kztt tallhatk a keresett
rtk elemek, majd ebbl egyszeren kiszmthat az elemek darabszma.
A megszmlls megoldst az 5.9. algoritmusban ismertetjk, amely elvben nagyon hasonl az elz
algoritmusokhoz.
5.9. Algoritmus Megszmlls programozsi ttel rendezett tmbben
Bemenet: x T rendezett tmb, n egsz, rtk T; ahol T sszehasonlthat
Kimenet: db egsz
1: fggvny MegszmllsRendezettben(x : T rendezett tmb, n : egsz, rtk : T)
2:
bal 1
3:
jobb n j
k
4:
center bal+jobb
2
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
Sergyn Szabolcs
181
budai Egyetem
Neumann Jnos Informatikai Kar
5.3. Halmazok
A matematikbl tudjuk, hogy a halmaz egy alapfogalom, amelyet nem lehet definilni. Viszont az
eldnthet, hogy valami eleme-e egy halmaznak vagy sem. Tudjuk azt is a halmazokrl, hogy ha valami
benne van egy halmazban, akkor nem lehet benne ktszer vagy tbbszr is, teht egy halmazban nem
ltezik ismtlds.
Vizsgljuk meg, hogyan lehet a matematikbl ismert halmazokat az algoritmusok s adatszerkezetek vilgban reprezentlni gy, hogy hatkonyan lehessen megvalstani a halmazokon rtelmezett
mveleteket. A halmazokat olyan nvekv mdon rendezett tmbkknt brzoljuk br a matematikai rtelemben vett halmazelemek kztt nincs rendezettsg , amelyekben nem fordul el ismtlds.
Termszetesen ez a reprezentci csak olyan halmazok esetn alkalmazhat, amikor az elemek kztt
rtelmezhet a < relci.
A halmazokkal kapcsolatban az albbi problmkat tekintjk t rszletesen. Megnzzk, hogy miknt
lehet egy nvekv mdon rendezett tmbrl eldnteni, hogy az halmaznak tekinthet-e (ld. 5.3.1. alfejezet). Algoritmust adunk arra, hogy egy rendezett tmb milyen mdon alakthat t halmazz
(ld. 5.3.2. alfejezet). Megadjuk az elemtartalmazs (ld. 5.3.3. alfejezet) s a rszhalmaz tulajdonsg
(ld. 5.3.4. alfejezet) eldntsnek hatkony algoritmusait. A fejezet lezrsaknt ismertetjk a halmazmveletek megvalstst az uni (ld. 5.3.5. alfejezet), metszet (ld. 5.3.6. alfejezet), klnbsg (ld. 5.3.7. alfejezet) s szimmetrikus differencia (ld. 5.3.8. alfejezet) esetben. Mind a ngy halmazmvelet a korbban
mr megismert sszefuttats programozsi ttel (ld. 2.2.6. fejezet) elve alapjn kerlt kidolgozsra.
Sergyn Szabolcs
182
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
183
budai Egyetem
Neumann Jnos Informatikai Kar
184
budai Egyetem
Neumann Jnos Informatikai Kar
be ismtelten a halmazba. A hatodik elem viszont mg nem halmazbeli, ezrt bemsoljuk a halmazba
(ld. 5.7f. bra). A bejrs vgre rve ltrejtt egy ismtlds nlkli halmaz, melyben az x minden
kezdeti eleme egyes multiplicitssal szerepel.
x:
x:
i
a:
a:
db
db
x:
i
a:
a:
x:
i
a:
db
db
x:
i
a:
db
db
Sergyn Szabolcs
185
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
186
budai Egyetem
Neumann Jnos Informatikai Kar
5.3.4. Rszhalmaz
A rszhalmaz vizsglatnl feladatunk annak meghatrozsa, hogy egy a halmaz minden egyes eleme
benne van-e egy msik b halmazban. Ezt a feladatot megoldhatnnk gy, hogy az a halmaz minden
egyes elemre megnzzk, hogy benne van-e a b halmazban, teht kt egymsba gyazott eldnts ttelt
(ld. 2.1.2. fejezet) alkalmaznnk. gy a futsi id a kt halmaz mretnek szorzatval lenne arnyos.
Viszont ez a megolds nem hasznlja ki, hogy a halmazban lv elemek nvekv mdon rendezettek.
Egy msik megoldsi lehetsg, ha a kt halmazt prhuzamosan jrjuk be a halmazok elejrl indulva.
Amennyiben a bejrs sorn az a aktulis a[i] eleme kisebb, mint a b aktulis b[j] eleme, akkor nincs
rtelme tovbb vizsgldnunk, mert a b halmaz j-nl nagyobb index elemei mr mind nagyobbak a[i]nl, teht biztos nem egyenlk az a[i]-vel. Ha viszont a[i] = b[j], akkor tovbblphetnk az a kvetkez
elemre, mikzben a b-ben is tovbbhaladunk. Amennyiben a[i] > b[j], akkor pedig tovbbra is keresni
kell mg az a[i]-t a b halmazban, ezt csak b-ben haladunk tovbb. Ha a bejrs sorn tljutunk az a
sszes elemn, akkor az a minden elemt megtalltuk b-ben, teht a rszhalmaza b-nek.
A lert tletet az 5.13. algoritmussal valstjuk meg. Az algoritmus bemenete a kt halmaz, valamint
azok mrete. Kimenet egy logikai vltoz, amely pontosan akkor igaz, ha az a rszhalmaza b-nek.
5.13. Algoritmus Rszhalmaz vizsglat
Bemenet: a T halmaz, m egsz (a mrete), b T halmaz, n T halmaz (b mrete)
Kimenet: l logikai
1: fggvny Rszhalmaz_e(a : T halmaz, m : egsz, b : T halmaz, n : egsz)
2:
i1
3:
j1
4:
ciklus amg (i m) (j n) (a[i] b[j])
5:
ha a[i] = b[j] akkor
6:
ii+1
7:
elgazs vge
8:
j j+1
9:
ciklus vge
10:
l (i > m)
11:
vissza l
12: fggvny vge
Felhasznlt vltozk s fggvnyek
a: Egyik halmaz.
m: a mrete.
b: Msik halmaz.
n: b mrete.
l: Pontosan akkor igaz, ha a b.
Az algoritmus elejn inicializljuk az a halmaz i, illetve a b halmaz j indext. Mivel mindkt halmazt
az elejtl jrjuk be, ezrt az indexek kezdeti rtke 1 lesz (ld. 2. s 3. sorok). A tmbk bejrst
a 4. s 9. sorok kztti ciklussal valstjuk meg. A ciklus belpsi s bennmaradsi felttele hrom
rszbl tevdik ssze. Az i s j indexnek is tnyleges tmbindexnek kell lennie, valamint az a halmaz
aktulis eleme nem lehet kisebb a b aktulis elemnl. A ciklusban megvizsgljuk, hogy a kt halmaz
aktulis elemei egyenlk-e (ld. 5. sor). Ha egyenlk, akkor tovbblpnk az a halmazban (ld. 6. sor). Az
egyenlsgtl fggetlenl tovbbhaladunk a b halmazban (ld. 8. sor). A ciklusbl val kilpst kveten
megvizsgljuk a kilps okt. Amennyiben az a halmaz indexe meghaladja az a mrett, akkor minden
a-beli elem benne van b-ben is, teht a rszhalmaza b-nek. Ezrt az l kimeneti vltozt az i > m relcitl
fggen rtelmezzk (ld. 10), majd rtkt kimenetknt adjuk vissza (ld. 11. sor).
Megjegyzs
Ha az a halmaz tbb elemet tartalmaz mint b (azaz m > n), akkor biztos, hogy a nem
rszhalmaza b-nek. Ezrt az algoritmus elejre, akr betehetnk egy mretvizsglatot is.
Viszont m < n esetben ez egy felesleges vizsglat, ezrt nem jelentettk meg az 5.13. algoritmusban.
Sergyn Szabolcs
187
budai Egyetem
Neumann Jnos Informatikai Kar
5.8. Plda. Az 5.8. brn bemutatjuk, hogy miknt dnti el az 5.13. algoritmus kt halmazrl, hogy
az egyik rszhalmaza-e a msiknak.
Kezdetben az i s j indexek rtke 1 lesz (ld. 2. s 3. sor). Mivel a 4. sorban kezdd ciklus belpsi
felttele igaz, ezrt belpnk a ciklusba. A cikluson bell az a[1] = b[1] felttel teljesl (ld. 5.8a. bra),
ezrt i s j rtke is nvekszik 1-gyel (ld. 6. s 8. sorok). Az i = 2 s j = 2 esetben a bejrst biztost
ciklus bennmaradsi felttele igaz, de az a[2] = b[2] felttel hamis (ld. 5.8b. bra), ezrt csak a j index
rtkt nveljk 1-gyel. Mg mindig bennmaradunk a ciklusban, ahol az a[2] = b[3] egyenlsg teljesl
(ld. 5.8c. bra), ezrt az i s a j rtkt is nveljk. A ciklus bennmaradsi felttele mg mindig igaz,
valamint az aktulis elemek is egyenlek (ld. 5.8d. bra), ezrt tovbbnveljk mindkt indexet. Ekkor
viszont az i index mr meghaladja az a halmaz mrett, ezrt kilpnk a ciklusbl s az l vltoz igaz
rtket vesz fel (ld. 10. sor).
a:
a:
i
b:
b:
(b) Mivel a[2] > b[2], ezrt folytatjuk az eldntst, de csak a b halmazban lpnk tovbb.
a:
i
b:
a:
i
5
b:
Sergyn Szabolcs
188
budai Egyetem
Neumann Jnos Informatikai Kar
a:
a:
i
b:
a:
b:
i
6
b:
j
(c) Mivel a[2] < b[3], ezrt a
nem lehet rszhalmaza b-nek.
Sergyn Szabolcs
189
budai Egyetem
Neumann Jnos Informatikai Kar
5.3.5. Uni
A halmazok unijnak megvalstsa teljes mrtkben megegyezik a korbban mr trgyalt sszefuttats
programozsi ttellel (ld. 2.2.6. fejezet), ezrt csak az algoritmus pszeudokdjt adjuk meg (ld. 5.14. algoritmus).
5.14. Algoritmus Halmazok unija
Bemenet: a1 T halmaz, n1 egsz (halmaz mrete), a2 T halmaz, n2 egsz (halmaz mrete)
Kimenet: b T halmaz, db egsz
1: fggvny HalmazUni(a1 : T halmaz, n1 : egsz, a2 : T halmaz, n2 : egsz)
2:
b Ltrehoz(T)[n1 + n2 ]
3:
i1
4:
j1
5:
db 0
6:
n1 n1 + 1
7:
a1 [n1 ] +
8:
n2 n2 + 1
9:
a2 [n2 ] +
10:
ciklus amg (i < n1 ) (j < n2 )
11:
db db + 1
12:
ha a1 [i] < a2 [j] akkor
13:
b[db] a1 [i]
14:
ii+1
15:
klnben
16:
ha a1 [i] > a2 [j] akkor
17:
b[db] a2 [j]
18:
j j+1
19:
klnben
20:
b[db] a1 [i]
21:
ii+1
22:
j j+1
23:
elgazs vge
24:
elgazs vge
25:
ciklus vge
26:
vissza (b, db)
27: fggvny vge
Felhasznlt vltozk s fggvnyek
a1 : Egyik halmaz.
n1 : Az a1 halmaz mrete.
a2 : Msik halmaz.
n2 : Az a2 halmaz mrete.
b: Kimeneti halmaz, melynek minden egyes eleme vagy az a1 vagy az a2 halmaznak eleme.
db: A b halmaz relevns elemeinek szma.
Ltrehoz(T)[n1 + n2 ]: Utasts, mely ltrehoz egy (n1 + n2 ) elem T tpus tmbt.
Sergyn Szabolcs
190
budai Egyetem
Neumann Jnos Informatikai Kar
5.3.6. Metszet
Kt halmaz metszetben a halmazok kzs elemei lesznek benne. Ennek rdekben az unit megvalst
algoritmust kell gy mdostanunk, hogy csak az egyez elemek kerljenek be a kimeneti halmazba. A
konkrt megvalstst az 5.15. algoritmussal adjuk meg.
5.15. Algoritmus Halmazok metszete
Bemenet: a1 T halmaz, n1 egsz (halmaz mrete), a2 T halmaz, n2 egsz (halmaz mrete)
Kimenet: b T halmaz, db egsz
1: fggvny HalmazMetszet(a1 : T halmaz, n1 : egsz, a2 : T halmaz, n2 : egsz)
2:
b Ltrehoz(T)[min(n1 , n2 )]
3:
i1
4:
j1
5:
db 0
6:
ciklus amg (i n1 ) (j n2 )
7:
ha a1 [i] < a2 [j] akkor
8:
ii+1
9:
klnben ha a1 [i] > a2 [j] akkor
10:
j j+1
11:
klnben
12:
db db + 1
13:
b[db] a1 [i]
14:
ii+1
15:
j j+1
16:
elgazs vge
17:
ciklus vge
18:
vissza (b, db)
19: fggvny vge
Felhasznlt vltozk s fggvnyek
a1 : Egyik halmaz.
n1 : Az a1 halmaz mrete.
a2 : Msik halmaz.
n2 : Az a2 halmaz mrete.
b: Kimeneti halmaz, melynek minden egyes eleme az a1 s az a2 halmaznak is eleme.
db: A b halmaz relevns elemeinek szma.
Ltrehoz(T)[min(n1 , n2 )]: Utasts, mely ltrehoz egy T tpus tmbt, melynek mrete az a1
s a2 halmazok mretnek minimuma.
Sergyn Szabolcs
191
budai Egyetem
Neumann Jnos Informatikai Kar
5.3.7. Klnbsg
Az a1 s a2 halmaz klnbsgnek az elemei az a1 halmaz azon elemei, amelyek nincsenek benne az a2
halmazban. A klnbsg a b halmazban jelenik meg. Ezek meghatrozsa is az unihoz hasonl mdon
tehet meg, ahogy az 5.16. algoritmusban lthat.
5.16. Algoritmus Halmazok klnbsge
Bemenet: a1 T halmaz, n1 egsz (halmaz mrete), a2 T halmaz, n2 egsz (halmaz mrete)
Kimenet: b T halmaz, db egsz
1: fggvny HalmazKulonbseg(a1 : T halmaz, n1 : egsz, a2 : T halmaz, n2 : egsz)
2:
b Ltrehoz(T)[n1 ]
3:
i1
4:
j1
5:
db 0
6:
ciklus amg (i n1 ) (j n2 )
7:
ha a1 [i] < a2 [j] akkor
8:
db db + 1
9:
b[db] a1 [i]
10:
ii+1
11:
klnben ha a1 [i] > a2 [j] akkor
12:
j j+1
13:
klnben
14:
ii+1
15:
j j+1
16:
elgazs vge
17:
ciklus vge
18:
ciklus amg i n1
19:
db db + 1
20:
b[db] a1 [i]
21:
ii+1
22:
ciklus vge
23:
vissza (b, db)
24: fggvny vge
Felhasznlt vltozk s fggvnyek
a1 : Egyik halmaz.
n1 : Az a1 halmaz mrete.
a2 : Msik halmaz.
n2 : Az a2 halmaz mrete.
b: Kimeneti halmaz, melynek minden egyes eleme az a1 halmaznak eleme, de az a2 halmaznak
nem.
db: A b halmaz relevns elemeinek szma.
Ltrehoz(T)[n1 ]: Utasts, mely ltrehoz egy n1 mret T tpus tmbt.
Sergyn Szabolcs
192
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
193
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
194
budai Egyetem
Neumann Jnos Informatikai Kar
6. fejezet
1 Angolul:
195
6.1. Maximumkivlaszts
A maximumkivlaszts feladatot jl ismerjk, hiszen mr kt megoldst is adtunk r (ld. 2.1.6. s 4.6.4. fejezetek). Most viszont az eddigiektl teljesen klnbz megkzeltst alkalmaz megoldst mutatunk
be.
Egy tmb legnagyobb rtk elemnek helyt gy fogjuk megkeresni, hogy kiindulsknt nem az egsz
tmbt vizsgljuk, hanem annak az els s a msodik felt kln-kln. Vagyis gy felosztjuk a problmt
kt rszproblmra. Ezt kveten megkeressk a kisebb mret tmbk legnagyobb rtk elemeinek
indexeit. Ez a keress rekurzv mdon trtnik, teht a rsztmbket jabb rsztmbkre fogjuk osztani.
Mint minden rekurzinl itt is fontos a rekurzi lellst biztost alapesetrl gondoskodni. Ha egy elem
mr a vizsglt rsztmbnk, akkor nem fogunk tovbbi felosztst s rekurzv hvst (uralkods) vgezni,
hiszen az egy elem rsztmb legnagyobb eleme az egyetlen benne lv elem. Miutn meghatroztuk az
eredeti tmb mindkt felben a legnagyobb elemet, illetve annak indext, mr csak el kell dntennk,
hogy a kt fltmbben tallhat maximumok kzl melyik a nagyobb. Amelyik nagyobb, az lesz az egsz
tmb maximuma, teht annak az indext adjuk meg eredmnyl.
A feladatbl jl lthat az Oszd meg s uralkodj! elv algoritmusok mkdsnek hrom fzisa.
Els lpsknt megtrtnik az eredeti tmb felosztsa kt rsztmbb. Msodik lpsknt rekurzv mdon meghatrozzuk az egyes rsztmbk legnagyobb elemeinek helyt, azaz a rsztmbkre megoldjuk
ugyanazt a feladatot, amit a teljes tmbre is meg kell oldanunk. Ez az uralkods fzisa. Harmadik
lpsknt pedig egyestjk a kt rsztmbre kapott megoldst, ami jelen esetben a kt maximum kzl a
nagyobbik kivlasztst jelenti.
A feladatot megold konkrt algoritmus pszeudokdjt a 6.1. algoritmusban mutatjuk be. A algoritmus bemenete a vizsgland x tmb, illetve a bal s a jobb indexrtkek. Ezek az indexek jelzik,
hogy ppen melyik rsztmbbel foglalkozunk. Kezdetben termszetesen bal rtke 1, mg jobb a tmb n
mretvel egyezik meg. Az algoritmus kimenete a legnagyobb rtk tmbelem indexe lesz.
6.1. Algoritmus Felez maximumkivlaszts
Bemenet: x T tmb, bal egsz, jobb egsz; ahol T sszehasonlthat
Kimenet: Az x tmb bal s jobb indexei kztti rsztmbje maximlis elemnek indexe.
1: fggvny FelezMaximumkivlaszts(x : T tmb, bal : egsz, jobb : egsz)
2:
ha bal = jobb akkor
3:
vissza bal
4:
klnben j
k
5:
center bal+jobb
2
6:
7:
8:
9:
10:
11:
12:
13:
14:
Sergyn Szabolcs
196
budai Egyetem
Neumann Jnos Informatikai Kar
rdemes megfigyelni, hogy abban az esetben, amikor a legnagyobb elem tbbszr is elfordul a tmbben, akkor az elem els elfordulsnak indext adja vissza az algoritmus.
Ezt gy rtk el, hogy a 8. sorban lv felttelnl az egyenlsg teljeslse esetn is a
baloldali rsztmb maximumt adjuk vissza kimenetknt. gy tnyleg a legbaloldalibb
maximum helyt fogjuk vgs eredmnyknt megkapni.
6.1. Plda. Nzzk vgig egy konkrt pldn a 6.1. algoritmus mkdst. A 6.1. brn lthat hat
elem tmb maximlis rtk elemnek indext szeretnnk meghatrozni.
Elszr meghvjuk a FelezMaximumkivlaszts rekurzv fggvnyt a bal = 1 s jobb = 6 paramterekkel. Mivel bal 6= jobb, ezrt az algoritmus klnben gba lpnk (ld. 4. sor). Meghatrozzuk
a kzps elem center indext (ld. 5. sor), ami 3 lesz (ld. 6.1a. bra). Ezt kveten meghvdik a FelezMaximumkivlaszts fggvny a bal = 1 s jobb = 3 paramterekkel. Ebben a fggvnyben is
kiszmtjuk center rtkt, ami 2 lesz (ld. 6.1b. bra). Ismt meghvdik a FelezMaximumkivlaszts fggvny a bal = 1 s jobb = 2 paramterekkel. A kzps elem indexe most 1 lesz. jabb rekurzv
hvs kvetkezik a bal = 1 s jobb = 1 rtkekkel (ld. 6.1d.bra). Mivel bal = jobb (ld. 2. sor), ezrt a bal
rtkt adja vissza a fggvny (ld. 3. sor), ahogy ez a 6.1e. brn lthat. A visszaadott rtk bekerl
az aktv rekurzv fggvny balmax vltozjba. jabb rekurzv hvs kvetkezik a bal = 2 s jobb = 2
paramterekkel (ld. 6.1f. bra). A meghvott fggvny a 2 rtkkel tr vissza, ami az aktulis fggvny
jobbmax vltozjba kerl (ld. 6.1g. bra). Mivel a balmax helyen trolt rtk nagyobb a jobbmax
helyen lv rtknl, ezrt az aktulis fggvny a balmax = 1 rtkkel tr vissza (ld. 6.1h. bra). Ezutn meghvsra kerl a FelezMaximumkivlaszts fggvny a bal = 3 s jobb = 3 paramterekkel
(ld. 6.1i. bra). A hvott fggvny a 3 rtkkel tr vissza, ami az aktulis fggvny jobbmax vltozjba
kerl (ld. 6.1j. bra). Mivel x[jobbmax] > x[balmax], ezrt a jobbmax indexszel tr vissza a fggvny
(ld. 6.1k. bra). Az algoritmus futsban most rtnk el oda, hogy az eredeti tmb els felben ismertt
vlt a legnagyobb elem indexe, ez a jelenlegi balmax vltozban van eltrolva.
Kvetkezik a jobboldali rsztmb feldolgozsa. Ennek rdekben meghvsra kerl a FelezMaximumkivlaszts fggvny a bal = 4 s jobb = 6 paramterekkel. A kzps elem az tdik lesz
(ld. 6.1l. bra). jabb rekurzv hvs kvetkezik a bal = 4 s jobb = 5 paramterekkel, ahol a center
index 4 lesz (ld. 6.1m. bra). A kvetkez rekurzv hvs a bal = 4 s jobb = 4 paramterekkel trtnik
(ld. 6.1n. bra). A fggvny visszatr a 4 rtkkel (ld. 6.1o. bra). Meghvsra kerl a FelezMaximumkivlaszts fggvny a bal = 5 s jobb = 5 paramterekkel (ld. 6.1p. bra). Ez a fggvny
visszatr az 5 rtkkel, ami az aktulis fggvny jobbmax vltozjba kerl (ld. 6.1q. bra). Mivel
x[jobbmax] > x[balmax], ezrt a jobbmax rtkkel tr vissza a fggvny (ld. 6.1r. bra). Ezutn meghvsra kerl a FelezMaximumkivlaszts fggvny a bal = 6 s jobb = 6 paramterekkel (ld. 6.1s. bra). Ez a fggvny visszatr a 6 rtkkel, ami a jobbmax vltozba kerl (ld. 6.1t. bra). Mivel a balmax
helyen lv rtk nagyobb a jobbmax indexnl, ezrt az aktulis fggvny a balmax rtkvel tr vissza
(ld. 6.1u. bra). Az eredeti tmb els felnek legnagyobb eleme a harmadik (balmax), msodik felnek
maximuma pedig az tdik (jobbmax) elem. Mivel x[jobbmax] > x[balmax], ezrt vgs eredmnyknt
a jobbmax rtkt kapjuk meg (ld.6.1v. bra).
Futsi id elemzse. A maximumkivlaszts 2.10. iteratv s 4.13. rekurzv algoritmusainak futsi
idejrl mr lttuk, hogy O(n)-esek. Milyen a futsi ideje a ms elven mkd felez maximumkivlaszts
6.1. algoritmusnak?
Vizsgljuk meg, hogy hny rekurzv fggvnyhvs trtnik. Kezdetben meg kell hvnunk a FelezMaximumkivlaszts fggvnyt a teljes tmbre. Ez a fggvny meghvja nmagt kt rsztmbre.
Sergyn Szabolcs
197
budai Egyetem
Neumann Jnos Informatikai Kar
Ez minden esetben gy trtnik addig, amg egy elem rsztmbkre nem hvjuk meg a fggvnyt. Egy
elem rsztmbbl pedig pontosan n darab van. Ezek alapjn a rekurzv hvsok szma:
1 + 2 + ... +
n
+ n.
2
(6.1)
A fenti sszeg egy mrtani sorozat sszege, ahol a kvciens q = 2 az elemek szma pedig kzeltleg
1 + log2 n. Ezek figyelembe vtelvel kijelenthet, hogy
1 + 2 + ... +
n
21+log2 n 1
+n=1
= 2n 1 = O(n).
2
21
(6.2)
Teht a futsi id az Oszd meg s uralkodj! elv felez maximumkivlaszts esetn is O(n)-es.
Sergyn Szabolcs
198
budai Egyetem
Neumann Jnos Informatikai Kar
FelezMaximumkivlaszts(x, 1, 3)
FelezMaximumkivlaszts(x, 1, 6)
x:
x:
jobb
center
bal
FelezMaximumkivlaszts(x, 1, 6)
FelezMaximumkivlaszts(x, 1, 2)
FelezMaximumkivlaszts(x, 1, 2)
FelezMaximumkivlaszts(x, 1, 3)
FelezMaximumkivlaszts(x, 1, 3)
FelezMaximumkivlaszts(x, 1, 6)
x:
FelezMaximumkivlaszts(x, 1, 6)
x:
jobb
bal
center
jobb
bal
FelezMaximumkivlaszts(x, 1, 1)
FelezMaximumkivlaszts(x, 2, 2)
1
FelezMaximumkivlaszts(x, 1, 2)
FelezMaximumkivlaszts(x, 1, 2)
FelezMaximumkivlaszts(x, 1, 3)
FelezMaximumkivlaszts(x, 1, 3)
FelezMaximumkivlaszts(x, 1, 6)
FelezMaximumkivlaszts(x, 1, 6)
balmax
x:
bal
center
x:
jobb
bal
jobb
Sergyn Szabolcs
199
budai Egyetem
Neumann Jnos Informatikai Kar
FelezMaximumkivlaszts(x, 2, 2)
2
FelezMaximumkivlaszts(x, 1, 2)
FelezMaximumkivlaszts(x, 1, 2)
1
FelezMaximumkivlaszts(x, 1, 3)
FelezMaximumkivlaszts(x, 1, 3)
FelezMaximumkivlaszts(x, 1, 6)
FelezMaximumkivlaszts(x, 1, 6)
jobbmax
balmax
x:
balmax
x:
jobb
bal
center
FelezMaximumkivlaszts(x, 3, 3)
3
FelezMaximumkivlaszts(x, 1, 3)
FelezMaximumkivlaszts(x, 1, 3)
FelezMaximumkivlaszts(x, 1, 6)
FelezMaximumkivlaszts(x, 1, 6)
jobbmax
balmax
x:
bal
x:
jobb
FelezMaximumkivlaszts(x, 1, 3)
FelezMaximumkivlaszts(x, 4, 6)
3
FelezMaximumkivlaszts(x, 1, 6)
FelezMaximumkivlaszts(x, 1, 6)
balmax
x:
bal
center
x:
jobb
Sergyn Szabolcs
200
budai Egyetem
Neumann Jnos Informatikai Kar
FelezMaximumkivlaszts(x, 4, 4)
FelezMaximumkivlaszts(x, 4, 5)
FelezMaximumkivlaszts(x, 4, 5)
FelezMaximumkivlaszts(x, 4, 6)
FelezMaximumkivlaszts(x, 4, 6)
FelezMaximumkivlaszts(x, 1, 6)
x:
FelezMaximumkivlaszts(x, 1, 6)
x:
jobb
bal
center
jobb
bal
FelezMaximumkivlaszts(x, 4, 4)
FelezMaximumkivlaszts(x, 5, 5)
4
FelezMaximumkivlaszts(x, 4, 5)
FelezMaximumkivlaszts(x, 4, 5)
FelezMaximumkivlaszts(x, 4, 6)
FelezMaximumkivlaszts(x, 4, 6)
FelezMaximumkivlaszts(x, 1, 6)
FelezMaximumkivlaszts(x, 1, 6)
balmax
x:
bal
center
x:
jobb
bal
jobb
Sergyn Szabolcs
201
budai Egyetem
Neumann Jnos Informatikai Kar
FelezMaximumkivlaszts(x, 5, 5)
5
FelezMaximumkivlaszts(x, 4, 5)
FelezMaximumkivlaszts(x, 4, 5)
5
FelezMaximumkivlaszts(x, 4, 6)
FelezMaximumkivlaszts(x, 4, 6)
FelezMaximumkivlaszts(x, 1, 6)
FelezMaximumkivlaszts(x, 1, 6)
jobbmax
balmax
x:
balmax
x:
jobb
bal
center
FelezMaximumkivlaszts(x, 6, 6)
6
FelezMaximumkivlaszts(x, 4, 6)
FelezMaximumkivlaszts(x, 4, 6)
FelezMaximumkivlaszts(x, 1, 6)
FelezMaximumkivlaszts(x, 1, 6)
jobbmax
balmax
x:
x:
jobb
bal
FelezMaximumkivlaszts(x, 4, 6)
5
FelezMaximumkivlaszts(x, 1, 6)
FelezMaximumkivlaszts(x, 1, 6)
jobbmax
balmax
x:
bal
center
5
3
jobb
x:
Sergyn Szabolcs
202
budai Egyetem
Neumann Jnos Informatikai Kar
merge sort
Sergyn Szabolcs
203
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
204
budai Egyetem
Neumann Jnos Informatikai Kar
az y2 tmbbe pedig a center+1 s jobb indexek kztti rsztmb. Ezt kveten mr csak a kt rsztmbt
kell az x tmb bal s jobb index elemei kztti helyre sszefslni.
6.2. Plda. A 6.2. brn vgig kvethetjk, hogy az sszefsl rendezs 6.2. algoritmusa miknt
rendez egy hat elem tmbt.
Els lpsben meghvjuk az sszefslRendezs eljrst a bal = 1 s jobb = 6 paramterekkel.
Mivel bal 6= jobb, ezrt meghatrozsra kerl a kzps elem center indexe (ld. 6.2a. bra). Rekurzvan
meghvdik a sszefslRendezs eljrs a bal = 1 s jobb = 3 paramterekkel, a kzps elem
indexe pedig 3 lesz (ld. 6.2b. bra). Ismt rekurzv hvs kvetkezik a bal = 1 s jobb = 2 paramterekkel,
center pedig 1 lesz (ld. 6.2c. bra). jabb rekurzv hvs jn a bal = 1 s jobb = 1 rtkekkel. Mivel
bal = jobb ezrt semmi nem trtnik, hiszen egy 1 elem rsztmb eleve rendezett (ld. 6.2d. bra). Ezt
kveten a bal = 2 s jobb = 2 paramterekkel is meghvsra kerl az sszefslRendezs eljrs.
Mivel most is egy elem a vizsglt rsztmb, ezrt semmi nem trtnik (ld. 6.2e. bra). Ezutn kvetkezik
a kt egy elem rsztmb sszefslse egy rendezett kt elem rsztmbb (ld. 6.2f. bra). Kvetkezik
a harmadik elembl ll egy elem rsztmb rendezse (ld. 6.2g. bra), majd kt rendezett rsztmb
sszefslse (ld. 6.2h. bra). Ekkor az eredeti tmb els fele mr rendezett.
Most kvetkezik a msodik fltmb rendezse a 6.2i-6.2o. brknak megfelelen. Utols lpsknt
pedig a kt hrom elem rendezett rsztmbt sszefsljk egyetlen rendezett tmbb (ld. 6.2p. bra).
Futsi id elemzse. Az sszefsl rendezs futsi idejnek elemzst kezdjk az sszefsl eljrs
futsi idejnek elemzsvel. Mennyi a futsi ideje egy bal s jobb kztti tmbrsz esetn ennek az
eljrsnak? Az sszefuttats programozsi ttel futsi idejnek ismeretben knny beltni, hogy a
futsi id a rsztmb mretvel arnyos.
Mit mondhatunk akkor a teljes sszefsl rendezs futsi idejrl? Amikor az eredeti n elem tmbre
meghvjuk az algoritmust, akkor trtnik kt rekurzv hvs megkzeltleg n2 mret tmbkkel. Ezt
kveten pedig egy sszefsls jn egy n elem tmbben. gy a T (n) futsi idrl kimondhatjuk, hogy
n
T (n) = 2 T
+ O(n).
(6.3)
2
Mennyi az
n
2
(6.4)
(6.7)
log2 n darab
Az sszefuttat rendezs futsi ideje teht O(n log n), amely az eddigi rendezseknl jobb futsi idt
jelent. Az algoritmus htrnya viszont, hogy az sszefuttats megvalstsa miatt az eredeti tmb mretvel megegyez mret tmeneti tmbfoglalsra is szksg van, teht jelents memria ignye van.
Sergyn Szabolcs
205
budai Egyetem
Neumann Jnos Informatikai Kar
sszefslRendezs(x, 1, 3)
sszefslRendezs(x, 1, 6)
x:
x:
jobb
center
bal
sszefslRendezs(x, 1, 6)
sszefslRendezs(x, 1, 2)
sszefslRendezs(x, 1, 2)
sszefslRendezs(x, 1, 3)
sszefslRendezs(x, 1, 3)
sszefslRendezs(x, 1, 6)
x:
sszefslRendezs(x, 1, 6)
x:
jobb
bal
center
sszefslRendezs(x, 1, 2)
sszefslRendezs(x, 1, 3)
sszefslRendezs(x, 1, 3)
sszefslRendezs(x, 1, 6)
sszefslRendezs(x, 1, 6)
x:
bal
sszefsl(x, 1, 1, 2)
sszefslRendezs(x, 1, 2)
(d) Rendez eljrs hvsa az 1. elembl ll rsztmbre. Az egy elem tmb mr eleve rendezett
is.
sszefslRendezs(x, 2, 2)
x:
jobb
bal
bal
center
jobb
(e) Rendez eljrs hvsa az 2. elembl ll rsztmbre. Az egy elem tmb mr eleve rendezett
is.
jobb
206
budai Egyetem
Neumann Jnos Informatikai Kar
sszefsl(x, 1, 2, 3)
sszefslRendezs(x, 3, 3)
sszefslRendezs(x, 1, 3)
sszefslRendezs(x, 1, 3)
sszefslRendezs(x, 1, 6)
sszefslRendezs(x, 1, 6)
x:
x:
jobb
bal
(g) Rendez eljrs hvsa az 3. elembl ll rsztmbre. Az egy elem tmb mr eleve
rendezett is.
sszefslRendezs(x, 4, 5)
sszefslRendezs(x, 4, 6)
sszefslRendezs(x, 4, 6)
sszefslRendezs(x, 1, 6)
sszefslRendezs(x, 1, 6)
x:
x:
sszefslRendezs(x, 4, 5)
sszefslRendezs(x, 4, 6)
sszefslRendezs(x, 4, 6)
sszefslRendezs(x, 1, 6)
bal
jobb
sszefslRendezs(x, 5, 5)
sszefslRendezs(x, 4, 5)
sszefslRendezs(x, 4, 4)
bal
center
x:
sszefslRendezs(x, 1, 6)
x:
jobb
bal
(k) Rendez eljrs hvsa a 4. elembl ll rsztmbre. Az egy elem tmb mr eleve rendezett
is.
jobb
(l) Rendez eljrs hvsa az 5. elembl ll rsztmbre. Az egy elem tmb mr eleve rendezett
is.
207
budai Egyetem
Neumann Jnos Informatikai Kar
sszefsl(x, 4, 4, 5)
sszefslRendezs(x, 4, 5)
sszefslRendezs(x, 6, 6)
sszefslRendezs(x, 4, 6)
sszefslRendezs(x, 4, 6)
sszefslRendezs(x, 1, 6)
x:
bal
center
sszefslRendezs(x, 1, 6)
x:
jobb
jobb
bal
sszefsl(x, 4, 5, 6)
sszefslRendezs(x, 4, 6)
sszefsl(x, 1, 3, 6)
sszefslRendezs(x, 1, 6)
x:
sszefslRendezs(x, 1, 6)
x:
center
bal
jobb
Sergyn Szabolcs
208
budai Egyetem
Neumann Jnos Informatikai Kar
6.3. Gyorsrendezs
A gyorsrendezs3 is egy Oszd meg s uralkodj! elven mkd rendez algoritmus, de itt nem tudjuk
elre, hogy a rendezend tmbt milyen mret rsztmbkre osztjuk fel. Teht ebben az esetben nem
lesz igaz, hogy a tmbt mindig felezzk, ahogy ezt a felez maximumkivlasztsnl vagy az sszefsl
rendezsnl tettk.
A gyorsrendezs legfontosabb lpse, hogy a tmb elemeit egy tmpont elem4 segtsgvel sztvlogatja. A tmpont pldul az eredeti tmb els eleme lehet. A tmb elemeinek sztvlogatsa pedig
gy trtnik, hogy a kivlasztott tmpont elem olyan helyre kerl a tmbben, hogy eltte csak nla
nem nagyobb, mgtte pedig csak nla nagyobb elemek vannak. Erre lthatunk egy pldt a 6.3a. s
6.3b. brn.
x:
10
17
23
17
10
23
10
17
23
quicksort
pivot element
Sergyn Szabolcs
209
budai Egyetem
Neumann Jnos Informatikai Kar
Ezutn megnzzk, hogy a vizsglt rsztmb tmpont eltti rsze hny elemet tartalmaz. Ha legalbb
kt elem a tmpont eltti rsz (ld. 3. sor), akkor rendezni kell mg ezt a rsztmbt. Ennek rdekben
rekurzvan meghvjuk a GyorsRendezs eljrst a megfelel paramterekkel (ld. 4. sor). Hasonlan
megnzzk, hogy legalbb kt elem-e a tmpont elem utni vizsgland rsztmb (ld. 6. sor). Ha igen,
akkor rekurzvan azt a tmbrszt is rendezzk (ld. 7. sor).
6.3. Plda. A 6.4. brn vgigkvethetjk, hogy miknt rendez a 6.4. algoritmus egy tizenngy elem
tmbt.
Elszr a teljes tmbt rendeznnk kell, ezrt a GyorsRendezs eljrst meghvjuk a bal = 1 s
jobb = 14 paramterekkel. Az eljrson bellrl meghvsra kerl a Sztvlogat fggvny ugyanazokkal a paramterekkel. A fggvny sztvlogatja a tmbt gy, hogy a kezdeti els elem (tmpont) a
negyedik helyre kerl, eltte csak nla kisebb, mgtte pedig csak nla nagyobb elemek vannak a tmbben. A fggvny a 4 rtket adja vissza (ld. 6.4a. bra). A tmpont elem mr a helyre kerlt, viszont
az els hrom elembl ll bal oldali s az utols tz elembl ll jobb oldali rsztmb rendezse mg
htra van.
Elszr rekurzvan meghvsra kerl a GyorsRendezs eljrs a bal = 1 s jobb = 3 paramterekkel.
Ez az eljrs gondoskodik az els hrom elemet tartalmaz rsztmb rendezsrl. Ennek rdekben
meghvdik a Sztvlogat fggvny a megfelel paramterekkel. A jelenlegi tmpont a harmadik
helyre kerl (ld. 6.4b. bra). Mivel az ppen vizsglt rsztmb jobb szlre kerlt a tmpont, ezrt csak
a bal oldali rsztmbbel kell a tovbbiakban foglalkozni.
Meghvsra kerl a GyorsRendezs eljrs a bal = 1 s jobb = 2 paramterekkel. Az eljrs elejn
meghvdik a Sztvlogat fggvny ugyanezekkel a paramterekkel. Az aktulis tmpont elem az els
helyre kerl (valjban ott marad). Mivel a vizsglt kt elem rsztmb els helyn van a tmpont, ezrt
bal oldali rsztmb nem is jn ltre, a jobb oldali pedig egy elem, ezrt nem kell tovbbi vizsglat. gy
az els kt elembl ll rsztmb mr rendezett (ld. 6.4c. bra).
A rekurzvan meghvott eljrsok futsa vget r, a vezrls visszaaddik a klvilgbl meghvott
eljrshoz. Az eredeti tmb bal oldalt mr feldolgoztuk, most kvetkezik a jobb oldal rendezse. Ennek
rdekben meghvdik a GyorsRendezs eljrs a bal = 5 s jobb = 14 paramterekkel. A sztvlogats
eredmnyeknt az aktulis tmpont elem a nyolcadik helyre kerl (ld. 6.4d. bra).
Sergyn Szabolcs
210
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
211
budai Egyetem
Neumann Jnos Informatikai Kar
Kvetkezik az tdik s hetedik elemek kztti tmbrsz rendezse. (Az algoritmus nem veszi szre,
hogy ez mr most is rendezett.) Ennek rdekben meghvsra kerl a GyorsRendezs eljrs a bal = 5
s jobb = 7 paramterekkel. A tmpont elem az tdik helyre kerl (ld. 6.4e. bra). A tmpont bal
oldaln nincs rendezend rsz, de a jobb oldaln egy kt elem rsztmb tallhat.
Emiatt meghvsra kerl a GyorsRendezs eljrs a bal = 6 s jobb = 7 paramterekkel. A tmpont
elem a hatodik helyen nyeri el vgs helyzett. Bal oldaln nincs rendezend rsz, a jobb oldaln is csak
egy egy elem rsztmb rvlkodik, ezrt nem kerl sor innen tovbbi rekurzv hvsra (ld. 6.4f. bra).
Visszatr a vezrls az tdk s tizennegyedik elemek kztti rsz feldolgozshoz, ahol a tmpont
bal oldalt mr rendeztk. Kvetkezik a jobb oldal rendezse a bal = 9 s jobb = 14 paramterek
hasznlatval. A tmpont elem a tizedik helyre kerl. gy a tmpont bal oldaln csak egy egy elem,
mr eleve rendezett tmbt tallunk (ld. 6.4g. bra).
Az algoritmus a tizenegyedik s tizennegyedik helyen ll elemek kztti rsztmb rendezsvel folytatdik. A tmpont a tizenkettedik helyre kerl, aminek a bal oldaln csak egy elem van, ezrt csak a
jobb oldal rendezse szksges a ksbbiekben (ld. 6.4h. bra).
Az utols kt elem rsztmb feldolgozsa sorn a tmpont a tizenharmadik helyre kerl, aminek
csak egy egy elem jobb szomszdja van, ezt nem kell mr tovbb rendezni (ld. 6.4i. bra). A rekurzvan
hvott eljrsok futsa vget r, az elsknt hvott eljrs is lell. A teljes tmb rendezett vlt.
Futsi id elemzse. A gyorsrendezs futsi ideje attl fgg, hogy az ppen aktulis tmpont elem
hova kerl a vizsglt rsztmbben. Legjobb esetnek azt tekinthetjk, ha az aktulis rsztmb kzepre
kerl, ilyenkor kt kzel azonos mret tovbbiakban rendezend rsztmb keletkezik. Ahhoz, hogy
ebben az esetben meg tudjuk hatrozni a futsi idt, elszr fel kell eleventennk a helyben sztvlogat
2.17. algoritmus futsi idejrl tanultakat. A sztvlogats a tmb mretvel arnyos futsi idej, teht
n elem tmb esetn O(n)-es.
Ahhoz, hogy az n elem tmbben meghatrozzuk a tmpont helyt vgre kell hajtanunk egy sztvlogatst. Ez O(n) id alatt megvalsul. Ha a tmpont kzpre kerl, akkor ezt kveten kt darab kzel
n
Ha egy n mret tmb rendezsnek ideje T (n), akkor ugyanazzal egy
2 mret tmbt kell rendezni.
fele akkor tmbt T n2 id alatt lehet rendezni. Ezek alapjn lthat, hogy
n
T (n) = O(n) + 2 T
.
(6.8)
2
Az sszefuttat rendezs futsi idejnl mr ltott levezets alapjn ebbl kvetkezik, hogy lland
felezgets mellett a teljes futsi id:
T (n) = O (n log n) .
(6.9)
Teht a gyorsrendezs legjobb esetben hasonl futsi idej, mint az sszefuttat rendezs.
Mi a helyzet a legrosszabb esettel? Mi tekinthet egyltaln futsi id szempontjbl a legrosszabbnak? Legrosszabb az, ha a tmpont elem minden esetben a tmb szlre, az elejre vagy a vgre kerl.
Ez knnyen elll pldul akkor, ha eleve rendezett a tmb, vagy ha fordtva rendezett. Ilyenkor ugyanis
els lpsben egy n elem tmbt kell sztvlogatni. Ezutn csak egy tmbbel kell tovbb foglalkozni
hiszen a tmpontnak csak az egyik oldaln vannak mg rendezend elemek , de ennek mrete n 1.
Hasonlan a mg tovbbi rendezend s ezzel egytt sztvlogatand tmb mrete mindig csak eggyel
fog cskkenni. Ilyenkor a futsi id a kvetkezkppen alakul:
T (n) n + (n 1) + (n 2) + . . . + 2 =
(2 + n) (n 1)
= O n2 .
2
(6.10)
Sergyn Szabolcs
212
budai Egyetem
Neumann Jnos Informatikai Kar
Sztvlogat(x, 1, 14)
4
GyorsRendezs(x, 1, 14)
x:
bal
12
10
14
13
11
jobb
idx
(a) Az 1. s 14. elem kztt rsztmb rendezse. A tmpont elem a 4. helyre kerl.
Sztvlogat(x, 1, 3)
3
GyorsRendezs(x, 1, 3)
GyorsRendezs(x, 1, 14)
x:
bal
12
10
14
13
11
jobb
idx
(b) Az 1. s 3. elem kztti rsztmb rendezse. A tmpont a 3. helyre kerl, ezrt csak
a bal oldali rsztmbt kell rendezni.
Sztvlogat(x, 1, 2)
1
GyorsRendezs(x, 1, 2)
GyorsRendezs(x, 1, 3)
GyorsRendezs(x, 1, 14)
x:
bal
12
10
14
13
11
idx jobb
Sergyn Szabolcs
213
budai Egyetem
Neumann Jnos Informatikai Kar
Sztvlogat(x, 5, 14)
8
GyorsRendezs(x, 5, 14)
GyorsRendezs(x, 1, 14)
x:
bal
10
12
14
13
11
jobb
idx
(d) Az 5. s 14. elem kztti rsztmb rendezse. A tmpont elem a 8. helyre kerl.
Sztvlogat(x, 5, 7)
5
GyorsRendezs(x, 5, 7)
GyorsRendezs(x, 5, 14)
GyorsRendezs(x, 1, 14)
x:
bal
idx
10
12
14
13
11
jobb
(e) Az 5. s 7. elem kztti rsztmb rendezse. A tmpont elem az 5. helyre kerl, ezrt
csak a jobb oldali rszt kell a tovbbiakban rendezni.
Sergyn Szabolcs
214
budai Egyetem
Neumann Jnos Informatikai Kar
Sztvlogat(x, 6, 7)
6
GyorsRendezs(x, 6, 7)
GyorsRendezs(x, 5, 7)
GyorsRendezs(x, 5, 14)
GyorsRendezs(x, 1, 14)
x:
10
12
14
13
11
idx jobb
bal
(f) A 6. s 7. elem kztti rsztmb rendezse. A tmpont elem a 6. helyre kerl. Tovbbi
rendezs itt mr nem szksges.
Sztvlogat(x, 9, 14)
10
GyorsRendezs(x, 9, 14)
GyorsRendezs(x, 5, 14)
GyorsRendezs(x, 1, 14)
x:
10
bal
idx
12
14
13
11
jobb
(g) A 9. s 14. elem kztti rsztmb rendezse. A tmpont a 10. helyre kerl. A bal
oldali rsztmb egy elem, ezrt csak a jobb oldali rszt kell a tovbbiakban rendezni.
Sergyn Szabolcs
215
budai Egyetem
Neumann Jnos Informatikai Kar
x:
10
11
12
bal
idx
13
14
jobb
(h) A 11. s 14. elem kztti rsztmb rendezse. A tmpont a 12. helyre kerl. Mivel a
bal oldali rszt egy elem, ezrt csak a jobb oldali rszt kell a tovbbiakban rendezni.
Sztvlogat(x, 13, 14)
13
GyorsRendezs(x, 13, 14)
GyorsRendezs(x, 11, 14)
GyorsRendezs(x, 9, 14)
GyorsRendezs(x, 5, 14)
GyorsRendezs(x, 1, 14)
x:
10
11
12
bal
13
14
idx jobb
(i) A 13. s 14. elem kztti rsztmb rendezse. A tmpont a 13. helyre kerl. Mivel a jobb
oldali rsztmb is csak egy elem, ezrt tovbbi rendezs mr nem szksges.
Sergyn Szabolcs
216
budai Egyetem
Neumann Jnos Informatikai Kar
Megjegyzs
Miknt lehet a gyorsrendezsnl arra trekedni, hogy a futsi id minden esetben n log nnel legyen arnyos? Erre tbbfle mdszer is van, amelyek kzl csak egyet szeretnnk
megemlteni. Rendezett tmbknl az a problma, hogy ha mindig az els elemet vlasztjuk tmpontnak, akkor a lehet legrosszabb felosztst kapjuk az aktulis rsztmbnek.
Ezen javthatunk, ha a tmpontot a vizsglt rsztmbbl vletlenszeren vlasztjuk ki.
Sergyn Szabolcs
217
budai Egyetem
Neumann Jnos Informatikai Kar
Azrt nem a k-adik legkisebb elem helyt hatrozzuk meg, mert a Sztvlogat fggvnyben a tmb elemeinek helye vltozik. Viszont a k-adikLegkisebbElem fggvny
az t hv klvilg fel nem ad vissza mdostott tmbt, gy az eredeti tmbben valsznleg mshol lesz a megtallt elem, mint a Sztvlogat fggvny ltal mdostott
tmbben.
Az algoritmust megvalst fggvny 2. sorban megvizsgljuk, hogy a vizsglt rsztmb egy elem-e.
Ha igen, akkor nem kell tovbbi keresst vgeznnk, ezrt visszaadjuk az egyetlen elem rtkt (ld. 3. sor).
Amennyiben tbb elem a vizsglt rsztmb (ld. 4. sor), akkor az aktulis rsztmb els elemt (x[bal])
tmpontnak tekintve elvgznk egy sztvlogatst. A sztvlogats megadja a tmpont helyt, valamint
a tmbt talaktja a korbban mr megismert mdon (ld. 5. sor). Megvizsgljuk, hogy a tmpont elem
a vizsglt rsztmb hnyadik helyre kerlt, amit konkrtan az idx bal + 1 hatroz meg. Ha ez a hely
megegyezik a k-val (ld. 6. sor), akkor megtalltuk a keresett rtket, ezrt visszaadjuk azt kimenetknt
(ld. 7. sor). Amennyiben a k rtk kisebb a tmpont rsztmbn belli helynl (ld. 8. sor), akkor
tovbbi keresst kell vgrehajtanunk a rsztmb tmpont eltti elemei kztt. Ennek rdekben rekurzv
hvst hajtunk vgre a megfelel paramterekkel (ld. 9. sor). A rekurzvan hvott fggvny visszatrsi
rtke lesz az aktulis fggvny visszatrsi rtke is. Amennyiben viszont a k rtk nagyobb a tmpont
rsztmbn belli helynl (ld. 10. sor), akkor a jobb oldali elemek kztt kell tovbbi keresst vgezni.
Viszont ekkor mr nem a k-adik, hanem a (k (idx bal + 1))-edik elemet kell kivlasztani, teht a
rekurzv hvs paramtereit is ennek megfelelen adjuk meg (ld. 11. sor).
6.4. Plda. rdemes vgigkvetnnk az algoritmus mkdst egy konkrt pldn is. Tekintsk
a 6.5. bran lthat tizenngy elem rsztmbt, amelybl az tdik legkisebb elemet szeretnnk kivlasztani.
Meghvjuk a k-adikLegkisebbElem fggvnyt a bal = 1, jobb = 14 s k = 5 paramterekkel. Mivel
a bal 6= jobb ezrt a vezrls a Sztvlogat fggvny hvsra ugrik. A sztvlogats trendezi a
Sergyn Szabolcs
218
budai Egyetem
Neumann Jnos Informatikai Kar
219
budai Egyetem
Neumann Jnos Informatikai Kar
Sztvlogat(x, 1, 14)
4
k-adikLegkisebbElem(x, 1, 14, 5)
x:
bal
12
10
14
13
11
jobb
idx
(a) Az 1. s 14. elemek kztt vgznk keresst. A tmpont elem a 4. helyre kerl, ezrt
az tdik legkisebb elemet a tmpont jobb oldaln kell tovbb keresnnk.
Sztvlogat(x, 5, 14)
8
k-adikLegkisebbElem(x, 5, 14, 1)
k-adikLegkisebbElem(x, 1, 14, 5)
x:
bal
10
12
14
13
11
jobb
idx
(b) Az 5. s 14. elemek kztt keresnk, de most mr az els legkisebb elemet. A tmpont
a 8. helyre kerl, ezrt a bal szomszdjai kztt folytatjuk majd a vizsglatot.
Sztvlogat(x, 5, 7)
5
k-adikLegkisebbElem(x, 5, 7, 1)
k-adikLegkisebbElem(x, 5, 14, 1)
k-adikLegkisebbElem(x, 1, 14, 5)
x:
bal
idx
10
12
14
13
11
jobb
Sergyn Szabolcs
220
budai Egyetem
Neumann Jnos Informatikai Kar
Bizonyts nlkl kzljk, hogy a k-adik legkisebb elem kivlasztst megvalst algoritmusunk
tlagos futsi ideje O(n)-es, teht a fejezet elejn ismertetett kt msik megkzeltsnl jelentsen jobb
futsi idvel rendelkezik.
Sergyn Szabolcs
221
budai Egyetem
Neumann Jnos Informatikai Kar
7. fejezet
Optimalizlsi problmk
Az optimalizlsi problmk cljukban jelentsen klnbznek minden eddig trgyalt algoritmustl. A
korbbi fejezetek algoritmusainl mindig volt egy konkrt problmnk, amelynek a megoldst kerestk.
Ketts cl lebegett a szemnk eltt. Egyrszt egy olyan megoldst kvntunk adni, ami minden lehetsges bemenet esetn helyesen oldja meg a felmerlt problmt. Msrszt arra koncentrltunk, hogy a
kifejlesztett algoritmus a lehet leggyorsabb, illetve legkisebb memria igny legyen.
Az optimalizlsi problmknl nem az a kifejezett clunk, hogy megoldst talljunk egy adott feladatra. (Persze azrt nem rt az sem, ha megoldst tudunk adni.) Ehelyett az adott problma sok
lehetsges megoldsa kzl szeretnnk valamilyen szempontbl a legjobbat, az optimlisat megadni.
Tekintsnk egy konkrt feladatot. Egy mezn kincseket stak el. A kincseket rendezetten egy ngyzetrcs ismert pontjaiban helyeztk el. Minden kincsnek ismerjk a pontos helyt s az rtkt is, ahogy
ezt a 7.1a. bra szemllteti. A kincsmez bal als sarkbl elindulva el kell jutnunk a jobb fels sarkba.
Bejrsunk sorn csak fel, illetve jobbra haladhatunk. Ahol kincset tallunk, ott azt be is gyjtjk.
1
11
15
11
15
10
20
10
20
7.1. bra. Kincsek begyjtse. A kincsmez bal als sarkbl indulva kell eljutnunk a jobb fels sarokba
gy, hogy kzben csak felfel vagy jobbra lphetnk.
Feladatunk most nem az, hogy talljunk egy lehetsges olyan bejrst, amivel eljuthatunk a bal
als sarokbl a jobb felsbe. (A korbbi fejezetekben megismert algoritmusok ilyen jelleg problmkra
adtak megoldsokat.) Bejrsi lehetsg egybknt szmos ltezik, ezek kzl nhnyat klnbz szn
nyilakkal feltntettnk a 7.1b. brn. Optimalizlsi problma megoldsa sorn azt kell meghatroznunk,
hogy a ltez bejrsok kzl melyik az, amelyik esetn a lehet legtbb kincset tudjuk begyjteni. Ezt
gy is fogalmazhatjuk, hogy van a problma sorn egy fggvnynk s olyan megoldst keresnk, amely
ezen fggvny szlsrtkt (maximumt vagy minimumt) kpes ellltani. Esetnkben ez a fggvny
a bejrs sorn sszegyjttt kincsek sszrtke s ennek a fggvnynek a maximalizlsa a clunk.
A 7.1b. bra hrom lehetsges bejrsa sorn, ha a kk nyilakat kvetjk, akkor 33 kincset gyjtnk
be. A narancssrga nyilak ltal mutatott bejrs esetn 61 kincsnk lesz, mg a szrke nyilak mentn
haladva 44 kincset tudunk sszegyjteni. gy a hrom lehetsg kzl biztos, hogy a narancssrga nyilak
mentn fogunk haladni. Persze ez mg nem biztostja, hogy ez az optimlis megoldsa a feladatnak.
Az optimlis megolds keresse sorn gondolkodhatnnk gy, hogy elszr meghatrozzuk az sszes
lehetsges megoldst, majd mindegyik megtallt megolds esetn kiszmtjuk az optimalizland fggvny rtkt. Ezt kveten mr csak az az esetet kell egy maximumkivlasztssal megtallni, amikor a
222
fggvny rtke a legnagyobb (vagy a legkisebb). Ezt a megkzeltst nyers er 1 mdszernek nevezzk,
mert gondolkods nlkl, nyers ervel nekiesnk a feladatnak s megoldjuk. Ilyenkor ltalban nagyon
lassan mkd algoritmusokat kapunk eredmnyl.
A fejezetben kt konkrt megkzeltst mutatunk be, melyek optimalizlsi problmk megoldsra
hasznlhatk. Elskt a 7.1. fejezetben a Dinamikus programozs 2 mdszert ismertetjk. Ez a mdszer
a megoldand feladatot rszfeladatokra bontja ilyen szempontbl hasonlt az Oszd meg s uralkodj!
elv algoritmusokra , majd ezek alapjn hatrozza meg az optimlis megoldst. Msodik trgyalt
megkzelts a 7.2. fejezetben rszletezett Moh algoritmus 3 . Ez a mdszer a problmt rszproblmkra
osztja, de nem minden rszproblmt old meg, csak az ppen optimlisnak tnt.
1 Angolul:
brute force
dynamic programming
3 Angolul: greedy algorithm
2 Angolul:
Sergyn Szabolcs
223
budai Egyetem
Neumann Jnos Informatikai Kar
Fontos megemlteni, hogy a mdszer neve egyltaln nem fejezi ki a dinamikus programozs lnyegt. Egyrszt nem szmtgpes programot runk a dinamikus programozs hasznlata sorn, hanem egy tblzaton alapul mdszert adunk meg. Msrszt a felptend
tblzat elemei sem dinamikusan vltoznak, hanem egy rtket egyszer meghatrozunk,
utna pedig mr nem mdostjuk.
A fejezetet hrom f rszre osztjuk. Elszr egy konkrt pldt mutatunk be, az n. 0-1 htizsk
feladatot4 (ld. 7.1.1. alfejezet). Ezt a feladatot megoldjuk a dinamikus programozs mdszervel s
kzben rmutatunk a mdszer legfontosabb elemeire. A 7.1.2. alfejezetben sszefoglaljuk a dinamikus
programozs elvt. A fejezet zrsaknt a 7.1.3. alfejezetben a leghosszabb kzs rszsorozat 5 problma
megoldst mutatjuk be.
A dinamikus programozsi techniknl ltalban tblzatokban trolunk el adatokat. Ezek tekinthetk ktdimenzis tmbknek is. A ktdimenzis tmb annyiban klnbzik az eddig megismert tmbktl, hogy nem csak egy, hanem kt index szksges egy tmbbeli elem elrshez. Minden tmbbeli elem
rendelkezik egy sor- s egy oszlopindexszel. Az x tmb i-edik sorban s j-edik oszlopban lv elemre
az x[i, j] szintaktikval hivatkozhatunk. Amikor ktdimenzis tmbt hozunk ltre, akkor is szksges a
Ltrehoz fggvnyt meghvni, de a tmb mretnl kt rtket, a tmb sorainak s oszlopainak szmt
is meg kell adni.
A fejezetben a dinamikus programozs egyszerbb lersa rdekben a ktdimenzis tmbk indexelse
ebben a fejezetben nem 1-tl, hanem 0-tl indul. Ez igaz mind a sor-, mind az oszlopindexekre. Az
ilyen specilis tulajdonsg ktdimenzis tmbket jelen jegyzetben rviden tblnak, a ltrehozshoz
szksges fggvnyt pedig TblaLtrehoz-nak nevezzk. Az algoritmusok lersnl mindig megadjuk,
hogy az adott tblban milyen tpus elemeket trolunk el, hasonlan a tmbk korbban bevezetett
lershoz.
4 Angolul:
5 Angolul:
Sergyn Szabolcs
224
budai Egyetem
Neumann Jnos Informatikai Kar
azaz a kivlasztott kincsek sszslya a htizsk kapacitst nem haladja meg, valamint
X
pj
(7.2)
jS
maximlis.
Hogyan lehetne megoldani a feladatot? Els tletnk, hogy megvizsgljuk az sszes lehetsges kivlasztsok halmazt. Mivel egy n elem halmaznak 2n darab rszhalmaza van, ezrt ez 2n lehetsget
jelent. Megnzzk, hogy ezen lehetsgek kzl melyik fr bele a htizskba, majd ezek kzl kivlasztjuk a legnagyobb sszrtkt. Ez az tlet az n. nyers er mdszert kveti, aminek futsi ideje O(2n )-es,
teht elg lass. Tudunk ennl hatkonyabb mdszert is tallni?
Vezessnk be egy j jellst, aminek segtsgvel lerhatunk egy ms jelleg megkzeltst. Jellje
F [i, x] az els i darab kincs kzl a legjobb (azaz legnagyobb sszrtk) kivlaszts sszrtkt, ahol a
kincsek sszslya legfeljebb x. Mivel n darab kincsnk van, ezrt 1 i n, x lehetsges rtkei pedig:
0, 1, 2, . . . , c.
Benne lehet-e az F [i, x] kivlasztsban az i-edik kincs? Ez elsdlegesen attl fgg, hogy milyen a
slya. Ha wi > x, akkor biztos nincs benne, mert gy az sszsly is meghaladn x-et, ami nem lehetsges.
Ha viszont wi x, akkor sem biztos, hogy benne van az F [i, x] kivlasztsban az i-edik kincs. Meg kell
vizsglni, hogy az F [i 1, x] s az F [i 1, x wi ] + pi rtk hogyan viszonyul egymshoz? Az F [i 1, x]
jelenti az els i 1 kincs kzl a legjobb vlaszts sszrtkt gy, hogy az sszsly legfeljebb x. Az
F [i 1, x wi ] pedig jelenti az els i 1 kincs kzl a legjobb vlasztst gy, hogy az sszslyuk
legfeljebb x wi . Ha ehhez hozzvesszk az i-edik kincset is, akkor a kivlasztott kincsek sszrtke
F [i 1, x wi ] + pi lesz, az sszsly pedig legfeljebb (x wi ) + wi , azaz legfeljebb x. Ezek szerint
az F [i 1, x] az az eset, amikor legfeljebb x slynyi kincset az els i 1 kincs kzl vlasztottunk,
F [i 1, x wi ] + pi pedig azt jelenti, amikor az i-edik kincset biztosan kivlasztottuk, valamint az
els i 1 kincs kzl is vlasztottunk annyit, hogy az i-edik kincset hozzvve az sszsly x-nl ne
legyen nagyobb. Teht akkor kijelenthet, hogy wi x esetben azt kell megnznnk, hogy F [i 1, x]
s F [i 1, x wi ] + pi kzl melyik eredmnyez nagyobb sszrtket, a sly pedig mindkt esetben
maximum x lesz.
Mindezek alapjn kijelenthet, hogy F [i, x] az albbi kplettel definilhat:
F [i 1, x],
ha wi > x,
F [i, x] =
(7.3)
max {F [i 1, x], F [i 1, x wi ] + pi } , ha wi x.
Ez egy rekurzv formula, amit gy tehetnk teljess, ha pontosan definiljuk az i = 0 alapesetet
is. Mivel ez azt jelenti, hogy nem vlasztottunk ki kincset a halmazbl, ezrt F [0, x] = 0. Knnyen
belthat az is, hogy F [i, 0] = 0, mivel ez azon kivlaszts sszrtkt jelli az els i darab kincs kzl,
amikor az sszsly legfeljebb 0. A feladat megoldsa rdekben az F [n, c] rtket kell kiszmtanunk s
mris tudjuk, hogy mekkora az optimlis vlaszts mellett a kivlasztott kincsek sszrtke.
Br rekurzv kpletet adtunk, de a megoldsra nem rekurzv algoritmust fogunk rni. Ennek az az oka,
hogy ugyanazt az rtket tbbszr is ki kne rtkelnnk, ahogy azt pldul a Fibonacci sorozat rekurzv
megvalstsnl (ld. 4.3. fejezet) tettk. Ehelyett az F [i, x] rtkeket egy tblzatban troljuk el gy,
hogy minden rtket pontosan egyszer szmtunk csak ki. A tblzatot gy tltjk fel, hogy elszr a
Sergyn Szabolcs
225
budai Egyetem
Neumann Jnos Informatikai Kar
rekurzv alapesetnek megfelel rtkeket troljuk el. Ezek egyrszt minden lehetsges x rtk mellett az
F [0, x] rtkek, mivel ha egyetlen trgyat sem vlasztunk ki, akkor a kivlasztott trgyak sszrtke 0.
Teht minden megengedett x rtke esetn tudjuk, hogy F [0, x] = 0. Emellett knnyen lthat, hogy
minden lehetsges i esetn F [i, 0] = 0, mivel a legfeljebb 0 sszsly kivlasztsok esetn sincs egyetlen
kincs sem a zskban, hiszen minden kincsnek 0-nl nagyobb a slya. Az alapesetek megadst kveten
mr csak sorfolytonosan be kell jrni a tblt s a 7.3. kpletnek megfelelen meg kell hatrozni az
aktulis F [i, x] rtket. A konkrt megvalstst a 7.1. algoritmusban adjuk meg.
7.1. Algoritmus 0-1 htizsk problma
Bemenet: p egsz tmb, w egsz tmb, n egsz (tmb mrete), c egsz
Kimenet: F egsz tbla
1: fggvny 0-1Htizsk(p : egsz tmb, w : egsz tmb, n : egsz, c : egsz)
2:
F TblaLtrehoz(egsz)[n + 1, c + 1]
3:
ciklus x 0-tl c-ig
4:
F [0, x] 0
5:
ciklus vge
6:
ciklus i 1-tl n-ig
7:
F [i, 0] 0
8:
ciklus vge
9:
ciklus i 1-tl n-ig
10:
ciklus x 1-tl c-ig
11:
ha wi x akkor
12:
F [i, x] max (F [i 1, x], F [i 1, x wi ] + pi )
13:
klnben
14:
F [i, x] F [i 1, x]
15:
elgazs vge
16:
ciklus vge
17:
ciklus vge
18:
vissza F
19: fggvny vge
Felhasznlt vltozk s fggvnyek
p: Tmb, melyben az egyes kincsek rtkt troljuk.
w: Tmb, melyben az egyes kincsek slyt troljuk.
n: A p s w tmbk mrete.
c: A htizsk kapacitsa.
F : Tbla, melynek mrete (n + 1) (c + 1). F [i, x] jelenti az els i darab kincs kzl kivlasztott
kincsek legnagyobb sszrtkt, ha a kivlasztott kincsek sszslya legfeljebb c.
TblaLtrehoz(egsz)[n + 1, c + 1]: Utasts, mely ltrehoz egy (n + 1) (c + 1) mret egsz
tpus tblt.
Az algoritmus bemenete az egyes kincsek rtkeit tartalmaz p tmb, valamint a slyok w tmbje.
Mindkt tmb elemszma azonos, ezt adja meg az n bemeneti vltoz. Termszetesen a p s w tmb
megfelel elemei ugyanazon kincs rtkt s slyt jellik. Bemeneti vltozknt meg kell mg adni a
htizsk c kapacitst. A tmb kimenete a 7.3. kpletnek megfelelen ellltott tbla, melynek mrete
(n + 1) (c + 1)-es.
A 7.1. algoritmusban elszr ltrehozzuk a kimeneti tblt (ld. 2. sor). Ezutn feltltjk a kezdeti
0 rtkekkel az F tbla nulladik sornak (ld. 3-5. sorok) s nulladik oszlopnak (ld. 6.-8. sorok) minden
egyes elemt. A 9. sorban kezdd kt egymsba gyazott ciklusban a 7.3. kpletnek megfelelen meghatrozzuk az F tbla egyes elemeinek rtkt. Az algoritmus vgn az F tblt kapjuk meg kimenetknt.
Futsi id elemzse. Knnyen lthat, hogy a 7.1. algoritmus futsi ideje O(n c)-s, teht jval
gyorsabb, mint a fejezet elejn emltett O(2n )-es futsi idej nyers er mdszer.
7.1. Plda.
A 7.1. algoritmus mkdst nyomon kvethetjk egy konkrt pldn is. A kincsek
szma: n = 4. Az egyes kincsek konkrt rtk s sly rtkeit a 7.1. tblzatban adtuk meg, a htizsk
Sergyn Szabolcs
226
budai Egyetem
Neumann Jnos Informatikai Kar
kapacitsa pedig legyen 5. A 7.2. brn vgigksrhet az algoritmus mkdse. Az brn kk sznnel
jelezzk a tbla sor- s oszlopindexeit.
i
1
2
3
4
pi
3
4
5
6
wi
2
3
4
5
7.2. bra. 0-1 htizsk problma megoldsa dinamikus programozssal. Az F tbla elemeinek ellltsa.
Az F tbla ismeretben mr meghatrozhat, hogy pontosan melyik kincseket kell kivlasztanunk.
Az F [n, c] elem azaz a jobb als sarokban lv elem megadja, hogy az n elem kzl kivlasztva
a legnagyobb sszrtket eredmnyez legfeljebb c sszsly elemeket mivel egyenl az sszrtk. Az
F tbla jobb als sarkbl indulva egy jl meghatrozott bejrssal megadhat, hogy mely kincsek
kivlasztsa szksges. A 7.1. algoritmusbl tudjuk ugyanis, hogy mikor kerlt egy elem a kivlasztottak
kz. Teht azt kell csak vizsglni, hogy egy kincset hozzvettnk-e a legjobb kivlasztshoz vagy
sem. Ezt pedig onnan tudjuk megmondani, hogy egy adott elem fltti elemnek mi az rtke az F
tblzatban.
A kiolvass megvalstst a 7.2. algoritmussal adjuk meg. Az algoritmus bemenete az F tbla,
melynek mrete (n + 1) (c + 1). Kimenete pedig az optimlis kivlasztsban szerepl kincsek indexeit
tartalmaz S halmaz.
A kimeneti S halmaz kezdetben res (ld. 2. sor). Az F tbla bejrst a bal als sarokbl kezdjk,
ezrt i kezdetben a kincsek n szmval (ld. 3. sor), x pedig a c kapacitssal egyenl (ld. 4. sor). Az F
tbla bejrst addig folytatjuk, amg i s x is pozitv, ezt valstja meg az 5. sorban kezdd ciklus.
Megvizsgljuk, hogy az F tmb aktulis F [i, x] eleme megegyezik-e a fltte lvvel (ld. 6. sor). Ha
nem egyezik meg, akkor az i-edik kincset hozzvettk az optimlis megoldshoz, ezrt az S halmazba
betesszk az i indexet (ld. 7. sor). Mivel az i-edik elem slya wi , ezzel cskkenteni kell a betehet x
sszslyt (ld. 8. sor). Minden esetben eggyel korbbi sorra kell visszalpni, ezrt az i-t cskkenteni kell
eggyel (ld. 10. sor). A ciklusbl kilpve az S-ben pont az optimlis megoldshoz tartoz kincsek indexei
lesznek, ezrt S-t visszaadjuk eredmnyknt (ld. 12. sor).
7.2. Plda. A 7.1. pldnl ltrehozott F tmb alapjn hatrozzuk meg, hogy mely elemek kivlasztsa
lesz optimlis. Az algoritmus mkdst szemllteti a 7.3. bra. A bejrst az F [4, 5]-bl indtjuk. Mivel
F [4, 5] = F [3, 5], ezrt a negyedik kincs nincs az optimlis kivlasztsban. Ugyanez igaz a harmadik
kincs esetben is, mert F [3, 5] = F [2, 5]. Viszont F [2, 5] 6= F [1, 5], ezrt a msodik kincs benne van
a kivlasztott elemek S halmazban. A msodik elem slya w2 = 3, ezrt az x rtke 2-re cskken.
Mivel F [1, 2] 6= F [0, 2], ezrt az els kincset is hozzvesszk a kivlasztottak S halmazhoz. Tovbbi
vizsglat nem kell, mert elfogytak a kincsek. gy az els s msodik kincset vlasztva kapjuk a legnagyobb
sszrtk kivlasztst c = 5 zskkapacits mellett.
Futsi id elemzse. Knnyen belthat, hogy a 7.2. algoritmus futsi ideje a kincsek szmval
arnyos, teht O(n)-es. gy a 0-1 htizsk problma optimlis megoldsnak teljes futsi ideje is csak
O(n c)-s.
Sergyn Szabolcs
227
budai Egyetem
Neumann Jnos Informatikai Kar
7.3. bra. 0-1 htizsk problma megoldsa dinamikus programozssal. Az optimlis kivlaszts ellltsa.
Sergyn Szabolcs
228
budai Egyetem
Neumann Jnos Informatikai Kar
rdemes vgignzni, hogy milyen lpseket hajtottunk vgre a 0-1 htizsk problma ismertetett
megoldsa sorn. Elszr jellemeztk az optimlis megolds szerkezett. Msodik lpsben rekurzv
mdon definiltuk az optimlis megolds rtkt. Ezutn a rekurzv definci alapjn kiszmtottuk az
optimlis megolds rtkeit, de nem rekurzv algoritmussal, hanem n. alulrl felfel trtn mdon.
Vgl a kiszmtott informcik alapjn meghatroztunk egy optimlis megoldst.
Sergyn Szabolcs
229
budai Egyetem
Neumann Jnos Informatikai Kar
6 Angolul:
memoization
Sergyn Szabolcs
230
budai Egyetem
Neumann Jnos Informatikai Kar
Az X sorozatnak rszsorozata maga az X sorozat is, mert ezt gy kapjuk meg, hogy
semmit nem trlnk X-bl.
Az X sorozatnak rszsorozata az res sorozat is, mert ha X-bl minden elemet trlnk,
akkor azt kapjuk.
Az eddigi defincik alapjn mr meghatrozhatjuk a jelen fejezetben trgyalsra kerl pontos feladatunkat. Adott kt sorozat: X = hx1 , x2 , . . . , xn i s Y = hy1 , y2 , . . . , ym i. Keressk meg a leghosszabb olyan rszsorozatot, amely rszsorozata X-nek s Y -nak is. Pldul az X = hc, a, d, b, r, zi s
az Y = ha, s, b, zi sorozatok leghosszabb rszsorozata az ha, b, zi sorozat.
A feladat ismeretben elkezdhetnk a megoldssal foglalkozni. Termszetesen most is nekieshetnnk
a feladat megoldsnak nyers er mdszerrel. Ekkor ellltannk az X sszes rszsorozatt, amibl
2n darab van. Majd ugyangy meghatroznnk az Y sszes rszsorozatt, amelybl pedig 2m darab
ltezik. Ezutn megnznnk, hogy X mely rszsorozata egyezik meg Y valamely rszsorozatval, majd
ezek kzl kivlasztannk a leghosszabbat. Nem kell sokig bizonygatni, hogy futsi id szempontjbl
ez egy nagyon nem hatkony megkzelts lenne. Vlasszunk ezrt ms stratgit!
Kvetend mdszernk kt egymstl jl elklnl lpsbl fog llni. Elszr ezt hatrozzuk meg,
hogy milyen hossz lehet a leghosszabb kzs rszsorozat, majd ennek ismeretben hatrozunk meg egy
konkrt, ilyen hosszsg rszsorozatot.
A leghosszabb kzs rszsorozat hossznak meghatrozsnl nem a teljes X s Y sorozatot fogjuk
minden esetben vizsglni, hanem azoknak csak az els valahny elemvel foglalkozunk egy adott lpsben. A vizsglat rdekben bevezetjk az F [i, j] jellst. F [i, j] alatt rtjk az X sorozat els i darab
elembl s az Y sorozat els j darab elembl ll sorozatok leghosszabb kzs rszsorozatnak hosszt.
Az egyszerbb lers rdekben bevezetjk az X i s Y j jellst, ami a megfelel sorozat els i illetve
j darab elembl ll rszsorozatot jelli. A feladat megoldsa sorn az a clunk, hogy meg tudjuk
hatrozni az F [n, m] rtket, hiszen ez pont a teljes X s Y leghosszabb kzs rszsorozatnak hosszt
adja meg. F [n, m] ismeretben rtrhetnk majd egy konkrt olyan kzs rszsorozat megkeressre,
melynek hossza megegyezik F [n, m]-mel.
Nzzk meg most, hogy milyen szablyszersget tudunk megadni az F [i, j] rtkekre. Ha i = 0 vagy
j = 0, azaz X-nek vagy Y -nak a 0 hosszsg elejt tekintjk, akkor a leghosszabb kzs rszsorozat
hossza se lehet tbb 0-nl. Teht ilyenkor F [i, j] = 0. Ha az X sorozat i-edik eleme (xi ) s az Y sorozat
j-edik eleme (yj ) megegyezik, akkor ez a megegyez elem benne van az X i s Y j leghosszabb kzs
rszsorozatban. A leghosszabb kzs rszsorozat hosszrl pedig az mondhat, hogy az X i s az Y j
leghosszabb kzs rszsorozatnak hossza eggyel nagyobb, mint az X i1 s az Y j1 leghosszabb kzs
rszsorozatnak hossza. Teht xi = yj esetn az F [i, j] = F [i1, j 1]+1. Vizsgland eset mg, amikor
az xi 6= yj . Ilyenkor az X i s az Y j leghosszabb kzs rszsorozatnak hossza az X i s az Y j1 , vagy
az X i1 s az Y j leghosszabb kzs rszsorozat hossza kzl a nagyobbik lesz. Az F [i, j]-re vonatkoz
megllaptsainkat az albbi rekurzv kpletben foglalhatjuk ssze:
ha i = 0 vagy j = 0
0,
F [i 1, j 1] + 1,
ha i, j > 0 s xi = yj
F [i, j] =
(7.4)
231
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
232
budai Egyetem
Neumann Jnos Informatikai Kar
10
Y
7.4. bra. Az X = hC, A, L, E, N, D, A, Ri s Y = hC, A, L, L, C, E, N, T, E, Ri sorozatok leghosszabb
kzs rszsorozatnak meghatrozshoz szksges F tbla ellltsa.
Sergyn Szabolcs
233
budai Egyetem
Neumann Jnos Informatikai Kar
(7.5)
A krds csak az, hogy hogyan lehet az elbbi felismers alapjn megtallni az X s Y sorozatok
egy leghosszabb kzs rszsorozatt. Tekintsnk ehhez elszr egy konkrt esetet, a 7.3. pldban ellltott F tblt s a hozz tartoz X = hC, A, L, E, N, D, A, Ri s az Y = hC, A, L, L, C, E, N, T, E, Ri
sorozatokat. Lthat, hogy az F [n, m] elem 1-gyel nagyobb az F [n 1, m 1] elemnl s x8 = y10 .
gy kijelenthet, hogy az X s Y kzs utols eleme biztos benne lesz az X s Y leghosszabb kzs
rszsorozatban. Ez azrt igaz, mert az R bet nem lehet benne az X n1 s az Y m1 leghosszabb
kzs rszsorozatban (ami az F alapjn 5 hossz), gy ehhez hozzvve az R bett, mris egy 6 hossz
rszsorozatt kapjuk X-nek s Y -nak. 6 hossz rszsorozatot egybknt az F tbla alapjn most nem is
kaphatunk msknt csak a lezr R betvel.
Hogyan tudjuk meghatrozni, hogy mi lesz az X s Y leghosszabb kzs rszsorozatnak tdik
eleme. Ehhez kell a tblban tallni egy olyan (i, j) helyet, ahol F [i, j] = 5, de F [i 1, j 1] = 4. Ha
megtalltuk ezt a helyet, akkor az xi elem (vagy a vele megegyez yj ) lesz az X s Y leghosszabb kzs
rszsorozatnak tdik eleme. Ilyen hely tbb is van a konkrt pldban, de csak egy helyen teljesl, hogy
xi = yj . Ez alapjn kijelenthet, hogy az tdik sor hetedik elemnl tallunk ilyen esetet. Ebbl viszont
az is kvetkezik, hogy X s Y leghosszabb kzs rszsorozatnak tdik eleme az N bet lesz. Krds
viszont, hogy az elbb megtallt (8, 10) koordintj helytl miknt juthatunk el egy algoritmussal a
mostani (5, 7) koordintj helyhez. gy is feltehetjk a krdst, hogy az F tblt milyen mdon kell
ehhez bejrnunk.
A keresett bejrs viszont nem lesz ms, mint hogy az F tbla jobb als sarkbl (az (n, m) koordintj helytl) indulva bejrjuk az F tblt gy, hogy kzben visszakvetkeztetnk az F tbla ellltsi
mdjra. Elindulunk az (n, m) koordintj helyrl. Megvizsgljuk, hogy az adott helyen xn = ym
teljesl-e. Ha teljesl, akkor biztos, hogy az (n 1, m 1) koordintj helyre kell tovbblpnnk, mert
egyezsg esetn ezt diktlja az F ellltsi szablya. Ha viszont xn 6= ym , akkor megnzzk, hogy az
F [n 1, m] s F [n, m 1] rtkek kzl melyik nagyobb. Ha az F [n 1, m] > F [n, m 1], akkor az
F [n, m] rtke biztos F [n 1, m]-mel egyenl, ezrt az (n 1, m) koordintj pontra lpnk vissza.
Egyb esetben viszont az (n, m 1) helyre lpnk. Ezt a bejrsi szably kvetjk mindaddig, amg meg
nem talljuk a leghosszabb kzs rszsorozat minden elemt.
A fenti tletet megvalst algoritmus pontos lerst a 7.4. algoritmusban mutatjuk be. Az algoritmus
bemenete a 7.3. algoritmus ltal ellltott F tbla, valamint az X s Y sorozatok, melyek mreteit is
ismerjk. Kimenetknt az X s Y egy leghosszabb kzs rszsorozatt tartalmaz S tmbt adjuk vissza.
Az algoritmus els lpseknt ltrehozzuk a kimeneti S tmbt, melynek a mrete pont az F [n, m]
rtkkel egyezik meg (ld. 2. sor). Az F tbla bejrshoz kt indexvltoz szksges. A sorokat az i, az
oszlopokat pedig a j indexeli. Az i vltoz kezdeti rtke n (ld. 3. sor), az j vltoz pedig m (ld. 4. sor),
hiszen a bejrst az F jobb als sarkbl kezdjk. Az S tmbt is szksges indexelnnk. Mivel az S-t
htulrl elrefel haladva tltjk fel, ezrt az idx index kezdeti rtke az S tmb mrete lesz (ld. 5. sor).
Az F tbla bejrst addig kell vgeznnk, amg az S tmbt teljesen fel nem tltttk. Ezt a 6. sorban kezdd ciklusban valstjuk meg, amelyben addig kell bennmaradnunk, amg az idx rtk pozitv.
A cikluson bell megvizsgljuk, hogy az aktulis (i, j) hely esetn X[i] s Y [j] megegyezik-e (ld. 7. sor).
Ha megegyeznek, akkor az S tmbbe felvesszk az X[i] elemet, majd mindhrom indexet 1-gyel cskkentjk. Ha X[i] 6= Y [j], akkor csak azt kell eldnteni, hogy az F tblban felfel vagy balra lpjnk
tovbb. Amennyiben F [i 1, j] > F [i, j 1] (ld. 12. sor), akkor az elz sorra lpnk, klnben pedig
Sergyn Szabolcs
234
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
235
budai Egyetem
Neumann Jnos Informatikai Kar
(ld. 14. sor) az elz oszlopba lpnk. A ciklusbl kilpve mr csak vissza kell adni a kimeneti S tmbt
(ld. 18. sor), mely tartalmazza az X s Y egy leghosszabb kzs rszsorozatt.
7.4. Plda. A 7.5. brn szemlltetjk, hogy a 7.4. algoritmus hasznlatval milyen bejrssal kapjuk
meg az X = hC, A, L, E, N, D, A, Ri s az Y = hC, A, L, L, C, E, N, T, E, Ri sorozatok egy leghosszabb
kzs rszsorozatt a 7.3. pldban ellltott F tbla hasznlatval. A nyilak mutatjk a bejrs
menett, a sttebb htter elemek pedig azok, amelyek bekerlnek a leghosszabb kzs rszsorozatba.
gy az ellltott leghosszabb kzs rszsorozat az S = hC, A, L, E, N, Ri sorozat lesz.
j
10
Y
7.5. bra. Az X = hC, A, L, E, N, D, A, Ri s Y = hC, A, L, L, C, E, N, T, E, Ri sorozatok egy leghosszabb
kzs rszsorozatnak ellltsa a 7.3. pldban meghatrozott F tbla felhasznlsval. A leghosszabb
kzs rszsorozat: S = hC, A, L, E, N, Ri.
Megjegyzs
Sok esetben nem csak egy leghosszabb kzs rszsorozata van kt sorozatnak, hanem tbb
is. Termszetesen a hossza mindegyik leghosszabb kzs rszsorozatnak ugyanaz.
A 7.6. brn mutatunk egy pldt, ahol kt legnagyobb kzs rszsorozatt is meghatrozzuk az X = hB, D, C, A, B, Ai s az Y = hA, B, C, B, D, A, Bi sorozatnak. A kk
sznnel jellt esetben a 7.4. algoritmussal hatroztuk meg az S1 = hB, C, B, Ai esetet.
A narancssrga esetben viszont kis mrtkben mdostottunk a 7.4. algoritmuson. Az
algoritmus 12. sorban a felttel vizsglatnl megengedjk az egyenlsget is. gy mr az
S2 = hB, D, A, Bi sorozatot kapjuk eredmnyl.
Futsi id elemzse. A 7.4. algoritmus futsi ideje knnyen meghatrozhat, ha megvizsgljuk, hogy
az algoritmusbeli ciklus legfeljebb hnyszor fut le. Mivel az i rtk legfeljebb (n 1)-szer, az j pedig
legfeljebb (m 1)-szer cskkenthet, gy az algoritmus futsi ideje O (n + m)-es.
A teljes leghosszabb kzs rszsorozat meghatrozs futsi ideje a 7.3. s a 7.4. algoritmusok futsi
idejnek sszege, teht O (n m)-es.
Sergyn Szabolcs
236
budai Egyetem
Neumann Jnos Informatikai Kar
B
Y
Sergyn Szabolcs
237
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
238
budai Egyetem
Neumann Jnos Informatikai Kar
7.2.1. Pnzkifizets
Els moh mdszerknt ismerkedjnk meg a pnztri kifizets problmjval. Egy pnztrban gyakran
elfordul feladat, hogy egy konkrt sszeget kell kifizetni valaki szmra, amihez a rendelkezsre ll
cmletek kzl a lehet legkevesebbet szabad hasznlni. Adjunk konkrt algoritmust ennek a problmnak
a megoldsra!
Moh megkzeltst hasznlva nagyon egyszeren kell eljrnunk. Az eljrs alaptlete, hogy minl
nagyobb cmletet hasznlunk a kifizetshez annl kevesebb cmletre van szksgnk. Vegyk pldul
azt az esetet, amikor 20.000 Ft-ot kell kifizetni. Ezt megoldhatjuk egyetlen 20.000 Ft-os cmlettel, vagy
2 db 10.000 Ft-ossal is. Ha a nagyobb cmletet hasznljuk, akkor rtelemszeren kevesebb cmletre
van szksgnk. Kvessk teht azt az tletet, hogy mindig a lehet legnagyobb cmletet adja oda a
pnztros, majd a mg kifizetend sszeget is a legnagyobb cmlet felhasznlsval fizeti ki. Mindezt
addig teszi, amg mindent ki nem fizetett. Ez a mdszer azrt moh, mert a legnagyobb cmletet hasznlja
mindig.
A mdszer konkrt lerst a 7.5. algoritmusban adjuk meg. Az algoritmus egyik bemenete a kifizetend sszeg, melyet x-szel jelljk. (Azt feltesszk, hogy ez az sszeg maradk nlkl kifizethet a
rendelkezsre ll cmletek felhasznlsval.) Msik bemenetnk egy rendezett tmb, melyben a rendelkezsre ll cmletek rtkeit adjuk meg. (A jelenleg Magyarorszgon forgalomban lv cmletek esetn
c = {5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000}.) Termszetesen a c tmb n mrett is
ismerjk. Az algoritmus kimenete az n elem db tmb. A db tmb i-edik eleme meghatrozza, hogy a
c[i] cmletbl hny darabra van szksg az x sszeg kifizetsekor. Teht
x=
n
X
db[i] c[i].
(7.6)
i=1
Az algoritmus olyan db tmbt hatroz meg, melyben trolt rtkek sszege azaz a cmletek szma
minimlis mikzben a 7.6. egyenlet is teljesl. A db elemeinek sszege ugyanis pont a felhasznlt cmletek
szmval egyezik meg.
7.5. Algoritmus Pnzkifizets moh algoritmusa
Bemenet: x egsz, c egsz rendezett tmb, n egsz
Kimenet: db egsz tmb
1: fggvny Pnzkifizets(x : egsz, c : egsz tmb, n : egsz)
2:
db Ltrehoz(egsz)[n]
3:
ciklus i 1-tl n-ig
4:
db[i] 0
5:
ciklus vge
6:
jn
7:
ciklus amg x > 0
8:
ciklus amg c[j] > x
9:
j j1
10:
ciklus vge
11:
db[j] db[j] + 1
12:
x x c[j]
13:
ciklus vge
14:
vissza db
15: fggvny vge
Felhasznlt vltozk s fggvnyek
x: A kifizetend sszeg.
c: A rendelkezsre ll cmletek nvekv mdon rendezett tmbje.
n: A c tmb mrete.
db: Kimeneti n elem tmb. A tmb
Pn i-edik elemnek rtke megadja, hogy a c[i] cmletbl hny
darabot kell kifizetni, teht x = i=1 db[i] c[i].
Ltrehoz(egsz)[n]: Utasts, mely ltrehoz egy n elem egsz tpus tmbt.
Sergyn Szabolcs
239
budai Egyetem
Neumann Jnos Informatikai Kar
A 7.5. algoritmus elejn ltrehozunk egy n elem tmbt a felhasznlt cmletek darabszmnak trolsra (ld. 2. sor). Ennek a tmbnek minden elemt 0-val tesszk egyenlv, amit a 3. sorban kezdd
ciklussal valstunk meg. Mivel szmon kell tartanunk, hogy ppen melyik cmletet hasznljuk a kifizetshez, ezrt ezt egy j indexvltozval fogjuk jellni. A j kezdeti rtke a legnagyobb cmletnek megfelel
index, teht a c tmb mrete lesz (ld. 6. sor). Mivel a teljes x sszeget ki kell fizetni, ezrt a 7. sorban kezdd ciklusban addig keresnk megfelel cmleteket, amg a mg kifizetend x sszeg pozitv. A cikluson
bell els lpsknt meg kell keresni azt a cmletet, ami a felhasznlhatak kzl a legnagyobb. Ennek
megtallst egy ciklussal valstjuk meg (ld. 8. sor), amelyben a j indexet addig cskkentjk, amg az
aktulis cmlet nagyobb a mg kifizetend sszegnl. Ha talltunk olyan cmletet, amit fel tudunk hasznlni, akkor az adott cmletnek megfelel darabszmot a db tmbben eggyel nveljk (ld. 11. sor). Mivel
a megtallt cmletet mr fel is hasznljuk pnzkifizetsre, ezrt a mg kifizetend sszeget cskkentjk a
cmlet rtkvel (ld. 12. sor). Az algoritmus vgn a db tmbt visszaadjuk eredmnyknt (ld. 14. sor).
7.5. Plda. Fizessnk ki 79.485 Ft-ot a lehet legkevesebb cmlet felhasznlsval!
A 7.5. algoritmus hasznlatval azt kapjuk, hogy 3 db 20.000-es, 1 db 10.000-es, 1 db 5.000-es, 2
db 2.000-es, 2 db 200-as, 1 db 50-es, 1 db 20-as, 1 db 10-es s 1 db 5-s cmlettel lehet a kifizetst
megvalstani. Nem bizonytjuk, de igaz, hogy ennl kevesebb cmlettel nem lehet megoldani a feladatot.
7.6. Plda. Feladatunk most adott sszrtk blyeg felragasztsa egy bortkra gy, hogy a lehet
legkevesebb blyeget hasznljuk. A postn fellelhet blyegek cmleteit a c tmbben troljuk. c =
{10, 100, 210, 340, 700, 1.000, 3.500}. Hogyan tudjuk megoldani a feladatot, ha 1.400 Ft-nyi blyeget kell
a bortkra tenni?
A 7.5. algoritmus alapjn azt kapjuk, hogy a feladat 1 db 1.000-es, 1 db 340-es s 6 db 10-es blyeggel
oldhat meg. Knnyen lthat, hogy ez a megolds nem optimlis, hiszen 2 db 700 Ft-os blyeggel is
megoldhat a feladat.
A fenti kt pldbl lthat, hogy ugyanaz az algoritmus egyik esetben optimlis megoldst szolgltat,
mg a msik esetben nem. Ennek f oka az, hogy a c cmleteket tartalmaz tmb ms az egyik, illetve a
msik esetben.
A moh algoritmusokrl egyelre azt ltjuk, hogy a dnts moh mdon trtnik esetnkben a
lehet legnagyobb vlaszthat cmlet mellett dntnk , viszont nem minden esetben kapunk optimlis
megoldst. Az is igaz persze, hogy br a 7.6. pldnl kapott megolds nem az optimlis, de nem is a
legrosszabb. Ezt gy fejezhetjk ki, hogy a moh algoritmus nem mindig eredmnyez globlis optimumot,
de a problma egy loklis optimumt megadja.
Sergyn Szabolcs
240
budai Egyetem
Neumann Jnos Informatikai Kar
...
.
w[1]
w[2]
w[n]
(7.7)
A lert tlet konkrt megvalstst a 7.6. algoritmusban adjuk meg. Az algoritmus bemenetei a
kincsek rtkeit tartalmaz p tmb, valamint a megfelel kincsek slyait tartalmaz w tmb. A kt tmb
elemeire teljesl a 7.7. egyenltlensgsorozat. Ismerjk a kt tmb azonos n elemszmt is, valamint
bemenetknt adjuk mg meg a htizsk c kapacitst. Az algoritmus kimenete a kivlasztott kincsek
indexeit tartalmaz S halmaz.
7.6. Algoritmus 0-1 htizsk problma moh megoldsa
Bemenet: p egsz tmb, w egsz tmb, n egsz (tmb mrete), c egsz
Kimenet: S egsz halmaz
1: fggvny Moh0-1Htizsk(p : egsz tmb, w : egsz tmb, n : egsz, c : egsz)
2:
S
3:
i1
4:
ciklus amg (c > 0) (i n)
5:
ha w[i] c akkor
6:
S S {i}
7:
c c w[i]
8:
elgazs vge
9:
ii+1
10:
ciklus vge
11:
vissza S
12: fggvny vge
Felhasznlt vltozk s fggvnyek
p: Tmb, melyben az egyes kincsek rtkt troljuk.
w: Tmb, melyben az egyes kincsek rtkt troljuk. (Fontos kiemelnnk, hogy a p s w tmb
elemeire teljesl a 7.7. egyenltlensgsorozat.)
n A p s w tmbk mrete.
c: A htizsk kapacitsa.
S: Halmaz, melynek elemei a htizskba helyezend trgyak indexei.
A 7.6. algoritmus 2. sorban inicializljuk a kimeneti S halmazt, mely kezdetben res, hiszen mg
egyetlen kincset sem vlasztottunk ki. Ezutn ki kell vlasztanunk moh mdon a kincseket. Mivel
a kincsek rtk-sly arny szerint cskken mdon rendezettek, ezrt csak annyit kell tennnk, hogy
Sergyn Szabolcs
241
budai Egyetem
Neumann Jnos Informatikai Kar
vgighaladunk a kincseken egy bejrssal. A bejrs sorn az i vltozval indexelnk, melynek kezdeti
rtke 1 (ld. 3. sor). A bejrst a 4. sorban kezdd ciklussal valstjuk meg. A ciklusban addig kell
bennmaradnunk, amg van mg szabad hely a htizskban (c > 0), illetve amg van mg megvizsgland
kincsnk (i n). A cikluson bell megvizsgljuk, hogy az aktulis kincs befr-e a htizskba (ld. 5. sor).
Ha befr, akkor a kincset betesszk a htizskba, azaz az indext eltroljuk az S halmazban (ld. 6. sor),
illetve a htizsk szabad kapacitst cskkentjk a betett kincs slyval (ld. 7. sor). A bejrs sorn
minden esetben szksges a kvetkez trgyra tovbblpni, ezrt az i rtkt a 9. sorban 1-gyel nveljk.
A bejrs vgeztvel az S halmazt adjuk vissza kimenetknt (ld. 11. sor).
7.7. Plda. Vizsgljuk meg, hogy a 7.1. tblzatban lv kincsek kzl melyeket helyezi egy c = 5
kapacits htizskba a 7.6. moh algoritmus. Vegyk szre, hogy a kincsek 7.1. tblzatban megadott
indexelse pont megfelel szmunkra, mivel pp a wp arny szerinti cskken rendezettsgben vannak.
A 7.6. algoritmus elszr megvizsglja, hogy az els trgy slya kisebb-e a c = 5 kapacitsnl. Mivel
kisebb, ezrt az S halmazba bekerl az els trgy indexe (S = {1} lesz), a szabad kapacits c rtke
pedig 3-ra cskken. Ezutn kvetkezik a msodik trgy vizsglata. Mivel az is befr a htizskba, ezrt
az S = {1, 2}-re vltozik, a htizsk szabad kapacitsa pedig 0-ra cskken. Mivel c = 0, ezrt kilpnk
a bejrst megvalst ciklusbl, s az algoritmus visszaadja az S halmazt.
Jl lthat, hogy ebben az esetben a moh algoritmus ugyanazt az eredmnyt szolgltatja, mint a
dinamikus programozs esetben, ahogy azt a 7.1. pldban lttuk.
7.8. Plda.
Tekintsnk egy msik pldt, melyben a 7.2. tblzatban megadott rtk s sly
kincseket hasznljuk. A kincsek most is az rtk-sly arny szerint cskken mdon rendezettek. Milyen
kivlogatst eredmnyez ebben az esetben a 7.6. moh algoritmus, ha a htizskunk kapacitsa c = 50?
i
1
2
3
pi
60
100
120
wi
10
20
30
Sergyn Szabolcs
242
budai Egyetem
Neumann Jnos Informatikai Kar
x
0
10
20
30
40
50
60
60
60
60
60
7.7. bra. A 7.8. plda megoldsa dinamikus programozssal. Eredmnyl az optimlis S = {2, 3}
kivlasztst kapjuk.
Sergyn Szabolcs
243
budai Egyetem
Neumann Jnos Informatikai Kar
C[i, j],
ha i = 1 s j = 1,
19
39
55
61
19
39
55
61
11
15
18
20
52
53
18
20
52
53
10
20
17
37
46
17
37
46
16
16
(a) A C tmb.
(b) A F tmb.
244
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
245
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
246
budai Egyetem
Neumann Jnos Informatikai Kar
Vizsgljuk meg, hogy miknt tudjuk a feladatot moh mdon megoldani. Ha a moh megkzeltst
kvetjk, akkor a bejrsnl egyszeren elindulunk az (1, 1) koordintj helyrl. Itt rvidlt mdon
rnznk a jobb oldali s a fels szomszdra. A kett kzl amelyik nagyobb, arra folytatjuk a bejrst.
Minden mezn ezt a stratgit kvetjk, teht csak a jobb s fels szomszdot vizsglva hozunk dntst
a tovbbhaladsrl. Moh mdon mindig az ppen jobbnak tn irnyt vlasztjuk. Amikor elrjk a
fels sort vagy a jobb szls oszlopot, akkor mr csak egyenes ton el kell jutnunk a jobb fels clmezbe.
Az ismertetett tletnek megfelel konkrt megvalstst a 7.9. algoritmusban rjuk le. Az algoritmus
a bal als sarokbl eljut a legfels sorig vagy a jobb szls oszlopig. Ezt kveten vgigjrja a jobb szls
oszlopot, illetve a fels sort. Az utols lpsben a jobb fels sarkot is hozzveszi a bejrst megad P
koordinta sorozathoz.
7.9. Algoritmus Kincsek begyjtse (moh algoritmus)
Bemenet: C egsz tmb, m egsz (C sorainak szma), n egsz (C oszlopainak szma)
Kimenet: P egsz tmb
1: fggvny MohKincsGyjts(C : egsz tmb, m : egsz, n : egsz)
2:
P Ltrehoz(egsz)[m + n 1]
3:
i1
4:
j1
5:
k0
6:
ciklus amg (i < m) (j < n)
7:
k k+1
8:
P [k] (i, j)
9:
ha C[i + 1, j] > C[i, j + 1] akkor
10:
ii+1
11:
klnben
12:
j j+1
13:
elgazs vge
14:
ciklus vge
15:
ciklus amg i < m
16:
k k+1
17:
P [k] (i, j)
18:
ii+1
19:
ciklus vge
20:
ciklus amg j < n
21:
k k+1
22:
P [k] (i, j)
23:
j j+1
24:
ciklus vge
25:
k k+1
26:
P [k] (i, j)
27:
vissza P
28: fggvny vge
Felhasznlt vltozk s fggvnyek
C: Kincsek rtkt tartalmaz ktdimenzis tmb.
m: A C tmb sorainak szma.
n: A C tmb oszlopainak szma.
P : Tmb, melynek elemszma m + n 1. A P tmb adja meg egy optimlis bejrs koordinta
sorozatt.
Ltrehoz(egsz)[m + n 1]: Utasts, mely ltrehoz egy m + n 1 elem egsz tpus tmbt.
Ha a korbban dinamikus programozssal megoldott feladatra alkalmazzuk a 7.9. moh algoritmust,
akkor eredmnyl a P = {(1, 1) , (2, 1) , (3, 1) , (3, 2) , (3, 3) , (4, 3) , (4, 4)} koordinta sorozatot kapjuk,
ahogy az a 7.9. brn is lthat. Az gy sszegyjttt kincsek mennyisge csak 44 lesz, ami elmarad a
dinamikus programozsi megkzeltsnl kapott 61 rtktl. Ebbl ltszik, hogy a moh megkzelts
Sergyn Szabolcs
247
budai Egyetem
Neumann Jnos Informatikai Kar
nem az optimlis megoldst adja eredmnyl. (rdemes azrt megemlteni, hogy nem a legkevesebb
kincset eredmnyez megoldst kaptuk.)
1
11
15
10
20
Sergyn Szabolcs
248
budai Egyetem
Neumann Jnos Informatikai Kar
(1, 1)
(1, 2)
(1, 3)
(1, 4)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 1)
(3, 2)
(3, 3)
(3, 4)
(4, 1)
(4, 2)
(4, 3)
(4, 4)
7.10. bra. A kincsek mezjnek bejrsi lehetsgei.
Sergyn Szabolcs
249
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
250
budai Egyetem
Neumann Jnos Informatikai Kar
251
budai Egyetem
Neumann Jnos Informatikai Kar
1
2
3
4
5
6
7
8
9
10
11
0
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
0
10
11
12
13
14
Sergyn Szabolcs
252
budai Egyetem
Neumann Jnos Informatikai Kar
Felmerlhet a krds, hogy a 7.10. algoritmus valban globlisan optimlis megoldst eredmnyez-e
minden lehetsges bemenet esetn. Ennl az egy algoritmusnl adunk egy bizonytst arra, hogy a moh
stratgia most tnyleg optimlis megoldst eredmnyez.
A bizonyts els lpseknt beltjuk, hogy az automatikusan kivlasztott els esemny tnyleg benne
lehet az optimlis megoldsban. Jelljk a lehetsges megoldsok halmazt S-sel. Tegyk fel, hogy az
A S egy optimlis megolds, s legyenek az A-beli esemnyek a befejezsi id szerint nvekv mdon
rendezettek. Tegyk fel, hogy az A-beli els esemny a k-adik. Ha k = 1, akkor belttuk, hogy az els
esemny benne lehet egy optimlis megoldsban. Ha k 6= 1, akkor tekintsk a B S megoldst, amelyet
gy kapunk, hogy A-bl elhagyjuk a k-t s hozzvesszk az 1-et. Teht B = (A \ {k}) {1}. Mivel
f [1] f [k], gy a B-beli esemnyek pronknt kompatibilisek s B pontosan annyi elemet tartalmaz,
mint A. Ez viszont azt jelenti hogy B is optimlis megolds. Teht minden esetben van olyan optimlis
megolds, melyben az els elem benne van.
A bizonyts msodik lpseknt azt kell beltnunk, hogy az els elemet kvet elemek vlasztsa
esetn is optimlis megoldst kapunk. Ennek rdekben azt kell megvizsglnunk, hogy az A0 = A \ {1}
optimlis megoldsa-e az S 0 = {i S : s[i] f [1]} esemnyeket tartalmaz problmnak. Tegyk fel,
hogy tallunk olyan B 0 megoldst az S 0 problmnak, amely tbb esemnyt tartalmaz mint A0 . Ebben
az esetben az els esemnyt hozzadva B 0 -hz, az S problmnak olyan megoldst kapjuk, mely tbb
esemnyt tartalmaz mint A. Ez viszont ellentmond annak, hogy A optimlis megolds. Teht minden
moh vlaszts utn olyan problmnk marad mint az eredeti. gy az eredetileg kivlasztott esemnnyel
kompatibilis esemnyek kzl jra az elst vlaszthatjuk moh mdon.
Esemny elklntsi problma
Az esemny elklntsi problmnl adott n darab esemny, melyeknek ismerjk a kezdsi s befejezsi idpontjaikat. Ezek rendere az s s az f tmbben vannak eltrolva. Ezek az idpontok a feladat
megoldsa sorn nem mdosthatk. Minden egyes esemnyhez hozz kell rendelnnk egy erforrst.
Feladatunk, hogy minden esemnyt hozzrendeljnk erforrsokhoz gy, hogy a lehet legkevesebb erforrst hasznljuk. (Az biztos, hogy van annyi erforrsunk, amennyi szksges.)
A problmt most gy fogjuk megoldani, hogy az esemnyeket kezdsi idpontjuk szerint rendezzk.
Ezt kveten az els esemnyt hozzrendeljk az els erforrshoz. A kvetkez esemnynl megnzzk,
hogy hozzrendelhet-e az els erforrshoz, azaz kompatibilis-e az els erforrshoz mr hozzrendelt esemnnyel. Ha hozzrendelhet, akkor ezt meg is tesszk. Ha nem, akkor viszont hozzrendel-
Sergyn Szabolcs
253
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
254
budai Egyetem
Neumann Jnos Informatikai Kar
5
3
10
1
9
9:30
6
10
10:30
11
11:30
12
12:30
13
13:30
9
14
14:30
15
15:30
16
16:30
2
1
9
9:30
7
6
4
10
10:30
11
11:30
12
12:30
13
13:30
10
9
14
14:30
15
15:30
16
16:30
255
budai Egyetem
Neumann Jnos Informatikai Kar
ti
di
1
3
6
2
2
8
3
1
9
4
4
9
5
3
14
6
2
15
Futsi id elemzse. Mivel a 7.12. algoritmusban egyetlen ciklus van, mely pontosan n-szer fut le,
ezrt az algoritmus futsi ideje O(n)-es.
Sergyn Szabolcs
256
budai Egyetem
Neumann Jnos Informatikai Kar
kss = 2
d3 = 9
0
d2 = 8
d6 = 15
3
d1 = 6
5
kss = 0
max kss = 6
d5 = 14
10
d4 = 9
11
12
13
14
15
d2 = 8
3
d3 = 9
5
d4 = 9
7
d5 = 14
9
10
11
12
d6 = 15
13
14
15
Sergyn Szabolcs
257
budai Egyetem
Neumann Jnos Informatikai Kar
8. fejezet
Kupacrendezs
A kupacrendezs1 a 3. fejezetben megismert rendezsekhez hasonlan helyben trtn rendezst valst
meg egy tmbben. A rendezs megvalstshoz viszont egy specilis adatszerkezetet kell megvalstani,
melyet kupacnak neveznk.
A fejezet 8.1. alfejezetben definiljuk azokat a fogalmakat, amelyek ahhoz szksgesek, hogy megrtsk milyen adatszerkezetet tekintnk kupacnak. Ezt kveten a 8.2. alfejezetben megismerkednk
a Kupacol rekurzv eljrssal, amely a kupactulajdonsg fenntartst biztostja. A 8.3. alfejezetben
ismertetjk, hogy milyen mdon lehet egy tetszleges tmbbl kupacot pteni. Mindezek ismeretben
a 8.4. alfejezetben adjuk meg a kupacrendezst megvalst algoritmust.
1 Angolul:
heapsort
258
8.1. Defincik
Annak rdekben, hogy a kupac fogalmt rtelmezni tudjuk, elszr nhny ms adatszerkezetet kell
definilnunk. Ezeket most nem teljes precizitssal tesszk meg, az Algoritmusok, adatszerkezetek II.
jegyzetben adjuk meg ezek pontosabb s rszletesebb bemutatst.
Binris fnak 2 neveznk egy olyan adatszerkezetet, amelyben minden egyes elemnek (ms szval
cscsnak) legfeljebb kt gyermeke van. A gyermek elemek kztt megklnbztetjk a bal- s jobboldali
gyermeket. A binris fnak egyetlen gykere van, melyet brzolsnl a valdi fkkal ellenttben fell
jelentnk meg. Azokat a cscsokat, amelyeknek egyetlen gyermeke sincs, leveleknek nevezzk. rtelem
szerint ezeket brzoljuk a fa legaljn. A binris fa magassga alatt a levelekbl gykrbe vezet utak
kzl a leghosszabb hosszt rtjk.
A 8.1. brn bemutatunk egy binris ft. Ennek gykerben a 8 van eltrolva, melyet kk sznnel
emeltnk ki. A gykr elemnek kt gyermeke van: baloldali gyermeke a kettes s a jobboldali gyermeke
a hrmas rtket tartalmaz cscs. Lthat a pldbl, hogy minden cscsnak legfeljebb kt gyermeke
van, de pldul a hrmas s ts rtket tartalmaz cscsoknak csak egy-egy. A hrmas rtk cscsnak
csak jobboldali, mg az ts rtket tartalmaz cscsnak csak baloldali gyermeke van. Azok a cscsok,
amelyeknek egyetlen gyermeke sincs, a levelek. Ezeket vilgoskk kitltssel jelltk. A bemutatott
binris fa magassga 3, mivel a legals levelektl hrom lpsben jutunk el a gykrig.
8
2
4
6
5
9
8.1. bra. Binris fa. A fa tetejn tallhat a fa gykere (kk kitlts), a fa aljn pedig a levelek
(vilgoskk kitlts). A fa hrmas magassg.
A binris fkban szintekrl is beszlhetnk. A 8.1. brn lthat binris fa els szintjn mint
minden ms binris fa esetn is csak a gykr elem tallhat. A msodik szinten kt elem van: a
kettes s a hrmas rtkeket tartalmaz. A harmadik szinten talljuk az egyes, ngyes s ts rtkeket,
a negyedik szinten pedig a hatos, kilences s hetes rtkeket.
Egy binris ft teljes binris fnak tekintnk, ha minden szintjn teljesen kitlttt, azaz az els
szinten egy elem, a msodikon kt elem, a harmadikon ngy elem, az n-ediken pedig 2n1 elem tallhat.
Knnyen belthat, hogy egy teljes binris fban pontosan 2n 1 elem van, ha az n-edik szint a legals. A
teljes binris fkrl az is kijelenthet, hogy minden elemnek pontosan kett vagy nulla gyermeke van, s
minden nulla gyermekkel rendelkez cscs (azaz levl) a legals szinten van. Teljes binris fra mutatunk
be pldt a 8.2. brn.
8
2
1
10
4
13
14
9
12
5
18
19
binary tree
Sergyn Szabolcs
259
budai Egyetem
Neumann Jnos Informatikai Kar
Majdnem teljes binris frl beszlnk, ha csak az als szinten hinyzik elem a teljes binris fbl. A
majdnem teljes balrl kitlttt binris fa pedig olyan majdnem teljes binris fa, melynek az als szintje
balrl jobbra haladva van feltltve.
A 8.3. brn egy majdnem teljes binris ft mutatunk be, a 8.4. brn pedig egy majdnem teljes
balrl kitlttt binris fa lthat.
8
2
10
14
13
12
19
8.3. bra. Majdnem teljes binris fa. A fnak csak a legals szintjn hinyoznak elemek.
8
2
1
10
4
13
14
12
19
8.4. bra. Majdnem teljes balrl kitlttt binris fa. A fnak csak a legals szintjn hinyoznak elemek,
viszont a legals szint balrl van feltltve.
A tovbbiakban csak a majdnem teljes balrl kitlttt binris fkkal foglalkozunk. Ezek a fk tmbkkel reprezentlhatk gy, hogy a fa gykere a tmb els eleme, majd a msodik szint elemei balrl
jobbra haladva a tmb msodik s harmadik elemei, a harmadik szint elemei balrl jobbra haladva a
tmb negyedik, tdik, hatodik s hetedik elemei, s gy tovbb. A 8.5. brn megadtunk egy majdnem
teljes balrl kitlttt binris ft a hozzrendelt indexekkel egytt. Az indexek ismeretben a fa mr egyrtelmen reprezentlhat egy tmbbel. Belthat, hogy minden majdnem teljes balrl kitlttt binris
fnak egyrtelmen megfeleltethet egy tmb, illetve minden tmbnek egyrtelmen megfeleltethet egy
majdnem teljes balrl kitlttt binris fa.
1
x:
14
10
11
12
10
13
12
19
14
10
13
12
19
260
budai Egyetem
Neumann Jnos Informatikai Kar
gyermeke a 2 i index elem, jobboldali gyermeknek indexe pedig 2 i + 1, feltve, hogy van az i-edik
elemnek baloldali s jobboldali gyermeke. Ezt ltalnosan is be tudjuk bizonytani.
Tegyk fel, hogy a k-adik szinten van az i index elem. Ha van az i-edik elemnek baloldali gyermeke,
akkor a k-adik szint biztosan teljesen fel van tltve. Tudjuk, hogy a k-adik szint vgnl a 2k 1 index
elem tallhat. gy a k-adik szinten az i index elem jobb oldaln sszesen 2k 1i darab elem tallhat.
Az i-edik elem bal oldaln pedig i 2k1 1 1 darab elem van a k-adik szinten. A k + 1-edik szinten
az i-edik elem baloldali gyereke eltt pontosan ktszer
annyi elem ll, mint ahny elem a k-adik szinten
volt az i-edik elem eltt, azaz 2 i 2k1 1 1 . Mivel az i-edik elembl gy jutunk el az baloldali
gyermekhez, hogy feltltjk a k-adik szinten i-tl jobbra lv helyeket, majd a k + 1-edik szinten az
i-edik elem baloldali gyermektl balra lv helyeket, aztn pedig mg egyet jobbra lpnk. Ezrt az
i-edik elem baloldali gyermeknek indexe:
i + 2k 1 i + 2 i 2k1 1 1 + 1 = 2 i.
A jobboldali gyermek indexe eggyel nagyobb mint a baloldali gyermek indexe, ezrt az 2 i + 1 lesz
minden esetben, ha ltezik jobboldali gyermek. Mindebbl kvetkezik, hogy az i-edik elem szljnek
indexe pedig bn/2c.
Vegyk szre azt is, hogy egy n elem majdnem teljes balrl kitlttt binris fnak a levelei az
bn/2c + 1 index elemtl az n index elemig tartanak, hiszen az n index elem szlje a legnagyobb
olyan index elem, amely nem levl. A fa gykrelemnek indexe minden esetben az 1.
rdemes lenne azt is megvizsglni, hogy egy n elem majdnem teljes balrl kitlttt binris fnak
hny szintje van. Ha a szintek szmt k-val jelljk, akkor biztos igaz, hogy
2k1 1 < n 2k 1.
Ebbl viszont kvetkezik, hogy
k 1 < log2 (n + 1) k.
Mivel a szintek szma egsz szm, ezrt
k = dlog2 (n + 1)e.
Az eddigi defincik mind szksgesek voltak ahhoz, hogy definilni tudjuk a kupacot. Kupacnak3
nevezzk azt a majdnem teljes balrl kitlttt binris ft, melyben minden elemre igaz, hogy az adott
elem nagyobb rtk mindkt gyermeke rtknl. Ezt a tulajdonsgot kupactulajdonsgnak nevezzk.
Mivel a kupacok majdnem teljes balrl kitlttt binris fk, ezrt tmbkkel reprezentlhatk. gy
a kupactulajdonsg gy is kimondhat, hogy egy n elem kupac tmb reprezentcijban minden 1 s
bn/2c kz es i-re igaz, hogy
x[i] x[2 i],
x[i] x[2 i + 1].
Utbbi termszetesen csak akkor ll fenn az bn/2c-edik elem esetn, ha n pratlan rtk, azaz a kupac
utols eleme a szljnek jobboldali gyermeke, egyb esetben ugyanis kiindexelnnk a tmbbl.
A 8.6. brn bemutatunk egy kupacot binris fa s tmb reprezentcival is.
sszefoglalva: kupacnak tekintjk azt a majdnem teljes balrl kitlttt binris ft, mely teljesti a
kupactulajdonsgot s tmbknt reprezentlhat.
3 Angolul:
heap
Sergyn Szabolcs
261
budai Egyetem
Neumann Jnos Informatikai Kar
16
2
14
10
x:
16
14
10
10
Sergyn Szabolcs
262
budai Egyetem
Neumann Jnos Informatikai Kar
8.2. Kupacols
A kupacrendezs megvalstshoz elszr szksges pr segdalgoritmus megvalstsa. Az els ezek
kzl a kupacols, vagy ms nven a kupactulajdonsg fenntartsa.
A kifejlesztend algoritmus egy olyan tmbt kap bemenetknt, melynek ha nzzk a majdnem teljes
balrl kitlttt binris fa reprezentcijt, akkor az i-edik elem baloldali gyermekbl, mint gykrbl
kiindul rszfa kupacnak tekinthet, valamint az i-edik elem jobboldali gyermekbl, mint gykrbl
kiindul rszfa is teljesti a kupacokkal szembeni elvrsokat. Pldul a 8.7. brn a 4-es s 5-s index
elemekbl, mint gykrbl kiindul rszfk kupacnak tekinthetk. Viszont a 2-es index elembl, mint
gykrbl kiindul rszfa mr nem kupac, hiszen a kettes index elem gyermekei kisebbek nla.
1
7
4
16
14
10
11
10
16
17
18
19
20
12
13
14
15
8.7. bra. A 4-es s az 5-s index elembl, mint gykrbl kiindul rszfk kupacnak tekinthetk,
viszont a 2-es index elemre mr nem teljesl a kupac tulajdonsg.
A kupacols erre a problmra nyjt megoldst, teht ha a 2i index elembl, mint gykrbl indul
rszfa kupac, s a 2 i + 1 index elembl, mint gykrbl indul rszfa is kupac, akkor biztostja, hogy az
i-edik elembl, mint gykrbl indul rszfa is kupac legyen. Ezt gy ri el az algoritmus, hogy kivlasztja
az i, 2 i s 2 i + 1 index elemek kzl a legnagyobb rtkt s ezt cservel az i-edik helyre teszi. Ha
eleve az i-edik elem volt a hrom vizsglt elem kzl a legnagyobb, akkor nincs tovbbi teend. Viszont
ha az i-edik elem valamely gyermeke volt a legnagyobb, akkor az adott gyermek rtke kerl az i-edik
helyre, az i-edik elem pedig az adott gyermek helyre. Ilyenkor azonban az adott gyermek elembl mint
gykrbl indul rszfa mr nem biztos, hogy kupac, ezrt arra rekurzvan meg kell hvni a kupacolst.
A rekurzv hvsok zros idn bell vget rnek, mert a hvsok sorn eljutunk olyan elemhez, ami mr
levl, teht nincs gyermeke.
A 8.1. algoritmusban rjuk le a kupacols konkrt megvalstst. Az algoritmust megvalst eljrs
bemenete az az x tmb, amelyben a kupacolst vgre akarjuk hajtani. Termszetesen az x tmb n mrett
is ismerjk. Meg kell adni a kupac k elemszmt is, amely ltalban megegyezik a tmb mretvel.
Ennek szksgessgt ksbb fogjuk megrteni. Ezeken kvl mg az i index az eljrs bemenete. Az
algoritmusban felttelezzk, hogy a 2 i s 2 i + 1 index elemekbl mint gykrbl indul rszfk mr
kupacok, vagy nem lteznek ezek az elemek.
Az algoritmus 2. s 3. soraiban meghatrozzuk az i index elem bal- s jobboldali gyermekeinek
indexeit. Ezek nem biztos, hogy valdi indexek, ezrt ezt majd vizsglnunk kell. Ezt kveten el kell
dntennk, hogy a fkuszban lv hrom elem kzl (i, 2 i s 2 i + 1 indexek) melyik a legnagyobb.
Ennek rdekben a 4. sorban megnzzk, hogy ltezik-e baloldali gyermek a kupacban (bal k felttel),
illetve ha ltezik, akkor nagyobb-e az x[i] elemnl. Ha ltezik s nagyobb, akkor a baloldali gyermeket
tekintjk maximlisnak, ezrt az indext eltroljuk a max vltozban (ld. 5. sor). Egyb esetben az
i-edik elem lesz az aktulis maximum (ld. 7. sor). Ezt kveten megvizsgljuk, hogy benne van-e a
kupacban az i-edik elem jobboldali gyermeke (jobb k felttel) s nagyobb-e az eddigi maximumnl
(ld. 9. sor). Ha igen, akkor a jobboldali a gyermek a legnagyobb a vizsglt hrom elem kzl, ezrt
ennek az indext troljuk el a max vltozban (ld. 10. sor). A 12. sorban megvizsgljuk, hogy az iedik elem volt-e a legnagyobb. Ha igen, akkor nincs szksg tovbbi teendkre, hiszen a gyermekeibl
mint gykerekbl kiindul rszfkrl tudjuk, hogy kupacok, s az i-edik elembl mint gykrbl indul
rszfa is teljesti a kupac tulajdonsgot. Ha viszont valamelyik gyermeke a hrom vizsglt elem kzl a
Sergyn Szabolcs
263
budai Egyetem
Neumann Jnos Informatikai Kar
(kupac mrete), i
Sergyn Szabolcs
264
budai Egyetem
Neumann Jnos Informatikai Kar
legnagyobb (max 6= i), akkor az adott gyermeket s az i-edik elemet megcserljk (ld. 13. sor). Ekkor az
i-edik elemnl mr minden alatta lv elem kisebb lesz, viszont a csere folytn j rtket kap gyermekre
mr nem biztos, hogy teljesl a kupac tulajdonsg. Ezrt az adott gyermekre vonatkozan rekurzvan
meghvjuk a kupacols eljrst (ld. 14. sor).
8.1. Plda. Nzzk meg, hogy a 8.8a. brn lthat plda esetn miknt tudjuk a kupac tulajdonsgot
fenntartani a 2-es index elem esetn. Lthat, hogy a bal- s jobboldali gyermekekbl mint gykrbl
kiindul rszfk mr eleve teljestik a kupac tulajdonsgot, viszont a 2-es index elemre mr nem teljesl
a kupacokkal szemben vlasztott kvetelmny.
Meghvjuk a Kupacol eljrst olyan mdon, hogy a bemenetek kzl n s k megegyezik, i rtke
pedig 2. Az eljrs kivlasztja a 2-es, 4-es s 5-s index elemek kzl a legnagyobbat, ami most az 5-s
index. A msodik s tdik elem kicserlsre kerl. gy a 2-es index helyre kerl a legnagyobb elem,
illetve a baloldali rszfa mr biztos rendben van (ld. 8.8b. bra). Viszont a jobboldali rszfban a csere
miatt elromolhatott a kupac tulajdonsg teljeslse, ezrt rekurzv mdon meghvsra kerl a Kupacol
eljrs az i = 5 rtkkel.
A rekurzvan hvott eljrs kivlasztja az 5-s, 10-es s 11-es index elemek kzl a legnagyobbat. Ez
a tizedik elem, amit megcserlnk az tdik elemmel. gy az tdik elem a helyre kerlt s a jobboldali
rszfja mr rendben van, viszont a csere miatt most a baloldali rszfban srlhetett a kupactulajdonsg
teljeslse (ld. 8.8c. bra). Emiatt ismt rekurzv hvs kvetkezik az i = 10 paramterrel.
A 10-es index elemnek csak baloldali gyermeke van, ezrt az eljrs a 10-es s 20-as index elemek
kzl vlasztja ki a nagyobbikat. Mivel a huszadik elem nagyobb, ezrt megtrtnik a csere, aminek
kvetkeztben a 10-es index helyen mr biztos j elem ll (ld. 8.8d. bra). Viszont mg egy rekurzv hvs
trtnik, hiszen a 20-as index elembl mint gykrbl indul rszfban elromolhatott a kupactulajdonsg
teljeslse.
Mivel a 20-as index elemnek nincsenek gyermekei, ezrt az eljrs a 20-as index elemet fogja
legnagyobbnak tekinteni, s nem trtnik csere, illetve jabb rekurzv hvs.
A kupacols vget rt, a 2-es index elembl mint gykrbl indul rszfra mr teljesl a kupactulajdonsg.
Futsi id elemzse. Hatrozzuk meg, hogy mennyi a 8.1. algoritmusban rszletezett Kupacol eljrs
futsi ideje. A hrom vizsglt elem kzl a legnagyobb kivlasztsa O(1) lpsben megvalsthat. Majd
a csere, ha szksges, csak hrom rtkadst jelent. Ezrt valjban azt kell megvizsglni, hogy legfeljebb
hny rekurzv hvs trtnik.
Mivel minden rekurzv hvsnl a binris fa eggyel lejjebbi szintjre kerlnk, ezrt a hvsok szma
legfeljebb a fa mlysge lehet. Errl viszont tudjuk, hogy n elem fa esetn dlog2 (n+1)e. gy a kupacols
futsi ideje: T (n) = O (log n).
Sergyn Szabolcs
265
budai Egyetem
Neumann Jnos Informatikai Kar
7
4
14
16
16
17
18
19
20
10
11
10
12
13
14
15
16
4
14
16
17
18
19
20
10
11
10
12
13
14
15
16
4
14
10
16
17
18
19
20
10
11
12
13
14
15
16
4
14
10
16
17
18
19
20
10
11
12
13
14
15
Sergyn Szabolcs
266
budai Egyetem
Neumann Jnos Informatikai Kar
Sergyn Szabolcs
267
budai Egyetem
Neumann Jnos Informatikai Kar
x:
x:
8
2
x:
7
6
Sergyn Szabolcs
268
budai Egyetem
Neumann Jnos Informatikai Kar
x:
9
2
x:
2
6
Sergyn Szabolcs
269
budai Egyetem
Neumann Jnos Informatikai Kar
Futsi id elemzse. Vizsgljuk meg a kupacrendezs 8.3. algoritmusnak futsi idejt. Elszr
meghvjuk a Kupacotpt(e)ljrst, aminek futsi ideje O (n log n)-es. Ezt kveten (n 1)-szer fut
le a ciklus, melyben egy csert hajtunk vgre s meghvjuk az O (n log n) futsi idej Kupacol eljrst.
Ezek alapjn lthat, hogy a kupacrendezs futsi ideje: T (n) = O (n log n)-es.
Sergyn Szabolcs
270
budai Egyetem
Neumann Jnos Informatikai Kar
8
2
x:
9
2
x:
8
2
x:
9
6
Sergyn Szabolcs
271
budai Egyetem
Neumann Jnos Informatikai Kar
x:
x:
5
2
x:
9
3
(f) A hatodik elem a helyre kerlt. Az els t elemet kupacoljuk az els elembl indulva.
Sergyn Szabolcs
272
budai Egyetem
Neumann Jnos Informatikai Kar
x:
x:
2
2
x:
9
3
Sergyn Szabolcs
273
budai Egyetem
Neumann Jnos Informatikai Kar
x:
9
3
Sergyn Szabolcs
274
budai Egyetem
Neumann Jnos Informatikai Kar
Magyar-angol sztr
0-1 htizsk feladat
Algoritmus
Algorithm
Bemenet
Input
Beillesztses rendezs
Insertion sort
Binris fa
Binary tree
Binris keress
Binary search
Buborkrendezs
Bubble sort
Dinamikus programozs
Dynamic programming
Eldnts
Decision
Feljegyzses mdszer
Memoization
Gyorsrendezs
Quicksort
Kimenet
Output
Kivlaszts
Selection
Kivlaszt rendezs
Selection sort
Kupac
Heap
Kupacrendezs
Heapsort
Lineris keress
Linear search
Logaritmikus keress
Logarithmic search
Loklis vltoz
Local variable
Msols
Copy
Metszet
Intersection
Moh algoritmus
Greedy algorithm
Nyers er
Brute force
sszefsl rendezs
Merge sort
sszegzs
Summation
Tmpont elem
Pivot element
275
Tpus
Type
Uni
Union
Vltoz
Variable
Sergyn Szabolcs
276
budai Egyetem
Neumann Jnos Informatikai Kar
Angol-magyar sztr
0-1 knapsack problem
Algorithm
Algoritmus
Binary search
Binris keress
Binary tree
Binris fa
Brute force
Nyers er
Bubble sort
Buborkrendezs
Copy
Msols
Decision
Eldnts
Dynamic programming
Dinamikus programozs
Greedy algorithm
Moh algoritmus
Heap
Kupac
Heapsort
Kupacrendezs
Input
Bemenet
Insertion sort
Beillesztses rendezs
Intersection
Metszet
Linear search
Lineris keress
Local variable
Loklis vltoz
Logarithmic search
Logaritmikus keress
Memoization
Feljegyzses mdszer
Merge sort
sszefsl rendezs
Output
Kimenet
Pivot element
Tmpont elem
Quicksort
Gyorsrendezs
Selection
Kivlaszts
Selection sort
Kivlaszt rendezs
277
Summation
sszegzs
Type
Tpus
Union
Uni
Variable
Vltoz
Sergyn Szabolcs
278
budai Egyetem
Neumann Jnos Informatikai Kar