You are on page 1of 280

NEUMANN JNOS

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.

Szerz: Dr. Sergyn Szabolcs


egyetemi docens
sergyan.szabolcs@nik.uni-obuda.hu

Lektor: Dr. Vmossy Zoltn


egyetemi docens
vamossy.zoltan@nik.uni-obuda.hu

2.0.3. verzi
2016. februr 16.

A jegyzet legfrissebb vltozata letlthet az albbi cmrl:


http://users.nik.uni-obuda.hu/sergyan/Programozas1Jegyzet.pdf

Ez a jegyzet LATEX segtsgvel kszlt.

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

6. Oszd meg s uralkodj! elv algoritmusok


6.1. Maximumkivlaszts . . . . . . . . . . . . .
6.2. sszefsl rendezs . . . . . . . . . . . . .
6.3. Gyorsrendezs . . . . . . . . . . . . . . . . .
6.4. A k-adik legkisebb elem kivlasztsa . . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

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

1.2. Vltozk, tpusok s kifejezsek


Ahogy azt az Euklideszi algoritmus pldjn lttuk, szksges lehet, hogy az algoritmus bemeneteit,
illetve a futsa kzben elll rtkeket, ezek mdosulsait valamilyen mdon eltroljuk. Ezt a clt
szolgljk az n. vltozk4 .
Minden algoritmusban hasznlt vltoznak van valamilyen neve, amellyel egyrtelmen azonostani
tudjuk. Azok a vltozk, amelyek mr az algoritmus kezdetn valamilyen rtket trolnak, az algoritmus
bemeneti vltozi, vagy rviden bemenetei. A bemeneti vltozk rtkei is mdosthatk az algoritmus
futsa sorn. Lteznek olyan vltozk, amelyek csak az algoritmuson belli mveletek elvgzse miatt
szksgesek, ezek az n. loklis vltozk5 . Vannak olyan vltozk, amelyekben az algoritmus eredmnyeknt elll rtkeket troljuk, illetve ezeket adja vissza az algoritmus a klvilg fel. Ezek a vltozk a
kimeneti vltozk, vagy rviden kimenetek.
A vltozknak tpusa6 is van. Ez fknt az egyes programozsi nyelvekben fontos, mert ez alapjn
tudja a programozsi nyelv rtelmezje, illetve fordtja, hogy az adott vltoz szmra milyen mret
memrit kell lefoglalni a biztonsgos mkds rdekben. Az algoritmusok lersnl a tpusokat lazbb
mdon kezeljk, mint konkrt programozsi nyelvi implementcik esetn.
Megjegyzs

Az fordt kszti el az algoritmust ler, ltalban magasabb szint programozsi nyelven


megrt forrs kdbl azt a gpi kd programot, amit a szmtgp utastsknt megrt
s vgrehajt.
Jelen jegyzet keretei kztt csak nhny tpust hasznlunk. Az egsz tpus vltozkban egsz
szmok trolhatk. A logikai tpus vltozkban logikai rtk trolhat, azaz rtkk csak igaz vagy
hamis lehet. Ezen kvl hasznlni fogjuk mg a T-vel jellt tpust, ami egy n. ltalnos tpus. Akkor
mondjuk, hogy egy vltoz T tpus, ha benne lnyegben brmilyen rtk eltrolhat. Nhny esetben
a T tpus vltozk esetn megszortst tesznk arra, hogy a vltozknak sszehasonlthatknak kell
lennik, azaz rtelmezett kzttk a < relci. Ilyenkor ezt fel is tntetjk kihangslyozva, hogy T
sszehasonlthat.
Minden egyes vltoznak lehet rtket adni. Ezt pldul a kvetkez mdon jelljk: a 5, ami azt
jelenti, hogy az a rtkl kapja az 5-t. Fontos, hogy csak a bal oldalon lv vltoz kaphat rtket, azaz
az rtkads nem szimmetrikus mvelet. Ezen kvl egy vltoz rtke tadhat egy msik vltoznak
is, ilyenkor az rtk mindkt vltozban trolva van, az eredeti helyrl nem trldik. Pldul a b vltoz
rtke 3, majd kiadjuk a a b utastst. Ilyenkor az a rtke is 3 lesz, a b pedig 3 marad. Egy vltozban
trolt rtk ki is olvashat, kifejezsekben valamint kiratsnl felhasznlhat.
Gyakran elfordul feladat, hogy kt azonos tpus vltozban eltrolt rtket meg kell cserlnk. Ezt
rtkadsok egyms utni elvgzsvel tehetjk meg. A csere megvalstshoz viszont a kt megcserlend rtket tartalmaz vltoz mellett szksges egy harmadik vltoz is, amiben tmenetileg eltroljuk
valamelyik rtket. Az a s b vltozkban trolt rtkek cserjt az albbi mdon valsthatjuk meg:
segd a
ab
b segd
Lthat, hogy kt vltoz cserjt hrom rtkadssal tudjuk csak megoldani s egy tmeneti vltoz
szksges mg hozz. Mivel gyakran kell cserket vgrehajtani, ezrt kln jellst vezetnk be erre
a mveletre. Az a b jelli az a s b vltozban trolt rtkek cserjt, amit a fent ltott mdon
valstunk meg.
A vltozkbl kifejezsek pthetk. Egy szmokat tartalmaz kifejezsben szmokat tartalmaz
vltozk, konkrt szmrtkek s ezeket sszekapcsol matematikai mveletek szerepelhetnek. Kifejezs
pldul a kvetkez:
bal jobb
+ 3.
(1.1)
2
4 Angolul:

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

1.1. tblzat. A negls logikai mvelet rtelmezse.


Kt logikai rtk vagy kifejezs s kapcsolatt is rtelmezzk, ezt a mveletet a szimblummal
jelljk. Kt logikai rtk s kapcsolata pontosan akkor igaz, ha mindkt rtk igaz, ahogy az az 1.2
tblzatban is lthat.
l1 logikai rtke
hamis
hamis
igaz
igaz

l2 logikai rtke
hamis
igaz
hamis
igaz

l1 l2 logikai rtke
hamis
hamis
hamis
igaz

l1 l2 logikai rtke
hamis
igaz
igaz
igaz

1.2. tblzat. Az s () valamint a vagy () kapcsolat rtelmezse, az l1 s l2 logikai tpus vltozk


rtkeinek minden lehetsges varicija esetn.
Kt logikai rtk vagy kifejezs vagy kapcsolatt is rtelmezzk, ezt a mveletet a szimblummal
jelljk. Kt logikai rtk vagy kapcsolata pontosan akkor hamis, ha mindkt rtk hamis, minden ms
esetben igaz, ahogy az az 1.2 tblzatban is lthat.
A logikai kifejezsek, mint minden ms kifejezs balrl jobbra kerl kirtkelsre. gy pldul az
(a = 5) (b > 3) logikai kifejezsben elszr az a = 5, majd a b > 3 kifejezs rtkeldik ki. Abban az
esetben, ha az els kifejezs hamis, akkor az s kapcsolat miatt a teljes kifejezs is biztosan hamis lesz,
teht a msodik kifejezs kirtkelse felesleges. Ezt figyelembe veszi az n. rvidzr kirtkels. Ezek
szerint kt s kapcsolattal sszekttt kifejezsben, ha az els kifejezs rtke hamis, akkor a msodik
kifejezs kirtkelse nem trtnik meg s a teljes kifejezs rtke hamis lesz. Hasonlan kt kifejezs
vagy kapcsolata esetn, ha az els kifejezs igaz, akkor a msodik kifejezs nem kerl kirtkelsre, s a
teljes kifejezs logikai rtke igaz lesz.

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

1.2. bra. Ktdimenzis tmb s indexelse.


Ktdimenzis tmb ltrehozsa is a Ltrehoz ltrehoz utastssal lehetsges, de mretknt meg kell
adni a sorok valamint az oszlopok szmt is. gy az brn lthat tmbt az x Ltrehoz(egsz)[4, 6]
utastssal hozhatjuk ltre.

Sergyn Szabolcs

10

budai Egyetem
Neumann Jnos Informatikai Kar

1.4. Vezrlsi szerkezetek


Az eddigiekben hrom mveletet ismertnk meg. Ezek az rtkads, amikor egy vltozhoz valamilyen
konkrt rtket rendeltnk, illetve a csere, amikor kt vltozban trolt rtkeket megcserlnk. Harmadik mr ismert mveletnk pedig a tmb ltrehozsa, aminek eredmnyeknt ltrejn egy adott tpus
s elemszm j sszetett vltoz. Milyen tovbbi mveletekre van szksgnk ahhoz, hogy sszetett
algoritmusokat ptsnk fel? Az igazat megvallva mr nem sokra, viszont fontos lenne, hogy az eddig
megismert mveleteket valamilyen mdon ssze tudjuk pteni. Az sszeptsek fajtit vezrlsi szerkezeteknek nevezzk, mert ezek adjk meg, hogy az algoritmus vgrehajtsa, annak vezrlse miknt
trtnjen.
Els vezrlsi szerkezetnk a szekvencia. Ez utastsok egyms utni vgrehajtst jelenti. Nzzk
pldaknt az albbi szekvencit:
x Ltrehoz(egsz)[3]
x[1] 5
x[2] 8
x[3] 11
Ngy utastsbl ll ez a szekvencia, melyek egyms utn kerlnek vgrehajtsra. Elsknt ltrehozunk egy egsz tpus hrom elem tmbt, melynek az x nevet adjuk. Ezt kveten a tmb els
elembe eltroljuk az 5 rtket. A tmb msodik helyre a 8 rtk kerl, mg a harmadik eleme 11-gyel
lesz egyenl.
Az algoritmusok lersnl a szekvenciban lv utastsokat ltalban egyms al rjuk. Az utastsokat fentrl lefel haladva sorban hajtjuk vgre. Az utastsok sorrendje nagyon fontos, nzzk meg
pldul, hogy mit eredmnyezne az albbi szekvencia.
x[1] 5
x[2] 8
x[3] 11
x Ltrehoz(egsz)[3]
Ha ilyen sorrendben rnnk a szekvencia elemeit, akkor hibt kvetnnk el. Akkor akarnnk a tmb
egyes elemeinek rtket adni, amikor a tmb mg nem is ltezik, hiszen a tmb ltrehozsa csak a negyedik
utastsban trtnik meg.
Lehetsgnk van arra is, hogy helytakarkossgi okokbl nhny egymst kvet utastst egy
sorba rjunk. Ilyenkor az egy sorba kerl utastsokat pontosvesszvel vlasztjuk el egymstl, ahogy
ez az albbi pldban is lthat.
x Ltrehoz(egsz)[3]
x[1] 5; x[2] 8; x[3] 11
Msodik vezrlsi szerkezetnk az elgazs vagy ms nven szelekci. Ez a vezrlsi szerkezet azt
teszi lehetv, hogy egy utastst, vagy tbb utastsbl felpl szekvencit egy logikai rtk igazsgnak
fggvnyben hajtsunk vgre. Az elgazs lershoz szksgnk van meghatrozott kulcsszavakra is.
Ennek ltalnos formja az albbi.
ha felttel akkor
utasts
elgazs vge
A ha kulcsszt kveten kell lernunk a logikai felttelt ami lehet egy logikai tpus vltoz, vagy
egy logikai rtket eredmnyez kifejezs , majd kvetkezik az akkor kulcssz. j sorban behzssal
adjuk meg azt az utastst, amit vgrehajt az algoritmus abban az esetben, ha a felttel igaz rtk.
Az elgazst egy j lezr sorban behzs nlkl az elgazs vge kulcssz zrja le. A lezrsra azrt
van szksg, mert az utasts helyn akr tbb utasts, pldul egy szekvencia is llhat:
Sergyn Szabolcs

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

Ez teljesen egyenrtk az albbi egymsba gyazott elgazsokkal:


ha a > 0akkor
b a
klnben
ha a < 0akkor
b a
klnben
b0
elgazs vge
elgazs vge
A harmadik vezrlsi szerkezet a ciklus, vagy ms nven iterci. Ez arra ad lehetsget, hogy egy
utasts, vagy utastsok sorozata tbbszr is vgrehajtsra kerljn. Termszetesen a vgrehajtsok
szma nem lehet vgtelen, mert minden algoritmustl elvrjuk, hogy vges sok lpst kveten vget
rjen. A ciklusok lellst ktfle mdon lehet biztostani. Vagy csak addig hajtdnak vgre a cikluson
belli utastsok, amg egy meghatrozott felttel igaz rtk (tesztels ciklus), vagy elre megadjuk az
itercik szmt (szmlls ciklus). Ciklusokbl hrom flt klnbztetnk meg.
Els az n. elltesztels ciklus. Ennl a ciklusba val belps eltt kirtkelsre kerl egy felttel. Ha
a felttel logikai rtke igaz, akkor a cikluson belli els utastsra ugrik a vezrls. Vgrehajtdik az
sszes cikluson belli utasts, majd ismt kirtkelsre kerl a ciklus felttele. Ha a felttel igaz, akkor
jra vgrehajtdnak a cikluson belli utastsok. Amint hamiss vlik a ciklus felttele, akkor a ciklust
kvet utastsnl folytatdik az algoritmus futsa. Az elltesztels ciklusnl hasznlt felttelt a fentiek
rtelmben belpsi s bennmaradsi felttelnek nevezzk. Az elltesztels ciklust az albbi formban
adjuk meg:
ciklus amg felttel
utastsok
ciklus vge
Az Euklideszi algoritmusnl mr lttunk is ilyen ciklust, csak mg nem neveztk elltesztels ciklusnak. Az Euklideszi algoritmus itercija az albbi mdon rhat le, ahol a mod kulcssz a maradkos
oszts opertort jelli:
ciklus amg r 6= 0
mn
nr
r m mod n
ciklus vge
Msik ciklusunk az n. htultesztels ciklus. Ennl a ciklusbennmaradsi felttele a ciklus vgn
van. Ez azt jelenti, hogy a cikluson belli utastsok egyszer biztosan vgrehajtsra kerlnek, majd ezt
kveten kerl kirtkelsre a ciklus felttele. Ha a felttel igaz, akkor az utastsok jra vgrehajtdnak,
majd megint kirtkelsre kerl a felttel. Ha viszont a felttel hamis, akkor a ciklust kvet utastsra
ugrik a vezrls. Ebben az esetben a felttel csak bennmaradsi felttel. A htultesztels ciklusok lersi
mdja:
ciklus
utastsok
amg felttel
A harmadik ciklus az n. szmlls ciklus. Ebben az esetben a ciklusnak van egy ciklusvltozja,
amely egy megadott rtktl egy msik adott rtkig vltozik gy, hogy minden felvett rtke mellett
egyszer lefutnak a cikluson belli utastsok. Lersa a kvetkez mdon trtnik:
ciklus ciklusvltoz kezdetirtk-tl vgrtk-ig
utastsok
ciklus vge
Sergyn Szabolcs

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

1.5. Algoritmusok lersa, pszeudokd


Az elz fejezetekben mr lttuk, hogy mi is az az algoritmus, illetve milyen rszekbl pl fel. Az
eddigieket sszefoglalva most bemutatjuk, hogy miknt rhatunk le egy konkrt algoritmust. A lersra
az n. pszeudokd ot hasznljuk. Mutatunk egy pldt is, a mr megismert Euklideszi algoritmus rszletes
lersval, amit az 1.1. algoritmusban adunk meg. A jegyzetben minden algoritmusnak sajt sorszma
s neve van, amikkel hivatkozhatunk rjuk.
Mivel minden algoritmusnak van bemenete s kimenete, ezrt a lers ezek pontos megadsval trtnik. A bemeneti s kimeneti vltozk nevt s tpust is meghatrozzuk. Ezt kveti az adott algoritmust
megvalst fggvny vagy eljrs megadsa. Azrt van szksg fggvnyekre, illetve eljrsokra, mert
ezeken keresztl egy konkrt algoritmust egy msik algoritmusbl akr meg is hvhatunk (ld. ksbb). Az
algoritmus bemenetei egyben a fggvny vagy eljrs bemenetei is lesznek. A fggvny abban klnbzik
az eljrstl, hogy a fggvnynek van legalbb egy kimenete, mg az eljrsnak nincs ilyen. A fggvny
kimenett a vissza kulcssz hasznlatval adhatjuk meg (ld. 1.1. algoritmus 8. sora). Ha a vezrls a
vissza kulcsszhoz kerl, akkor a fggvny futsa vget is r.
1.1. Algoritmus Euklideszi algoritmus
Bemenet: m egsz, n egsz
Kimenet: n egsz
1: fggvny LNKO(m : egsz, n : egsz)
2:
r m mod n
3:
ciklus amg r 6= 0
4:
mn
5:
nr
6:
r m mod n
7:
ciklus vge
8:
vissza n
9: fggvny vge
Felhasznlt vltozk s fggvnyek
m: Pozitv egsz szm.
n: Pozitv egsz szm, amely kezdetben nem nagyobb m-nl. Az algoritmus vgn ennek a vltoznak az rtke a kt bemeneti vltoz legnagyobb kzs osztjval egyenl.
r: Az aktulis m s n maradkos osztsnak eredmnye.
A fggvnyen vagy eljrson bell a mr korbban megismert algoritmus ler eszkzket hasznljuk.
Ezek az rtkads, tmbltrehozs, illetve a megismert vezrlsi szerkezetek.
A fggvnyt vagy eljrst kveten ismertetjk az algoritmusban hasznlt vltozkat is.
Az Euklideszi algoritmust lerhatjuk fggvny helyett eljrs hasznlatval is, ahogy az 1.2. algoritmusban lthat. Ilyenkor termszetesen nincs a vissza kulcsszval megadott visszatrsi rtke az
eljrsnak. A kimenetet az eljrs egyik paramtern keresztl kapjuk meg, amihez a cmszerint kulcsszt rjuk az adott vltoz el.
Az algoritmusokban lehetsgnk van arra is, hogy egy msik algoritmusban definilt fggvnyt vagy
eljrst meghvjunk. Erre lthatunk egy pldt az 1.3. algoritmusban. Az algoritmus azt vizsglja, hogy
egy tmb mely elemei relatv prmek egy megadott rtkkel. Ennek eldntshez meg kell nzni, hogy a
vizsglt x tmb aktulis elemnek (x[i]) s az rtk vltoznak mi a legnagyobb kzs osztja. Ehhez
meghvjuk az 1.1. Euklideszi algoritmusban definilt LNKO fggvnyt, ahogy ez az 1.3. algoritmus
4. sorban lthat.

Sergyn Szabolcs

15

budai Egyetem
Neumann Jnos Informatikai Kar

1.2. Algoritmus Euklideszi algoritmus (2)


Bemenet: m egsz, n egsz
Kimenet: n egsz
1: eljrs LNKO(m : egsz, cmszerint n : egsz)
2:
r m mod n
3:
ciklus amg r 6= 0
4:
mn
5:
nr
6:
r m mod n
7:
ciklus vge
8: eljrs vge
Felhasznlt vltozk s fggvnyek
m: Pozitv egsz szm.
n: Pozitv egsz szm, amely kezdetben nem nagyobb m-nl. Az algoritmus vgn ennek a vltoznak az rtke a kt bemeneti vltoz legnagyobb kzs osztjval egyenl.
r: Az aktulis m s n maradkos osztsnak eredmnye.

1.3. Algoritmus Relatv prm vizsglat


Bemenet: x egsz tmb, n egsz (tmb mrete), rtk egsz
Kimenet: y logikai tmb
1: fggvny RelatvPrmVizsglat(x : egsz tmb, n : egsz, rtk : egsz)
2:
y Ltrehoz(logikai)[n]
3:
ciklus i 1-tl n-ig
4:
ha LNKO(x[i], rtk) = 1 akkor
5:
y[i] igaz
6:
klnben
7:
y[i] hamis
8:
elgazs vge
9:
ciklus vge
10: fggvny vge
Felhasznlt vltozk s fggvnyek
x: Pozitv egsz rtkeket tartalmaz tmb.
n: Az x tmb elemszma.
rtk: Pozitv egsz szm. Az algoritmusban azt vizsgljuk, hogy az x tmb relatv prmek-e az
rtk szmmal.
y: Kimeneti logikai tpus tmb. Az y tmb i-edik eleme pontosan akkor igaz, ha az x tmb i-edik
eleme relatv prm az rtk-kel.
Ltrehoz(logikai)[n]: Utasts, mely ltrehoz egy n elem logikai tpus tmbt.
LNKO(x[i], rtk): Az 1.1. algoritmusban kifejtett LNKO fggvnyt hvja meg, mely meghatrozza, hogy a x[i]-nek s az rtk-nek mi a legnagyobb kzs osztja.

Sergyn Szabolcs

16

budai Egyetem
Neumann Jnos Informatikai Kar

1.6. Hatkonysg, futsi id elemzse


Lttuk mr, hogy miknt tudunk lerni egy algoritmust. Felmerl viszont, hogy milyen elvrsaink
vannak egy algoritmussal szemben. Rviden tekintsk ezrt t az algoritmusokkal szemben tmasztott
kvetelmnyeket.
Fontos az algoritmus megbzhatsga s kiszmthatsga. Ez alatt azt rtjk, hogy minden lehetsges
bemenet esetn valban azt a kimenetet lltsa el, amit elvrunk az algoritmustl. A kiszmthatsgba
belertjk azt is, hogy egy adott bemenet esetn mindig ugyanazt a kimenetet lltsa el. Ezt ms nven
az algoritmus determinisztikus (elre meghatrozott) viselkedsnek is nevezzk.
A j algoritmusok egyszer ek is. Ez alatt azt rtjk, hogy nem tl krlmnyesek, knnyen megrthetek. Az egyszersg rdekben rdemes az algoritmusokat olyan vltoz nevekkel elltni, amik
alapjn egyrtelm, hogy az adott vltozban milyen adatot is trolunk el. Az egyszersg rdekben
rdemes az algoritmusokat rszekre, n. modulokra osztani. Erre mutat j pldt az 1.3. algoritmus,
ahol a legnagyobb kzs oszt meghatrozst nem rjuk le jra az algoritmuson bell, hanem egy mr
mshol megvalstott fggvnyt hvunk meg. Az 1.3. algoritmus olvasskor nem az kti le a figyelmnket,
hogy a legnagyobb kzs oszt kiszmtsa miknt trtnik, csak azt ltjuk, hogy az adott helyen annak
szmtsa megtrtnik.
Az algoritmusokkal kapcsolatban elvrs mg, hogy hatkonyak legyenek. Ez alatt ltalban kt
klnbz dolgot is rtnk. Egyrszt elvrs, hogy az algoritmus szmtgpes implementcija sorn
minl kevesebb memria, vagy ms httrtr ignye legyen. Ezrt, ha egy algoritmus ugyanazt a feladatot meg tudja oldani egy darab n elem tmb hasznlatval, mg egy msik algoritmusnak ugyanehhez
kt darab n elem tmb is szksges, akkor memria felhasznls tekintetben az elst tekintjk hatkonyabbnak. A hatkonysg fogalmban rtjk azt is, hogy az algoritmus gyorsan fusson le. Persze ennek
meghatrozsa elg nehz, sokszor nagyon szubjektv feladat. A fejezet tovbbi rszben pp ezrt azzal
foglalkozunk, hogy egy algoritmus futsi idejt miknt lehet meghatrozni vagy megbecslni.
Hogyan is lehet egy algoritmus futsi idejt meghatrozni? Els tletnk taln az, hogy az adott
algoritmust egy adott szmtgpen, valamilyen programozsi nyelven lekdoljuk, majd futtatjuk az elkszlt programot. A fut program vgrehajtsi idejt mrve mr meg is tudjuk hatrozni az adott
algoritmus futsi idejt. Ez az egyszernek tn eljrs viszont szmos problmt vet fel. Ha az algoritmusunkat ms gpen vagy ms programozsi nyelven kdoltuk volna, akkor klnbz futsi idt
kapunk. Azt se felejtsk el, hogy egy szmtgpen egyszerre nem csak egy program fut, teht mikzben
a sajt programunk futsi idejt mrjk, nem tudhatjuk, hogy milyen ms programok zavarnak mg
be futs kzben. Ezek miatt ezt az empirikus mdszert elvetjk, az algoritmusok futsi idejt nem gy
hatrozzuk meg.
Msik lehetsgnk annak vizsglata, hogy az adott algoritmus hny darab elemi lpsbl ll. Megnzzk teht, hogy hny rtkads, sszehasonlts, logikai kifejezs kirtkels, fggvny hvs, stb.
trtnik egy algoritmus futsa alatt. Ha nzzk pldul az Euklideszi algoritmust, ott adott bemenetek
mellett ssze tudjuk szmolni ezen mveletek szmt. Viszont azt is ltnunk kell, hogy minden elemi
mvelet vgrehajtsa ms-ms idignnyel rendelkezik. Pldul az m n rtkads esetn annyi trtnik, hogy az m vltozba tmsoldik az n vltoz rtke. Az r m mod n rtkadsnl viszont
elszr ki kell rtkelni az m mod n kifejezst, majd ezt kveten kell az elll rtket az r vltozba
msolni. St az m mod n kifejezs kirtkelse sokkal bonyolultabb mvelet mint egy msols, ezrt
pontosan meg se tudjuk mondani, hogy hnyszor tbb idt ignyel.
Mindebbl az lthat, hogy elg nehz egzakt dolgot mondani egy algoritmus futsi idejrl. Mgis,
miknt tudjuk akkor egy algoritmus futsi idejt megbecslni? A leggyakrabban hasznlt megkzelts
annak vizsglata, hogy a feldolgozand adatok mennyisgnek nvekedsvel miknt nvekszik egy algoritmus futsi ideje. Azt vizsgljuk teht, hogy ha pldul ktszeresre nveljk a feldolgozand adatok
szmt, akkor hnyszorosra nvekszik ettl az algoritmus futsi ideje. Emiatt azt fogjuk vizsglni, hogy
n darab bemeneti adat esetn a futsi id hogyan fgg az n rtktl.
Nzzk egy konkrt pldt! Feladatunk, hogy egy n elem egsz szmokat tartalmaz tmbben
hatrozzuk meg, hny esetben eredmnyez a tmb kt elemnek sszege 0 rtket. Ezt a feladatot valstja
meg az 1.4. algoritmus. Az algoritmus mkdsnek lnyege, hogy minden lehetsges elemprt ellltunk,
amit kt darab egymsba gyazott ciklussal rnk el. Minden egyes elempr esetn megnzzk, hogy az
sszegk 0-e (ld. 5. sor). Ha igen, akkor a db vltoz rtkt amely kezdetben 0 volt nveljk eggyel
(ld. 6. sor). Az algoritmus vgn a db vltoz aktulis rtkt adjuk vissza (ld. 10. sor).

Sergyn Szabolcs

17

budai Egyetem
Neumann Jnos Informatikai Kar

1.4. Algoritmus Nullt eredmnyez elemprok szma


Bemenet: x egsz tmb, n egsz
Kimenet: db egsz
1: fggvny NulltAdElemprokSzma(x : egsz tmb, n : egsz)
2:
db 0
3:
ciklus i 1-tl (n 1)-ig
4:
ciklus j (i + 1)-tl n-ig
5:
ha x[i] + x[j] = 0 akkor
6:
db db + 1
7:
elgazs vge
8:
ciklus vge
9:
ciklus vge
10:
vissza db
11: fggvny vge
Felhasznlt vltozk s fggvnyek
x: A feldolgozand tmb.
n: Az x mrete.
db: Azon x-beli elemprok szma, melyek sszege 0.

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

1.3. bra. A T1 (n) =

9
100

n2 s a T2 (n) = n log2 n fggvnyek grafikonjai.

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 )

Futsi id nagysgrendjnek elnevezse


Konstans
Logaritmikus
Lineris
Logaritmetikus
Ngyzetes
Kbs
Exponencilis

1.3. tblzat. Futsi idk nagysgrendjei s azok elnevezsei

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

2.1. Egyszer programozsi ttelek


2.1.1. Sorozatszmts programozsi ttel
A sorozatszmts programozsi ttel egy tmb (vagy ms nven sorozat) sszes eleme kztt elvgez
egy mveletet, majd a mvelet eredmnyt adja vissza. A ttel hasznlhat pldul egy tmb minden
elemnek sszegzsre, az elemek szorzatnak kiszmtsra. Hasonlan alkalmas egy sorozat elemeinek
unijaknt elll halmaz elksztsre. Gyakori alkalmazsi terlet mg szvegeket tartalmaz tmbelemek egyetlen szvegg trtn sszefzse.
Megjegyzs

A sorozatszmts ttelt a szakirodalom egy rszben sszegzsa ttelknt emltik, mivel


a tmb elemeinek sszegzse is megvalsthat vele. Trgyalsunkban mi az ltalnosabb
feladatra utal nevet vlasztottuk.
a Angolul:

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

A tmb bejrst kveten a 6. sorban visszaadjuk a kiszmtott rtk-et.


2.1. Plda. Az algoritmus mkdst egy konkrt pldn is szemlltetjk, ami a 2.1. brn lthat.
A pldban egy t elem tmb elemeit sszegezzk, gy a figyelembe vett mvelet itt a jl ismert +
mvelet.
x:

x:

i
Kimenet

Kimenet

rtk : 0

rtk : 3

(a) Kiindulsi llapot.


x:

(b) Bejrs 1. lps.


x:

i
Kimenet

Kimenet

rtk : 10

(c) Bejrs 2. lps.


3

rtk : 9

x:

(d) Bejrs 3. lps.


x:

Kimenet

Kimenet

rtk : 18

rtk : 22

(e) Bejrs 4. lps.

(f) Bejrs 5. lps.

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

2.1.2. Eldnts programozsi ttel


Az eldnts1 programozsi ttelt akkor hasznljuk, amikor szeretnnk eldnteni, hogy egy tmbben van-e
legalbb egy adott tulajdonsg elem. Tegyk fel pldul, hogy egy tmbben egsz szmokat trolunk
s szeretnnk megtudni, hogy van-e kzttk legalbb egy pros szm. Ebben az esetben a prossgot
tekintjk a vizsglt tulajdonsgnak.
Az algoritmust megalkothatjuk olyan mdon, hogy a sorozatszmts ttelhez hasonlan vgigjrjuk
az egsz tmbt, s amennyiben tallunk egy adott tulajdonsg elemet, akkor egy logikai vltozt
mely kezdetben hamis volt igaz ra lltjuk. gy minden elemet meg kell vizsglnunk, ami szmos
esetben teljesen felesleges. Ha pldul mr a tmb els elemre teljesl a vizsglt tulajdonsg, akkor
a tmb tbbi elemt nem rdemes vizsglni. Ezen problma kikszblsre egy olyan algoritmust kell
megalkotnunk, amely a tmb elemeinek vizsglatt abbahagyja abban az esetben, ha mr talltunk egy
adott tulajdonsg elemet a tmbben.
Az eldnts problmjt a 2.2. algoritmus oldja meg. Az algoritmus bemenetknt megkapja a vizsglt
tmbt amelynek elemszma is ismert s a vizsglt tulajdonsgot. A tulajdonsgot egy n. tulajdonsg2 fggvnyknt adjuk meg, melyet ltalban P -vel jellnk. A tulajdonsg fggvny logikai rtket ad
vissza, ami igaz vagy hamislehet. Az algoritmusban a tmb bejrst s a tulajdonsg teljeslsnek
vizsglatt a 3. s 5. sorok kztti ciklus valstja meg. A ciklus felttelnek vizsglata eltt a tmb
indexelsre hasznlt i vltoznak kezdeti rtket kell adni, ami a tmb elejrl trtn bejrs miatt 1
lesz (2. sor).
2.2. Algoritmus Eldnts programozsi ttel
Bemenet: x T tmb, n egsz (tmb mrete), P logikai (tulajdonsg)
Kimenet: van logikai
1: fggvny Eldnts(x : T tmb, n : egsz, P : logikai)
2:
i1
3:
ciklus amg (i n) P (x[i])
4:
ii+1
5:
ciklus vge
6:
van (i n)
7:
vissza van
8: fggvny vge
Felhasznlt vltozk s fggvnyek
x: Vizsglt tmb.
n: A tmb mrete.
P : Tulajdonsg fggvny, amely minden T tpus rtk esetn igaz vagy hamis rtket ad vissza.
Az algoritmus P tulajdonsg elem elfordulst vizsglja az x tmbben.
van: Logikai tpus kimeneti vltoz, amely pontosan akkor lesz igaz, ha van P tulajdonsg elem
az x tmbben. Egyb esetben van rtke hamis lesz.
A 3. sorban tallhat ciklusfelttelben kt dolog egyttes teljeslst vizsgljuk. Egyrszt figyelnnk
kell arra, hogy az i vltoz ne legyen nagyobb a tmb n elemszmnl. Ha i mr meghaladn n-t, akkor
egyrszt nem tudnnk indexelsre hasznlni hiszen nem lenne vals indexe a tmbnek , msrszt azt
jelenten, hogy a tmb minden elemt megvizsgltuk, teht teljesen felesleges tovbbi vizsglatot vgezni.
A ciklus flttel msodik tagja azt ellenrzi, hogy az aktulis x[i] tmbelem teljesti-e az P tulajdonsgot.
Amennyiben nem teljesti, akkor tovbb kell vizsgldnunk, ezrt a ciklusmagban nveljk az i index
rtkt (4. sor). Ha viszont x[i] P tulajdonsg, akkor talltunk a tmbben egy P tulajdonsg elemet,
gy nem kell mr tovbbi vizsglatokat vgeznnk.
1 Angolul:
2 Angolul:

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.

2.3. Algoritmus Mdostott eldnts programozsi ttel


Bemenet: x T tmb, n egsz (tmb mrete), P logikai (tulajdonsg)
Kimenet: van logikai
1: fggvny Eldnts_Minden(x : T tmb, n : egsz, P : logikai)
2:
i1
3:
ciklus amg (i n) P (x[i])
4:
ii+1
5:
ciklus vge
6:
van (i > n)
7:
vissza van
8: fggvny vge
Felhasznlt vltozk s fggvnyek
x: Vizsglt tmb.
n: A tmb mrete.
P : Tulajdonsg fggvny, amely minden T tpus rtk esetn igaz vagy hamis rtket ad vissza.
Az algoritmus azt vizsglja, hogy x minden eleme P tulajdonsg-e.
van: Logikai vltoz, amely pontosan akkor igaz, ha minden x-beli elem P tulajdonsg.

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.

(b) Bejrs 2. lps.


Kimenet

x:

x:

van : igaz

(c) Bejrs 3. lps.

(d) Bejrs 4. lps.

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)

Ez az sszehasonlts valstja meg a tulajdonsg vizsglatot A vizsglatot termszetesen csak 1 i


n 1 esetn vgezhetjk el, mert i = n esetn mr a tmbn kvlre is indexelnnk.
A rendezettsg vizsglatot a 2.5. algoritmussal valstjuk meg, melynek lefutst egy konkrt pldn
a 2.3. bra szemllteti.

3 Prm

szmok azok a pozitv egsz szmok, melyeknek pontosan kett klnbz osztjuk van.

Sergyn Szabolcs

25

budai Egyetem
Neumann Jnos Informatikai Kar

2.4. Algoritmus Prm teszt


Bemenet: N egsz (N 2)
Kimenet: prm logikai
1: fggvny PrmTeszt(N : egsz)
2:
i2

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

(a) 1. s 2. elem sszehasonltsa.


x:

10

i+1

15

x:

21

10

15

i+1

10

15

21

10

15

i+1

21

(d) 4. s 5. elem sszehasonltsa.


x:

(b) 2. s 3. elem sszehasonltsa.

(c) 3. s 4. elem sszehasonltsa.

x:

10

15

21

21

Kimenet

rendezett : igaz

i+1

(f) i = 6, a tmb rendezett.

(e) 5. s 6. elem sszehasonltsa.

2.3. bra. Tmb rendezettsgnek vizsglata az eldnts programozsi ttellel.


Sergyn Szabolcs

26

budai Egyetem
Neumann Jnos Informatikai Kar

2.1.3. Kivlaszts programozsi ttel


A kivlaszts4 programozsi ttelt olyan feladatok esetn hasznljuk, amikor tudjuk, hogy egy tmbben
van vizsglt tulajdonsg elem s keressk ennek els elfordulst. Knnyen belthat, hogy a megfelel algoritmus nagyon hasonlt az eldnts ttel megvalstsra. Klnbsg csak abban van, hogy
nem a tulajdonsg legalbb egyszeri teljeslst kell vizsglnunk, hanem az els elforduls indext kell
megadnunk, tudva, hogy legalbb egy elem esetn biztosan teljesl a tulajdonsg.
A ttel megvalstst a 2.6. algoritmus adja meg, amely nagyon hasonl az eldnts ttel 2.2. algoritmushoz. Hrom klnbsg van csak. A ciklus belpsi, illetve bennmaradsi felttelnl (3. sor) nem
kell vizsglnunk, hogy a tmb indexelsre hasznlt i vltoz meghaladja-e mr a tmb mrett, mivel
ez csak akkor llhatna el, ha nem lenne a tmbben P tulajdonsg elem. A ciklusbl akkor lpnk ki,
ha megtalltuk azt az i indexet, amelynl elszr teljesl az P tulajdonsg. A ciklust kveten ezrt az
idx kimeneti vltoz megkapja az aktulis i rtket (6. sor), amit egyben a fggvny visszatrsi rtke
is (7. sor).
2.6. Algoritmus Kivlaszts programozsi ttel
Bemenet: x T tmb, n egsz, P logikai
Kimenet: idx egsz
1: fggvny Kivlaszts(x : T tmb, n : egsz, P : logikai)
2:
i1
3:
ciklus amg P (x[i])
4:
ii+1
5:
ciklus vge
6:
idx i
7:
vissza idx
8: fggvny vge
Felhasznlt vltozk s fggvnyek
x: A vizsglt tmb.
n: Az x tmb mrete.
P : Tulajdonsgfggvny, amely minden T tpus rtke esetn igaz vagy hamis rtket ad vissza.
Az algoritmus az els P tulajdonsg elem indext hatrozza meg.
idx: Az els P tulajdonsg tmbelem indexe.
Futsi id elemzse. Mivel a kivlaszts programozsi ttel az eldnts ttel egyszer mdostsa,
ezrt a futsi idrl is hasonlt mondhatunk, mint az eldnts ttelnl tettk (ld. a 24. oldalon). Azonban a kivlaszts ttel esetn nem kell figyelembe vennnk azt az esetet, amikor nincs a tmbben P
tulajdonsg elem, gy kijelenthet, hogy az tlagos futsi id n2 -del arnyos, azaz ez az algoritmus is
O(n)-es.

4 Angolul:

selection

Sergyn Szabolcs

27

budai Egyetem
Neumann Jnos Informatikai Kar

2.1.4. Lineris keress programozsi ttel


A lineris keress5 programozsi ttelt olyan feladatok megoldsa esetn hasznljuk, amikor meg szeretnnk tudni, hogy egy tmbben van-e valamilyen tulajdonsg elem, s ha van, akkor hol tallhat az els
ilyen. A feladatot meg lehetne oldani gy, hogy elszr egy eldntssel megvizsgljuk a P tulajdonsg
teljeslst, majd ha szksges, akkor egy kivlaszts ttellel megkeressk a tmb els P tulajdonsg
elemt. Ha gy jrnnk el, akkor a tmbt ktszer is bejrnnk a keresett elemig, ami teljesen felesleges,
mert egy bejrssal is megvalsthat a feladat megoldsa. Ehhez is csak az eldnts ttel 2.2. algoritmusnak mdostsa szksges.
Vltoztatni kell egyrszt a kimeneteket, mert P tulajdonsg elem ltezse esetn meg kell adnunk
azt is, hogy van ilyen elem, valamint az els ilyen elem indext is. Msrszt a helyes mkds rdekben
kis mrtkben az algoritmust is mdostanunk kell gy, hogy van igaz rtke esetn visszaadjuk az
aktulis indexet is. A ttelt a 2.7. algoritmus valstja meg.
Az algoritmus a 6. sorig teljes egszben megegyezik az eldnts ttelnl mr megismertekkel. Ezt
kveten hatrozzuk meg annak fggvnyben, hogy talltunk-e P tulajdonsg elemet a tmbben, hogy
csak a van rtkt, vagy emellett a megfelel indexet (idx) is visszaadjuk a klvilgnak.
Megjegyzs

Pszeudokdban lehetsges, hogy a visszatrsi rtkek szma ms s ms, viszont konkrt


programozsi nyelven ltalban egy fggvnynek csak egy visszatrsi rtke lehet. Ilyen
esetben gy is megvalsthatjuk a lineris keress, hogy mindig pontosan egy visszatrsi
rtke lesz. Ha a keresett rtket megtalltuk a tmbben, akkor a tallat helyt, azaz az
idx vltozt adjuk vissza. Ha viszont nincs benne a keresett rtk a tmbben, akkor egy
nem vals indexet, pldul a 0-t adjuk vissza kimenetknt.

2.7. Algoritmus Lineris keress programozsi ttel


Bemenet: x T tmb, n egsz, P logikai
Kimenet: van logikai, idx egsz
1: fggvny LinerisKeress(x : T tmb, n : egsz, P : logikai)
2:
i1
3:
ciklus amg (i n) P (x[i])
4:
ii+1
5:
ciklus vge
6:
van (i n)
7:
ha van akkor
8:
idx i
9:
vissza (van, idx)
10:
klnben
11:
vissza van
12:
elgazs vge
13: fggvny vge
Felhasznlt vltozk s fggvnyek
x: A vizsglt tmb.
n: Az x elemszma.
P : Logikai rtket visszaad tulajdonsg fggvny. Az algoritmusban azt vizsgljuk, hogy az x
tmbnek van-e P tulajdonsg eleme.
van: Logikai rtk. Pontosan akkor igaz az rtke, ha van olyan elem az x tmbben, mely esetn
teljesl a P tulajdonsg.
idx: Csak akkor rtelmezzk, ha van igaz. Ebben az esetben a legkisebb olyan egsz szmot adja
meg, ahnyadik eleme a tmbnek teljesti a P tulajdonsgot.
5 Angolul:

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:

(a) Bejrs 1. lps.

(b) Bejrs 2. lps.


Kimenet

x:

van : igaz, idx : 3

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

2.8. Algoritmus Lineris keress programozsi ttel (konkrt rtk keresse)


Bemenet: x T tmb, n egsz, rtk T
Kimenet: van logikai, idx egsz
1: fggvny LinerisKeress(x : T tmb, n : egsz, rtk : T)
2:
i1
3:
ciklus amg (i n) (x[i] 6= rtk)
4:
ii+1
5:
ciklus vge
6:
van (i n)
7:
ha van akkor
8:
idx i
9:
vissza (van, idx)
10:
klnben
11:
vissza van
12:
elgazs vge
13: fggvny vge
Felhasznlt vltozk s fggvnyek
x: A vizsglt tmb.
n: Az x elemszma.
rtk: Az algoritmusban azt vizsgljuk, hogy az x tmbben megtallhat-e az rtk.
van: Logikai rtk. Pontosan akkor igaz az rtke, ha van az rtk-kel egyez elem az x tmbben.
idx: Csak akkor rtelmezzk, ha van igaz. Ebben az esetben a legkisebb olyan egsz szmot adja
meg, ahnyadik eleme a tmbnek megegyezik az rtk-kel.

Sergyn Szabolcs

30

budai Egyetem
Neumann Jnos Informatikai Kar

2.1.5. Megszmlls programozsi ttel


Feladatunk, hogy egy tmbben meghatrozzuk az adott tulajdonsg elemek szmt. Pldul egy egsz
szmokat tartalmaz tmbben a prosak darabszmt szeretnnk megkapni.
A ttelt a 2.9. algoritmussal valstjuk meg. Bemenetknt a tmbt (x), annak elemszmt (n) s a
tulajdonsg fggvnyt (P ) ismerjk, kimenetknt pedig az adott tulajdonsg elemek szmt (db) kapjuk
vissza.
2.9. Algoritmus Megszmlls programozsi ttel
Bemenet: x T tmb, n egsz (tmb mrete), P logikai (tulajdonsg)
Kimenet: db egsz (darabszm)
1: fggvny Megszmlls(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:
elgazs vge
7:
ciklus vge
8:
vissza db
9: fggvny vge
Felhasznlt vltozk s fggvnyek
x: Feldolgozand tmb.
n: Az x tmb elemszma.
P : Tulajdonsg fggvny.
db: A P tulajdonsg elemek szma x-ben.
Els lpsknt az algoritmus 2. sorban a darabszmot nullra lltjuk. Ezt kveten az algoritmus
3. s 7. sorai kztti ciklussal bejrjuk a teljes tmbt, hogy minden egyes elem esetn megvizsgljuk a
P tulajdonsg teljeslst (4. sor).
Ha az aktulis elem esetn teljesl a vizsglt tulajdonsg, akkor a darabszmot 1-gyel nveljk, amint
az az algoritmus 5. sorban lthat, egyb esetben pedig vltozatlanul hagyjuk.
Az algoritmus vgn a darabszm rtkvel tr vissza a fggvny (8. sor).
2.6. Plda. A 2.5. bra egy 5 elem egsz szmokat tartalmaz tmb esetn szemllteti a pros szmok
darabszmnak meghatrozst. Elszr a db vltozt incializljuk (2.5a. bra), majd bejrjuk a tmbt
s minden elemnl vizsgljuk a tulajdonsg teljeslst (2.5b-2.5f. bra). Ha a vizsglt elem pros, akkor
1-gyel nveljk a db vltozt (2.5c, 2.5e s 2.5f. brk), ha pedig pratlan, akkor db-t vltozatlanul
hagyjuk (2.5b s 2.5d. brk).
Futsi id elemzse. Az algoritmus vgrehajtsa sorn bejrjuk a teljes tmbt s minden elemre
megvizsgljuk a tulajdonsg teljeslst, gy egy n elem tmb esetn n darab tulajdonsg vizsglatot
hajtunk vgre. A db vltozt viszont csak abban az esetben nveljk, amikor a vizsglt tulajdonsg
teljesl. A P tulajdonsgfggvny kirtkelse ltalban tbb idt vesz ignybe, mint db nvelse. gy
a nagyobb futsi idej mvelet mindig vgrehajtdik, ezrt vgs soron a futsi id a tmb mretvel
arnyos, azaz O(n)-es.
Megjegyzs

Abban az esetben, ha nincs P tulajdonsg elem a tmbben, akkor a darabszm rtke


0 lesz. gy az algoritmust akr eldntsre is lehetne hasznlni. Ha a darabszm pozitv,
akkor az eldnts eredmnye igaz, egybknt pedig hamis.
Termszetesen, ha csak eldnts a feladatunk, akkor clszerbb az eldnts programozsi ttelt hasznlni, hiszen az az els P tulajdonsg elem megtallsa esetn befejezi
a tmb bejrst, mg a megszmlls programozsi ttelben minden esetben bejrjuk a
teljes tmbt.

Sergyn Szabolcs

31

budai Egyetem
Neumann Jnos Informatikai Kar

x:

x:

i
Kimenet

Kimenet

db : 0

db : 0

(a) Kiindulsi llapot.


x:

(b) Bejrs 1. lps.


x:

Kimenet

db : 1

db : 1

(c) Bejrs 2. lps.


3

Kimenet

x:

(d) Bejrs 3. lps.


x:

Kimenet

Kimenet

db : 2

db : 3

(e) Bejrs 4. lps.

(f) Bejrs 5. lps.

2.5. bra. Megszmlls programozsi ttel. Az x tmbben meghatrozzuk a pros szmok darabszmt.

Sergyn Szabolcs

32

budai Egyetem
Neumann Jnos Informatikai Kar

2.1.6. Maximumkivlaszts programozsi ttel


A maximumkivlaszts programozsi ttel megadja, hogy egy tmbben melyik az az elem, amelynek a
legnagyobb az rtke. Termszetesen ez a problma csak olyan esetben merlhet fel, amikor a tmbben
egymssal sszehasonlthat elemeket trolunk, azaz olyanokat, amelyek kztt mindig egyrtelmen
megadhat a kztk lv kisebb-nagyobb viszony.
A feladatot gy oldjuk meg, hogy az algoritmus elejn felttelezzk, hogy a tmb els eleme a legnagyobb. (Ez a felttelezs azt is magban foglalja, hogy nem lehet a tmb elem nlkli, mert akkor mr
els elemrl sem beszlhetnk.) Ezt kveten minden elemet megvizsglunk, hogy az rtke nagyobb-e
az t megelz elemek maximumnl, s ha igen, akkor ezentl azt tekintjk a maximlis rtk elemnek.
A ttelt a 2.10. algoritmus rja le.
A 2. sorban a max vltoz megkapja a kezdeti rtkt. A 3. s 7. sorok kztti ciklus biztostja a
tmb bejrst. Vegyk szre, hogy a bejrst a msodik elemnl kezdjk. A 4. sorban tallhat elgazs
felttelben megvizsgljuk, hogy az aktulis x[i] tmbelem nagyobb-e a mr korbban megvizsglt elemek
legnagyobbiknl (x[max]). Ha nagyobb, akkor j maximumot talltunk, ezrt az 5. sorban max j
rtket kap, mgpedig az aktulis indexet. A ciklusbl kilpve minden elemet megvizsgltunk mr, gy a
max vltoz a legnagyobb rtk elem indext tartalmazza, s ezt adjuk vissza kimenetknt a klvilgnak
(8. sor).
2.10. Algoritmus Maximumkivlaszts programozsi ttel.
Bemenet: x T tmb, n egsz (tmb mrete); ahol T sszehasonlthat
Kimenet: max egsz
1: fggvny Maximumkivlaszts(x : T tmb, n : egsz)
2:
max 1
3:
ciklus i 2-tl n-ig
4:
ha x[i] > x[max] akkor
5:
max i
6:
elgazs vge
7:
ciklus vge
8:
vissza max
9: fggvny vge
Felhasznlt vltozk s fggvnyek
x: Legalbb 1 elem tmb, melyben a legnagyobb elemet keressk. Az x tmb elemeinek sszehasonlthatnak kell lennie.
n: Az x tmb mrete
max: A x legnagyobb rtk elemnek indexe. (Ha tbbszr is elfordul a legnagyobb rtk, akkor
max a legkisebb index ilyen elem indexe lesz.)

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

Ha a tmbben tbbszr is elfordul a maximlis elem, akkor az algoritmus a legkisebb


index helyet fogja visszaadni. Ha a 4. sorban tallhat felttelben -re mdostannk a
relcit, akkor a visszaadott index, az elfordul maximumok kzl a legnagyobb index
lenne.

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

(b) A 2. elem vizsglata.

x:

max

(c) A 3. elem vizsglata.

(d) A 4. elem vizsglata.

max

Kimenet

x:

max

x:

(e) Az 5. elem vizsglata.

max

max : 5

(f) A 6. elem vizsglata s a kimenet meghatrozsa.

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

2.2. sszetett programozsi ttelek


2.2.1. Msols programozsi ttel
A msols6 programozsi ttelt olyan esetben hasznljuk, amikor egy tmb minden elemt szeretnnk egy
msik tmbbe tmsolni, vagy egy tmb minden elemnek egy adott fggvny ltal mdostott rtkt
szeretnnk egy msik tmbbe msolni.
A ttel megvalstsa nagyon egyszer, ahogy az a 2.11. algoritmusban is lthat. Egy szmlls ciklussal vgigjrjuk az x tmb minden elemt s az elemek f fggvny ltal mdostott rtkeit tmsoljuk
az y tmb megfelel helyre.
2.11. Algoritmus Msols programozsi ttel
Bemenet: x T tmb, n egsz (tmb mrete), f mvelet
Kimenet: y T tmb
1: fggvny Msols(x : T tmb, n : egsz, f : mvelet)
2:
y Ltrehoz(T)[n]
3:
ciklus i 1-tl n-ig
4:
y[i] f (x[i])
5:
ciklus vge
6:
vissza y
7: fggvny vge
Felhasznlt vltozk s fggvnyek
x: A feldolgozand tmb.
n: Az x tmb mrete.
f : Fggvny, amely az x elemein rtelmezett.
y: Kimeneti, n elem tmb. Minden egyes eleme csak az x tmb megfelel elemtl fgg, az
y[i] = f (x[i]) szably szerint.
Ltrehoz(T)[n]: Utasts, mely ltrehoz egy n elem T tpus tmbt.
2.8. Plda. Tekintsnk egy ngy elem tmbt. Msoljuk t a tmb egyes elemeinek abszolt rtkt
egy msik tmbbe. A feladat megoldst a 2.7. bra szemllteti.
Futsi id elemzse. Mivel minden esetben a tmb sszes elemt egyszer msoljuk t az j tmbbe,
ezrt az algoritmus futsi ideje O(n)-es.

6 Angolul:

copy

Sergyn Szabolcs

35

budai Egyetem
Neumann Jnos Informatikai Kar

x:

-2

-1

x:

-2

i
y:

y:

-1

(b) Bejrs 2. lps.


x:

-2

-1

i
y:

(a) Bejrs 1. lps.


-2

-1

x:

i
y:

(c) Bejrs 3. lps.

(d) Bejrs 4. lps.

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

2.2.2. Kivlogats programozsi ttel


A kivlogats programozsi ttelt olyan feladatok esetn hasznljuk, amikor egy tmb adott tulajdonsg
elemeit szeretnnk kigyjteni, kivlogatni. Pldul egy egsz szmokat tartalmaz tmbbl ki akarjuk
vlogatni azokat, amelyek prosak.
A ttel megoldsra olyan algoritmust adunk, amely bejrja a bemeneti tmbt s egy msik tmbbe
kigyjti az adott tulajdonsg elemeket. A megoldst a 2.12. algoritmusban rjuk le. Az algoritmus
bemenete a feldolgozand x tmb, melynek ismerjk a mrett, illetve a P tulajdonsgfggvny. Az x
tmb P tulajdonsg elemeit egy j y tmbbe gyjti ki az algoritmus, ez a tmb lesz az egyik visszatrsi
rtk is. Az algoritmus elejn mg nem ismerjk az y tmb mrett, ezrt annyi helyet kell lefoglalni
szmra, ami a lehetsges maximlis mrete. Ez a mret megegyezik az x mretvel, hiszen ha x minden
eleme P tulajdonsg, akkor minden elemet kivlogatunk y-ba. Az algoritmusnak mg egy kimenetet
kell szolgltatnia, ugyanis meg kell hatroznia, hogy hny elemet vlogattunk ki az y tmbbe. Ezt db-vel
jelljk s termszetesen megegyezik az x tmb P tulajdonsg elemeinek szmval.
Megjegyzs

Emlkeztetknt jelezzk, hogy a db rtket hatrozza meg a megszmlls ttel is.


Knnyen szrevehet, hogy a kivlogats 2.12. algoritmusa a megszmlls ttel 2.9. algoritmusnak tovbbfejlesztse.
Az algoritmus elejn ltrehozzuk a kimeneti y tmbt n elemmel (2. sor). Ezt kveten nullra lltjuk
a db vltoz rtkt (3. sor), hiszen kezdetben egyetlen P tulajdonsg elemet sem talltunk mg az x
tmbben. A 4. s 9. sorok kztti ciklussal bejrjuk az x tmbt. Megvizsgljuk, hogy a tmb aktulis
eleme teljesti-e a P tulajdonsgot (5. sor). Ha igen, akkor nveljk a db vltoz rtkt (6. sor) s az y
tmb db-edik elembe tmsoljuk az x tmb aktulis elemt (7. sor). A ciklus befejezst kveten db
rtke megegyezik az x tmb P tulajdonsg elemeinek szmval, az y tmbbe pedig kivlogattuk az x
tmb P tulajdonsg elemeit, gy mr csak a kimeneteket kell visszaadni az algoritmusnak (10. sor).
2.12. Algoritmus Kivlogats programozsi ttel
Bemenet: x T tmb, n egsz (tmb mrete), P logikai
Kimenet: y T tmb, db egsz
1: fggvny Kivlogats(x : T tmb, n : egsz, P : logikai)
2:
y Ltrehoz(T)[n]
3:
db 0
4:
ciklus i 1-tl n-ig
5:
ha P (x[i]) akkor
6:
db db + 1
7:
y[db] x[i]
8:
elgazs vge
9:
ciklus vge
10:
vissza (y, db)
11: 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 ki az algoritmus az y tmbbe.
y: Az n elem kimeneti tmb, melynek elemei az x azon elemei, melyek teljestik a P tulajdonsgot.
db: Az y tmb relevns elemeinek szma.
Ltrehoz(T)[n]: Utasts, mely ltrehoz egy n elem T tpus tmbt.
2.9. Plda. Feladatunk, hogy egy hat elem egsz szmokat tartalmaz tmbbl kivlogassuk a pros
szmokat egy j tmbbe. A feladat megoldst a 2.8. brn lthatjuk. A kivlogats ttel alkalmazsval
vgigjrjuk az x tmb elemeit. Az els elem pros szm, ezrt a db vltoz rtkt egyre vltoztatjuk
s az y tmb els helyre bemsoljuk az x tmb els elemt (2.8a. bra). A soron kvetkez kt elem
Sergyn Szabolcs

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:

(d) Bejrs 4. lps.


2

x:

i
4

db
(c) Bejrs 3. lps.

y:

(b) Bejrs 2. lps.

db

x:

db

i
y:

(a) Bejrs 1. lps.


4

db

x:

i
y:

db

db

(e) Bejrs 5. lps.

(f) Bejrs 6. lps.

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.13. Algoritmus Kivlogats programozsi ttel az eredeti tmbben


Bemenet: x T tmb, n egsz (tmb mrete), P logikai
Kimenet: x T tmb, db egsz
1: fggvny KivlogatsHelyben(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 tulajdonsg fggvny. Az x tmb P tulajdonsg elemeit vlogatja ki az algoritmus az x tmb elejre.
db: A kivlogatst kveten az x tmbben az els s a db-edik elemek kztt vannak a relevns
elemek, azaz db a relevns elemek szma.

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:

(d) Bejrs 4. lps.

db
8

(c) Bejrs 3. lps.

db

x:

(b) Bejrs 2. lps.

db
4

(a) Bejrs 1. lps.

x:

db
8

x:

(e) Bejrs 5. lps.

(f) Bejrs 6. lps.

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

2.2.3. Sztvlogats programozsi ttel


A sztvlogats programozsi ttel a kivlaszts ttelhez hasonl feladat megvalstsra alkalmas. Ebben az esetben is adott egy tmb, valamint egy tulajdonsg. Viszont a bemeneti tmb elemeit most
esetben gy szeretnnk sztvlogatni, hogy egy tmbbe kerljenek a megadott tulajdonsg elemek, egy
msik tmbbe pedig a nem olyan tulajdonsgak. Azaz a sztvlogats ttel hasznlata esetn minden
elem bekerl valamely kimeneti tmbbe, gy az elemeket tnyleg sztvlogatjuk a vizsglt tulajdonsgnak
megfelelen.
A ttel megvalstst a 2.15. algoritmus mutatja be. Az algoritmus bemenete az x tmb, melynek
ismert az n elemszma, valamint egy logikai rtket visszaad P tulajdonsgfggvny. Az algoritmus az
y1 tmbbe kivlogatja az x tmb P tulajdonsg elemeit, az y2 tmbbe pedig a nem P tulajdonsgakat.
A kt kimeneti tmbn kvl azt is meg kell adnia az algoritmusnak, hogy melyik kimeneti tmbbe hny
elem kerl, ezeket jellik rendre a db1 s db2 vltozk.
Az algoritmus els lpseknt helyet kell foglalni a memriban az y1 s y2 tmbk szmra. Mivel
nem tudjuk, hogy melyik tmbbe hny elem fog kerlni hiszen nem ismert mg, hogy a bemeneti x
tmb hny P tulajdonsg elemet tartalmaz , ezrt mindkt tmbnek a lehetsges legnagyobb mretet
foglaljuk le, ami megegyezik az x tmb n mretvel (2. s 3. sor). Ezt kveten nullra lltjuk a db1 s
db2 vltozkat, hiszen mg egyetlen elemet sem msoltunk t a kimeneti tmbkbe (4. s 5. sor).
A kimenetek inicializlsa utn a 6. s a 14. sorok kztti ciklussal vgigjrjuk az x tmbt. Megvizsgljuk, hogy a x tmb aktulis eleme P tulajdonsg-e (7. sor). Amennyien x[i] teljesti a vizsglt
tulajdonsgot, akkor az y1 tmbbe kell bemsolni. Ennek rdekben elszr nveljk a y1 tmbben trolt
elemek szmlljt, azaz a db1 vltozt (8. sor), majd y1 megfelel helyre bemsoljuk az aktulis elemet
(9. sor). Ha a vizsglt elem nem P tulajdonsg, akkor hasonl mdon a y2 tmbbe msoljuk az aktulis
elemet (10-12. sor). A ciklus lefutst kveten minden elem bekerlt a neki megfelel kimeneti tmbbe,
ezrt az algoritmus vgn kimenetknt visszaadjuk a kt kimeneti tmbt, valamint a tmbkben eltrolt
relevns elemek szmt (15. sor).
2.11. Plda. Feladatunk, hogy egy hat elem egsz szmokat tartalmaz tmbt sztvlogassunk kt
tmbbe gy, hogy az egyikbe kerljenek a pros szmok, a msikba pedig a pratlan szmok. A feladat
sztvlogats ttellel trtn megoldst a 2.10. bra szemllteti.
Futsi id elemzse. A 2.15. algoritmus minden egyes tmbbeli elemet egyszer vizsgl meg. A
vizsglt elem pedig minden esetben tkerl valamelyik tmbbe. gy kijelenthet, hogy a futsi id
mindig ugyanannyi, mgpedig a bemeneti tmb mretvel arnyos, azaz O(n)-es.
A sztvlogats ttel megismert algoritmusnak htrnya, hogy kt n elem kimeneti tmbt foglalunk le minden esetben. Knnyen belthat az is, hogy a kt tmbbe sszessgben n elemet msolunk,
teht a kimeneti tmbk ktszer annyi helyet foglalnak a memriban, mint amennyire valjban szksg
lenne. Ezen problma feloldsra adhatunk egy olyan megoldst is, amely egyetlen n elem kimeneti
tmbt hasznl, melynek elejre msoljuk a P tulajdonsg elemeket, vgre pedig a nem P tulajdonsgakat.
A sztvlogats ttel egy kimeneti tmbt hasznl megvalstst a 2.16. algoritmus adja meg. A
bemeneti vltozk nem vltoznak meg a 2.15. algoritmusban bemutatotthoz kpest, a kimeneti vltozk
viszont igen. Egyetlen kimeneti tmbnk lesz (y), illetve a db vltozval jelljk, hogy hny P tulajdonsg elemet talltunk az x tmbben. Az algoritmus vgn az y tmb els db darab eleme P tulajdonsg,
a (db + 1)-edik elemtl az utolsig pedig nem P tulajdonsg.
Elszr a memriban helyet kell foglalni a kimeneti y tmb szmra, amelynek elemszma megegyezik a bemeneti x tmb n elemszmval (2. sor).A 2.16. algoritmus vgrehajtsa sorn a db vltoz rtke
mindig megegyezik az utoljra beszrt P tulajdonsg elem indexvel az y tmbben, a jobb vltoz pedig
ugyanezt adja meg a nem P tulajdonsg elemek esetn. gy kezdetben a db-nek 0 a jobb-nak pedig
n + 1 kezdeti rtket kell adni (ld. 3. s 4. sorok). Az inicializl lpseket kveten az 5. s 13. sorok
kztti ciklussal bejrjuk az x tmbt. A cikluson bell megvizsgljuk, hogy az aktulis x[i] elem P
tulajdonsg-e (6. sor). Ha igen, akkor a vizsglt elemet az y tmb elejre kell msolnunk, ezrt megnveljk db rtkt 1-gyel (7. sor), majd az y tmb db-edik helyre bemsoljuk az x[i] elemet (8. sor).
Amennyiben az x aktulis eleme nem volt P tulajdonsg, akkor az elgazs 9. sorban tallhat klnben gba lpnk be, hogy az y tmb vgre msoljuk be x[i]-t. Ekkor a jobb indexel rtkt 1-gyel
cskkentennk kell (10. sor), s y[jobb]-ba msoljuk t x[i]-t. A ciklus vgn, amikor bejrtuk a teljes x
tmbt, mr csak vissza kell adni a kimeneti y s db vltozkat (14. sor).

Sergyn Szabolcs

41

budai Egyetem
Neumann Jnos Informatikai Kar

2.15. Algoritmus Sztvlogats programozsi ttel


Bemenet: x T tmb, n egsz (tmb mrete), P logikai
Kimenet: y1 T tmb, db1 egsz, y2 T tmb, db2 egsz
1: fggvny Sztvlogats(x : T tmb, n : egsz, P : logikai)
2:
y1 Ltrehoz(T)[n]
3:
y2 Ltrehoz(T)[n]
4:
db1 0
5:
db2 0
6:
ciklus i 1-tl n-ig
7:
ha P (x[i]) akkor
8:
db1 db1 + 1
9:
y1 [db1 ] x[i]
10:
klnben
11:
db2 db2 + 1
12:
y2 [db2 ] x[i]
13:
elgazs vge
14:
ciklus vge
15:
vissza(y1 , db1 , y2 , db2 )
16: fggvny vge
Felhasznlt vltozk s fggvnyek
x: A feldolgozand tmb.
n: Az x mrete.
P : Logikai rtk tulajdonsg fggvny. A sztvlogats sorn a P s a nem P tulajdonsg
elemeket vlogatjuk kln.
y1 : n elem tmb, melynek els db1 darab eleme tartalmazza az x tmb P tulajdonsg elemeit.
db1 : Az x tmb P tulajdonsg elemeinek szma.
y2 : n elem tmb, melynek els db2 darab eleme tartalmazza az x tmb nem P tulajdonsg
elemeit.
db2 : Az x tmb nem P tulajdonsg elemeinek szma.
Ltrehoz(T)[n]: Utasts, mely ltrehoz egy n elem T tpus tmbt.

Sergyn Szabolcs

42

budai Egyetem
Neumann Jnos Informatikai Kar

x:

x:

i
y1 :

y1 :

y2 :

db2

(b) Bejrs 2. lps.


2

x:

y1 :

db1
y2 :

db2

(c) Bejrs 3. lps.


4

db2

(d) Bejrs 4. lps.


2

x:

i
4

i
y1 :

db1
y2 :

db2

db1

y1 :

x:

(a) Bejrs 1. lps.

y2 :

db1

y2 :

y1 :

db1

x:

db1
y2 :

db2

db2

(e) Bejrs 5. lps.

(f) Bejrs 6. lps.

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

2.16. Algoritmus Sztvlogats programozsi ttel egyetlen j kimeneti tmbbe


Bemenet: x T tmb, n egsz (tmb mrete), P logikai
Kimenet: y T tmb, db egsz
1: fggvny Sztvlogats(x : T tmb, n : egsz, P : logikai)
2:
y Ltrehoz(T)[n]
3:
db 0
4:
jobb n + 1
5:
ciklus i 1-tl n-ig
6:
ha P (x[i]) akkor
7:
db db + 1
8:
y[db] x[i]
9:
klnben
10:
jobb jobb 1
11:
y[jobb] x[i]
12:
elgazs vge
13:
ciklus vge
14:
vissza(y, db)
15: fggvny vge
Felhasznlt vltozk s fggvnyek
x: A feldolgozand tmb.
n: Az x mrete.
P : Logikai rtk tulajdonsg fggvny. A sztvlogats sorn a P s a nem P tulajdonsg
elemeket vlogatjuk kln.
y: n elem tmb, melynek els db darab eleme tartalmazza az x tmb P tulajdonsg elemeit, a
db + 1 s n indexek kztti elemek pedig az x tmb nem P tulajdonsg elemei.
db: Az x tmb P tulajdonsg elemeinek szma.
jobb: Indexel, amely azt jelli, hogy az y tmb melyik helyre msolunk t egy nem P tulajdonsg
elemet az x tmbbl.
Ltrehoz(T)[n]: Utasts, mely ltrehoz egy n elem T tpus tmbt.

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

(b) Bejrs 2. lps.


2

x:

db

jobb

db

jobb

i
y:

(c) Bejrs 3. lps.

(d) Bejrs 4. lps.

x:

i
y:

x:

(a) Bejrs 1. lps.

y:

db

x:

db

jobb

i
y:

db jobb

(e) Bejrs 5. lps.

(f) Bejrs 6. lps.

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

2.17. Algoritmus Sztvlogats programozsi ttel az eredeti tmbben


Bemenet: x T tmb, n egsz (tmb mrete), P logikai
Kimenet: x T tmb, db egsz
1: fggvny Sztvlogat(cmszerint x : T tmb, n : egsz, P : logikai)
2:
bal 1
3:
jobb n
4:
segd x[1]
5:
ciklus amg bal < jobb
6:
ciklus amg (bal < jobb) P (x[jobb])
7:
jobb jobb 1
8:
ciklus vge
9:
ha bal < jobb akkor
10:
x[bal] x[jobb]
11:
bal bal + 1
12:
ciklus amg (bal < jobb) P (x[bal])
13:
bal bal + 1
14:
ciklus vge
15:
ha bal < jobb akkor
16:
x[jobb] x[bal]
17:
jobb jobb 1
18:
elgazs vge
19:
elgazs vge
20:
ciklus vge
21:
x[bal] segd
22:
ha P (x[bal]) akkor
23:
db bal
24:
klnben
25:
db bal 1
26:
elgazs vge
27:
vissza db
28: fggvny vge
Felhasznlt vltozk s fggvnyek
x: A feldolgozand tmb. Az algoritmus vgn x els db darab eleme P tulajdonsg, a tbbi
pedig nem P tulajdonsg.
n: Az x mrete.
P : Logikai rtk tulajdonsg fggvny.
db: A P tulajdonsg elemek szma az x tmbben.
segd: Segdvltoz, melyben az x tmb els elemt troljuk.
bal: Az x tmb bejrsa sorn az egyik index vltoz. Kezdeti rtke 1, a bejrs kzben pedig
folyamatosan nvekszik az rtke. Az algoritmus sorn mindig igaz, hogy az x tmb bal-nl kisebb
index elemei mr mind P tulajdonsgak.
jobb: Az x tmb bejrsa sorn a msik index vltoz. Kezdeti rtke a tmb mrete, a bejrs
kzben pedig folyamatosan cskken az rtke. Az algoritmus sorn mindig igaz, hogy az x tmb
jobb-nl nagyobb index elemei mr nem P tulajdonsgak.

Sergyn Szabolcs

47

budai Egyetem
Neumann Jnos Informatikai Kar

Vltoz

x:

segd = 4

(a) Els elem kimentse segdvltozba.


Vltoz

x:

segd = 4

jobb

bal

(b) Bejrs 1. lps.

Vltoz

x:

segd = 4

jobb

bal

(c) Bejrs 2. lps.


Vltoz

x:

segd = 4

jobb

bal

(d) Bejrs 3. lps.

Vltoz

x:

segd = 4

segd = 4

jobb

bal

(e) Bejrs 4. lps.


Vltoz

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

(g) Bejrs 6. lps.


Vltoz

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

2.2.4. Metszet programozsi ttel


A metszet7 programozsi ttelt olyan feladatok megoldsa esetn hasznljuk, amikor kt tmbbl a
kzs elemeket ki kell vlogatni egy harmadik tmbbe. Pldul ismert, hogy egy osztly tanuli kzl
kik jrnak nekkarra, illetve kosrlabdzni, s szeretnnk meghatrozni azon tanulkat, akik nekkarra
s kosrlabdzni is jrnak.
A kt tmb kzs elemeinek kivlogatst kt korbban mr trgyalt programozsi ttel sszeptsvel valstjuk meg. Az egyik bemeneti tmb minden egyes elemre megvizsgljuk, hogy benne van-e a
msik bemeneti tmbben is. Ez a vizsglat lnyegben egy eldnts ttel. Az els bemeneti tmb azon
elemeit, amelyek bent vannak a msik bemeneti tmbben is (teht teljestik ezt a tulajdonsgot), kivlogatjuk a kimeneti tmbbe. Ez pedig egy kivlogats ttelt jelent. A problma ilyen jelleg megvalstst
a 2.18. algoritmus rja le.
2.18. Algoritmus Metszet programozsi ttel
Bemenet: x1 T tmb, n1 egsz (tmb mrete), x2 T tmb, n2 egsz (tmb mrete)
Kimenet: y T tmb, db egsz
1: fggvny Metszet(x1 : T tmb, n1 : egsz, x2 : T tmb, n2 : egsz)
2:
y Ltrehoz(T)[n1 ]
3:
db 0
4:
ciklus i 1-tl n1 -ig
5:
j1
6:
ciklus amg (j n2 ) (x1 [i] 6= x2 [j])
7:
j j+1
8:
ciklus vge
9:
ha j n2 akkor
10:
db db + 1
11:
y[db] x1 [i]
12:
elgazs vge
13:
ciklus vge
14:
vissza (y, db)
15: fggvny vge
Felhasznlt vltozk s fggvnyek
x1 : Egyik bemeneti tmb.
n1 : Az x1 tmb mrete.
x2 : Msik bemeneti tmb.
n2 : Az x2 tmb mrete.
y: Kimeneti tmb, melynek elemei az x1 tmb azon elemei, amik benne vannak az x2 tmbben is.
db: Az y tmbben a relevns elemek szma, azaz az x1 tmb azon elemeinek szma, amelyek benne
van az x2 tmbben is.
Ltrehoz(T)[n1 ]: Utasts, mely ltrehoz egy n1 elem T tpus tmbt.
Az algoritmus bemenete az x1 s az x2 tmb, melyeknek ismerjk az n1 s az n2 elemszmt is.
Az algoritmus kimenetknt ellltja az y tmbt, melyben a kt bemeneti tmb kzs elemei vannak.
Az algoritmus megvizsglja, hogy az x1 tmb, mely eleme tallhat meg az x2 tmbben is. Ebbl az
elvbl kvetkezik, hogy a kimeneti tmbnek legfeljebb annyi eleme lehet, mint az x1 tmbnek, ezrt a
memriban ekkora helyet kell lefoglalni neki. Szksges viszont mg egy kimeneti vltoz, hiszen meg
kell adnunk, hogy hny kzs elemet talltunk a kt bemeneti tmbben. Ezt az adatot a db kimeneti
vltoz adja meg, gy az y tmb els db darab eleme szolgltat valdi informcit.
Ahogy mr emltettk a kivlogats ttel s az eldnts ttel egybeptsvel valstjuk meg az algoritmust. Egy kivlogats ttelt adunk meg gy, hogy a P tulajdonsg vizsglatt egy eldnts ttel
helyettesti. A kivlogats ttelnek megfelelen elszr ltrehozzuk n1 elem tmbknt az y tmbt
(2. sor), valamint inicializljuk a db vltozt (3. sor). A 4. s 13. sorok kztti ciklussal bejrjuk az x1
tmbt.
7 Angolul:

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:

(c) x1 [2] keresse az x2 tmbben, 1. lps. Mivel x1 [2] =


x2 [1] teljesl, ezrt x1 [2]-t bemsoljuk az y tmbbe.
x1 :

i
2

x2 :

i
2

db

i
2

(b) x1 [1] keresse az x2 tmbben, 2. lps. Mivel x1 [1] =


x2 [2] teljesl, ezrt x1 [1]-et bemsoljuk az y tmbbe.
x1 :

db

(a) x1 [1] keresse az x2 tmbben, 1. lps. Mivel x1 [1] =


x2 [1] nem teljesl, gy nem msoljuk x1 [1]-et az y tmbbe.

y:

y:

x2 :

x1 :

j
y:

db

db

db

(d) x1 [3] keresse az x2 tmbben, 1. lps.

(e) x1 [3] keresse az x2 tmbben, 2. lps.

(f) x1 [3] keresse az x2 tmbben, 3. lps.

x1 :

x1 :

i
x2 :

x1 :

i
2

x2 :

j
y:

i
x2 :

j
y:

j
2

db

db

(g) x1 [3] keresse az x2 tmbben, 4. lps.

(h) x1 [4] keresse az x2 tmbben, 1. lps.

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

2.19. Algoritmus Kzs elem ltezsnek vizsglata


Bemenet: x1 T tmb, n1 egsz (tmb mrete), x2 T tmb, n2 egsz (tmb mrete)
Kimenet: van logikai
1: fggvny KzsElemEldntse(x1 : T tmb, n1 : egsz, x2 : T tmb, n2 : T tmb)
2:
i1
3:
van hamis
4:
ciklus amg (i n1 ) van
5:
j1
6:
ciklus amg (j n2 ) (x1 [i] 6= x2 [j])
7:
j j+1
8:
ciklus vge
9:
ha j n2 akkor
10:
van igaz
11:
klnben
12:
ii+1
13:
elgazs vge
14:
ciklus vge
15:
vissza van
16: fggvny vge
Felhasznlt vltozk s fggvnyek
x1 : Egyik bemeneti tmb.
n1 : Az x1 tmb mrete.
x2 : Msik bemeneti tmb.
n2 : Az x2 tmb mrete.
van: Logikai vltoz, mely pontosan akkor igaz, ha van olyan elem, amely az x1 s az x2 tmbben
is benne van.

Sergyn Szabolcs

53

budai Egyetem
Neumann Jnos Informatikai Kar

2.2.5. Uni programozsi ttel


Az uni8 programozsi ttelt olyan esetben hasznljuk, amikor kt tmbbl ki akarjuk vlogatni az
sszes elfordul elemet, teht azokat, amik akr az egyikben, akr a msikban benne vannak. Ezt
a feladatot gy tudjuk megvalstani, hogy az egyik bemeneti tmb minden egyes elemt tmsoljuk
a kimeneti tmbbe, majd a msik bemeneti tmbnek csak azokat az elemeit msoljuk t a kimeneti
tmbbe, amelyek nincsenek bent a mr korbban teljes egszben tmsolt tmbben. Az uni ttelt a
2.20. algoritmussal valsthatjuk meg.
Az algoritmus bemenete az x1 tmb, melynek ismerjk az elemszmt (n1 ), valamint az x2 tmb az
elemszmval (n2 ). Az algoritmus kimenete az y tmb, mely tartalmazza a bemeneti tmbk minden
elemt, valamint a db vltoz, amely megadja, hogy hny relevns eleme van az y tmbnek.
Az algoritmus 2. sorban ltrehozzuk a kimeneti y tmbt, melynek maximlis elemszma a bemeneti
tmbk elemszmainak sszege. Ezt kveten a 3. s 5. sorok kztti ciklusban megvalstjuk, hogy az
x1 tmb minden eleme bemsoldjon az y tmbbe. A msols vgn az y tmbben n1 darab elem lesz,
ezrt a db vltoznak tadjuk ezt az rtket (6. sor).
Az algoritmus lnyegi rsze ezutn kvetkezik. A 7. s 16. sorok kztti szmlls ciklussal bejrjuk
az x2 tmbt. A tmb minden elemre megvizsgljuk, hogy benne van-e az x1 tmbben is. Ha benne van,
akkor nem kell bemsolni y-ba, ha viszont nincs bent, akkor a msols szksges. Ennek rdekben meg
kell vizsglnunk, hogy x2 [j] benne van-e az x1 tmbben, amihez egy mdostott eldnts ttel hasznlata
szksges. Elszr inicializljuk az i indexel rtkt (8. sor), majd a 9. s 11. sorok kztti ciklussal
bejrjuk az x1 tmbt mindaddig, amg a tmb vgre nem rnk, vagy meg nem talljuk az x2 [j]
elemet az x1 tmbben. A ciklust kveten megvizsgljuk, hogy mirt hagytuk abba a x1 tmb bejrst
(12. sor). Ha i > n1 , akkor az x1 tmbben nincs benne az x2 [j] elem, gy be kell azt msolni az y tmbbe.
Ehhez szksges az y tmb indexeljt eggyel nvelni (13. sor), majd megtrtnhet a tnyleges msols
(14. sor). Az algoritmus vgn vissza kell adnunk az ellltott y tmbt s a bemsolt elemek szmt
megad db vltozt (17. sor).
Futsi id elemzse. Az uni ttel futsi idejnek vizsglatnl lthatjuk, hogy az x1 tmbt minden
esetben tmsoljuk az y tmbbe, ami n1 darab rtkadst jelent. Az algoritmus tovbbi rsznek futsi
ideje fgg attl, hogy milyen elemeket tartalmaz a kt bemeneti tmb. Futsi id szempontjbl legrosszabb esetnek az minsl, ha a x2 tmb egyetlen eleme sincs benne az x1 tmbben. Ilyenkor ugyanis
az x2 tmb minden elemre elvgznk egy eldntst, amely vizsglja, hogy az adott x2 [j] elem benne
van-e x1 -ben. Ez minden j-re n1 darab vizsglatot jelent, teht az x2 tmb minden elemre n2 n1 darab
vizsglatot. gy a futsi id O(n1 n2 )-es lesz.
2.15. Plda. Adott kt egsz szmokat tartalmaz tmb a 2.14. brnak megfelelen. Feladatunk,
hogy lltsuk el a kt tmb unijt. A feladat megoldshoz a 2.20. algoritmust hasznljuk.
Els lpsknt lefoglaljuk a kimeneti y tmb szmra szksges helyet a memriban. Ez a mret
a kt bemeneti tmb mretnek sszege lesz. Ezt kveten az x1 tmb minden elemt tmsoljuk az y
tmbbe, majd a db indexet 4-re lltjuk (ld. 2.14a. bra). Az x1 tmb tmsolst kveten feladatunk
az x2 tmb elemeinek keresse az x1 tmbben, s szksges esetn msols az y tmbbe.
Elszr megvizsgljuk (az eldnts ttel hasznlatval), hogy x2 [1] benne van-e az x1 tmbben. Mivel
x2 [1] = x1 [1], ahogy a 2.14b. brn is lthat, ezrt x2 [1]-et nem msoljuk t y-ba. Az x2 [2] elem keressekor elszr megnzzk, hogy megegyezik-e x1 [1]-gyel (ld. 2.14c. bra). Mivel nem teljesl az egyenlsg,
ezrt az x1 tmbben tovbblpnk a kvetkez elemre (ld. 2.14d. bra). Lthat, hogy x2 [2] = x1 [2],
ezrt az x2 [2] elemet nem kell az y tmbbe bemsolni. Kvetkez lpsknt megvizsgljuk, hogy x2 [3]
benne van-e az x1 tmbben. Nem fogunk egyezsget tallni, ezrt az x1 tmb i indexelje meghaladja
a tmb mrett (ld. 2.14e. bra), ami miatt az x2 [3] elemet bemsoljuk az y tmbbe. A 2.14f. brn
lthat, hogy x2 [4]-et megtalljuk x1 -ben. Az x2 tmb utols elemt nem talljuk meg x1 -ben, ezrt
x2 [5]-t bemsoljuk az y-ba (ld. 2.14g. bra).
8 Angolul:

union

Sergyn Szabolcs

54

budai Egyetem
Neumann Jnos Informatikai Kar

2.20. Algoritmus Uni programozsi ttel


Bemenet: x1 T tmb, n1 egsz (tmb mrete), x2 T tmb, n2 egsz (tmb mrete)
Kimenet: y T tmb, db egsz
1: fggvny Uni(x1 : T tmb, n1 : egsz, x2 : T tmb, n2 : egsz)
2:
y Ltrehoz(T)[n1 + n2 ]
3:
ciklus i 1-tl n1 -ig
4:
y[i] x1 [i]
5:
ciklus vge
6:
db n1
7:
ciklus j 1-tl n2 -ig
8:
i1
9:
ciklus amg (i n1 ) (x1 [i] 6= x2 [j])
10:
ii+1
11:
ciklus vge
12:
ha i > n1 akkor
13:
db db + 1
14:
y[db] x2 [j]
15:
elgazs vge
16:
ciklus vge
17:
vissza (y, db)
18: fggvny vge
Felhasznlt vltozk s fggvnyek
x1 : Egyik bemeneti tmb.
n1 : Az x1 tmb mrete.
x2 : Msik bemeneti tmb.
n2 : Az x2 tmb mrete.
y: 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.

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.

2.14. bra. Uni programozsi ttel.

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.

2.14. bra. Uni programozsi ttel (folyt.).

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.

2.14. bra. Uni programozsi ttel (folyt.).

Megjegyzs

Az uni ttellel kapcsolatban is szrevehetjk, hogy a tbbszr elfordul elemeket nem


pontosan gy kezeli, ahogyan azt a matematikai halmazoknl megismert uni mveletnl
megismertk. Ha van olyan elem, ami tbbszr is elfordul az x1 tmbben, akkor azt
az sszes elfordulsval tmsoljuk az y tmbbe, hiszen a 3. s 5. sorok kztti msols
semmilyen felttelt nem vizsgl, csak msolja az elemeket.
Az x2 tmbben tbbszr elfordul elemekkel mr ms a helyzet. Ha a tbbszrs elem
olyan, hogy x1 -ben is megtallhat, akkor x2 -bl egyszer sem msoljuk t az y tmbbe.
Ha viszont az x2 -ben tbbszr megjelen elem nincs benne az x1 tmbben, akkor minden
elfordulst tmsoljuk az y-ba.
A metszet s az uni ttelnl is lttuk, hogy az ismtld elemek zavart okozhatnak az algoritmusok
mkdsben. Ezrt felmerl bennnk annak az ignye, hogy legyen olyan algoritmusunk, amely egy
tmbbl kiszri az ismtldseket. Erre ad megoldst a 2.21. algoritmus.
Az algoritmus bemenete az x tmb, melynek ismerjk az elemszmt. Kimenetknt az talaktott
x tmbt adjuk vissza, melynek az els db darab eleme nem tartalmaz ismtld elemeket, viszont az
eredeti tmb minden korbbi elemt egyszeres elfordulssal tartalmazza. Termszetesen a db vltoz
rtkt is szolgltatnia kell az algoritmusnak.
Az algoritmus a db vltoz kezdeti rtknek meghatrozsval indul (2. sor). Ez 1 lesz, mivel ha
csak az x els elemt tekintjk, az nem tartalmaz ismtldst. Ezt kveten a tmb sszes tbbi elemre
meg kell vizsglni, hogy az elfordulst megelz helyen megtallhat-e. Ennek rdekben a tmbt
vgigjrjuk a msodik elemtl az utols elemig egy szmlls ciklussal (3-12. sorok), amelyben az i rtke
mindig a vizsglt tmbelem indexe. Az i-edik elemet ssze kell hasonltanunk az els db darab elemmel,
ezt valstja meg a 4. s 7. sorok kztti rsz9 . Ha a bels ciklusbl kilpve a j db felttel igaz, akkor
valamely j esetn az x[i] 6= x[j] felttel vlt hamiss, azaz talltunk olyan elemet az els db darab
elem kztt, amely megegyezik az x[i] elemmel, ezrt x[i]-t nem kell ismtelten eltrolni a tmbben. Ha
viszont j > db teljesl (8. sor), akkor minden megvizsglt j-re az x[i] 6= x[j] felttel igaz volt, teht x[i]
mg nincs benne az talaktott tmb relevns rszben, ezrt be kell oda msolni. Ehhez elszr nveljk
a db rtkt (9. sor) hiszen egy j megtartand elemet talltunk , majd x[i]-t bemsoljuk az adott
helyre.
Az algoritmus vgn az talaktott x tmbt nem kell kln visszaadnunk, mivel cmszerinti paramtertadst hasznltunk. A db vltozt viszont a klvilg fel is elrhetv kell tennnk, ezrt ennek az
rtkvel tr vissza az algoritmus.
9 szrevehetjk,

hogy ez valjban egy eldnts ttel.

Sergyn Szabolcs

58

budai Egyetem
Neumann Jnos Informatikai Kar

2.21. Algoritmus Ismtldsek kiszrse


Bemenet: x T tmb, n egsz (tmb mrete)
Kimenet: x T tmb, db egsz
1: fggvny IsmtldsekKiszrse(cmszerint x : T tmb, n : egsz)
2:
db 1
3:
ciklus i 2-tl n-ig
4:
j1
5:
ciklus amg (j db) (x[i] 6= x[j])
6:
j j+1
7:
ciklus vge
8:
ha j > db akkor
9:
db db + 1
10:
x[db] x[i]
11:
elgazs vge
12:
ciklus vge
13:
vissza db
14: fggvny vge
Felhasznlt vltozk s fggvnyek
x: Tmb, melyet gy alakt t az algoritmus, hogy az ismtld elemek kzl pontosan egy maradjon a tmbben. A tmbt oly mdon alaktjuk t, hogy a megmarad elemek a tmb elejre
kerljenek.
n: Az x tmb mrete.
db: Az x tmbben az talaktst kveten megmarad elemek szma.

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:

(a) A msodik elem vizsglata. Mivel


x[2] = x[1], gy nem kell eltrolni x[2]-t.

db
1

x:

(d) A negyedik elem vizsglata, 1. lps.

db
2

(b) A harmadik elem vizsglata, 1. lps.

(c) A harmadik elem vizsglata, 2. lps.


Mivel j nagyobb mint a korbbi db rtk,
ezrt x[3]-at x[2]-be msoljuk.

x:

db
x:

db
4

x:

(e) A negyedik elem vizsglata, 2. lps.

(f) A negyedik elem vizsglata, 3. lps.


Mivel j nagyobb, mint a korbbi db rtk,
ezrt x[4]-et x[3]-ba msoljuk.

db

db

x:

x:

(g) Az tdik elem vizsglata, 1. lps.

(h) Az tdik elem vizsglata, 2. lps.

db
x:

(i) A hatodik elem vizsglata, 1. lps.

2.15. bra. Ismtldsek kiszrse

Sergyn Szabolcs

60

budai Egyetem
Neumann Jnos Informatikai Kar

2.2.6. sszefuttats programozsi ttel


Az sszefuttats programozsi ttel ugyanarra a problmra ad megoldst, mint az elz fejezetben
bemutatott uni ttel. Adott kt tmb s el kvnunk lltani bellk egy olyan tmbt, mely a kt
bemeneti tmb minden elemt tartalmazza, de lehetleg gy, hogy az ismtldseket (azaz a mindkt
tmbben elfordul elemeket) kiszrjk. Az sszefuttats ttel esetn viszont tbblet informcink van
a kt bemeneti tmbrl, azok ugyanis rendezettek. Viszont a rendezettsg kihasznlsval a megold
algoritmus futsi ideje jelentsen cskkenthet.
Az uni ttel esetn az volt a megoldsunk gondolatmenete, hogy az egyik bemeneti tmb minden
elemt tmsoltuk a kimeneti tmbbe, majd a msik bemeneti tmb elemei kzl csak azokat, amelyek
a korbban bemsolt tmbnek nem elemei. Ehhez a msodik bemeneti tmb minden egyes eleme esetn
vgre kellett hajtanunk egy eldntst, amely megadta, hogy a vizsglt elem benne van-e az els bemeneti
tmbben. Emiatt a jelents szm vizsglat miatt lett az algoritmusunk futsi ideje viszonylag lass.
A bemeneti tmbk rendezettsgt kihasznlva viszont a kt tmbt prhuzamosan is bejrhatjuk.
A bejrst kezdjk mindkt tmb elejrl, azaz legyen mindkt tmbben az aktulis elem az els elem. A
bejrs sorn minden egyes elemprnl vizsgljuk meg, hogy melyikk kisebb. A kisebb rtket msoljuk
be a kimeneti tmb soron kvetkez helyre, majd lpjnk tovbb abban a bemeneti tmbben, ahonnan
a msolst vgeztk. A bejrst addig folytassuk, amg mindkt bemeneti tmb vgre nem rnk. Ez
az tlet vrhatan gyorsabb futst eredmnyez, mint az uni ttelnl ismertetett vltozat, hiszen minden
vizsglat utn egy elem bemsoldik a kimeneti tmbbe s eggyel tovbblpnk az adott tmbben. Az
sszefuttats ttel konkrt megvalstst a 2.22. algoritmus rja le.
Az algoritmus bemenetknt megkapja a kt sszefuttatand nvekv mdon rendezett tmbt, melyeknek termszetesen az elemszmait is ismerjk. Kimenetknt szolgltatja az sszefuttats eredmnyeknt elll tmbt. Errl a tmbrl az algoritmus elejn nem tudjuk, hogy hny eleme lesz, ezrt
lefoglalunk neki a memriban annyi helyet, amennyi maximlisan szksges lehet. Ez a mret a kt
bemeneti tmb mretnek sszege. Mivel csak az algoritmus vgn derl ki, hogy a kimeneti y tmbnek
hny relevns eleme van, ezrt ezek szmt (db) is visszaadja az algoritmus kimenetknt.
Els lpsknt ltre kell hoznunk a kimeneti tmbt (2. sor), majd a tmbk bejrshoz szksges
indexeknek adunk kezdeti rtket (35. sorok). Az x1 bementi tmbt i-vel, x2 -t pedig j-vel indexeljk.
A db vltozban mindig eltroljuk, hogy az adott pontig hny darab elemet msoltunk mr t a kimeneti
y tmbbe, gy egyszerre szmllknt s indexknt is hasznlhat.
Az inicializl lpseket kveten kvetkezik az algoritmus lnyegi rsze, a bemeneti tmbk prhuzamos bejrsa, melyet a 6. s 21. sorok kztti ciklus valst meg. A ciklus addig fut, amg valamelyik
bementi tmbt teljes mrtkben fel nem dolgoztuk, teht amg az i s j index sem haladja meg a megfelel tmb elemszmt. A cikluson bell biztos, hogy egy j elemet fogunk msolni az y tmbbe, vagy
az x1 vagy az x2 tmbbl. Ezrt a db vltoz rtkt eggyel nveljk (7. sor). El kell dntennk, hogy
melyik tmbbl msoljunk elemet az y tmbbe. Hrom klnbz eset llhat el, melyek a bemeneti
tmbk aktulis elemeinek, azaz x1 [i]-nek s x2 [j]-nek az egymshoz val viszonytl fggnek. Ha x1
aktulis eleme a kisebb (8. sor), akkor az els tmbbl msolunk elemet az y-ba, majd az x1 tmb kvetkez elemre lpnk i nvelsvel. Ha viszont az x2 aktulis eleme a kisebb (12. sor), akkor az x2
tmbbl trtnik a msols s itt lpnk tovbb. Harmadik eset, ha a bementi tmbk aktulis elemei
megegyeznek (15. sor), akkor tetszs szerint valamelyik bementi tmbbl (pl. x1 -bl) msolunk y-ba,
majd mindkt tmbben tovbblpnk, teht az i s j indexek rtkt is nveljk eggyel.
Amikor a bejrst megvalst ciklusbl kilpnk, akkor biztos, hogy az egyik tmbnek a vgre
rtnk, hiszen vagy i > n1 vagy j > n2 . Viszont a mg nem teljes mrtkben feldolgozott bemeneti
tmb fennmarad elemeit be kell msolnunk a kimeneti tmbbe, hiszen ezek az elemek mind nagyobbak
a msik tmb sszes elemnl, gy helyk van az y tmbben. Ezt a msolst valstjk meg a 22. s 26.,
valamint a 27. s 31. sorok kztti ciklusok. Ha az x1 tmbnek vannak mg feldolgozatlan elemei, akkor
az els, msik esetben pedig a msodik ciklus valstja meg a htralv elemek y tmbbe msolst.
Az algoritmus vgn mg egyetlen lps szksges, az ellltott kimeneti vltozkat vissza kell adni
a klvilg fel (32. sor).
A bemutatott algoritmus megoldja az sszefuttats feladatt, de az algoritmust ler pszeudokd elg
hossz, valamint els rnzsre bonyolultnak is tnhet az egymst kvet hrom ciklus miatt. Lehetsgnk van viszont arra, hogy a kdot valamelyest egyszerstsk egy kis trkk segtsgvel. Bvtsk ki
mindkt tmbt egy plusz elemmel, melynek rtke biztos, hogy minden a tmbkben elfordul elemnl
nagyobb. (Jelljk ezt az rtket +-nel.) A kibvts miatt a tmbk rendezettsge termszetesen

Sergyn Szabolcs

61

budai Egyetem
Neumann Jnos Informatikai Kar

2.22. Algoritmus 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 sszefuttats(x1 : T rendezett tmb, n1 : egsz, x2 : T rendezett tmb, n2 :
egsz)
2:
y Ltrehoz(T)[n1 + n2 ]
3:
i1
4:
j1
5:
db 0
6:
ciklus amg (i n1 ) (j n2 )
7:
db db + 1
8:
ha x1 [i] < x2 [j] akkor
9:
y[db] x1 [i]
10:
ii+1
11:
klnben
12:
ha x1 [i] > x2 [j] akkor
13:
y[db] x2 [j]
14:
j j+1
15:
klnben
16:
y[db] x1 [i]
17:
ii+1
18:
j j+1
19:
elgazs vge
20:
elgazs vge
21:
ciklus vge
22:
ciklus amg i n1
23:
db db + 1
24:
y[db] x1 [i]
25:
ii+1
26:
ciklus vge
27:
ciklus amg j n2
28:
db db + 1
29:
y[db] x2 [j]
30:
j j+1
31:
ciklus vge
32:
vissza (y, db)
33: 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.

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.

2.16. bra. sszefuttatas programozsi ttel.

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.

2.16. bra. sszefuttats programozsi ttel (folyt.).

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.

2.16. bra. sszefuttats programozsi ttel (folyt.).

Sergyn Szabolcs

66

budai Egyetem
Neumann Jnos Informatikai Kar

2.3. Programozsi ttelek sszeptse


A programozsi ttelek olyan problmkra adnak hatkony, programozk krben ltalban hasznlt
megoldsokat, melyek az algoritmus alkotsi munka sorn gyakran elfordulnak. Szmos problma viszont nem oldhat meg egyetlen programozsi ttel alkalmazsval, vagy a ttelek egyms utni hasznlatval, hanem szksges, hogy a tteleknl megismert tleteket, mdszereket sszeptve hasznljuk.
Ilyen feladat lehet pldul, amikor egy tmb elemei kzl ki kell vlogatnunk az sszes legnagyobb rtk
elem indext. Ehhez egyrszt egy maximumkivlasztst, msrszt egy kivlogatst kell megvalstanunk.
A kt ttelt termszetesen egymst kveten is hasznlhatjuk, viszont ebben az esetben a feldolgozand
tmbt ktszer is vgig kell jrnunk, elszr a maximlis rtk meghatrozsa rdekben, majd a maximlis rtk elemek indexnek kivlogatsa miatt. Ezzel szemben, a kt emltett programozsi ttelt
ssze lehet gy is pteni, hogy csak egyszer kelljen a feldolgozand tmbt bejrni.
Programozsi ttelek sszeptsre csak nhny pldt mutatunk be, nem treksznk a teljessgre, hiszen az sszeptsi lehetsgek szma olyan magas, hogy minden eset bemutatsa tlmutat jelen
jegyzet keretein. A bemutatott algoritmusok ngy csoportra oszthatk. Elsknt a msols ttellel
val sszeptsre mutatunk be kt lehetsget, egyrszt a sorozatszmtssal, msrszt a maximumkivlasztssal trtn sszeptsre. Ezt kveti a megszmols ttellel val sszepts esetn egy eset, a
keresssel trtn sszepts trgyalsa. Harmadik csoport a maximumkivlasztssal val sszepts
lehetsge egy pldn keresztl bemutatva. Vgl a kivlogatssal trtn sszeptsre mutatunk be
hrom lehetsges esetet.
Az egyes sszeptsek elnevezse utal arra, hogy melyik ttelt melyik ttelbe integrljuk. Pldul a
maximumkivlaszts s kivlogats sszeptse alatt azt az esetet rtjk, amikor egy kivlogatson bell
valstunk meg egy maximumkivlasztst. A kivlogats s maximumkivlaszts sszeptse viszont
arra utal, hogy a maximumkivlasztsba ptnk be egy kivlogatst. Teht az elnevezsnl az els tag
a bels, mg a msodik a kls szerkezeti elemre utal.

Sergyn Szabolcs

67

budai Egyetem
Neumann Jnos Informatikai Kar

2.3.1. Msols s sorozatszmts sszeptse


A msols programozsi ttel (ld. 2.2.1. fejezet) egy tmb minden elemt tmsolja egy msik tmbbe
gy, hogy a msols kzben egy adott fggvny esetlegesen mdostst hajt vgre az elemeken. A sorozatszmts ttel (ld. 2.1.1. fejezet) pedig egy tmb elemei kztt vgrehajt egy adott mveletet s az
gy kapott eredmnyt adja vissza kimenetknt. A msols s sorozatszmts ttel sszeptst olyan
esetekben hasznljuk, amikor egy tmb minden elemnek egy megadott fggvnnyel val mdostsnak eredmnyeknt elll j tmb minden eleme kztt vgrehajtunk egy mveletet, s ezen mvelet
eredmnyt keressk. Pldul egy tmb elemeinek abszolt rtkeit kvnjuk sszeadni.
A msols s sorozatszmts sszeptst megvalst algoritmust gy szeretnnk megalkotni, hogy
ne kelljen egymst kveten kt bejrst elvgezni, egyet a msols, egyet pedig a sorozatszmts megvalstsa rdekben. Msrszt olyan megvalstst kvnunk adni, amelynl nem kell a memriban
tmeneti az eredmny szempontjbl feleslegesnek tn tmbt eltrolni. Egy ilyen megvalstst
mutat be a 2.24. algoritmus.
Az algoritmus bemenete az x feldolgozand tmb, melynek elemszmt is ismerjk. Bemenetknt
adjuk meg mg a msols rsznl alkalmazand f fggvnyt (vagy mveletet). Az algoritmus visszatrsi
rtke egyetlen rtk lesz. Az algoritmus megvalstsa sorn ismernnk kell mg, hogy a sorozatszmts
milyen mveletet hajt vgre az elemek kztt, ezt jelli a opertor. Ehhez a mvelethez tartozik egy
kezdeti rtk is (rtk0 ), ahogy ezt a sorozatszmts ttelnl korbban megismertk. A visszaadott
rtk vltozra igaz, hogy
rtk = rtk0 f (x[1]) f (x[2]) . . . f (x[n]) .

(2.4)

2.24. Algoritmus Msols s sorozatszmts sszeptse


Bemenet: x T tmb, n egsz (tmb mrete), f mvelet
Kimenet: rtk T
1: fggvny Msols_Sorozatszmts(x : T tmb, n : egsz, f : mvelet)
2:
rtk rtk0
3:
ciklus i 1-tl n-ig
4:
rtk rtk f (x[i])
5:
ciklus vge
6:
vissza rtk
7: fggvny vge
Felhasznlt vltozk s fggvnyek
x: Feldolgozand tmb.
n: Az x tmb mrete.
f : Fggvny, amely az x elemein rtelmezett.
: Mvelet, amelyet az x tmbbl kpzett sszes f (x[i]) elem kztt hajtunk vgre.
rtk: Az mveletnek a tmb sszes mdostott f (x[i]) elemre val alkalmazst kveten
elll eredmny.
rtk0 : Az alkalmazott mvelettl fgg kiindulsi rtk.
A 2.24. algoritmus lnyegben egyetlen sorban klnbzik a sorozatszmts programozsi ttelt megvalst 2.1. algoritmustl. A 4. sorban a tmb aktulis x[i] eleme helyett, a tmb aktulis elemnek az
f ltal mdostott f (x[i]) rtkt vesszk figyelembe.
2.18. Plda. A 2.17. brn lthat pldban azt kvethetjk nyomon, hogy egy egsz szmokat
tartalmaz t elem tmb esetn miknt lehetsges a szmok abszolt rtkeinek sszegt meghatrozni
a 2.24. algoritmus hasznlatval.

Sergyn Szabolcs

68

budai Egyetem
Neumann Jnos Informatikai Kar

x:

-3

-1

-8

x:

-3

-1

-8

i
Kimenet

Kimenet

rtk : 0

rtk : 3

(a) Kiindulsi llapot.


x:

-3

-1

-8

(b) Bejrs 1. lps.


x:

-3

Kimenet

rtk : 9

rtk : 10

(c) Bejrs 2. lps.


-3

-8

Kimenet

x:

-1

-1

-8

(d) Bejrs 3. lps.


x:

-3

-1

-8

Kimenet

Kimenet

rtk : 18

rtk : 22

(e) Bejrs 4. lps.

(f) Bejrs 5. lps.

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

2.3.2. Msols s maximumkivlaszts sszeptse


A msols s maximumkivlaszts ttelek sszeptst olyan esetekben hasznljuk, amikor egy tmb
elemeinek egy fggvny ltal mdostott rtkei kzl szeretnnk a maximlis rtk elemet kivlasztani. Ezt megvalsthatnnk gy, hogy a msols ttel (ld. 2.2.1. fejezet) alkalmazsval ellltunk egy
j tmbt, melyben az eredeti tmb elemeinek f fggvny ltal mdostott rtkeit troljuk el. Ezt
kveten pedig egy maximumkivlaszts ttel (ld. 2.1.6. fejezet) hasznlatval meghatrozhatnnk a
mdostott rtkeket tartalmaz tmbbl a maximlis rtket s annak els elfordulsi helyt. Ha ezt a
megkzeltst hasznlnnk, akkor kt bejr ciklusra lenne szksgnk, illetve egy tmeneti tmbt is el
kne trolnunk a memriban. Ennl futsi id s memria felhasznls szempontjbl is hatkonyabb
eljrst mutatunk be a 2.25. algoritmusban.
2.25. Algoritmus Msols s maximumkivlaszts sszeptse
Bemenet: x T tmb, n egsz (tmb mrete), f mvelet; ahol T sszehasonlthat
Kimenet: max egsz, maxrtk T
1: fggvny Msols_Maximumkivlaszts(x : T tmb, n : egsz, f : mvelet)
2:
max 1
3:
maxrtk f (x[1])
4:
ciklus i 2-tl n-ig
5:
segd f (x[i])
6:
ha maxrtk < segd akkor
7:
max i
8:
maxrtk segd
9:
elgazs vge
10:
ciklus vge
11:
vissza (max, maxrtk)
12: fggvny vge
Felhasznlt vltozk s fggvnyek
x: Feldolgozand tmb.
n: Az x tmb mrete.
f : Fggvny, amely az x minden egyes elemn rtelmezett. Olyan rtkeket llt el, amelyek
egymssal sszehasonlthatk.
max: A x tmb azon elemnek indexe, mely esetn az f (x[max]) rtk maximlis. Ha tbb ilyen
elem is ltezik, akkor ezek kzl a legkisebb index.
maxrtk: maxrtk = f (x[max])
Az algoritmus bemenete a feldolgozand x tmb, melynek az elemszmt is ismerjk. Ezen kvl
adott mg az az f fggvny, amelyet meghvunk az x tmb minden elemre, majd az f (x[i]) elemek
kzl vlasztjuk ki a maximlis rtk elemet. A max kimeneti vltoz hatrozza meg, hogy mi a
megtallt maximlis elem indexe, azaz f (x[max]) nagyobb vagy egyenl minden ms f (x[i]) rtknl. Az
algoritmus futsa sorn meghatrozzuk a maximlis rtket, ezrt ezt a kiszmtott rtket kimenetknt
is visszaadjuk (maxrtk).
Az algoritmus kezdetn a maximumkivlaszts 2.10. algoritmushoz hasonlan a tmb els elemt
tekintjk maximlisnak, ezrt a max vltozt 1-gyel tesszk egyenlv (ld. 2. sor). Annak rdekben,
hogy az f fggvnyt minl kevesebbszer kelljen meghvni az algoritmus futsa sorn hiszen ennek
a fggvnynek a kirtkelse jelents idbe is telhet , minden egyes tmbelemre pontosan egyetlen
fggvnyhvst valstunk meg. Emiatt az f (x[1]) rtket el kell trolnunk a maxrtk vltozban,
mivel kezdetben az els elemet tekintjk maximlisnak (ld. 3. sor).
Az inicializl lpsek utn kvetkezik a tmb tbbi elemnek a bejrsa, amit a 4. s 10. sorok
kztti szmlls ciklus valst meg. Az f fggvny korbban mr emltett kirtkelsnek minimalizlsa rdekben az aktulis x[i] elem esetn kiszmtjuk s eltroljuk az f (x[i]) rtket (ld. 5. sor).
A 6. sorban megvizsgljuk, hogy az aktulis elem nagyobb-e mint a maxrtk. Ha nagyobb, akkor j
maximlis elemet talltunk, ezrt a max s a maxrtk vltozkat aktualizlnunk kell. Az algoritmus
vgn visszaadjuk a meghatrozott kimeneti rtkeket (ld. 11. sor).

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.26. Algoritmus Msols s maximumkivlaszts sszeptse (mdostott, kevsb hatkony vltozat)


Bemenet: x T tmb, n egsz (tmb mrete), f mvelet; ahol T sszehasonlthat
Kimenet: max egsz
1: fggvny Msols_Maximumkivlaszts_Mdostott(x : T tmb, n : egsz, f : mvelet)
2:
max 1
3:
ciklus i 2-tl n-ig
4:
ha f (x[max]) < f (x[i]) akkor
5:
max i
6:
elgazs vge
7:
ciklus vge
8:
vissza max
9: fggvny vge
Felhasznlt vltozk s fggvnyek
x: A feldolgozand tmb.
n: Az x tmb mrete.
f : Fggvny, amely az x minden egyes elemn rtelmezett. Olyan rtkeket llt el, amelyek
egymssal sszehasonlthatk.
max: Az x azon elemnek indexe, mely esetn az f (x[max]) rtk maximlis. Ha tbb ilyen elem
is ltezik, akkor ezek kzl a legkisebb index.

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

(b) Megkezddik a tmb elemeinek bejrsa, ennek rdekben az i ciklusvltoz rtke 2


lesz. A segd vltozba bekerl a msodik elem ngyzetnek rtke, ami nagyobb, mint
a jelenlegi maxrtk.
Vltoz

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

(e) A 4. elem ngyzete nagyobb, mint x[max] ngyzete.

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

(f) Mdosul a max s a maxrtk rtke is.

Vltoz

x:

-1

-4

-7

max

-8

maxrtk : 49

Vltoz

segd : 81

(g) Az 5. elem ngyzete nagyobb a jelenlegi maxrtk-nl.


Vltoz

x:

-1

-4

-7

max

-8

maxrtk : 81

Vltoz

segd : 81

(h) Ismt mdostani kell a max s a maxrtk vltozkat.

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

2.3.3. Megszmols s keress sszeptse


A 2.1.4. fejezetben megismertk a lineris keress programozsi ttelt, mely arrl adott informcit, hogy
egy tmbben van-e P tulajdonsg elem, s ha van, akkor hol talljuk meg az els ilyet. A megszmols
s keress programozs ttelek sszeptst viszont olyan esetekben hasznljuk, amikor azt szeretnnk
megvizsglni, hogy egy tmbben van-e legalbb k darab P tulajdonsg elem, s ha van, akkor hol
talljuk meg a tmbben a k-adikat. Ezt gy tudjuk megvalstani, hogy a lineris keress programozsi
ttelbe integrlunk egy megszmlls ttelt, azaz a keress sorn folyamatosan szmoljuk a mr megtallt
P tulajdonsg elemeket. A feladatot 2.27. algoritmussal oldjuk meg.
2.27. Algoritmus Megszmols s keress sszeptse
Bemenet: x T tmb, n egsz (tmb mrete), P logikai, k egsz
Kimenet: van logikai, idx egsz
1: fggvny Megszmols_Keress(x : T tmb, n : egsz, P : logikai, k : egsz)
2:
db 0
3:
i0
4:
ciklus amg (i < n) (db < k)
5:
ii+1
6:
ha P (x[i]) akkor
7:
db db + 1
8:
elgazs vge
9:
ciklus vge
10:
van (db = k)
11:
ha van akkor
12:
idx i
13:
vissza (van, idx)
14:
klnben
15:
vissza van
16:
elgazs vge
17: fggvny vge
Felhasznlt vltozk s fggvnyek
x: Feldolgozand tmb.
n: Az x tmb mrete.
P : Tulajdonsgfggvny.
k: Azt vizsgljuk, hogy van-e az x tmbben legalbb k darab P tulajdonsg elem.
van: Logikai tpus vltoz, melynek pontosan akkor igaz az rtke, ha van az x tmbben legalbb
k darab P tulajdonsg elem.
idx: Csak akkor kap rtket, ha a van vltoz igaz rtk. Ebben az esetben megmutatja, hogy
az x hnyadik eleme a k-adik P tulajdonsg elem.
Az algoritmus egyik bemenete a feldolgozand x tmb, melynek ismerjk az elemszmt is. Bemenetknt adjuk meg mg a vizsgland P tulajdonsgot, valamint azt a k rtket, ahnyadik P tulajdonsg
elemet keressk az x tmbben. Az algoritmus van logikai kimenete adja meg, hogy talltunk-e legalbb
k darab P tulajdonsg elemet az x tmbben. Amennyiben van rtke igaz az algoritmus vgn, akkor
visszaadjuk a k-adik P tulajdonsg elem idx indext is. Mg van hamis rtke esetn nem adunk
vissza semmilyen idx rtket.
Az algoritmus elejn, a 2. sorban ltrehozunk egy db vltozt, mely mindig a mr megtallt P tulajdonsg elemek szmt trolja el. Kezdeti rtke termszetesen 0 lesz. A 3. sorban ltrehozzuk az
i vltozt, melyet a tmb bejrsa sorn a tmb indexelsre hasznlunk majd. Kivtelesen kezdeti
rtkknt nullt adunk neki, gy a bejrst megvalst ciklusban els lpsknt mindig i rtkt fogjuk
eggyel nvelni (ld. 5. sor).
Az inicializlsokat kveten megkezdjk az x tmb bejrst, amit a 4. s 9. sorok kztti ciklussal
valstunk meg. A ciklusba val belpsnek, illetve bennmaradsnak kt felttele van. Egyrszt az i < n
felttelnek kell teljeslnie, mivel egyb esetben a cikluson bell i rtknek nvelst kveten mr az
x tmbn kvlre indexelnnk i-vel. Msrszt vizsgljuk, hogy talltunk-e mr k darab P tulajdonsg
elemet a tmbben. Ha mg nem, akkor a db vltoz kisebb lesz a k vltoznl, s tovbb kell folytatnunk
Sergyn Szabolcs

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

van : igaz, idx : 4

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

2.3.4. Maximumkivlaszts s kivlogats sszeptse


A 2.1.6. fejezetben megismert maximumkivlaszts programozsi ttel hasznlatval egy tmbben meghatrozhatjuk, hogy melyik a legnagyobb rtk elem. Abban az esetben ha viszont tbb olyan elem is
van a tmbben, ami a maximlis rtkkel egyenl, akkor ezek kzl egyet, a legkisebb indext adja meg
a 2.10. algoritmus. Ha fontos szmunkra, hogy az sszes maximlis rtk elem indext ismerjk, akkor
ezeket az indexeket ki kell vlogatnunk egy jabb tmbbe. Ezt a problmt a maximumkivlaszts s
kivlogats ttelek sszeptsvel tudjuk megoldani, melyet a 2.28. algoritmussal valstunk meg.
2.28. Algoritmus Maximumkivlaszts s kivlogats sszeptse
Bemenet: x T tmb, n egsz (tmb mrete); ahol T sszehasonlthat
Kimenet: db egsz, y egsz tmb, maxrtk T
1: fggvny Maximumkivlogats(x : T tmb, n : egsz)
2:
y Ltrehoz(egsz)[n]
3:
maxrtk x[1]
4:
db 1
5:
y[db] 1
6:
ciklus i 2-tl n-ig
7:
ha x[i] > maxrtk akkor
8:
maxrtk x[i]
9:
db 1
10:
y[db] i
11:
klnben
12:
ha x[i] = maxrtk akkor
13:
db db + 1
14:
y[db] i
15:
elgazs vge
16:
elgazs vge
17:
ciklus vge
18:
vissza (db, y, maxrtk)
19: fggvny vge
Felhasznlt vltozk s fggvnyek
x: Feldolgozand tmb, melynek elemei sszehasonlthatak.
n: Az x tmb elemeinek szma.
maxrtk: Az x tmbben tallhat maximlis rtk.
db: Az x tmbben a maxrtk rtk elemek szma.
y: Kimeneti n elem tmb. Az els db darab elemben troljuk el azon indexeket, ahol az x
tmbben a maxrtk rtk elemet talljuk. Azaz minden 1 i db esetn x [y[i]] = maxrtk.
Ltrehoz(egsz)[n]: Utasts, mely ltrehoz egy n elem egsz tpus tmbt.
Az algoritmus bemenete a feldolgozand x tmb, melynek elemei sszehasonlthatk, hiszen ms
esetben nem tudnnk vizsglni, hogy melyik elem nagyobb a tbbinl. Termszetesen ismerjk az x
tmb n elemszmt is. Kimenetknt az x tmb maximlis rtk elemeinek az indext adjuk vissza az
y tmbben. Az algoritmus elejn nem tudjuk, hogy hny maximlis rtk elemet fogunk tallni, ezrt
az y mrete az x mretvel lesz azonos. Meg kell azonban hatroznunk, hogy az y tmbben eltrolt
indexek kzl hny darab hordoz valdi informcit. Emiatt szksgnk van mg egy db kimeneti
vltozra is, melynek rtke az algoritmus lefutsa utn megegyezik az x tmb maximlis rtk elemeinek
darabszmval. Az algoritmus vgn az n elem y tmbben az els db darab elem rendelkezik rdemi
informcival.
Els lpsknt ltre kell hoznunk az y tmbt (2. sor), melynek ugyanannyi eleme lesz, mint az x
tmbnek. A ksbbi lpsek logikja nagy mrtkben hasonlt a maximumkivlaszts 2.10. algoritmusnak logikjhoz. Kiindulsknt az els elemet tekintjk maximlisnak, ezrt a maxrtk vltoznak
tadjuk az els elem rtkt (3. sor). Mivel itt egyetlen maximlis rtknk van, ezrt a db vltozt is
egyre lltjuk (4. sor), illetve eltroljuk az y tmbbe a jelenlegi maximlis rtk elem indext, azaz az
1-et (5. sor).
Sergyn Szabolcs

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

A maximumkivlaszts ttel 2.10. algoritmusban nem troltuk el a maximlis rtket,


mivel a maximlis rtk elem indexnek ismeretben a maximlis rtket is meg tudjuk
hatrozni. A 2.28. algoritmusban viszont eltroljuk a maximlis rtket, br ez nem
felttlenl szksges, csak gy kiss ttekinthetbb a kd. Vegyk szre, hogy a maxrtk
vltoz helyett hasznlhattuk volna az x [y[db]] kifejezst is, hiszen az y tmb els db darab
eleme olyan indexeket tartalmaz, amely index elemei az x tmbnek pont a maxrtk
vltozval egyeznek meg. Abban az esetben, ha nem hasznljuk a maxrtk vltozt,
akkor az algoritmus 3. s 8. sorai elhagyhatk a kdbl, illetve kimenetknt sem adjuk
meg a maximlis rtket.
2.21. Plda. A 2.20. brn lthatunk egy pldt, amelyben egy nyolc elem tmbbl vlogatjuk ki
a maximlis rtk elemek indexeit. rdemes megfigyelni, hogy a feldolgozs sorn az y tmbbe hrom
elem is bekerl, majd egy jabb maximlis rtk megtallsakor ezek elvesztik jelentsgket. A bejrs
vgn hrom elem is van az y tmbben, de ezek kzl csak az els kett hordoz relevns informcit.

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

2.3.5. Kivlogats s sorozatszmts sszeptse


A 2.1.1. fejezetben megismert sorozatszmts ttel meghatrozza egy mvelet eredmnyt, ha a mveletet egy tmb elemei kztt hajtjuk vgre. Elllhat viszont olyan feladat is, amikor nem a feldolgozand
tmbnk sszes elemre szeretnnk az adott mveletet elvgezni, hanem csak valamilyen adott P tulajdonsg elemekre. Ebben az esetben eljrhatunk gy, hogy elszr a 2.2.2. fejezetben megismert
kivlogats ttelt alkalmazzuk, azaz kigyjtjk a P tulajdonsg elemeket egy tmeneti tmbbe, majd
az tmeneti tmb minden egyes eleme kztt hajtjuk vgre az adott mveletet. Msik lehetsgnk,
hogy az emltett kt programozsi ttel sszeptsvel valstjuk meg a feladatot. Ezt az utbbi esetet
mutatja be a 2.29. algoritmus.
2.29. Algoritmus Kivlogats s sorozatszmts sszeptse
Bemenet: x T tmb, n egsz (tmb mrete), P logikai
Kimenet: rtk T
1: fggvny Kivlogats_Sorozatszmts(x : T tmb, n : egsz, P : logikai)
2:
rtk rtk0
3:
ciklus i 1-tl n-ig
4:
ha P (x[i]) akkor
5:
rtk rtk x[i]
6:
elgazs vge
7:
ciklus vge
8:
vissza rtk
9: fggvny vge
Felhasznlt vltozk s fggvnyek
x: A feldolgozand tmb.
n: Az x tmb mrete.
P : Tulajdonsgfggvny. Az algoritmusban az x tmb P tulajdonsg elemei kztt vgezzk el
az mveletet.
: T tpus rtkek kztt rtelmezett mvelet.
rtk: Az x tmb minden P tulajdonsg eleme kztt elvgezve az mveletet az elll vgeredmny rtke.
rtk0 : Az mvelethez tartoz kezdeti rtk. Pldul sszeads esetn 0, szorzs esetn pedig 1.
Az algoritmus bemenete a feldolgozand x tmb, melynek ismerjk az elemszmt is. Ezeken kvl
ismerjk mg a vizsgland P tulajdonsgot is. Az algoritmus kimenete az rtk vltoz, melyet gy
kapunk meg, hogy a x tmb P tulajdonsg elemei kztt elvgezzk a megadott mveletet.
Az algoritmus pszeudokdja majdnem teljes egszben megegyezik a sorozatszmts 2.1. algoritmusval, ezrt rszletesen nem ismertetjk az egyes lpseket, csak az egyetlen klnbsgre trnk ki. Az
rtk vltoz 5. sorbeli aktualizlsa eltt meg kell vizsglnunk, hogy az adott x[i] elem teljesti-e a P
tulajdonsgot (4. sor). Az rtk mdostst csak akkor hajtjuk vgre, ha P tulajdonsg az aktulis
tmbelem.
2.22. Plda. A 2.21. brn lthatunk egy pldt arra, hogy a 2.29. algoritmus hasznlatval hogyan
lehet egy tmb pros rtk elemeinek sszegt meghatrozni. Ebben az esetben a P tulajdonsg a
prossg, az elvgzend mvelet az sszeads, mg az rtk0 kezdeti rtk a 0.

Sergyn Szabolcs

80

budai Egyetem
Neumann Jnos Informatikai Kar

Kimenet

x:

rtk : 0

Kimenet

x:

rtk : 0

(a) Els lpsknt inicializljuk az rtk vltozt.


Mivel sszeads az elvgzend mvelet, ezrt 0 lesz
a kiinduls rtk.

(b) Megkezdjk a tmb bejrst. Mivel az els elem


pratlan, ezrt nem kell hozzadni az rtk vltozhoz.

Kimenet

x:

Kimenet

x:

rtk : 6

(c) A msodik elem pros, ezrt hozzadjuk az rtk


vltozhoz.

(d) A harmadik elem pratlan, ezrt nem tesznk


semmit.

Kimenet

x:

rtk : 6

Kimenet

x:

rtk : 14

rtk : 18

(e) A negyedik elem pros, gy nveljk vele az rtk


vltozt.

(f) Az tdik elem is pros, ezt is hozzadjuk az rtk


vltozhoz. Az algoritmus kimenete az elll rtk
lesz.

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

2.3.6. Kivlogats s maximumkivlaszts sszeptse


A kivlogats s maximumkivlaszts programozsi ttelek sszeptst olyan esetekben hasznljuk,
amikor egy tmb adott P tulajdonsg elemei kzl kell a maximlis rtkt kivlasztani. Ezt a feladatot megoldhatnnk gy, hogy elszr kivlogatjuk egy segdtmbbe a P tulajdonsg elemeket, ahogy
ezt a 2.2.2. fejezetben tettk, majd a segdtmbben hajtunk vgre egy a 2.1.6. fejezetben megismert
maximumkivlasztst. Ehhez viszont egyszer be kne jrnunk a bemeneti tmbt, majd a ltrehozott
segdtmbt. Amennyiben a kt emltett programozsi ttelt sszeptjk, akkor olyan megoldst kaphatunk, amely csak egyszer jrja be a bemeneti tmbnket, s a bejrs vgn mr szolgltatja is az
elvrt eredmnyeket. Az sszeptst a 2.30. algoritmussal valstjuk meg.
2.30. Algoritmus Kivlogats s maximumkivlaszts sszeptse
Bemenet: x T tmb, n egsz (tmb mrete), P logikai; ahol T sszehasonlthat
Kimenet: van logikai, max egsz, maxrtk T
1: fggvny Kivlogats_Maximumkivlaszts(x : T tmb, n : egsz, P : logikai)
2:
maxrtk
3:
ciklus i 1-tl n-ig
4:
ha P (x[i]) (x[i] > maxrtk) akkor
5:
max i
6:
maxrtk x[i]
7:
elgazs vge
8:
ciklus vge
9:
van (maxrtk > )
10:
ha van akkor
11:
vissza (van, max, maxrtk)
12:
klnben
13:
vissza van
14:
elgazs vge
15: fggvny vge
Felhasznlt vltozk s fggvnyek
x: A feldolgozand tmb, melynek elemei sszehasonlthatk.
n: Az x tmb mrete.
P : Tulajdonsgfggvny.
van: Logikai rtk, amely pontosan akkor igaz, ha van az x tmbben legalbb egy P tulajdonsg
elem.
max: Ha van az x tmbben P tulajdonsg elem, akkor az ilyen elemek kzl a legnagyobb rtk
indexe. Ha tbb legnagyobb rtk elem is van a P tulajdonsgak kztt, akkor a legelszr
elfordul (legkisebb index) ilyen elem indexe.
maxrtk: Ha van az x tmbben P tulajdonsg elem, akkor az ilyen elemek kzl a legnagyobb
elem rtke.
Az algoritmus bemenete a feldolgozand x tmb, melynek ismerjk az n elemszmt is. Mivel az
elemek kzl majd egy maximlis elemet akarunk kivlasztani, ezrt az elemeknek sszehasonlthatknak
kell lennik. Ismerjk mg a vizsgland P tulajdonsgot is. Az algoritmus els kimenete a van logikai
vltoz. Erre azrt van szksg, mert ha esetleg egyetlen P tulajdonsg elem sincs az x tmbben, akkor
nem tudunk kzttk maximlis rtket sem meghatrozni. Teht a van vltoz pontosan akkor lesz
igaz, ha van legalbb egy P tulajdonsg elem az x tmbben, s csak van igaz rtke esetn fogjuk
a tovbbi kimeneti vltozkat ellltani. Msodik kimeneti vltoznk a max index, mely annak az
x-beli elemnek az indext adja meg, amely elem a P tulajdonsg elemek kztt a legnagyobb rtk.
Amennyiben tbb ilyen maximlis elem is van a bemeneti tmbben, akkor ezek kzl a legels indexe
lesz a max rtke. Az algoritmusban hasznlni fogjuk a maxrtk vltozt is, ezrt azt kimenetknt is
megadhatjuk.
Az algoritmus els lpse, hogy a maxrtk vltoz rtkt -re10 lltjuk. Erre azrt van szksg,
mert a tmb bejrsa sorn ms gondolatmenetet kell kvetnnk, mint amit a maximumkivlaszts ttel
10

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 :

(a) Els lpsknt a maxrtk vltoz megkapja a rtket.


Vltoz

x:

maxrtk :

i
(b) Az els tmbbeli elem nem pros, ezrt nem tesznk vele
semmit.

Vltoz

x:

max

maxrtk : 2

(c) A msodik elem pros s nagyobb, mint a korbbi


maxrtk, ezrt a max felveszi az i rtkt, illetve maxrtk
megkapja az x[2] rtkt.

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

(e) A negyedik elem pratlan, ezrt semmit nem kell tennnk.


Kimenet

Vltoz

x:

max

maxrtk : 6

van : igaz, max : 3, 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

2.3.7. Kivlogats s msols sszeptse


A kivlogats s msols ttel sszeptse egy a korbbiak ismeretben mr nagyon egyszer feladatra
ad megoldst. A 2.2.2. fejezetben megismert kivlogatst gy akarjuk mdostani, hogy ha egy elem P
tulajdonsg, azaz kivlogatsra kerl, akkor ne az elemet, hanem annak valamely f fggvny ltal
mdostott rtkt msoljuk be a kimeneti tmbbe. Ehhez a kivlogats 2.12. algoritmust egyetlen
sorban kell mdostani, amint az a 2.31. algoritmusban lthat.
2.31. Algoritmus Kivlogats s msols sszeptse
Bemenet: x T tmb, n egsz (tmb mrete), P logikai, f mvelet
Kimenet: db egsz, y T tmb
1: fggvny Kivlogats_Msols(x : T tmb, n : egsz, P : logikai, f : mvelet)
2:
y Ltrehoz(T)[n]
3:
db 0
4:
ciklus i 1-tl n-ig
5:
ha P (x[i]) akkor
6:
db db + 1
7:
y[db] f (x[i])
8:
elgazs vge
9:
ciklus vge
10:
vissza (db, y)
11: fggvny vge
Felhasznlt vltozk s fggvnyek
x: Feldolgozand tmb.
n: Az x tmb elemeinek szma.
P : Tulajdonsgfggvny.
f : Mvelet, amely T tulajdonsg elemeken rtelmezett.
db: Az x tmb P tulajdonsg elemeinek szma.
y: Kimeneti n elem tmb. Az y tmb els db darab eleme az x tmb P tulajdonsg elemeibl
az f mvelettel kpzett elem.
Ltrehoz(T)[n]: Utasts, mely ltrehoz egy n elem T tpus tmbt.
2.24. Plda. A 2.23. brn vgig kvethetjk, hogy a ngy elem egszeket tartalmaz x-bl miknt
vlogatjuk ki a pros elemek ngyzett az y tmbbe.

Sergyn Szabolcs

85

budai Egyetem
Neumann Jnos Informatikai Kar

x:

x:

y:

db

16

db

(a) Bejrs 1. lps.


3

(b) Bejrs 2. lps.


x:

i
y:

y:

x:

16

i
y:

64

16

64

db

db

(c) Bejrs 3. lps.

(d) Bejrs 4. lps.

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

3.1. Egyszer csers rendezs


Az egyszer csers rendezs tlete nagyon knnyen megrthet. Elszr megvizsgljuk, hogy a rendezend tmb els eleme kisebb-e a msodik elemnl. Ha kisebb, akkor megfelel a viszonyuk, hiszen nvekv
mdon rendezett tmbt akarunk ltrehozni. Ha viszont a msodik elem kisebb, mint az els, akkor megcserljk a kt elemet, hogy a sorrendjk az elvrsoknak megfelel legyen. Ezt kveten megvizsgljuk
az els s a harmadik elem viszonyt. Ha a harmadik elem kisebb az elsnl, akkor cserlnk, hiszen
elrbb kell lennie a kisebb elemnek. Hasonl vizsglatot vgznk az els s a negyedik elem kztt, majd
ha szksges, akkor cserlnk. Addig folytatjuk a lpseket, amg el nem jutunk odig, hogy mr az els
s az utols tmbelemet hasonltjuk ssze. Termszetesen csak akkor cserlnk, ha az utols elem kisebb
az elsnl. gy vgeredmnyben az els elemet sszehasonltottuk az sszes tbbi elemmel, s ha az els
elem nem volt kisebb a msik elemnl, akkor csert hajtottunk vgre. Ennek eredmnyeknt biztos, hogy
a tmb legkisebb eleme kerlt az els helyre, teht a vgs helyn van.
Ezt kveten a msodik elemet is hasonl mdon sszehasonltjuk az sszes t kvetvel, s ha
szksges, azaz a nagyobb index elem kisebb rtk, mint a msodik, akkor cserlnk. Miutn a
msodik elemet az sszes t kvetvel sszehasonltottuk, s ha kellett, cserltnk, biztosak lehetnk
abba, hogy a msodik legkisebb elem kerlt a msodik helyre, azaz a vgleges helyre.
Ezt az eljrst kvetjk a harmadik elemre, majd a negyedikre, s gy tovbb egszen az utols eltti
elemig. A vizsglt elemet mindig sszehasonltjuk az sszes t kvetvel, s szksg esetn cserlnk, gy
az algoritmus vgre minden elem biztosan az elvrt helyre kerl, gy az egsz tmb rendezett vlik.
Nem szorul taln magyarzatra, hogy mirt pont az egyszer csers nevet kapta ez a rendezsi mdszer,
hiszen tnyleg nem tesznk mst csak cserlgetnk.
Az ismertetett tlet pszeudokddal trtn lerst a 3.2. algoritmus adja meg. A 2. sorban kezdd
kls szmlls ciklus i ciklusvltozja a tmbnek azt az elemt fogja indexelni, amelyet a tbbi elemmel
sszehasonltunk egy futamon bell. A 3. sorban kezdd bels ciklus ciklusvltozjval pedig rgztett
i index mellett az sszes i-nl nagyobb index elemet fogjuk indexelni, ezrt j rtke (i + 1)-tl n-ig
megy. A kt ciklus gondoskodik a tmb bejrsrl. A ciklusmagban meg kell valstanunk az i-edik s
az t kvet valamely elem sszehasonltst. Ez trtnik meg a 4. sorban szerepl elgazsban. Ha az
x[i] > x[j] felttel igaz, azaz az i-edik elem utni aktulis elem kisebb, mint az i-edik, akkor cserlni kell
a kt elemet, ahogy az az 5. sorban meg is trtnik.
3.2. Algoritmus Egyszer csers rendezs
Bemenet: x T tmb, n egsz (tmb mrete); ahol T sszehasonlthat
Kimenet: x T rendezett tmb
1: eljrs EgyszerCsersRendezs(cmszerint x : T tmb, n : egsz)
2:
ciklus i 1-tl (n 1)-ig
3:
ciklus j (i + 1)-tl n-ig
4:
ha x[i] > x[j] akkor
5:
x[i] x[j]
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.
3.1. Plda. Adott a 4, 3, 8, 6, 1 elemeket tartalmaz x tmb. Feladatunk, hogy nvekv mdon rendezzk a tmbt az egyszer csers rendezs 3.2. algoritmusnak hasznlatval. Az algoritmus futsa sorn
az i s j indexek alakulst, valamint a tmbben bekvetkez vltozsokat a 3.1. brn szemlltetjk.
Els lpsknt elindul az algoritmus 2. sorban tallhat ciklus, gy i rtke 1 lesz. Majd a 3. sorban
lv bels ciklushoz kerl a vezrls, ezrt j rtke 2 lesz. sszehasonltjuk az x[i] s x[j] rtkt, s
mivel x[i] > x[j], ezrt megcserljk a kt megindexelt elemet, ahogy a 3.1a. brn lthat.
Sergyn Szabolcs

89

budai Egyetem
Neumann Jnos Informatikai Kar

x:

x:

1
x:

x:

x:

x:

x:

(b) x[i] < x[j], nem cserlnk.

(c) x[i] < x[j], nem cserlnk.

x:

x:

(e) x[i] < x[j], nem cserlnk.

(f) x[i] < x[j], nem cserlnk.

x:

x:

(d) Mivel x[i] > x[j], ezrt


x[i] x[j].

x:

(a) Mivel x[i] > x[j], ezrt


x[i] x[j].

x:

(g) Mivel x[i] > x[j], ezrt


x[i] x[j].

x:

x:

(h) Mivel x[i] > x[j], ezrt


x[i] x[j].

x:

(i) Mivel x[i] > x[j], ezrt


x[i] x[j].

(j) Mivel x[i] > x[j], ezrt


x[i] x[j].

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)

sszeg. Matematikai ismereteinkbl tudjuk, hogy ez pont egyenl az


n (n 1)
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

3.2. Minimumkivlasztsos rendezs


Az egyszer csers rendezs mkdsi elve az volt, hogy az els elemtl az utols eltti elemig bejrjuk a
rendezend tmbnket, s az aktulis tmbelemet sszehasonltjuk az sszes t kvetvel. Amennyiben
azt talljuk, hogy az aktulis elem utni valamely elem kisebb az aktulis elemnl, akkor kicserltk a
kt elemet. Ennek eredmnyeknt azt tapasztaltuk, hogy elszr a legkisebb elem kerlt az els helyre,
majd a msodik legkisebb a msodik helyre, s gy tovbb, egszen a tmb vgig. Ennek elrshez
viszont szmos csert kellett vgrehajtanunk.
rdemes azt megvizsglni, hogy nem lehetne-e hasonl eredmnyt elrni gy, hogy a cserk szmt
jelentsen lecskkentsk, ezltal az algoritmusunk futsi idejt redukljuk. Ennek rdekben azt fogjuk
tenni, hogy elszr megvizsgljuk, hogy a teljes tmbben melyik elem a legkisebb rtk. Ezt az elemet
kicserljk az els elemmel, gy az mr biztos a helyre kerl. Ezt kveten mr csak a tmb fennmarad
elemeivel kell foglalkoznunk. Megkeressk a msodik s az utols elem kzttiek kzl a legkisebbet,
majd ezt kicserljk a msodik elemmel. Ennek eredmnyeknt mr a tmb els kt eleme a helyn lesz.
Folytatjuk az eljrsunkat, a harmadik elemtl a tmb vgig megkeressk ismt a legkisebb elemet, majd
ezt kicserljk a harmadik elemmel. Ezt az eljrst kvetjk addig, amg az utols keresst mr csak
az utols eltti s az utols elembl ll rsztmbben hajtjuk vgre, majd a kt elem kzl a kisebbiket
kicserljk az utols eltti elemmel. Ha ezt az tletet megvalstjuk a tmbnk rendezett vlik.
Az ismertetett gondolatot viszonylag egyszeren meg tudjuk valstani, mert csak egy ciklusra van
szksgnk, amely a tmb els elemtl az utols eltti elemig fut. Ezen ciklus belsejben pedig meg kell
keresnnk a minimlis elemet. A legkisebb elemet a 2.1.6. fejezetben megismert maximumkivlaszts
programozsi ttel mdostsval knnyen meg tudjuk tallni. A minimlis elem kivlasztst kveten
mr csak egy csert kell vgrehajtanunk. A minimumkivlasztsos rendezs konkrt megvalstst
a 3.3. algoritmus rja le pszeudokddal.
3.3. Algoritmus Minimumkivlasztsos rendezs
Bemenet: x T tmb, n egsz (tmb mrete); ahol T sszehasonlthat
Kimenet: x T rendezett tmb
1: eljrs MinimumkivlasztsosRendezs(cmszerint x : T tmb, n : egsz)
2:
ciklus i 1-tl (n 1)-ig
3:
min i
4:
ciklus j (i + 1)-tl n-ig
5:
ha x[min] > x[j] akkor
6:
min j
7:
elgazs vge
8:
ciklus vge
9:
x[i] x[min]
10:
ciklus vge
11: 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.
min: A tmb egy bejrsn bell a megtallt minimlis rtk elem indexe.
A 2. sorban kezdd kls ciklussal jrjuk be a tmbnket az els elemtl az utols eltti elemig. Az
algoritmus lnyege az ahogy ezt mr korbban emltettk , hogy az i-edik s az n-edik elem kztti
elemek kzl vlasztjuk ki a minimlis rtkt, majd ezt a minimlis elemet kicserljk az i-edik elemmel.
Teht a kls ciklus azt az elemet fogja indexelni, ami a vizsgland tmbrsz els eleme, illetve amely
elem a kls ciklus magjnak minden egyes lefutsa vgn mr a vgleges rtkt veszi fel.
A 3. sorban elindul a minimumkivlaszts eljrsa, amely egszen a 8. sorig tart. Kijelljk a kezdetben minimlis rtk elemnek tekintett elem indext, ami az i lesz (ld. 3. sor), majd bejrjuk a
vizsgland tmbrsz fennmarad elemeit. Ezt a bejrst valstja meg a 4. sorban kezdd bels ciklus. A bels ciklus magjban sszehasonltjuk az eddigi minimlis elemet az aktulis tmbelemmel, azaz

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

Az algoritmus 9. sorban lv csert abban az esetben is vgrehajtjuk, ha a legkisebb elem


pp az i-edik, azaz ha min = i. Ennek kivdst csak gy tudjuk megtenni, ha a csere el
beszrunk egy felttel vizsglatot. gy csak akkor cserlnk, ha a min 6= i felttel teljesl.
A felesleges csert ilyen mdon sikerl kikszblnnk, viszont megjelenik egy j felttel,
amit akkor is ki kell rtkelni, amikor cserlni kell, teht ilyenkor pedig a felttel vizsglat
lesz felesleges. Ezek alapjn dntttnk gy, hogy inkbb minden esetben elvgezzk a
nha feleslegesnek tn csert.
Megjegyzs

A szakirodalomban sokszor a minimumkivlasztsos rendezst egyszeren csak kivlaszt


rendezsneka hvjk. Mi azrt vlasztottuk inkbb az itt hasznlt elnevezst, mert gy
jobban ltszik, hogy egy jl ismert programozsi ttelt hasznlunk a kls ciklus magjban.
a Angolul:

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

(a) Kezdetben i 1 s kiindulsknt min 1. Mivel x[min] > x[j],


ezrt min j.

min

x:

i
x:

min

min

min

j
8

min

1
x:

min j

(e) A bels ciklus vgre rtnk,


ezrt x[min] x[i].

x:

(d) Mivel x[min] > x[j], ezrt


min j.

min

(c) Mivel x[min] < x[j], ezrt nincs


teend.

x:

(b) Mivel x[min] < x[j], ezrt nincs


teend.

x:

x:

(f) A kls ciklusban tovbblpnk,


azaz i 2 s min i. Mivel
x[min] < x[j], ezrt nincs teend.
x:

(g) Mivel x[min] < x[j], ezrt nincs


teend.

min

(h) Mivel x[min] < x[j], ezrt nincs


teend.

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

(j) A kls ciklusban tovbblpnk,


azaz i 3 s min i. Mivel
x[min] > x[j], ezrt min j.

x:

i
j

x:

(k) Mivel x[min] > x[j], ezrt


min j.

x:

min

(i) A bels ciklus vgre rtnk,


ezrt x[min] x[i], mg akkor is,
ha min = i.
x:

min

(l) A bels ciklus vgre rtnk,


ezrt x[min] x[i].

x:

min j

(m) A kls ciklusban tovbblpnk,


azaz i 4 s min i. Mivel
x[min] < x[j], ezrt nincs teend.

min

(n) A bels ciklus vgre rtnk,


ezrt x[min] x[i], mg akkor is,
ha min = i.

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)

lesz. gy az sszehasonltsok szma:


n (n 1)
.
(3.5)
2
Ez az eredmny nem fgg attl, hogy a bemeneti tmbnk milyen volt rendezettsg szempontjbl, teht
az sszehasonltsok szma minden esetben pontosan ugyanannyi, mint az egyszer csers rendezsnl.
gy itt nem rtnk el javulst.
Nzzk most a cserk szmt. Csert csak a kls ciklusmag lefutsnak vgn vgznk. gy pontosan
annyi csernk lesz, mint ahnyszor lefut a kls ciklus. Ez az rtk pedig n 1. A msolsok szma is
knnyen meghatrozhat gy mr: 3 (n 1). Vegyk szre, hogy a cserk s msolsok szma sem fgg
attl, hogy milyen a rendezend tmbnk.
Krds, hogy sikerlt-e javtanunk a rendezs futsi idejn az egyszer csers rendezs futsi idejhez
kpest. Azt mondhatjuk, hogy tlagosan igen, mivel az egyszer csers rendezs cserinek tlagos szma
1 n(n1)
, mg a minimumkivlasztsos rendezsnl mindig csak n darab csert hajtunk vgre. A futsi
2
2
id csak akkor fog romlani, ha a bemeneti tmb eleve rendezett volt, mert egyszer csers esetben ilyenkor
egyetlen csere sem lesz, mg a minimumkivlasztsos esetben ekkor is megtrtnik az n 1 darab csere.
sszessgben azt mondhatjuk, hogy a minimumkivlasztsos rendezst akkor rdemes hasznlni,
ha a cserket lassan tudjuk megvalstani, mert ezek szmban sikerlt j eredmnyt elrni. (Ksbb
ltni fogjuk, hogy ilyen alacsony csere szmot ms algoritmussal sem tudunk tlagos esetben elrni.)
A minimumkivlasztsos
rendezs teljes futsi ideje viszont az sszehasonltsok szma miatt szintn

O n2 -es.

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:

(a) Mivel x[j] > x[j + 1], ezrt


x[j] x[j + 1].

x:

x:

j+1

x:

j+1

x:

j j+1

x:

j j+1

i
3

j+1

(f) Mivel x[j] > x[j + 1], ezrt


x[j] x[j + 1].

(g) Mivel x[j] < x[j + 1], ezrt nem


cserlnk.
x:

j+1

(d) Mivel x[j] < x[j + 1],


ezrt nem cserlnk.

(e) Mivel x[j] < x[j + 1],


ezrt nem cserlnk.
x:

j j+1

x:
1

(b) Mivel x[j] > x[j + 1], ezrt


x[j] x[j + 1].

(c) Mivel x[j] > x[j + 1], ezrt


x[j] x[j + 1].

x:

j+1

(h) Mivel x[j] < x[j + 1], ezrt nem


cserlnk.
x:

j j+1

(i) Mivel x[j] < x[j + 1], ezrt nem


cserlnk.

(j) Mivel x[j] < x[j + 1], ezrt nem


cserlnk.

3.3. bra. Buborkrendezs. A pldn a 3.4. algoritmusnak megfelelen nyomon kvethetjk az i s j


indexek alakulst, valamint az elvgzett cserk eredmnyeit.

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

3.4. Javtott buborkrendezs


Az elz fejezetben trgyalt buborkrendezsnl bemutatott 3.3. pldnl lttuk, hogy a buborkrendezs
nem veszi szre, ha az algoritmus sorn a tmb rendezett vlik. Prbljuk ezrt erre a kpessgre
megtantani az algoritmust.
A buborkrendezs egyik jellemzje, hogy egy bejrs sorn az ppen vizsglt rsz legnagyobb eleme
biztosan a helyre kerl. Viszont ha a legnagyobb, illetve az azt megelz nhny elem mr eleve a
helyn van, akkor a kvetkez bejrsoknl kr lenne ezeket az elemeket ismt figyelembe venni. Hogyan
tudjuk azt meghatrozni, hogy mely elemek vannak a helykn? Tudjuk, hogy amikor egy nagy elem
a helyn van, akkor ott nem hajtunk vgre csert, hiszen a csere kimozdtan t a helyrl. Ezrt csak
azt kell vizsglnunk, hogy egy bejrs sorn hol hajtjuk vgre az utols csert. A csere helynl nagyobb
index elemek mr biztosan a helykn vannak, ezrt a kvetkez bejrsnl azokat nem kell figyelembe
venni. Teht a soron kvetkez bejrst csak a megelz bejrs utols cserjnek helyig kell vgezni.
Ezzel az tlettel javthatjuk a buborkrendezs hatkonysgt. A konkrt pszeudokdot a 3.5. algoritmusban rjuk le. Els lpsknt az i vltoznak adunk kezdeti rtket, amely az x tmb n elemszma lesz
(ld. 2. sor). Az i vltoznak ugyanaz a szerepe, mint a buborkrendezs 3.4. algoritmusnak 2. sorban
ciklusvltozknt ltrehozott i vltoznak. Teht i azt adja meg neknk, hogy meddig kell mg a tmbt
vizsglnunk egy konkrt bejrs sorn. A buborkrendezshez kpest lnyeges klnbsg, hogy most az
i rtkt nem trvnyszeren egyesvel cskkentjk, emiatt nem is szmlls ciklust hasznlunk kls
ciklusknt. A 3. sorban kezdd elltesztels ciklus fogja azt vizsglni, hogy a i rtke nem cskkent-e
mg le tlsgosan. Ha 2-nl kisebb lenne az i akkor mr nem kell tovbb folytatnunk az algoritmust,
mivel ez mr kevesebb mint kett elem rsztmb feldolgozst jelenten. Az i rtkt a ciklus vgn,
a 11. sorban mdostjuk majd.
3.5. Algoritmus Javtott buborkrendezs
Bemenet: x T tmb, n egsz (tmb mrete); ahol T sszehasonlthat
Kimenet: x T rendezett tmb
1: eljrs JavtottBuborkRendezs(cmszerint x : T tmb, n : egsz)
2:
in
3:
ciklus amg i 2
4:
idx 0
5:
ciklus j 1-tl (i 1)-ig
6:
ha x[j] > x[j + 1] akkor
7:
x[j] x[j + 1]
8:
idx j
9:
elgazs vge
10:
ciklus vge
11:
i idx
12:
ciklus vge
13: 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.
idx: Az utols csere helyt troljuk benne. Ha x[j]-t s x[j + 1]-et cserljk, akkor az idx rtke j
lesz.
Az 5. sorban indul el az a szmlls ciklus, amely egy konkrt bejrst valst meg. A j ciklusvltoz
1-tl (i 1)-ig megy, hasonlan a 3.4. algoritmus 3. sorban lv ciklushoz. A bels ciklus magjban
megvizsgljuk, hogy kt szomszdos elem kzl a kisebb indexnek nagyobb-e az rtke mint a nagyobb
indexnek (ld. 6. sor). Ha x[j] > x[j + 1], akkor ki kell cserlnnk a kt elemet (ld. 7. sor). Amint
mr emltettk az utols csere helyt meg kell jegyeznnk. Ha csere trtnt, akkor az idx vltozban
eltroljuk, hogy a jelenlegi helyen (j-nl) trtnt meg a utols csere (ld. 8. sor). Az idx vltoznak
korbban a konkrt bejrs megkezdse eltt, a 4. sorban 0 kezdeti rtket adtunk.

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

(d) Mivel x[j] < x[j + 1], ezrt nem


cserlnk.

x:

idx

(c) Mivel x[j] > x[j + 1], ezrt


x[j] x[j + 1]. A csert kveten
idx j.

idx

(b) Mivel x[j] > x[j + 1], ezrt


x[j] x[j + 1]. A csert kveten
idx j.

idx

x:

idx

(a) Mivel x[j] > x[j + 1], ezrt


x[j] x[j + 1]. A csert kveten
idx j.

x:

i
4

idx

(e) A bels ciklus vgn i idx. Majd


mivel x[j] < x[j + 1], ezrt nem cserlnk.
x:

idx j j + 1

(f) Mivel x[j] > x[j + 1], ezrt


x[j] x[j + 1]. A csert kveten
idx j.
3

(g) A bels ciklus vgn i idx.


Majd mivel x[j] < x[j + 1], ezrt nem
cserlnk. Az idx vltoz rtke nulla
marad, ezrt az algoritmus vget r.

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

3.5. Beillesztses rendezs


A beillesztses rendezs2 nem abbl indul ki mint az eddig trgyalt rendez algoritmusaink. A korbbi
algoritmusok tlete az volt, hogy cserket vgznk mindaddig, amg az elemek a helykre nem kerlnek.
Csak abban volt lnyeges klnbsg az algoritmusaink kztt, hogy mely elemek kztt vgznk cserket.
A beillesztses rendezs ms logikt kvet, br cserket itt is fogunk vgezni.
A beillesztses rendezsnl az n elem tmbnkbl elszr csak egy elemmel, mgpedig az els elemmel
foglalkozunk. Ha egy elem tmbnk van, akkor az mr eleve rendezett. Vegynk most hozz az egy
elem tmbhz mg egy elemet, a soron kvetkezt, teht a msodikat. A msodik elem lehet, hogy a
helyn van, lehet hogy nem. Illesszk gy a korbbi egy elem tmbhz a msodik elemet, hogy ezutn
a kt elem tmbnk mr rendezett legyen. Nzzk ezutn a harmadik elemet. Az els kt elembl ll
tmb mr rendezett, ebbe a rendezett tmbbe illesszk be a megfelel helyre a harmadik elemet gy,
hogy a hrom elem tmb rendezett legyen. Ezt kveten jhet a negyedik elem, amelyet beillesztnk a
hrom elem rendezett tmbben a megfelel helyre, gy mr egy ngy elem rendezett tmbt kapunk.
Ezt a gondolatmenetet kvessk egszen addig, amg utols lpsknt az n 1 elem rendezett tmbbe
illesztjk be az n-edik elemet a megfelel helyre, ami ltal az egsz tmbnk rendezett vlik. A 3.5. brn
vgig tudjuk tekinteni a lert folyamatot. Lthat, hogy a beillesztsek hatsra vgl az egsz tmb
rendezett vlik.
A beillesztses rendezs tlett mr megismertk, de azrt egy krdst mg nem vlaszoltunk meg.
Az aktulis beillesztend elemet hogyan fogjuk a megfelel helyre beszrni? Ennek megvalstsa sorn
szksgnk lesz az elemek cserlgetsre. A beillesztst ugyanis gy oldjuk meg, hogy a beillesztend
elemet sszehasonltjuk a kzvetlenl eltte ll elemmel. Ha a beillesztend elem nem kisebb a bal
szomszdjnl, akkor nem kell semmit tennnk (pl. a 3.5c. brn lthat esetben). Ha viszont a beillesztend elem kisebb a bal szomszdjnl, akkor megcserljk ket, gy a beillesztend elem eggyel elrbb
kerl. Ezutn ismt sszehasonltjuk a beillesztend elemet a bal szomszdjval. Vagy azt ltjuk, hogy
ismt cserlnnk kell, vagy mr a helyn van. Az eljrst addig folytatjuk, amg a beillesztend elem a
helyre nem kerl, azaz vagy nem kisebb mr a bal szomszdjnl, vagy a tmb legelejre kerlt.
A lert tletet konkrtan a 3.6. algoritmussal valsthatjuk meg.
3.6. Algoritmus Beillesztses rendezs
Bemenet: x T tmb, n egsz (tmb mrete); ahol T sszehasonlthat
Kimenet: x T rendezett tmb
1: eljrs BeillesztsesRendezs(cmszerint x : T tmb, n : egsz)
2:
ciklus i 2-tl n-ig
3:
j i1
4:
ciklus amg (j > 0) (x[j] > x[j + 1])
5:
x[j] x[j + 1]
6:
j j1
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.
Az algoritmus elejn a 2. sorban kezdd kls szmlls ciklusba lpnk be. Az i ciklusvltozval
jelljk, hogy ppen a tmb hnyadik elemt kvnjuk beilleszteni a megfelel helyre. A fentebb lert
letnek megfelelen mindig felttelezzk, hogy a tmb els i 1 eleme mr rendezett llapotban van.
Az i kiindulsi rtke 2, gy ekkor mg biztos teljesl, hogy a msodik elemet megelz egy elem tmb
biztosan rendezett. Az i ciklusvltoz rtkt az algoritmus elrehaladtval egszen a tmb mretig (n)
nveljk majd.
2 Angolul:

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

(d) Mivel x[j] < x[j + 1], ezrt nem


cserlnk.

j j+1
x:

(b) Mivel x[j] > x[j + 1], ezrt


x[j] x[j + 1].

(c) Mivel x[j] > x[j + 1], ezrt


x[j] x[j + 1].

x:

j j+1

(a) Mivel x[j] > x[j + 1], ezrt


x[j] x[j + 1].

x:

x:

i
8

(e) Mivel x[j] > x[j + 1], ezrt


x[j] x[j + 1].

j+1

(f) Mivel x[j] < x[j + 1], ezrt nem


cserlnk.

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)

lesz. A msolsok szma a cserk szmnak hromszorosa, teht azokbl 3 n(n1)


darabot kell elvgezni.
2
tlagos esetben nem tudunk pontos rtket mondani, mind az sszehasonltsok, mind a cserk,
illetve msolsok szma valahol
 a kt szlsrtk kztt lesz. sszessgben azt mondhatjuk, hogy az
algoritmus futsi ideje O n2 -es. Ha rendezett a tmbnk, akkor viszont O (n)-es a futsi id.
Megjegyzs

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

3.6. Javtott beillesztses rendezs


Ebben a fejezetben megnzzk, hogy miknt lehet javtani az elz fejezetben megismert beillesztses
rendezs futsi idejn. Egy tovbbi tletet szeretnnk megvizsglni, de a beillesztses rendezs alaptletn nem akarunk mdostani. Teht most is abbl fogunk kiindulni, hogy a beillesztend elem eltti
tmbelemek rendezettsge mellett, a megfelel helyre szrjuk be a beillesztend elemet. Viszont az
aktulis elemet nem cserk egyms utni vgrehajtsval fogjuk a helyre vinni, hanem ms mdszert
hasznlunk.
Nzzk pldul a 3.5e. brn lthat esetet. Az tdik helyen ll 2-t szeretnnk az eltte lv ngy
elem rendezett tmbben a helyre illeszteni. Ezt megvalsthatjuk gy is, hogy a beszrand elem
eltt ll, nla nagyobb elemeket (3, 4 s 6) eggyel htrbb toljuk, majd ezt kveten a beillesztend
elemet mr a helyre tudjuk tenni. Hogyan fogunk tudni egy elemet egy hellyel htrbb tolni? Ha a
htrbb mozdtand elem a j-edik elem, akkor az x[j + 1] be kell tmsolnunk x[j]-t. Ilyen egyszeren
megoldhat az elem htrbb mozgatsa. Egy esetben viszont problmval fogunk tallkozni. Ha pont a
beillesztend elem eltti elemet akarjuk htrbb tolni (3.5e. brn pldul a kezdetben negyedik helyen
ll 6-ot), akkor a htrbb msolskor a beillesztend elemet fellrnnk, gy elvesztennk a tmbbl.
Ennek kivdse rdekben azt tesszk, hogy az elemek htra tologatsa eltt kimentjk a beillesztend
elemet egy segdvltozba. Ezt kveten mr nyugodtan htrbb tolhatjuk a beillesztend elemnl
nagyobb elemeket, majd a beillesztend elemet a segdvltozbl visszamsoljuk a megtallt j helyre.
A javtott beillesztses rendezs konkrt megvalstst a 3.7. algoritmusban lthatjuk, ami termszetesen nagyon hasonlt a beillesztses rendezs 3.6. algoritmushoz. Egy kls ciklussal fogunk vgigmenni
az aktulisan beszrand elemeken. Egy bels ciklussal oldjuk meg, hogy a beszrand elem eltti, nla
nagyobb elemek htrbb kerljenek. Ami lnyeges klnbsg, hogy nem hasznlunk cserket, illetve a
beillesztend elem tmeneti trolsra egy segdvltozt alkalmazunk.
3.7. Algoritmus Javtott beillesztses rendezs
Bemenet: x T tmb, n egsz (tmb mrete); ahol T sszehasonlthat
Kimenet: x T rendezett tmb
1: eljrs JavtottBeillesztsesRendezs(cmszerint x : T tmb, n : egsz)
2:
ciklus i 2-tl n-ig
3:
j i1
4:
segd x[i]
5:
ciklus amg (j > 0) (x[j] > segd)
6:
x[j + 1] x[j]
7:
j j1
8:
ciklus vge
9:
x[j + 1] segd
10:
ciklus vge
11: 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.
segd: Segdvltoz, mely mindig az aktulis beillesztend elemet tartalmazza.
Az algoritmus 2. sorban belpnk a kls szmlls ciklusba. Az i ciklusvltoz jelli, hogy ppen
melyik elemet kvnjuk az t megelz rendezett rsztmbben a helyre tenni. Az els beillesztend elem
termszetesen a msodik tmbelem lesz. A cikluson bell a j indexvltozt hasznljuk a beillesztend
elem eltti tmbrsz bejrsra. A j vltoz kezdeti rtke i 1 lesz (ld. 3. sor), gy a beillesztend elem
bal szomszdjtl indul majd ez a bejrs. A beillesztend elemet kimentjk egy tmeneti vltozba
(4. sor).
Az 5. sorban kezdd ciklussal valstjuk meg a beillesztend elem eltti elemek tnyleges bejrst.
Ebbe a ciklusba akkor lpnk be, illetve addig maradunk benne, amg a j vltoz mg vals index, illetve
amg a j-edik tmbelem mg nagyobb a beillesztend elemnl. Ez utbbi felttel jelenti azt, hogy a
j-edik elemet mg htrbb kell mozgatnunk. (rdemes sszevetni az 5. sor feltteleit a 3.6. algoritmus
Sergyn Szabolcs

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

(a) Msodik elem beillesztse. Az x[2] elemet


eltroljuk a segd vltozban.

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.

(d) Harmadik elem beillesztse. Az x[3] elemet


eltroljuk a segd vltozban.

Vltoz

x:

x:

Vltoz

x:

segd : 1

j
8

x:

(f) Harmadik elem beillesztse. Mivel x[1] > segd,


ezrt x[1]-et htrbb mozgatjuk.

Vltoz

segd : 1

(e) Harmadik elem beillesztse. Mivel x[2] > segd,


ezrt x[2]-t htrbb mozgatjuk.

x:

segd : 1

Vltoz

x:

segd : 1

i
(g) Harmadik elem beillesztse. A segd-ben trolt
rtket az x[1]-be mozgatjuk.

segd : 8

(h) Negyedik elem beillesztse. Az x[4] elemet


eltroljuk a segd vltozban.

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

(i) Negyedik elem beillesztse. Mivel x[3] < segd,


ezrt nem tesznk semmit.

segd : 8

(j) Negyedik elem beillesztse. A segd-ben trolt


rtket az x[4]-be mozgatjuk.
Vltoz

x:

segd : 6

Vltoz

x:

x:

segd : 6

(k) tdik elem beillesztse. Az x[5] elemet


eltroljuk a segd vltozban.

(l) tdik elem beillesztse. Mivel x[4] > segd,


ezrt x[4]-et htrbb mozgatjuk.

Vltoz

x:

Vltoz

x:

segd : 6

(m) tdik elem beillesztse. Mivel x[3] < segd,


ezrt nem tesznk semmit.

segd : 6

(n) tdik elem beillesztse. A segd-ben trolt


rtket az x[4]-be mozgatjuk.

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

3.7. Shell rendezs


A Shell rendezst a javtott beillesztses rendezs talaktsval kapjuk. A javtott beillesztses rendezs
egyik htrnya, hogy ha egy kis rtk a tmb vge fel van kezdetben, akkor sok sszehasonltst s
msolst kell annak rdekben vgezni, hogy a vgs helyre kerljn. Ennek oka, hogy az elemeket
mindig a kzvetlen szomszdok mozgatsval juttatjuk el a megfelel helykre. A Shell rendezs tlete
az, hogy elszr az egymstl valamilyen nagyobb tvolsgra elhelyezked elemek kztt vgez sszehasonltsokat s mozgatsokat. gy egy a tmb vge fel lv kis rtk nagy lpskzkkel tud eljutni a
vgs helye kzelbe, ezrt jval kevesebb mveletet kell elvgezni a rendezs rdekben.
Shell rendezsnl teht elszr vlasztunk valamilyen tvolsgot (ezt fogjuk d-vel jellni), majd a
tmb ilyen tvolsgra lv elemei kztt vgznk rendezseket. Ezt szemllteti pldul d = 5 esetn
a 3.8a. bra. Lthatjuk, hogy az azonos sznrnyalattal jellt, egymstl t tvolsgra lv elemekbl
alkotott rsztmbk rendezett vltak. Ennek fontos eredmnye az, hogy az elemek nagy rsze a vgleges
helynek kzelbe kerlt. Pldul a tmb els t helyre az t legkisebb elem kerlt. gy ezen elemek
sorba rendezse mr kevs mvelet elvgzsvel megvalsthat.
A rendezs folyamn a d tvolsgrtket folyamatosan cskkenteni fogjuk, gy pldul a kvetkez
rtke lehet 3. Ekkor az egymstl hrom tvolsgra lv elemekbl alkotott rsztmbket rendezzk,
ahogy a 3.8b. brn is lthat. A tvolsg rtk vltoztatsa mindig a d = 1 esettel r vget, mely lnyegben megfelel a korbban mr megismert javtott beillesztses rendezsnek. Ekkor viszont mr az elemek
nagy valsznsggel a vgs helyk kzelben vannak, gy viszonylag kevs mvelettel megvalsthat a
vgleges finomhangols. A d = 1 esetet a 3.8c. bra szemllteti.
x:

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

3.8. Algoritmus Shell rendezs


Bemenet: x T tmb, n egsz (tmb mrete); ahol T sszehasonlthat
Kimenet: x T rendezett tmb
1: eljrs ShellRendezs(cmszerint x : T tmb, n : egsz)
2:
d KezdetiTvolsg(n)
3:
ciklus amg d 1
4:
ciklus i (d + 1)-tl n-ig
5:
j id
6:
segd x[i]
7:
ciklus amg (j > 0) (x[j] > segd)
8:
x[j + d] x[j]
9:
j jd
10:
ciklus vge
11:
x[j + d] segd
12:
ciklus vge
13:
d KvetkezTvolsg(d)
14:
ciklus vge
15: 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.
segd: Segdvltoz, mely mindig az aktulis beillesztend elemet tartalmazza.
d: Megadja, hogy az egymstl mekkora tvolsgra lv elemek kztt vgznk vizsglatokat.
KezdetiTvolsg(n): Fggvny, amely meghatrozza, hogy az adott tmbmrethez milyen kezdeti d tvolsgrtk tartozik.
KvetkezTvolsg(d): Fggvny, amely meghatrozza, hogy egy adott d tvolsgrtk utn,
melyik tvolsggal kell dolgoznunk.

Sergyn Szabolcs

115

budai Egyetem
Neumann Jnos Informatikai Kar

mdjval a ksbbiekben foglalkozunk majd.) Ahogy mr korbban emltettk az algoritmusnak addig


kell futnia, amg a d rtke 0-ra nem cskken. Ennek rdekben a 3. s 14. sorok kztti ciklusban addig
lesznk bent, amg teljesl a d 1 felttel. A kls cikluson bell kt dolgot tesznk. Egyrszt vgre
kell hajtanunk egy javtott beillesztses rendezst az egymstl d tvolsgra lv elemekbl ll rsztmbkn. Ezt a feladatot valstja meg az algoritmus 4. s 12. sorok kztti rsze. Ez az algoritmusrsz
majdnem teljesen azonos a javtott beillesztses rendezs 3.7. algoritmusval. Csak annyi mdostst
eszkzltnk, hogy minden helyen ahol a szomszdos elemre trtnik utals (pl. i 1 vagy j + 1), ott
a szomszdos elem miatt hasznlt 1 rtket d-re vltoztattuk. gy tudjuk elrni, hogy az egymstl
d tvolsgra lv elemekkel foglalkozzunk. A kls cikluson bell mg egy lpst kell megtennnk, a
mdostott javtott beillesztses rendezs vgrehajtst kveten a d rtkt mdostanunk kell. Ezt a
KvetkezTvolsg fggvnnyel valstjuk meg.
Az algoritmus megismerst kveten nzzk meg, hogy milyen mdon hatrozhatjuk meg a d tvolsgokat. Erre vonatkozan t lehetsget mutatunk be.
1. Legyenek az alkalmazott d tvolsgok a 2k 1 alak szmok, azaz az {1, 3, 7, 15, 31, 63, 127, . . .}
halmaz elemei. A KezdetiTvolsg fggvny ltal megadott els d rtk pedig a tmb n elemszmnak felhez legkzelebbi 2k 1 alak szm.
2. A Fibonacci sorozat3 elemeit hasznljuk tvolsgknt. Teht az alkalmazott rtkek az
{1, 2, 3, 5, 8, 13, 21, 34, 55, . . .} halmaz elemei. A kiindulsi d rtk ekkor is legyen az n2 -hez legkzelebbi Fibonacci szm.
3. Donald Shell javaslata, hogy a d rtkek legyenek az
jnk
2k
alak szmok, ahol k = 1, 2, . . ., bc pedig az als egszrszt jelli. Ilyenkor a kezdeti d rtk
lesz.

n
2

4. Vaughan Pratt a 2p 3q alakban elllthat szmok hasznlatt javasolta, ahol p s q termszetes


szmok. Ilyenkor a lehetsges d rtkek a kvetkezk lehetnek: {1, 2, 3, 4, 6, 8, 9, 12, . . .}. A kezdeti
d rtk ilyenkor a 2p 3q alak szmok kzl az elemszm felhez legkzelebbi.
5. Donald Ervin Knuth a


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

O n 2 -es lesz a futsi id.


Annak rdekben, hogy jobban el tudjuk kpzelni miknt is alakul az algoritmus futsi ideje az egyes
esetekben, a 3.10. brn megjelentettk az egyes futsi idket klnbz n rtkek fggvnyben. Az
brn az itt trgyalt hrom eseten kvl megjelentettk az O (n log n)-es futsi idt is, mert ksbb ltni
fogjuk, hogy bizonyos rendez algoritmusok ilyen futsi idvel kpesek rendezni.

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

(a) A tvolsg: d = 7. A nyolcadik s az els elembl ll rsztmbt rendezzk.


Vltoz

x:

10

12

id
x:

14

13

11

14

13

11

segd : 7

i
1

10

12

(b) A tvolsg: d = 7. A kilencedik s a msodik elembl ll rsztmbt rendezzk.


Vltoz

x:

10

12

id

14

13

11

segd : 3

(c) A tvolsg: d = 7. A tizedik s a harmadik elembl ll rsztmbt rendezzk.


Vltoz

x:

10

12

id
x:

14

13

11

14

13

11

segd : 5

i
8

12

10

(d) A tvolsg: d = 7. A tizenegyedik s a negyedik elembl ll rsztmbt rendezzk.


Vltoz

x:

10

12

id

14

13

11

segd : 14

(e) A tvolsg: d = 7. A tizenkettedik s az tdik elembl ll rsztmbt rendezzk.


Vltoz

x:

10

12

id

14

13

11

segd : 13

(f) A tvolsg: d = 7. A tizenharmadik s a hatodik elembl ll rsztmbt rendezzk.

3.9. bra. Shell rendezs.

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

(g) A tvolsg: d = 7. A tizennegyedik s a hetedik elembl ll rsztmbt rendezzk.


Vltoz

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

(i) A tvolsg: d = 3. Az tdik s a msodik elembl ll rsztmbt rendezzk.


Vltoz

x:

10

id

11

14

13

12

segd : 6

(j) A tvolsg: d = 3. A hatodik s a harmadik elembl ll rsztmbt rendezzk.


Vltoz

x:

10

id

11

14

13

12

segd : 11

(k) A tvolsg: d = 3. A hetedik, negyedik s els elembl ll rsztmbt rendezzk.


Vltoz

x:

10

i 2d
x:

11

id
1

10

14

13

12

14

13

12

segd : 4

i
6

11

(l) A tvolsg: d = 3. A nyolcadik, tdik s msodik elembl ll rsztmbt rendezzk.


Vltoz

x:

10

id

11

14

13

12

segd : 9

(m) A tvolsg: d = 3. A kilencedik, hatodik s harmadik elembl ll rsztmbt rendezzk.

3.9. bra. Shell rendezs (folyt.).


Sergyn Szabolcs

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

(n) A tvolsg: d = 3. A tizedik, hetedik, negyedik s els elembl ll rsztmbt rendezzk.


Vltoz

x:

i 3d
x:

10

i 2d
1

11

id
6

10

14

13

12

14

13

12

segd : 5

11

(o) A tvolsg: d = 3. A tizenegyedik, nyolcadik, tdik s msodik elembl ll rsztmbt rendezzk.


Vltoz

x:

10

11

14

id

13

12

segd : 14

(p) A tvolsg: d = 3. A tizenkettedik, kilencedik, hatodik, s harmadik elembl ll rsztmbt rendezzk.


Vltoz

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

(r) A tvolsg: d = 3. A tizennegyedik, tizenegyedik, nyolcadik, tdik s msodik elembl ll rsztmbt


rendezzk.

3.9. bra. Shell rendezs (folyt.).


10,000

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

3.10. bra. Klnbz futsi idk sszehasonltsa.


Sergyn Szabolcs

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.1. Faktorilis szmts


Matematikbl jl ismert, hogy az N termszetes szm faktorilisa alatt az els N darab pozitv egsz
szm szorzatt rtjk, a nulla faktorilist pedig 1-knt rtelmezzk. A faktorilis jellsre a felkiltjelet hasznljuk, teht az N szm faktorilist N !-knt jelljk. Egyetlen kpletben sszefoglalva az
eddigieket:

1,
ha N = 0 vagy N = 1
N! =
(4.1)
1 2 . . . N, ha N > 1 s n N
Ha algoritmust szeretnnk alkotni az N ! kiszmtsra, akkor a sorozatszmts ttelhez hasonl
algoritmussal (2.1. algoritmus) tudjuk kiszmtani a kvnt rtket. Lnyeges klnbsg persze, hogy az
elemek most nincsenek egy tmbben eltrolva. Tekinthetnk viszont gy az els N darab pozitv egsz
szmra, mint egy N elem tmb elemeire. gy a faktorilist a 4.1. algoritmussal hatrozhatjuk meg
iteratv, azaz ciklust hasznl mdon.
4.1. Algoritmus Faktorilis iteratv kiszmtsa
Bemenet: N egsz (termszetes szm)
Kimenet: rtk egsz
1: fggvny FaktorilisIteratv(N : egsz)
2:
rtk 1
3:
ciklus i 2-tl N -ig
4:
rtk rtk i
5:
ciklus vge
6:
vissza rtk
7: fggvny vge
Felhasznlt vltozk s fggvnyek
N : Termszetes szm, melynek a faktorilist meg kvnjuk hatrozni.
rtk: Az algoritmus vgn az N ! rtkt tartalmaz vltoz.
rdemes megemlteni, hogy az algoritmus 3. sorban lv szmlls ciklus i ciklusvltozjnak kezdeti
rtke 2. gy N = 0, illetve N = 1 esetben be sem lpnk a ciklusba, azaz az algoritmus a kezdeti 1
rtket fogja visszaadni.
Knnyen lthat, hogy a 4.1. algoritmus futsi ideje arnyos az N rtkvel, hiszen a ciklusban lv
utastst (N 1)-szer hajtjuk vgre.
A faktorilis iteratv trgyalst kveten trjnk r a rekurzv elv megvalsts bemutatsra.
Nzzk meg elszr miknt szmthatnnk ki pldul a 10 faktorilist, ha ismerjk mr mondjuk a 9
faktorilist. Az iteratv megkzeltst hasznlva vennnk az els 10 darab pozitv egsz szm szorzatt,
s gy megkapnnk a 10 faktorilist. Ehhez 9 darab szorzst kne elvgeznnk. Ha viszont ismerjk a
9 faktorilist (mert korbban mr kiszmtottuk), akkor a 10 faktorilist gy is megkaphatjuk, ha a 9
faktorilist megszorozzuk 10-zel. Ez azrt igaz, mert a 4.1. kplet alapjn
9! = 1 2 . . . 9

(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)

Az eddigiek alapjn mr megadhatjuk a faktorilis kiszmtsnak 4.2. rekurzv algoritmust, amit


a 4.5. kplet alapjn alkottunk meg.
4.2. Algoritmus Faktorilis rekurzv kiszmtsa
Bemenet: N egsz (termszetes szm)
Kimenet: N faktorilisa
1: fggvny FaktorilisRekurzv(N : egsz)
2:
ha N = 0 akkor
3:
vissza 1
4:
klnben
5:
vissza N FaktorilisRekurzv(N 1)
6:
elgazs vge
7: fggvny vge
Felhasznlt vltozk s fggvnyek
N : Termszetes szm, melynek a faktorilist meg kvnjuk hatrozni.
Az algoritmus 2. sorban megvizsgljuk, hogy az N rtke 0-e. Amennyiben 0, akkor a fggvny
visszatr az 1 rtkkel (ld. 3. sor). Egybknt, teht amikor N 1 a fggvny visszatrsi rtkt gy
hatrozzuk meg, hogy eltte meghvjuk a FaktorilisRekurzv fggvnyt (ld. 5. sor). Itt trtnik
meg tnylegesen a rekurz, hiszen a FaktorilisRekurzv fggvny egyik sajt utastsa meghvja
azt a fggvnyt, ami ppen fut. Fontos viszont azt szrevenni, hogy a hv fggvny paramtere N , mg
a hvott fggvny paramtere N 1.
4.1. Plda. Egy konkrt pldn nzzk vgig, miknt mkdik a 4.2. algoritmus, mikor milyen
paramterrel hvjuk meg a FaktorilisRekurzv fggvnyt. Az algoritmus futsa a 4.1. brn is
nyomon kvethet.
Feladatunk a 4 faktorilisnak meghatrozsa. Ennek rdekben meghvjuk az algoritmust megvalst fggvnyt, paramterknt a 4-et tadva annak: FaktorilisRekurzv(4). Ezt a hvst szemllteti
a 4.1a. bra, amelyen kk kitltssel jelezzk, hogy a hvott fggvnynl van jelenleg a vezrls. A fggvnyen bell kirtkelsre kerl az algoritmus 2. sorban tallhat felttel, ami hamis eredmnyt ad. A
felttel klnben gba lp a vezrls, ahol meghvjuk a fggvnyt egy j paramterrel: FaktorilisRekurzv(3). Ekkor a vezrls taddik a hvott fggvnynek, ahogy a 4.1b. brn is lthat.
Az j fggvnyben ismt kirtkelsre kerl az N = 0 felttel, ami ismt hamis lesz, ezrt a klnben
gba ugrik a vezrls. Itt pedig jabb rekurzv fggvnyhvs trtnik: FaktorilisRekurzv(2). A
vezrls taddik a 2-vel hvott fggvnynek (ld. 4.1c. bra). Ebben a fggvnyben is kirtkeljk az
N = 0 felttelt, ami mg mindig hamis lesz. Ezrt meghvjuk a fggvnyt egy kisebb paramterrel:
FaktorilisRekurzv(1). A vezrls taddik a hvott fggvnynek (ld. 4.1d. bra). Ebben a fggvnyben is kirtkeljk a 2. sorban lv felttelt, ami ismt hamis lesz. A klnben gban meghvjuk a
FaktorilisRekurzv fggvnyt a 0 paramterrel, gy a vezrls taddik a FaktorilisRekurzv(0)
fggvnynek (ld. 4.1e. bra).
Ebben a fggvnyben viszont az N = 0 felttel igaz lesz, gy a fggvny visszaadja az 1 rtket az algoritmus 3. sorban lv utastsnak megfelelen. Az rtk visszaadsval egytt a FaktorilisRekurzv(0)
fggvny futsa be is fejezdik, a vezrlst visszakapja a FaktorilisRekurzv(1) fggvny (ld. 4.1f. bra). A FaktorilisRekurzv(1) fggvnyen bell a vezrls abba a sorba tr vissza, ahonnan korbban meghvtuk a FaktorilisRekurzv(0) fggvnyt. Ez a fggvny 5. sora. Itt elvgezzk
az 1 FaktorilisRekurzv(0) mveletet, majd a fggvny visszatr a kiszmtott 1 rtkkel s a
FaktorilisRekurzv(1) fggvny futsa is vget r. gy a vezrls visszakerl a FaktorilisRekurzv(2)
fggvnyhez (ld. 4.1g. bra).
A FaktorilisRekurzv(2) fggvnyen bell is elvgezzk az 5. sorban lv szorzst, majd ez a fggvny visszatr a 2 rtkkel. A FaktorilisRekurzv(2) fggvny futsa is vget r, a vezrls visszakerl a FaktorilisRekurzv(3) fggvnyhez (ld. 4.1h. bra). A FaktorilisRekurzv(3) fggvnyben
Sergyn Szabolcs

123

budai Egyetem
Neumann Jnos Informatikai Kar

is elvgezzk a szksges szorzst, majd a fggvny visszaadja a 6 rtket. A FaktorilisRekurzv(3)


futsa is vget r, a vezrls pedig a FaktorilisRekurzv(3) fggvnyhez kerl vissza (ld. 4.1i. bra).
A FaktorilisRekurzv(4) fggvnyben is az algoritmus 5. sorban folytatdik a vgrehajts.
Elvgezzk a 4 FaktorilisRekurzv(3) szorzst, majd a fggvny visszatr a 24-gyel. Ezt kveten
vget r a FaktorilisRekurzv(4) fggvny futsa is (ld. 4.1j. bra). Mivel ez volt az a fggvny, amit
a klvilgbl hvtunk, gy az algoritmus futsa vget rt, sikeresen meghatroztuk a 4 faktorilist.
Megjegyzs

A rekurzi vgrehajtsa sorn lthatjuk, hogy a FaktorilisRekurzv fggvnynek


egyszerre tbb pldnya is fut, br kzlk csak egy aktv. Ez nem okoz problmt,
mivel a rekurzv hvsok sorn adminisztrljuk, hogy melyik pontrl hvtuk meg az j
fggvnyt, gy a hvott fggvny futsa vgn visszatrhet oda a vezrls. Ez viszont ids memriaignyes tevkenysg.
Futsi id elemzse. Rekurzv algoritmusok futsi idejnek vizsglatnl ltalban azt vizsgljuk,
hogy hny rekurzv hvs trtnt. Ez lnyegben hasonl megkzelts, mit amit iteratv algoritmusoknl
hasznltunk. Ott sokszor azt vizsgltuk, hogy egy ciklus hnyszor fut le. Mivel a rekurzv algoritmusoknl
a ciklusokat helyettestjk rekurzv hvsokkal, gy rtelemszeren a rekurzv hvsok szmt rdemes
vizsglnunk.
Az N faktorilisnak meghatrozshoz (N + 1)-szer hvjuk meg a FaktorilisRekurzv fggvnyt. A klvilg persze csak egy hvst eszkzl, majd ezt kveti mg N darab rekurzv hvs.
Ezek alapjn az algoritmus futsi ideje O(N )-es. Ez azt jelenti, hogy nagysgrendileg ugyanolyan a
futsi ideje, mint a faktorilis szmts iteratv megvalstsnak. Viszont a rekurzv fggvnyhvsok
megvalstsa id- s memriaignyes, ezrt konkrt implementci esetn azt tapasztaljuk, hogy az
iteratv megvalsts lnyegesen gyorsabb futst eredmnyez.
FaktorilisRekurzv(2)

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.

4.1. bra. A 4 faktorilisnak rekurzv meghatrozsa.

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.

(e) A FaktorilisRekurzv(1) fggvny


meghvja a FaktorilisRekurzv(0) fggvnyt.

FaktorilisRekurzv(0)
1
FaktorilisRekurzv(1)

FaktorilisRekurzv(1)
1

FaktorilisRekurzv(2)

FaktorilisRekurzv(2)

FaktorilisRekurzv(3)

FaktorilisRekurzv(3)

FaktorilisRekurzv(4)

FaktorilisRekurzv(4)

(f) A FaktorilisRekurzv(0) fggvny


visszaadja az 1 rtket, majd futsa
vget r.
A vezrls visszakerl a
FaktorilisRekurzv(1) fggvnyhez.

(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.

4.1. bra. A 4 faktorilisnak rekurzv meghatrozsa (folyt.).

Sergyn Szabolcs

125

budai Egyetem
Neumann Jnos Informatikai Kar

4.2. Rekurzv algoritmusok jellemzi


Az elz alfejezetben a faktorilis szmtsnak pldjn lttuk, miknt is mkdnek a rekurzv algoritmusok. Foglaljuk ssze, hogy mik ezeknek az algoritmusoknak a legfontosabb jellemzi.
1. A rekurzv algoritmusokat olyan fggvnyekkel vagy eljrsokkal valstjuk meg, melyek nmagukat
hvjk meg. Ez trtnhet kzvetlenl, ahogy azt a faktorilis szmtsnl is lttuk. A FaktorilisRekurzv fggvny ugyanis nmagt hvta meg.
Megjegyzs

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

A FaktorilisRekurzv fggvnynl az alapeset az N = 0 paramter esetn llt el.


Ekkor ugyanis a fggvny nem hvta meg jra nmagt, hanem visszaadott egy konkrt
rtket, mgpedig az 1-et.
3. A rekurzv hvsok sorn a fggvnyek vagy eljrsok paramterei folyamatosan vltoznak. Ha
nem vltoznnak, akkor vgtelen hvsi lncba kerlnnk. A paramterek vltozsnak olyannak
kell lennie, hogy a hvsok sorn kzeledjnk az alapeset fel.
Megjegyzs

A FaktorilisRekurzv fggvnynl a rekurzv hvsok sorn a fggvny bemeneti


paramtere mindig eggyel cskkent, gy kzeledett az N = 0 alapesethez.
4. A rekurzv fggvny egyszer kerl eltrolsra a memriban. Az egyes fggvnyhvsokat a fggvny paramterei klnbztetik meg egymstl. A paramterek s a hozzjuk tartoz loklis vltozk viszont minden j fggvnyhvskor eltrolsra kerlnek a memria n. verem rszben. A
rekurzv hvsoknl a paramterek s loklis vltozk eltrolsa, azaz a hvsok adminisztrlsa ids memriaignyes tevkenysg. Emiatt ltalban igaz, hogy egy algoritmus rekurzv megvalstsa
lassabb, mint a hasonl logikra pl iteratv megvalsts.
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

4.3. Fibonacci sorozat


Kvetkez pldnk egy olyan algoritmus trgyalsa, mely rekurzv tleten alapszik, de knnyen adhat
r iteratv st tbbszrs kirtkelst nem ignyl megvalsts is.
Fibonacci itliai matematikus egyszer a nyulak szaporodst vizsglta. Megllaptotta, hogy egy
nylpr a szletst kveten ktszer szaporodik. Az els szaporodsi ciklusban egy nylprnak, majd
a msodik ciklusban is egy nylprnak ad letet. Felmerlhet a krds, hogy az N -edik szaporodsi
ciklusban hny nylpr fog ilyen mdon megszletni.
Kiindulskor, azaz a nulladik szaporodsi ciklusban egy nylprunk van, akiknek a kvetkez kt
ciklusban szletnek majd utdaik. Ha Fi -vel jelljk az i-edik ciklusban szletett nylprok szmt,
akkor F0 -t az elsnek tekinthetjk.
Az els szaporodsi ciklusban a kezdetben l egyetlen nylprunk fog szaporodni, mgpedig egy
nylprt hoznak a vilgra. gy F1 = 1. A msodik szaporodsi ciklusban mg egyszer szaporulatot
ad a kezdetben mr ltez nylpr, illetve szaporodik az elz ciklusban szletett nylpr is. Ezrt
F2 = F0 + F1 , azaz F2 = 2. A harmadik ciklusban a kezdetben ltez nylpr mr nem fog jra
szaporodni, viszont az els s msodik szaporodsi ciklusban szletett prok igen. gy F3 = F1 + F2 ,
teht F3 = 3. Innentl kezdve ez gy megy a vgtelensgig, azaz FN = FN 2 + FN 1 .
sszefoglalva Fibonacci az albbi szablyszersget tallta:

1,
ha N 1
FN =
(4.7)
FN 2 + FN 1 , ha N 2
Teht a Fibonacci sorozat nulladik s els eleme 1-gyel egyenl, minden tovbbi eleme pedig a kt
megelz elem sszegeknt ll el.
A 4.7. kplet alapjn egyszeren megrhatjuk az N -edik Fibonacci szm kiszmtsnak rekurzv
algoritmust, ahogy ez a 4.3. algoritmusnl lthat is.
4.3. Algoritmus Fibonacci sorozat N -edik elemnek rekurzv meghatrozsa
Bemenet: N egsz
Kimenet: N -edik Fibonacci szm
1: fggvny FibonacciRekurzv(N : egsz)
2:
ha N 1 akkor
3:
vissza 1
4:
klnben
5:
vissza FibonacciRekurzv(N 2) + FibonacciRekurzv(N 1)
6:
elgazs vge
7: fggvny vge
Felhasznlt vltozk s fggvnyek
N : Nemnegatv egsz, mely megadja, hogy hnyadik Fibonacci szmot akarjuk meghatrozni.
Az algoritmusban semmi ms nem trtnik, mint ami a 4.7. kpletben is lthat. Megvizsgljuk,
hogy milyen az N rtke (ld. 2. sor). Amennyiben N 1, akkor az alapeset ll fenn, teht 1-et ad vissza
a fggvny (ld. 3. sor). Egybknt viszont az (N 2)-edik s (N 1)-edik Fibonacci szmok sszegt
adja vissza a fggvny (ld. 5. sor). A kisebb index Fibonacci szmokat rekurzv hvsokkal kapjuk meg.
Egy utastson bell kt rekurzv hvs is trtnik, de termszetesen nem egy idben, hanem egymst
kveten. Hogy a FibonacciRekurzv(N 2) vagy a FibonacciRekurzv(N 1) fggvnyt hvjuke meg elszr, az attl fgg, hogy a konkrt programozsi krnyezet milyen sorrendben rtkeli ki az
sszeadsban szerepl kifejezseket. Amennyiben az sszeads kirtkelse balrl jobbra trtnik, akkor
elszr lefut a FibonacciRekurzv(N 2) fggvny, majd ezt kveten fut a FibonacciRekurzv(N
1) fggvny.
4.2. Plda. Nzzk meg, hogy a 4.3. algoritmus hasznlatval miknt tudjuk meghatrozni az tdik
Fibonacci szmot. Ennek rdekben meghvjuk a FibonacciRekurzv fggvnyt, az N = 5 bemenettel. A FibonacciRekurzv(5) fggvny futsa sorn meghvja a FibonacciRekurzv(3) fggvnyt.
A FibonacciRekurzv(3) fggvny hvja a FibonacciRekurzv(1)-et, ami visszatr az 1 rtkkel,
majd a vezrls visszakerl a FibonacciRekurzv(3) fggvnyhez. A FibonacciRekurzv(3) fggvnybl meghvsra kerl a FibonacciRekurzv(2) fggvny is. A FibonacciRekurzv(2) meghvja
Sergyn Szabolcs

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

4.5. Algoritmus Az els N darab Fibonacci szm megadsa


Bemenet: N egsz
Kimenet: x egsz tmb
1: fggvny FibonacciKigyjt(N : egsz)
2:
x Ltrehoz(egsz)[N ]
3:
x[1] 1
4:
x[2] 2
5:
ciklus i 3-tl N -ig
6:
x[i] x[i 2] + x[i 1]
7:
ciklus vge
8:
vissza x
9: fggvny vge
Felhasznlt vltozk s fggvnyek
N : Megadja, hogy az els hny darab Fibonacci szmot hatrozzuk meg. Feltesszk, hogy N 2.
x: N elem egszeket tartalmaz tmb, melynek i-edik eleme az i-edik Fibonacci szm.
Ltrehoz(egsz)[N ]: Utasts, mely ltrehoz egy N elem egsz tpus tmbt.

Sergyn Szabolcs

130

budai Egyetem
Neumann Jnos Informatikai Kar

4.4. Hatvnyozs rekurzvan


Kvetkez feladatunk egy pozitv vals szm (a) pozitv egsz kitevs (N ) hatvnynak meghatrozsa.
Erre knnyen adhatunk iteratv megoldst a 2.1.1. fejezetben megismert sorozatszmts programozsi
ttel hasznlatval. A hatvnyozs iteratv megvalstst a 4.6 algoritmusban lthatjuk.
4.6. Algoritmus aN iteratv meghatrozsa
Bemenet: a szm, N egsz
Kimenet: rtk szm
1: fggvny HatvnyIteratv(a : szm, N : egsz)
2:
rtk a
3:
ciklus i 2-tl N -ig
4:
rtk rtk a
5:
ciklus vge
6:
vissza rtk
7: fggvny vge
Felhasznlt vltozk s fggvnyek
a: Pozitv vals szm.
N : Pozitv egsz szm.
rtk: A fggvny visszatrsi rtke, mely az algoritmus vgn aN -nel egyenl.
Futsi id elemzse. Lthat, hogy az algoritmuson belli ciklus (N 1)-szer fut le, gy az algoritmus
futsi ideje O(N )-es.
Nzzk meg, hogy miknt tudunk rekurzv algoritmust adni a feladat megoldsra. Tudjuk, hogy az
a szm N -edik hatvnyt kiszmthatjuk gy, ha az (N 1)-edik hatvnyt megszorozzuk a-val, azaz
aN = aN 1 a.

(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 =

(((a a) (a a)) ((a a) (a a))) (((a a) (a a)) ((a a) (a a))) .

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.

4.8. Algoritmus aN felezses elv rekurzv meghatrozsa


Bemenet: a szm, N egsz
Kimenet: aN rtke
1: fggvny HatvnyFelez(a : szm, N : egsz)
2:
ha N = 1 akkor
3:
vissza a
4:
klnben
5:
ha N pros akkor

6:
segd HatvnyFelez a, N2
7:
vissza segd segd
8:
klnben

9:
segd HatvnyFelez a, N 21
10:
vissza a segd segd
11:
elgazs vge
12:
elgazs vge
13: fggvny vge
Felhasznlt vltozk s fggvnyek
a: Pozitv vals szm.
N : Pozitv egsz szm.
A 4.8. algoritmusban lthatjuk a 4.21. kpletnek megfelel megvalsts pszeudokdjt. Fontos megemlteni, hogy az algoritmus 6. s 9. soraiban trtnik a rekurzv fggvnyhvs. A fggvnyek visszatrsi
rtkt egy segd vltozba mentjk, majd ennek a vltoznak kpezzk a ngyzett. Ha ehelyett pldul
Sergyn Szabolcs

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)

(a) A klvilgbl meghvjuk a HatvnyFelez(2,22) fggvnyt.

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.

4.3. bra. 222 meghatrozsa a 4.8. algoritmus hasznlatval.

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)

(d) A HatvnyFelez(2,5) fggvny meghvja a HatvnyFelez(2,2) fggvnyt.

(e) A HatvnyFelez(2,2) fggvny


meghvja a HatvnyFelez(2,1) fggvnyt.

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)

(f) A HatvnyFelez(2,1) fggvny


visszatr az 1 rtkkel. A vezrls visszakerl a HatvnyFelez(2,2) fggvnyhez.

(g) A HatvnyFelez(2,2) fggvny


visszatr a 4 rtkkel. A vezrls
visszakerl a HatvnyFelez(2,5)
fggvnyhez.

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

(h) A HatvnyFelez(2,5) fggvny visszatr a 32 rtkkel. A vezrls visszakerl a HatvnyFelez(2,11) fggvnyhez.

(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.

4.3. bra. 222 meghatrozsa a 4.8. algoritmus hasznlatval (folyt.).

Sergyn Szabolcs

134

budai Egyetem
Neumann Jnos Informatikai Kar

4.5. Hanoi tornyai


A Hanoi tornyai egy jtk, amelynek megoldsra mutatunk be egy rekurzv elven mkd algoritmust. A
jtk szablyai a kvetkezk. Van hrom rudunk, jellje ezeket A, B s C, valamint N darab korongunk.
A korongok mrete klnbz. Kezdetben minden korong az A rdon helyezkedik el gy, hogy egy korong
nem lehet nla kisebb korongon. Ngy korong esetn a 4.4. bra mutatja a kiindulsi esetet. Feladatunk,
hogy minden korongot thelyezznk az A oszloprl a C oszlopra. Az thelyezsnek kt fontos szablya
van. Az els, hogy csak a legfels korongot vehetjk le valamely rdrl s a levett korongot t kell
helyezni egy msik rdra. Nem tehetnk olyat, hogy egy korongot bizonyos ideig nem rdon trolunk.
A msik szably, hogy egy korongot csak olyan rdra tehetnk t, amely vagy res, vagy a rajta lv
fels korong nagyobb, mint a rhelyezend korong.

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

(a) A hrom legkisebb korongot mr tmozgattuk az A rdrl a B rdra.

1
2

(b) A negyedik korongot ttesszk az A rdrl az res C rdra.

1
2
3
4
A

(c) A B rdrl a hrom korongot ttettk a C rdra gy, hogy a legnagyobb


korong mr a C rdon volt.

4.5. bra. Ngy korong A-rl C-re val tmozgatsnak tlete.

4.9. Algoritmus Hanoi tornyai


Bemenet: N egsz, forrs rd, cl rd, segd rd
1: eljrs Hanoi(N : egsz, forrs : rd, cl : rd, segd : rd)
2:
ha N = 1 akkor
3:
Mozgat(1, forrs, cl)
4:
klnben
5:
Hanoi(N 1, forrs, segd, cl)
6:
Mozgat(N, forrs, cl)
7:
Hanoi(N 1, segd, cl, forrs)
8:
elgazs vge
9: eljrs vge
Eljrs hvsa: Hanoi(N, A, C, B)
Felhasznlt vltozk s fggvnyek
N : A mozgatand korongok szma.
forrs: Az a rd, amelyrl mozgatni akarunk.
cl: Az a rd, amelyre mozgatni akarunk.
cl: Az a rd, amelyet segtsgl hasznlhatunk a mozgatshoz.
Mozgat(n, forrs, cl): Eljrs, amely megvalstja az n-edik korong mozgatst a forrs rdrl
a cl rdra.

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.6. Egyszer programozsi ttelek rekurzv megvalstsa


4.6.1. Sorozatszmts
A 2.1.1. fejezetben mr trgyaltuk a sorozatszmts programozsi ttelt, de ott iteratv megoldst
mutattunk be. Ebben a fejezetben pedig a sorozatszmts feladatnak rekurzv megvalstst mutatjuk
be.
Sorozatszmtsnl a feladatunk egy x tmb sszes eleme kztt elvgezni egy megadott mveletet.
Az algoritmus eredmnyl a kiszmtott mveleti rtket adja meg. Pldaknt ltalban az sszegzst
szoks emlteni, ami a tmb elemeinek sszegt hatrozza meg.
A rekurzv megoldsunk lnyege az lesz, hogy amikor az els jobb darab elem kztti mveleti eredmnyt akarjuk kiszmtani, akkor feltesszk, hogy az els jobb 1 darab elem kztt mr ismerjk az
mvelet eredmnyt, gy csak ezen rtk s a tmb jobb index eleme kztt kell meghatrozni az
mvelet eredmnyt. Lnyegben az mvelet asszociatv tulajdonsgt hasznljuk, hiszen:
x[1] + x[2] + . . . + x[jobb 1] + x[jobb] = (x[1] + x[2] + . . . + x[jobb 1]) + x[jobb].

(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.

(a) A klvilgbl meghvsra kerl


a SorozatszmtsRekurzv(x, 5)
fggvny, mely a teljes tmbt 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.

4.7. bra. Sorozatszmts programozsi ttel rekurzv megvalstsa


Sergyn Szabolcs

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.

4.7. bra. Sorozatszmts programozsi ttel rekurzv megvalstsa (folyt.).

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.

4.7. bra. Sorozatszmts programozsi ttel rekurzv megvalstsa (folyt.).

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

(i) A SorozatszmtsRekurzv(x, 2) fggvny visszatr a 9 rtkkel.


A vezrls
a SorozatszmtsRekurzv(x, 3) fggvnyhez
kerl vissza.

(j) A SorozatszmtsRekurzv(x, 3) fggvny visszatr a 10 rtkkel.


A vezrls a SorozatszmtsRekurzv(x, 4) fggvnyhez kerl vissza.

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.

4.7. bra. Sorozatszmts programozsi ttel rekurzv megvalstsa (folyt.).

Sergyn Szabolcs

143

budai Egyetem
Neumann Jnos Informatikai Kar

4.6.2. Lineris keress


Az eldnts (ld. 2.1.2. fejezet), kivlaszts (ld. 2.1.3. fejezet) s lineris keress (ld. 2.1.4. fejezet) programozsi ttelek kzl csak az utbbi rekurzv megvalstst mutatjuk be. Ennek oka, hogy a lineris
keress magba foglalja az eldntst s a kivlasztst is, teht ennek a rekurzv algoritmusa ismeretben mr nagyon egyszeren meg tudnnk alkotni az eldnts s kivlaszts rekurzv megvalstsnak
algoritmust.
Lineris keressnl adott egy x bemeneti tmb, melynek ismerjk az n mrett is. Azt vizsgljuk,
hogy van-e a tmbben P tulajdonsg elem, s ha van, akkor megadjuk az els ilyen elem indext is.
Teht a lineris keressnek kt kimenete van. Mivel egyes nyelvi implementciknl egy fggvnynek csak
egy visszatrsi rtke lehet, ezrt a lineris keresst egy olyan rekurzv fggvnnyel fogjuk megvalstani,
melynek csak egy visszatrsi rtke van. Abban az esetben, ha van P tulajdonsg elem a tmbben,
akkor visszaadja a fggvny az els ilyen elem indext. Ha viszont nincs a tmbben P tulajdonsg elem,
akkor egy nemltez indexet, a 0-t adja vissza a fggvny.
A rekurzv megvalsts sorn kezdetben az egsz tmbt vizsgljuk. Ha az els elem P tulajdonsg, akkor lellhat a futs, ezrt visszaadja a fggvny az egy rtket. Ha viszont az els elem nem P
tulajdonsg, akkor csak a msodiktl az n-edik elemig terjed rsztmbbel kell foglalkoznunk. Ezrt
rekurzvan meghvjuk a fggvnynket gy, hogy a msodik elemet tekintjk elsnek. Amennyiben a
rekurzv hvsok sorn tallunk P tulajdonsg elemet, akkor lell a futs. Ha viszont nincs P tulajdonsg elem a tmbben, akkor mr olyan rekurzv hvst eszkzlnk, melyben egy nem vals rsztmb
vizsglatt krjk az algoritmustl. Ilyenkor a fggvny a 0 visszaadott rtkkel fog lellni.
A lineris keress rekurzv megvalstst a 4.11. algoritmusban lthatjuk.
4.11. Algoritmus Lineris keress programozsi ttel rekurzv megvalstsa
Bemenet: x T tmb, bal egsz, n egsz (tmb mrete), P logikai (tulajdonsg)
Kimenet: Az els P tulajdonsg elem indexe, illetve ha nincs P tulajdonsg elem, akkor 0.
1: fggvny LinerisKeressRekurzv(x : T tmb, bal : egsz, n : egsz, P : logikai)
2:
ha bal > n akkor
3:
vissza 0
4:
klnben
5:
ha P (x[bal]) akkor
6:
vissza bal
7:
klnben
8:
vissza LinerisKeressRekurzv(x, bal + 1, n, P )
9:
elgazs vge
10:
elgazs vge
11: fggvny vge
Fggvny hvsa: LinerisKeressRekurzv(x, 1, n, P )
Felhasznlt vltozk s fggvnyek
x: A feldolgozand tmb.
n: Az x tmb mrete.
bal: Az x tmbnek a bal index elemtl az utols elemig tart rsztmbt dolgozza fel az aktulis
LinerisKeressRekurzv fggvny.
P : Logikai rtket visszaad tulajdonsgfggvny. Az algoritmus azt hatrozza meg, hogy az x
tmbnek van-e P tulajdonsg eleme, s ha van, akkor hol tallhat az els ilyen.
Az algoritmus els bemenete az x vizsglt tmb. Msodik bemenetknt megadjuk a bal rtket, amely
azt jelzi, hogy hol kezddik az ppen vizsglt rsztmb. Ez a paramter fog vltozni a rekurzv hvsok
sorn. Kezdeti rtke 1, hiszen kiindulsknt a teljes tmbt vizsgljuk. Ha ennek a bemenetnek az rtke
nagyobb lesz a tmb n mretnl, akkor ll el az az eset, amikor nem talltunk P tulajdonsg elemet
a tmbben. Harmadik paramterknt meg kell mg adnunk az x tmb mrett. Negyedik bemenetnk a
vizsglt P tulajdonsgfggvny lesz. Az algoritmust megvalst LinerisKeressRekurzv fggvny
visszatrsi rtke a megtallt P tulajdonsg elem indexe vagy 0 lesz.
Az algoritmus 2. sorban megvizsgljuk, hogy bal rtke meghaladja-e mr a tmb mrett. Ha igen,
akkor nem talltunk a tmbben P tulajdonsg elemet, ezrt 0-val tr vissza a fggvny (ld. 3. sor).
Sergyn Szabolcs

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

(c) A LinerisKeressRekurzv (x, 2, 5, Pros) (d)


Mivel
a
3.
elem
pros,
ezrt
a
fggvny
meghvja
a LinerisKeressRekurzv(x, 3, 5, Pros)
fggLinerisKeressRekurzv(x, 3, 5, Pros)
fgg- vny visszatr a 3 rtkkel. A vezrls visszakerl
vnyt, mely az x tmb 3. s 5. eleme kztti a LinerisKeressRekurzv(x, 2, 5, Pros) fggrsztmbben keres pros szmot.
vnyhez.
LinerisKeressRekurzv(x, 2, 5, Pros)
3
LinerisKeressRekurzv(x, 1, 5, Pros)
LinerisKeressRekurzv(x, 1, 5, Pros)
3
x:

bal

x:

(e) A LinerisKeressRekurzv(x, 2, 5, Pros)


fggvny is a 3 rtkkel tr vissza. A vezrls a
LinerisKeressRekurzv(x, 1, 5, Pros) fggvnyhez kerl vissza.

(f) A LinerisKeressRekurzv(x, 1, 5, Pros)


fggvny is a 3 rtkkel tr vissza. A feladatot
megoldottuk, van pros elem a tmbben,
mgpedig a 3. elem az els ilyen tulajdonsg.

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.

4.9. bra. Megszmlls programozsi ttel rekurzv megvalstsa. A 3, 6, 1, 8, 4 tmbben keressk a


pros rtkek darabszmt.
Sergyn Szabolcs

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.

4.9. bra. Megszmlls programozsi ttel rekurzv megvalstsa. A 3, 6, 1, 8, 4 tmbben keressk a


pros rtkek darabszmt (folyt.).

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.

4.9. bra. Megszmlls programozsi ttel rekurzv megvalstsa. A 3, 6, 1, 8, 4 tmbben keressk a


pros rtkek darabszmt (folyt.).

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

(j) A MegszmllsRekurzv(x, 3, Pros)


fggvny visszatr a 1 rtkkel. A vezrls a
MegszmllsRekurzv(x, 4, Pros)
fggvnyhez kerl vissza.

(k) A MegszmllsRekurzv(x, 4, Pros)


fggvny visszatr a 2 rtkkel. A vezrls a
MegszmllsRekurzv(x, 5, Pros) fggvnyhez kerl vissza.

MegszmllsRekurzv(x, 5, Pros)
1+2=3

x:

(l) A MegszmllsRekurzv(x, 5, Pros)


fggvny visszatr a 3 rtkkel, ami a tmbben lv prosak szma.

4.9. bra. Megszmlls programozsi ttel rekurzv megvalstsa. A 3, 6, 1, 8, 4 tmbben keressk a


pros rtkek darabszmt (folyt.).

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

Elszr meghvjuk a MaximumkivlasztsRekurzv(x, 6) fggvnyt (ld. 4.10a. bra). Mivel jobb


rtke nem 1, ezrt rgtn hvjuk a MaximumkivlasztsRekurzv(x, 5) fggvnyt (ld. 4.10b. bra).
A tovbbi fggvnyhvsokat brzoltuk a 4.10c-4.10f. brkon.
Amikor jobb rtke 1, akkor a MaximumkivlasztsRekurzv(x, 1) fggvny visszatr az 1 rtkkel. A vezrls visszakerl a MaximumkivlasztsRekurzv(x, 2) fggvnyhez. Ebben a fggvnyben
sszehasonltjuk az msodik s a max index elemet (ld. 4.10h. bra). Mivel az els elem nagyobb ezrt
a MaximumkivlasztsRekurzv(x, 2) fggvny is 1-et fog visszaadni a MaximumkivlasztsRekurzv(x, 3) fggvnynek. Itt is elvgezzk az aktulis sszehasonltst (ld. 4.10h. bra). A harmadik
elem viszont nagyobb az els elemnl, ezrt a MaximumkivlasztsRekurzv(x, 3) fggvny a 3-at
fogja visszaadni a MaximumkivlasztsRekurzv(x, 4) fggvnynek. Az algoritmus tovbbi futst
a 4.10i-4.10l. brk szemlltetik. Az algoritmus vgn azt kapjuk vissza, hogy az x tmb tdik eleme a
legnagyobb.
Futsi id elemzse. A 4.13. algoritmus vgrehajtsa sorn mindig n darab fggvnyhvst vgznk,
gy a maximumkivlaszts rekurzv megvalstsa is O(n)-es futsi idej algoritmus.
MaximumkivlasztsRekurzv(x, 5)
MaximumkivlasztsRekurzv(x, 6)

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.

4.10. bra. Maximumkivlaszts programozsi ttel rekurzv megvalstsa. A 2, 1, 6, 5, 8, 3 elemei


kztt keressk a legnagyobb rtkt.

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.

4.10. bra. Maximumkivlaszts programozsi ttel rekurzv megvalstsa. A 2, 1, 6, 5, 8, 3 elemei


kztt keressk a legnagyobb rtkt (folyt.).

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.

4.10. bra. Maximumkivlaszts programozsi ttel rekurzv megvalstsa. A 2, 1, 6, 5, 8, 3 elemei


kztt keressk a legnagyobb rtkt (folyt.).
Sergyn Szabolcs

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.

4.10. bra. Maximumkivlaszts programozsi ttel rekurzv megvalstsa. A 2, 1, 6, 5, 8, 3 elemei


kztt keressk a legnagyobb rtkt (folyt.).
Sergyn Szabolcs

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

5.1. Keressek rendezett tmbkben


A keress feladatval mr megismerkedtnk a 2.1.4. fejezetben. Ott azt lttuk, hogy egy ismert mret
x tmbben keresnk adott (P ) tulajdonsg elemet. Mivel nem tudjuk, hogy van-e egyltaln P tulajdonsg elem x-ben, ezrt a keress egyik visszatrsi rtke errl ad informcit (van logikai vltoz).
Ha talltunk P tulajdonsg elemet az x tmbben, akkor azt is tudni akarjuk, hogy hol talltunk ilyet.
Errl ad informcit az idx visszatrsi rtk.
Rendezett tmbk esetn kis mrtkben mdostunk a feladaton annak rdekben, hogy a rendezettsget valban ki tudjuk hasznlni. Nem azt fogjuk vizsglni, hogy van-e adott tulajdonsg elem a
tmbben, hanem egy konkrt rtket keresnk, amit az rtk vltozval jellnk (ld. 2.8. algoritmus).
Ha van a keresett rtk-kel megegyez elem a tmbben, akkor az eltte lv elemek mind kisebbek nla,
az utna kvetkezk pedig mind nagyobbak nla, hiszen nvekv mdon rendezett a tmb.
Megjegyzs

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

5.1.1. Lineris keress


A 2.1.4. fejezetben megismert lineris keress algoritmusban a tmb elejtl indulva elemrl elemre
haladva jrjuk be a vizsglt tmbnket, ahogy azt a 2.8. algortimusban lttuk. A bejrs akkor r vget,
ha megtalltuk a keresett elemet, vagy ha a tmb vgre rtnk.
Rendezett tmbk esetn, amikor egy konkrt rtk-et keresnk javthatunk a 2.8. algoritmuson.
Ugyanis a tmb bejrsa nem csak a fentebb emltett kt esetben rhet vget, hanem akkor is, ha az
aktulisan vizsglt tmbelem nagyobb a keresett rtk-nl. Ilyenkor mr biztos nem fogjuk a keresett
rtk-et megtallni a tmbben, hiszen csak nla nagyobb elemeket vizsglnnk a tovbbi bejrs sorn.
Ennek rtelmben rendezett tmbk esetn a lineris keresst az 5.1. algoritmussal valsthatjuk meg.
5.1. Algoritmus Lineris keress rendezett tmbben
Bemenet: x T rendezett tmb, n egsz (tmb mrete), rtk T; ahol T sszehasonlthat
Kimenet: van logikai, idx egsz
1: fggvny LinerisKeressRendezettben(x : T rendezett tmb, n : egsz, rtk : T)
2:
i1
3:
ciklus amg (i n) (x[i] < rtk)
4:
ii+1
5:
ciklus vge
6:
van (i n) (x[i] = rtk)
7:
ha van akkor
8:
idx i
9:
vissza (van, idx)
10:
klnben
11:
vissza van
12:
elgazs vge
13: fggvny vge
Felhasznlt vltozk s fggvnyek
x: Nvekv mdon rendezett tmb.
n: Az x tmb mrete.
rtk : Keresett rtk.
van: Pontosan akkor igaz, ha az rtk benne van az x-ben.
idx: Ha rtk benne van az x tmbben, akkor (az els elfordulsa) az idx-edik helyen tallhat
meg.
A 2.8. algoritmust kt helyen kell mdostanunk. Egyrszt a 3. sorbeli ciklusfelttel msodik tagjt
vltoztatjuk meg. Nem azt vizsgljuk, hogy x[i] 6= rtk teljesl-e, hiszen teljesen felesleges akkor
folytatni a bejrst, ha rtk > x[i]. Ehelyett csak azt nzzk, hogy a keresett rtk kisebb-e mint
az aktulis x[i] tmbelem. Ha kisebb, akkor mg van rtelme tovbb keresni, ezrt bennmaradunk a
bejrst megvalst ciklusban.
A ciklust kveten megvizsgljuk, hogy mirt lptnk ki a ciklusbl s ez alapjn eldntjk, hogy
megtalltuk-e a keresett rtk-et. Ehhez korbban a 2.8. algoritmusban elg volt azt vizsglni, hogy
i n igaz -e. Az most is igaz, hogy i > n esetn nem talltuk meg a keresett rtk-et, teht a van
kimenetnek hamis-nak kell lennie. Viszont az i n felttel gy is lehet igaz, ha nem talltuk meg
a tmbben a keresett rtk-et, ugyanis a bejrst flbehagyjuk akkor is, ha az aktulis tmbelem mr
nagyobb a keresett rtk-nl.
Ezek miatt a ciklust kveten azt vizsgljuk, hogy nem haladtunk-e tl a tmb utols elemn is
(i n), illetve, hogy az aktulis x[i] tmbelem megegyezik-e a keresett rtk-kel. Ha mindkt vizsglt
felttel igaz, akkor talltuk meg a keresett rtk-et az x tmbben. Fontos megjegyezni azt is, hogy az
i n felttelt nem hagyhatjuk el a vizsglatbl. Ha pldul a keresett rtk az utols tmbelemnl is
nagyobb azaz rtk > x[n] , akkor a ciklusbl az i n felttel hamis-s vlsa miatt lpnk ki. gy
viszont i = n + 1, teht az x tmbt nem tudjuk ezzel az i-vel indexelni.
Futsi id elemzse. Elszr ismteljk t, hogy mit tudunk a lineris keress 2.8. algoritmusnak
futsi idejrl. Ha a keresett rtk benne van a tmbben, akkor a bejrst megvalst ciklusban addig
vagyunk bent, amg meg nem talljuk az rtk-et. A futsi id teht ilyenkor attl fgg, hogy hnyadik
Sergyn Szabolcs

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

5.1.2. Logaritmikus keress


A logaritmikus keressnl1 feladatunk ugyanaz, mint a korbbi lineris keressnl volt. Azt keressk,
hogy egy nvekv mdon rendezett tmbben benne van-e a keresett rtk, s ha benne van, akkor melyik
helyen. A lineris keressnl lttuk, hogy rendezetlen s rendezett tmbben is meg tudjuk oldani a
problmt. A logaritmikus keress viszont csak rendezett tmbk esetn alkalmazhat.
A logaritmikus keressnl a kvetkez tlet alapjn jrunk el. Kezdetben vizsgljuk az egsz tmbnket, melynek kzps elemt sszehasonltjuk a keresett rtkkel. Ha egyezsget tallunk, akkor nincs
tovbbi teendnk. Ha viszont a kzps elem nagyobb mint a keresett rtk, akkor a keresst mr csak
a kzps elem eltti elemek kztt kell folytatnunk. Hasonlan, ha a kzps elem kisebb a keresett
rtknl, akkor a kzps elem utni elemek kztt kell a tovbbiakban keresnnk. Mindkt esetben
igaz, hogy a vizsglt tmbnek csak az egyik felben folytatjuk tovbb a keresst. Emiatt ezt a keressi
mdszert felez keressnek, illetve binris keressnek2 is szoks nevezni. A keress akkor r vget, ha
megtalljuk valahol a keresett rtket, vagy ha elfogy a tmbnk.
A logaritmikus keress megvalstst az 5.2. algoritmusban mutatjuk be. Az algoritmus bemenetei
s kimenetei megegyeznek a lineris keressnl mr megismertekkel.
5.2. Algoritmus Logaritmikus keress iteratv megvalstsa
Bemenet: x T rendezett tmb, n egsz, rtk T; ahol T sszehasonlthat
Kimenet: van logikai, idx egsz
1: fggvny LogaritmikusKeress(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:

ciklus amg (bal jobb) (x[center] 6= rtk)


ha x[center] > rtk akkor
jobb center 1
klnben
bal center + 1
elgazs jvge
k
center bal+jobb
2
ciklus vge
van (bal jobb)
ha van akkor
idx center
vissza (van, idx)
klnben
vissza van
elgazs vge
fggvny vge

Felhasznlt vltozk s fggvnyek


x: Nvekv mdon rendezett tmb.
n: Az x tmb mrete.
rtk: Ezt az rtket keressk az x-ben.
van: Pontosan akkor igaz, ha az rtk benne van az x-ben.
idx: Ha rtk benne van az x-ben, akkor az idx-edik helyen tallhat meg. (Nem biztos, hogy csak
ott.)
bal: Az aktulisan vizsglt rsztmb bal szlnek indexe.
jobb: Az aktulisan vizsglt rsztmb jobb szlnek indexe.
center: Az aktulisan vizsglt rsztmb kzps elemnek indexe.
1 Angolul:
2 Angolul:

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

bal center jobb


(c) Az tdik s a hetedik elem kztti rsztmbt vizsgljuk, melynek kzps eleme a hatodik.
Ennek rtke megegyezik a keresett 12 rtkkel, ezrt vget r az algoritmus.

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

bal center jobb


(c) Harmadik lpsben az els s harmadik elemek kztti rsztmbbel foglalkozunk. A kzps
elem most a msodik, amely kisebb a keresett 4 rtknl.
x:

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.

5.2. bra. Logaritmikus keress. Az x tmbben keressk a 4 rtket.

Sergyn Szabolcs

164

budai Egyetem
Neumann Jnos Informatikai Kar

5.3. Algoritmus Logaritmikus keress rekurzv megvalstsa


Bemenet: x T rendezett tmb, bal egsz, jobb egsz, rtk T; ahol T sszehasonlthat
Kimenet: Az rtk-kel megegyez elem indexe, illetve ha nincs ilyen, akkor 0.
1: fggvny LogaritmikusKeressRekurzv(x :
T rendezett tmb, bal : egsz, jobb :
egsz, rtk : T)
2:
ha bal > jobb akkor
3:
vissza 0
4:
klnben j
k
5:
center bal+jobb
2
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:

ha x[center] = rtk akkor


vissza center
klnben
ha x[center] > rtk akkor
vissza LogaritmikusKeressRekurzv(x, bal, center 1, rtk)
klnben
vissza LogaritmikusKeressRekurzv(x, center + 1, jobb, rtk)
elgazs vge
elgazs vge
elgazs vge
fggvny vge

Fggvny hvsa: LogaritmikusKeressRekurzv(x, 1, n, rtk)


Felhasznlt vltozk s fggvnyek
x: Nvekv mdon rendezett tmb.
n: Az x tmb mrete.
bal: Az aktulisan vizsglt rsztmb els elemnek indexe.
jobb: Az aktulisan vizsglt rsztmb utols elemnek indexe.
center: Az aktulisan vizsglt rsztmb kzps elemnek indexe.
rtk: A keresett rtk.

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

LogaritmikusKeressRekurzv(x, 1, 15, 12)

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

bal center jobb


(c) Rekurzvan meghvsra kerl a fggvny bal = 5 s jobb = 7 rtkkel. A kzps elem megegyezik
a keresett rtkkel.

5.3. bra. Logaritmikus keress rekurzv megvalstsa. Az x tmbben keressk a 12 rtket.

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

bal center jobb


(c) A msodik rekurzv hvsnl a jobb 3-ra cskken. A kzps elem kisebb a keresettnl.

5.4. bra. Logaritmikus keress rekurzv megvalstsa. Az x tmbben keressk a 4 rtket.

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

bal center jobb


(g) Az utoljra hvott fggvny visszatr a 0 rtkkel.

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

(h) Az utoljra hvott fggvny visszatr a 0 rtkkel.


LogaritmikusKeressRekurzv(x, 1, 7, 4)
0
LogaritmikusKeressRekurzv(x, 1, 15, 4)

x:

12

14

17

18

19

23

jobb

center

bal

(i) Az utoljra hvott fggvny visszatr a 0 rtkkel.


LogaritmikusKeressRekurzv(x, 1, 15, 4)
0

x:

12

14

17

18

19

23

25

26

28

30

(j) A klvilgbl hvott fggvny visszatr a 0 rtkkel.

5.4. bra. Logaritmikus keress rekurzv megvalstsa (folyt.). Az x tmbben keressk a 4 rtket.

Sergyn Szabolcs

172

budai Egyetem
Neumann Jnos Informatikai Kar

5.2. Programozsi ttelek rendezett tmbkben


Ebben a fejezetben ttekintjk, hogy bizonyos programozsi tteleket miknt lehet futsi id szempontjbl optimalizlni rendezett tmbk esetn. Az 5.1. fejezetben lttuk, hogy a keress megvalstsa
pldul a logaritmikus keress hasznlatval a leghatkonyabb.
A fejezetben ismertetsre kerl programozsi ttelek mind a logaritmikus keress tletre ptenek.
Megmutatjuk, hogy miknt kell eldnts, kivlaszts, kivlogats s megszmols cljra mdostani a
logaritmikus keresst. Ezen tl nhny esetben ismertetjk, hogy miknt lehet nem csak egyetlen rtket,
hanem egy adott intervallumba es rtket keresni egy rendezett tmbben.

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:

ciklus amg (bal jobb) (x[center] 6= rtk)


ha x[center] > rtk akkor
jobb center 1
klnben
bal center + 1
elgazs jvge
k
center bal+jobb
2
ciklus vge
van (bal jobb)
vissza van
fggvny vge

Felhasznlt vltozk s fggvnyek


x: Nvekv mdon rendezett tmb, melynek elemei egymssal sszehasonlthatak.
n: Az x tmb mrete.
rtk: A tmb elemeivel azonos tpus rtk. Az eldnts sorn azt vizsgljuk, hogy ez az rtk
benne van-e az x tmbben.
van: Logikai vltoz, amely pontosan akkor igaz, ha rtk megtallhat az x tmbben.
bal: Az aktulisan vizsglt rsztmb els elemnek indexe.
jobb: Az aktulisan vizsglt rsztmb utols elemnek indexe.
center: Az aktulisan vizsglt rsztmb kzps elemnek indexe.
Nzznk viszont egy bonyolultabb problmt. Azt szeretnnk megmondani, hogy egy rendezett tmbben van-e olyan rtk, amely kt szlsrtk (alshatr s f elshatr) kz esik. Ennek eldntshez
az 5.4. algoritmus kis mrtk mdostsa szksges. A mdostott kdot az 5.5. algoritmusban adjuk
meg.
Az algoritmus 5. sorbeli belpsi s bennmaradsi felttelt mdostani kell. Itt nem az a fontos, hogy
a konkrt rtk-et megtalljuk, hanem, hogy a kt szlsrtk kztti-e az elem. Hasonlan a 6. sorban
nem azt kell vizsglnunk, hogy az aktulis kzps elem a keresett rtk-nl nagyobb-e, hanem azt, hogy
a f elshatr rtknl nagyobb-e. A 8. sorba akkor kerl a vezrls, ha az x[center] < alshatr.
5.5. Plda. Az 5.5. brn lthatunk egy pldt, ahol egy 10 elem x rendezett tmb esetn szeretnnk
eldnteni, hogy van-e a tmbben alshatr = 17 s f elshatr = 23 kztti rtk. A feladatot a
logaritmikus keressen alapul eldnts mdostott 5.5. algoritmusval oldjuk meg.
Kezdetben a teljes tmbt vizsgljuk, gy a bal = 1 s a jobb = 10. A tmb kzps eleme az tdik.
Mivel az tdik elem kisebb az alshatr-nl (ld. 5.5a. bra), ezrt bal rtke 6-ra mdosul. Ekkor a
kzps elem a nyolcadik, ami viszont nagyobb a f elshatr-nl (ld. 5.5b. bra). Ekkor a jobb vltozik
7-re. A kzps elem a hatodik, amely viszont benne van a keresett tartomnyban (ld. 5.5c. bra). Mivel
talltunk megfelel elemet, ezrt az algoritmus a van = igaz rtkkel tr vissza.

Sergyn Szabolcs

174

budai Egyetem
Neumann Jnos Informatikai Kar

5.5. Algoritmus Mdostott eldnts programozsi ttel rendezett tmbben


Bemenet: x T rendezett tmb, n egsz (tmb mrete), alshatr T, f elshatr
T; ahol T sszehasonlthat
Kimenet: van logikai
1: fggvny MdostottEldntsRendezettben(x : T rendezett tmb, n : egsz, alshatr :
T, felshatr : 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:

ciklus amg (bal jobb) ((alshatr x[center]) (x[center] f elshatr))


ha x[center] > f elshatr akkor
jobb center 1
klnben
bal center + 1
elgazs jvge
k
center bal+jobb
2
ciklus vge
van (bal jobb)
vissza van
fggvny vge

Felhasznlt vltozk s fggvnyek


x: Nvekv mdon rendezett tmb, melynek elemei sszehasonlthatk.
n: Az x tmb elemszma.
alshatr: Ennl az rtknl nem kisebb elemet keresnk az x tmbben.
f elshatr: Ennl az rtknl nem nagyobb elemet keresnk az x tmbben.
van: Logikai vltoz, amely pontosan akkor igaz, ha van az alshatr rtknl nem kisebb s a
f elshatr rtknl nem nagyobb elem az x tmbben.
bal: Az aktulisan vizsglt rsztmb els elemnek indexe.
jobb: Az aktulisan vizsglt rsztmb utols elemnek indexe.
center: Az aktulisan vizsglt rsztmb kzps elemnek indexe.

x:

12

19

23

24

26

jobb

center

bal

30

(a) A kzps elem kisebb, mint az alshatr.


x:

12

19

bal

23

24

26

center

30

jobb

(b) A kzps elem nagyobb, mint a f elshatr.


Kimenet

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:

ciklus amg x[center] 6= rtk


ha x[center] > rtk akkor
jobb center 1
klnben
bal center + 1
elgazs jvge
k
center bal+jobb
2
ciklus vge
idx center
vissza idx
fggvny vge

Felhasznlt vltozk s fggvnyek


x: Nvekv mdon rendezett tmb, melynek elemei sszehasonlthatak.
n: Az x tmb elemeinek szma.
rtk: Az x tmb elemivel azonos tpus rtk. Annak az elemnek az indext keressk, amely az
rtk-kel megegyezik. (Tudjuk, hogy van ilyen elem.)
idx: Az x tmb azon elemnek indexe, amely megegyezik az rtk-kel.
bal: Az aktulisan vizsglt rsztmb els elemnek indexe.
jobb: Az aktulisan vizsglt rsztmb utols elemnek indexe.
center: Az aktulisan vizsglt rsztmb kzps elemnek indexe.

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

5.7. Algoritmus Kivlogats programozsi ttel rendezett tmbben


Bemenet: x T rendezett tmb, n egsz, rtk T; ahol T sszehasonlthat
Kimenet: van logikai, bal egsz, jobb egsz
1: fggvny KivlogatsRendezettben(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:

ciklus amg (bal jobb) (x[center] 6= rtk)


ha x[center] > rtk akkor
jobb center 1
klnben
bal center + 1
elgazs jvge
k
center bal+jobb
2
ciklus vge
van (bal jobb)
ha van akkor
bal center
ciklus amg (bal > 1) (x[bal 1] = rtk)
bal bal 1
ciklus vge
jobb center
ciklus amg (jobb < n) (x[jobb + 1] = rtk)
jobb jobb + 1
ciklus vge
vissza (van, bal, jobb)
klnben
vissza van
elgazs vge
fggvny vge

Felhasznlt vltozk s fggvnyek


x: Nvekv mdon rendezett tmb, melynek elemei sszehasonlthatak.
n: Az x tmb elemeinek szma.
rtk: Az x tmb elemeivel azonos tpus rtk. Azt keressk, hogy van-e ilyen elem a tmbben,
s ha van, akkor mely helyeken tallhat.
van: Logikai vltoz, amely pontosan akkor igaz, ha van legalbb egy rtk-kel azonos elem az x
tmbben.
bal: Az aktulisan vizsglt rsztmb els elemnek indexe. Amennyiben van rtke igaz, akkor az
algoritmus vgn az els rtk-kel egyez tmbbeli elem indexe.
jobb: Az aktulisan vizsglt rsztmb utols elemnek indexe. Amennyiben van rtke igaz, akkor
az algoritmus vgn az utols rtk-kel egyez tmbbeli elem indexe.
center: Az aktulisan vizsglt rsztmb kzps elemnek indexe.

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

(b) A bal indexet egyenlv tesszk a center-rel, majd megvizsgljuk a bal


szomszdjt.
x:

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

(f) A jobb indexet egyenlv tesszk a center-rel, majd megvizsgljuk a jobb


szomszdjt.
x:

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

5.8. Algoritmus Mdostott kivlogats programozsi ttel rendezett tmbben


Bemenet: xT rendezett tmb, negsz, alshatrT, f elshatrT; ahol T sszehasonlthat
Kimenet: van logikai, bal egsz, jobb egsz
1: fggvny MdostottKivlogatsRendezettben(x : T rendezett tmb, n : egsz, alshatr
: T, felshatr : 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:

ciklus amg (bal jobb) ((alshatr x[center]) (x[center] f elshatr))


ha x[center] > f elshatr akkor
jobb center 1
klnben
bal center + 1
elgazs jvge
k
center bal+jobb
2
ciklus vge
van (bal jobb)
ha van akkor
bal center
ciklus amg (bal > 1) (x[bal 1] alshatr)
bal bal 1
ciklus vge
jobb center
ciklus amg (jobb < n) (x[jobb + 1] f elshatr)
jobb jobb + 1
ciklus vge
vissza (van, bal, jobb)
klnben
vissza van
elgazs vge
fggvny vge

Felhasznlt vltozk s fggvnyek


x: Nvekv mdon rendezett tmb, melynek elemei sszehasonlthatak.
n: Az x tmb elemeinek szma.
alshatr s f elshatr: Az x tmb elemeivel azonos tpus rtkek. Azt keressk, hogy van-e
alshatr s f elshatr kztti elem a tmbben. Ha van, akkor mely helyeken tallhatk ilyenek.
van: Logikai vltoz, amely pontosan akkor igaz, ha van legalbb egy alshatr s f elshatr
kztti elem az x tmbben.
bal: Az aktulisan vizsglt rsztmb els elemnek indexe. Amennyiben van rtke igaz, akkor az
algoritmus vgn az els alshatr-nl nem kisebb els tmbbeli elem indexe.
jobb: Az aktulisan vizsglt rsztmb utols elemnek indexe. Amennyiben van rtke igaz, akkor
az algoritmus vgn az utols f elshatr-nl nem nagyobb utols tmbbeli elem indexe.
center: Az aktulisan vizsglt rsztmb kzps elemnek indexe.

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:

ciklus amg (bal jobb) (x[center] 6= rtk)


ha x[center] > rtk akkor
jobb center 1
klnben
bal center + 1
elgazs jvge
k
center bal+jobb
2
ciklus vge
ha bal jobb akkor
bal center
ciklus amg (bal > 1) (x[bal 1] = rtk)
bal bal 1
ciklus vge
jobb center
ciklus amg (jobb < n) (x[jobb + 1] = rtk)
jobb jobb + 1
ciklus vge
db jobb bal + 1
klnben
db 0
elgazs vge
vissza db
fggvny vge

Felhasznlt vltozk s fggvnyek


x: Nvekv mdon rendezett tmb, melynek elemei sszehasonlthatak.
n: Az x tmb elemeinek szma.
rtk: Az x tmb elemeivel azonos tpus rtk. Azt keressk, hogy hny darab ilyen elem van a
tmbben.
db: Az rtk-kel egyez elemek szma az x tmbben.
bal: Az aktulisan vizsglt rsztmb els elemnek indexe. Amennyiben van az rtk-kel egyez
elem a tmbben, akkor az algoritmus vgn az els ilyen tmbbeli elem indexe.
jobb: Az aktulisan vizsglt rsztmb utols elemnek indexe. Amennyiben van az rtk-kel egyez
elem a tmbben, akkor az algoritmus vgn az utols ilyen tmbbeli elem indexe.
center: Az aktulisan vizsglt rsztmb kzps elemnek indexe.

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

5.3.1. Halmaztulajdonsg vizsglata


Ha egy tmbrl azt szeretnnk eldnteni, hogy halmaz-e, akkor kt tulajdonsgot kell megvizsglnunk. Az
els a rendezettsg, a msodik pedig az ismtlds mentessg. Az eldnts programozsi ttel trgyalsnl (ld. 2.1.2. fejezet) mr megmutattuk a rendezettsg vizsglatt megvalst algoritmust (ld. 2.5. algoritmus), gy most csak az ismtldsnlklisg vizsglatval foglalkozunk. Ennek megvalstsa is az
eldnts ttel mdostsval valsthat meg hatkonyan, amit az 5.10. algoritmusban mutatunk be.
5.10. Algoritmus Halmaztulajdonsg vizsglata
Bemenet: x T rendezett tmb, n egsz (tmb mrete); ahol T sszehasonlthat
Kimenet: l logikai
1: fggvny HalmazE(x : T rendezett tmb, n : egsz)
2:
i2
3:
ciklus amg (i n) (x[i] 6= x[i 1])
4:
ii+1
5:
ciklus vge
6:
l (i > n)
7:
vissza l
8: fggvny vge
Felhasznlt vltozk s fggvnyek
x: Rendezett tmb.
n: Az x tmb mrete. Tudjuk, hogy n 2.
l: Logikai vltoz. Pontosan akkor igaz rtk, ha az x tmbben nincs ismtlds.
Az algoritmus bemenete az x nvekv mdon rendezett tmb, melynek ismerjk a mrett is (n).
A kimenet egy l logikai vltoz, amely pontosan akkor igaz rtk, ha a rendezett tmbben nincsenek
ismtld elemek.
A rendezettsg miatt az esetleges ismtldsek csak kzvetlen szomszdok esetn fordulhatnak el,
ezrt az eldnts programozsi ttelt gy kell mdostanunk, hogy a szomszdok egyenlsgt vizsgljuk
(ld. 3. sor). Az x tmb akkor tekinthet halmaznak, hogy nincs benne ismtlds, ami akkor ll el,
ha az sszes szomszdos elemet mr megvizsgltuk, s gy az i vltoz rtke mr meghaladja a tmb n
elemszmt (ld. 6. sor).

Sergyn Szabolcs

183

budai Egyetem
Neumann Jnos Informatikai Kar

5.3.2. Halmaz ltrehozsa


Tudjuk mr, hogy miknt lehet egy rendezett tmbrl eldnteni, hogy van-e benne ismtld elem, azaz
tekinthet-e halmaznak. Nzzk meg, hogyan lehet egy ismtld elemeket tartalmaz rendezett tmbbl
az ismtldseket kiszrni. ltalnos, nem rendezett tmbk esetn megoldottuk mr ezt a problmt
a 2.21. algoritmus hasznlatval. Viszont, ha kihasznljuk a rendezettsget, akkor sokkal hatkonyabb
megoldst is adhatunk, ahogy ez az 5.11. algoritmusban lthat.
Az algoritmus bemenete az x nvekv mdon rendezett tmb, melynek ismert az n elemszma is.
Kimenetknt az ismtlds nlkli a halmazt kapjuk, melyben a relevns elemek szma db.
5.11. Algoritmus Halmaz ltrehozsa
Bemenet: x T rendezett tmb, n egsz (tmb mrete); ahol T sszehasonlthat
Kimenet: a T halmaz, db egsz
1: fggvny HalmazLtrehozs(x : T rendezett tmb, n : egsz)
2:
a Ltrehoz(T)[n]
3:
db 1
4:
a[db] x[1]
5:
ciklus i 2-tl n-ig
6:
ha x[i] 6= a[db] akkor
7:
db db + 1
8:
a[db] x[i]
9:
elgazs vge
10:
ciklus vge
11:
vissza (a, db)
12: fggvny vge
Felhasznlt vltozk s fggvnyek
x: Rendezett tmb.
n: Az x tmb mrete.
a: Halmaz, mely az x tmb elemeit tartalmazza ismtlds nlkl.
db: Az a halmazban trolt elemek szma.
Ltrehoz(T)[n]: Utasts, mely ltrehoz egy n elem T tpus tmbt.
Az algoritmus mkdsnek lnyege az lesz, hogy az x tmbt az elejtl indulva bejrjuk s megnzzk, hogy az x aktulis eleme megegyezik-e az a utols elemvel. Ha megegyezik, akkor nem msoljuk
t a halmazba, ha nem akkor viszont betesszk a halmaz vgre.
Els lpsknt ltre kell hozni a kimeneti a halmazt. Mivel nem tudjuk, hogy az algoritmus vgn
pontosan hny elem lesz benne, ezrt az x bemeneti tmbbel azonos mret tmbknt inicializljuk
(ld. 2. sor). Mivel az x tmb els eleme mg biztos nincs az a halmazban hiszen a halmaz res , ezrt
az els elemet felttelvizsglat nlkl tmsoljuk s a halmaz aktulis db elemszmt 1-re lltjuk (ld. 34. sor). Ezt kveten bejrjuk az x tmb tbbi elemt, amit az 5. s 10. sorok kztti szmlls ciklussal
valstunk meg. A cikluson bell a 6. sorban megvizsgljuk, hogy a tmb aktulis x[i] eleme klnbzik-e
a halmaz aktulisan utols a[db] elemtl. Ha egyezsg van, akkor semmit nem kell tennnk, klnbzsg esetn viszont egy j elemet kell a halmazba tenni. Ennek rdekben a halmaz elemeinek szmt
nveljk eggyel (ld. 7. sor), majd bemsoljuk az aktulis tmbelemet a halmazba (ld. 8. sor). A ciklus
vgeztvel az elll halmazt s annak elemszmt kimenetknt visszaadjuk (ld. 11. sor).
5.7. Plda. Az 5.7. brn lthatunk egy hat elem tmbt, mely szmos ismtld elemet is tartalmaz.
Az brn vgigkvethetjk, hogy az 5.11. algoritmus hasznlatval miknt alkothatjuk meg az x-nek
megfelel a halmazt.
Els lpsknt ltrehozunk egy hat elem tmbt az a halmaz szmra (ld. 2. sor), majd a tmb els
elemt tmsoljuk a halmaz els helyre a 3-4. soroknak megfelelen (ld. 5.7a. bra). Ezutn megkezdjk
a tmb bejrst az 5. sorban kezdd ciklussal. Mivel a tmb msodik eleme, megegyezik a halmaz els
elemvel (ld. 6. sor), ezrt nem msoljuk be mg egyszer az ismtld elemet a halmazba (ld. 5.7b. bra).
Folytatjuk a bejrst, a harmadik elem klnbzik a halmaz utols elemtl, ezrt a halmaz elemszmt
nveljk (ld. 7. sor), majd tmsoljuk az aktulis tmbelemet (ld. 8. sor), amit az 5.7c. bra szemlltet.
A tmb negyedik s tdik eleme mr benne van a halmazban (ld. 5.7d-5.7e. brk), ezrt nem kerlnek
Sergyn Szabolcs

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

(a) Az x tmb els elemt automatikusan


tmsoljuk az a halmazba.

x:

(b) Az x msodik eleme megegyezik az a


els elemvel, ezrt nem helyezzk ismt
a halmazba.
x:

i
a:

a:

(d) Az x negyedik eleme mr benne van


az a-ban.

x:

i
a:

db

(c) Az x harmadik eleme mg nincs a halmazban, ezrt a soron kvetkez helyre


msoljuk.
2

db

x:

i
a:

db

db

(e) Az x tdik eleme is benne van az aban.

(f) Az x hatodik eleme mg nincs a halmazban, ezrt a soron kvetkez helyre


msoljuk.

5.7. bra. Halmaz ltrehozsa rendezett tmbbl.


Futsi id elemzse. Mivel az 5.11. algoritmus egyetlen ciklust tartalmaz, ezrt knnyen lthat,
hogy a futsi id az x elemszmval arnyos, teht O(n)-es. Vessk ezt ssze a 2.21. algoritmus futsi
idejvel, ami O(n2 )-es volt. A rendezettsg kihasznlsa teht jelents futsi id javulst eredmnyez.

Sergyn Szabolcs

185

budai Egyetem
Neumann Jnos Informatikai Kar

5.3.3. Tartalmazs vizsglata


Halmazokkal kapcsolatban fontos feladat, hogy el tudjuk dnteni, valami benne van-e egy halmazban
vagy sem. Jelenlegi ismereteink mellett ez nem jelent nehz feladatot, hiszen egy rendezett tmbben
amilyen egy halmaz is az 5.4. algoritmus hasznlatval el tudjuk dnteni, hogy a keresett elem a
vizsglt tmbben van-e. Az 5.12. algoritmus halmazok esetn rja le a tartalmazs vizsglatot. Mivel
semmi j ismeret nincs ebben az algoritmusban, ezrt a rszletesebb ismertetstl eltekintnk.
5.12. Algoritmus Tartalmazs vizsglat
Bemenet: a T halmaz, n egsz (halmaz mrete), rtk T; ahol T sszehasonlthat
Kimenet: l logikai
1: fggvny TartalmazzaE(a : T halmaz, 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:

ciklus amg (bal jobb) (a[center] 6= rtk)


ha a[center] > rtk akkor
jobb center 1
klnben
bal center + 1
elgazs jvge
k
center bal+jobb
2
ciklus vge
l (bal jobb)
vissza l
fggvny vge

Felhasznlt vltozk s fggvnyek


a: Halmaz.
n: Az a halmaz mrete.
rtk: A halmaz elemeivel azonos tpus rtk. Azt vizsgljuk, hogy ez az rtk benne van-e az a
halmazban.
l: Logikai vltoz, amely pontosan akkor igaz, ha rtk megtallhat az a halmazban.
bal: Az aktulisan vizsglt rszhalmaz els elemnek indexe.
jobb: Az aktulisan vizsglt rszhalmaz utols elemnek indexe.
center: Az aktulisan vizsglt rszhalmaz kzps elemnek indexe.

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) Mivel a[1] = b[1], ezrt mindkt


tmbben tovbblpnk.

a:

i
5

b:

(c) Mivel a[2] = b[3], ezrt mindkt


tmbben tovbblpnk.

(d) Mivel a[3] = b[3], ezrt mindkt


tmbben tovbblpnk. Az a vgre
rtnk, gy a rszhalmaza b-nek.

5.8. bra. Rszhalmaz vizsglat. Az a halmaz rszhalmaza a b halmaznak.


5.9. Plda. Az 5.9. brn lthat esetben vgigkvethetjk, hogy az 5.13. algoritmus miknt dnti el,
hogy a nem rszhalmaza b-nek.
Mindkt halmaz els eleme azonos (ld. 5.9a. bra), ezrt tovbblpnk a msodik elemekre. Az a
msodik eleme nagyobb a b msodik elemnl (ld.5.9b. bra), ezrt csak a b halmaz indext nveljk.
Viszont a[2] < b[3], ezrt kilpnk a bejrst megvalst ciklusbl s a kimeneti l vltoz hamis rtket
kap.
Futsi id elemzse. Az 5.13. algoritmus futsi idejnek meghatrozsnl a 4. sorban kezdd
ciklusra kell fkuszlnunk. Mivel a cikluson bell a j index mindig eggyel nveldik, ezrt a ciklus
legfeljebb n-szer fut le. Teht a rszhalmaz tulajdonsgot vizsgl algoritmusunk futsi ideje a msodik
halmaz mretvel arnyos, azaz O(n)-es. Ez a futsi id sokkal jobb, mint a fejezet elejn emltett
O(m n)-es id.

Sergyn Szabolcs

188

budai Egyetem
Neumann Jnos Informatikai Kar

a:

a:

i
b:

a:

b:

i
6

b:

(a) Mivel a[1] = b[1], ezrt


mindkt tmbben tovbblpnk.

(b) Mivel a[2] > b[2], ezrt


folytatjuk az eldntst, de
csak a b halmazban lpnk tovbb.

j
(c) Mivel a[2] < b[3], ezrt a
nem lehet rszhalmaza b-nek.

5.9. bra. Rszhalmaz vizsglat. Az a nem rszhalmaza a b halmaznak.

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

5.3.8. Szimmetrikus differencia


Kt halmaz szimmetrikus differencijnak elemei azok az elemek, amelyek a kt halmazbl pontosan egyben vannak benne. Ezen elemek kivlogatsa is az uni mdostsval trtnik. A konkrt pszeudokdot
az 5.17. algoritmusban mutatjuk be.

Sergyn Szabolcs

193

budai Egyetem
Neumann Jnos Informatikai Kar

5.17. Algoritmus Halmazok szimmetrikus differencija


Bemenet: a1 T halmaz, n1 egsz (halmaz mrete), a2 T halmaz, n2 egsz (halmaz mrete)
Kimenet: b T halmaz, db egsz
1: fggvny HalmazSzimmetrikusDifferencia(a1 : T halmaz, n1 : egsz, a2 : T halmaz, n2 :
egsz)
2:
b Ltrehoz(T)[n1 + n2 ]
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:
db db + 1
13:
b[db] a2 [j]
14:
j j+1
15:
klnben
16:
ii+1
17:
j j+1
18:
elgazs vge
19:
ciklus vge
20:
ciklus amg i n1
21:
db db + 1
22:
b[db] a1 [i]
23:
ii+1
24:
ciklus vge
25:
ciklus amg j n2
26:
db db + 1
27:
b[db] a2 [j]
28:
j j+1
29:
ciklus vge
30:
vissza (b, db)
31: 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 halmazok kzl pontosan az
egyiknek eleme.
db: A b halmaz relevns elemeinek szma.
Ltrehoz(T)[n1 + n2 ]: Utasts, mely ltrehoz egy n1 + n2 mret T tpus tmbt.

Sergyn Szabolcs

194

budai Egyetem
Neumann Jnos Informatikai Kar

6. fejezet

Oszd meg s uralkodj! elv


algoritmusok
Az Oszd meg s uralkodj! 1 elv algoritmusok lnyegesen klnbznek az eddig megismertektl. Az
elz fejezetekben minden algoritmus olyan volt, amely egy tmb bejrsn alapult. A bejrs lehetett
olyan, amely a tmb elejtl a tmb vgig haladva, minden elemet egyszer rintett. Ez a bejrs
megvalsulhatott ciklusok vagy rekurzv hvsok hasznlatval is. Nhny esetben a bejrs ktirny
volt (pl. a 2.17. algoritmus esetn). Lttunk olyan algoritmusokat is, amikor a bejrs gy trtnt, hogy
a bejrsra hasznlt index rtke felezdtt (pl. a logaritmikus keressnl).
Ezekkel szemben az Oszd meg s uralkodj! elv algoritmusoknl nem trtnik bejrs, illetve nem
a bejrson van a hangsly, hanem teljesen ms elven mkdnek. Az Oszd meg s uralkodj! elv
algoritmusok mindig hrom fzisbl llnak. Els lpsknt a megoldand problmt felosztjk kisebb
rszproblmkra. Pldul, ha rendezni szeretnnk egy tmbt, akkor nem a teljes tmb rendezsre
koncentrlnak, hanem a tmbt kett vagy tbb rsztmbre osztjk. Msodik fzisknt uralkodnak a
rszproblmkon, azaz a rszproblmkat megoldjk. Ez a megolds gy trtnik, hogy a teljes problmt megold algoritmust alkalmazzk a kisebb rszproblmra rekurzv mdon. Majd miutn az egyes
rszproblmk mr megoldottak, akkor harmadik lpsknt a megoldott rszproblmk egyestse kvetkezik.
Taln mr rezhet ebbl a lersbl is, hogy azt igazbl nem hatrozzuk meg, hogy a rszproblmk
megoldsa hogyan trtnik meg, hiszen azt a rekurzivits biztostja majd. Miknt mkdhetnek akkor
ezek az algoritmusok?
Az Oszd meg s uralkodj! elv bemutatsa s mkdsnek megrtse rdekben ngy feladatot
ismertetnk rszletesen. Elsknt a mr tbbszr trgyalt maximumkivlaszts problmjt oldjuk meg
az j mdszerrel (ld. 6.1. fejezet). Ezt kveten bemutatunk egy hatkony rendez algoritmust, az
sszefsl rendezst, mely az j elvet hasznlja (ld. 6.2. fejezet). Harmadikknt egy msik rendezst, a
gyakran hasznlt gyorsrendezst ismerjk meg (ld. 6.3. fejezet). Vgezetl a gyorsrendezs tletre ptve
bemutatunk egy hatkony mdszert a k-adik legkisebb tmbbeli elem kivlasztsra (ld. 6.4. fejezet).

1 Angolul:

divide and conquer

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:

balmax FelezMaximumkivlaszts(x, bal, center)


jobbmax FelezMaximumkivlaszts(x, center + 1, jobb)
ha x[balmax] x[jobbmax] akkor
vissza balmax
klnben
vissza jobbmax
elgazs vge
elgazs vge
fggvny vge

Fggvny hvsa: FelezMaximumkivlaszts(x, 1, n)


Felhasznlt vltozk s fggvnyek
x: A tmb.
n: Az x tmb mrete.
bal: Az aktulisan vizsglt rsztmb els elemnek indexe.
jobb: Az aktulisan vizsglt rsztmb utols elemnek indexe.
center: Az aktulisan vizsglt rsztmb kzps elemnek indexe.
balmax: A bal s center indexek kztti tmbrsz maximlis elemnek indexe.
jobbmax: A center + 1 s jobb indexek kztti tmbrsz maximlis elemnek indexe.

Sergyn Szabolcs

196

budai Egyetem
Neumann Jnos Informatikai Kar

A rekurzv algoritmusban elszr gondoskodunk az alapeset kezelsrl. Ha a vizsglt tmbrsz egy


elem, azaz bal = jobb (ld. 2. sor), akkor annak az egy elemnek az indext adja vissza az algoritmus
(ld. 3. sor). Minden ms esetben fel kell osztani a tmbt kt (kzel) egyenl mret rszre. Ennek
rdekben meghatrozzuk a bal s jobb indexek kztti kzps elem indext (ld. 5. sor). A kzp helynek
ismeretben mr meghvhatjuk rekurzvan az elll rsztmbkre az algoritmust. A bal oldali rsz
eredmnye kerl a balmax vltozba (ld. 6. sor), mg a jobb oldali rsz a jobbmax-ba (ld. 7. sor). Ezutn
mr csak az egyests fzisa van htra. Megvizsgljuk, hogy a bal- vagy a jobboldali rsz maximuma-e
a nagyobb (ld. 8. sor), s ennek fggvnyben visszaadjuk a megfelel kimenetet (ld. 9. s 11. sorok).
Megjegyzs

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)

bal center jobb

(a) Fggvny hvsa az 1. s 6. elemek kztti rsztmbre.

(b) Fggvny hvsa az 1. s 3. elemek kztti


rsztmbre.
FelezMaximumkivlaszts(x, 1, 1)

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

(c) Fggvny hvsa az 1. s 2. elemek kztti rsztmbre.

(d) Fggvny hvsa az 1. elembl ll rsztmbre.

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

(e) Az 1. elembl ll rsztmb maximumnak megadsa.

jobb

(f) Fggvny hvsa az 2. elembl ll rsztmbre.

6.1. bra. Felez maximumkivlaszts.

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

bal center jobb

(g) Az 2. elembl ll rsztmb maximumnak megadsa. A kt eredmny sszehasonltsa.

(h) Az 1. s 2. elemek kztti rsztmb maximumnak megadsa.


FelezMaximumkivlaszts(x, 3, 3)

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

bal center jobb

(i) Fggvny hvsa az 3. elembl ll rsztmbre.

(j) A 3. elembl ll rsztmb maximumnak megadsa. A kt eredmny sszehasonltsa.

FelezMaximumkivlaszts(x, 1, 3)

FelezMaximumkivlaszts(x, 4, 6)

3
FelezMaximumkivlaszts(x, 1, 6)

FelezMaximumkivlaszts(x, 1, 6)

balmax
x:

bal

center

x:

jobb

bal center jobb

(k) Az 1. s 3. elemek kztti rsztmb maximumnak megadsa.

(l) Fggvny hvsa a 4. s 6. elemek kztti


rsztmbre.

6.1. bra. Felez maximumkivlaszts (folyt.).

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

(m) Fggvny hvsa a 4. s 5. elemek kztti rsztmbre.

(n) Fggvny hvsa az 4. elembl ll rsztmbre.

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

(o) A 4. elembl ll rsztmb maximumnak megadsa.

jobb

(p) Fggvny hvsa az 5. elembl ll rsztmbre.

6.1. bra. Felez maximumkivlaszts (folyt.).

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

bal center jobb

(q) Az 5. elembl ll rsztmb maximumnak megadsa. A kt eredmny sszehasonltsa.

(r) A 4. s 5. elemek kztti rsztmb maximumnak megadsa.


FelezMaximumkivlaszts(x, 6, 6)

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

(s) Fggvny hvsa az 6. elembl ll rsztmbre.

bal center jobb


(t) A 6. elembl ll rsztmb maximumnak megadsa. A kt eredmny sszehasonltsa.

FelezMaximumkivlaszts(x, 4, 6)
5
FelezMaximumkivlaszts(x, 1, 6)
FelezMaximumkivlaszts(x, 1, 6)

jobbmax

balmax
x:

bal

center

5
3

jobb

x:

(u) A 4. s 6. elemek kztti rsztmb maximumnak megadsa. A kt eredmny sszehasonltsa.

(v) Az 1. s 6. elemek kztti rsztmb maximumnak megadsa.

6.1. bra. Felez maximumkivlaszts (folyt.).

Sergyn Szabolcs

202

budai Egyetem
Neumann Jnos Informatikai Kar

6.2. sszefsl rendezs


Rendez algoritmusokkal mr a 3. fejezetben megismerkedtnk. Az ott ltott rendezsek cserkkel,
beillesztsekkel operltak, mikzben valamilyen szably alapjn bejrtuk a rendezend tmbket. Az
sszefsl rendezs2 viszont teljesen ms elven mkdik.
Az Oszd meg s uralkodj! elvet kvet sszefsl rendezs tlete melyet Neumann Jnos fejlesztett ki 1945-ben nagyon hasonlt az elz fejezetben megismert felez maximumkivlasztshoz. A
rendezend tmbnket gy rendezzk, hogy sztvgjuk kt (kzel) egyenl rszre, majd az egyes rszeket
rendezzk. Ha pedig van kt rendezett tmbnk, azokat az sszefuttats programozsi ttel (ld. 2.2.6. fejezet) hasznlatval mr knnyen ssze tudjuk fslni egyetlen rendezett tmbb.
Hogyan rendezzk a rsztmbket? Pontosan ugyangy, mint ahogy a teljes tmbt. Azaz rekurzvan
megoldjuk a rendezst ugyanazzal az algoritmussal, amivel a teljes tmbt is rendeztk. Ha csak egy
elem a rendezend tmb, akkor pedig nem kell rendezni.
A fenti elvet megvalst sszefuttat rendezs megvalstsa nagyon egyszer, ahogy azt a 6.2. algoritmusban lthatjuk.
6.2. Algoritmus sszefsl rendezs
Bemenet: x T tmb, bal egsz, jobb egsz; ahol T sszehasonlthat
Kimenet: x T rendezett tmb
1: eljrs sszefslRendezs(cmszerint x : T tmb, bal : egsz, jobb : egsz)
2:
ha bal < jobbhakkor i
3:
center bal+jobb
2
4:
5:
6:
7:
8:

sszefslRendezs(x, bal, center)


sszefslRendezs(x, center + 1, jobb)
sszefsl(x, bal, center, jobb)
elgazs vge
eljrs vge

Eljrs hvsa: sszefslRendezs(x, 1, n)


Felhasznlt vltozk s fggvnyek
x: Rendezend tmb, mely az algoritmus vgre rendezett vlik.
bal: A tmb ppen rendezs alatt lv rsznek als indexe.
jobb: A tmb ppen rendezs alatt lv rsznek fels indexe.
center: A rendezs alatt lv rsztmb kzepnek indexe.
n: A tmb mrete.
sszefsl: Kt rendezett tmbt sszefuttat egy rendezett tmbb (ld. 6.3. algoritmus).
Az algoritmust megvalst eljrs bemenete a rendezend x tmb, valamint a bal s jobb indexek,
amelyek meghatrozzk, hogy az eredeti tmb melyik rsztmbjvel foglalkozunk ppen. Kezdetben
bal = 1 s jobb = n. Az algoritmus helyben rendezst valst meg, gy futsnak vgre az x rendezett
vlik. Ezen kvl tovbbi kimenetre nincs szksg, ezrt tudjuk az algoritmust fggvny helyett eljrssal
megvalstani.
Ha egy elem tmbt kell rendeznnk, akkor nincs semmi teendnk, mivel egy egy elem tmb mr
eleve rendezett. Ha viszont legalbb kt eleme van a vizsglt rsztmbnek, akkor bal < jobb (ld. 2. sor).
Ilyenkor meghatrozzuk a rsztmb kzps elemnek indext (ld. 3. sor). Ezutn gondoskodunk a bal
oldali rsztmb rendezsrl egy megfelel rekurzv hvssal (ld. 4. sor), majd a jobb oldali rsztmbt
is rendezett tesszk (ld. 5. sor). Ha van kt rendezett rsztmbnk, akkor ezek sszefuttatst kell mg
megvalstanunk, amihez egy nll eljrst hasznlunk (ld. 6. sor).
Az sszefsl eljrs lnyegben az sszefuttats programozsi ttel 2.23. algoritmust valstja
meg kis mdostssal. Vltoztatsra azrt van szksg, mert most nem kt bemeneti tmbt akarunk egy
kimeneti tmbbe sszefuttatni, hanem egy adott x tmb kt rsztmbjt akarjuk az x ugyanazon helyn
sszefuttatni. Mivel ezt adatveszts nlkl nem tudjuk megtenni, ezrt az x tmb megfelel rsztmbjeit
ideiglenesen kirjuk kt tmeneti tmbbe. Az y1 tmbbe kerl a bal s center indexek kztti rsztmb,
2 Angolul:

merge sort

Sergyn Szabolcs

203

budai Egyetem
Neumann Jnos Informatikai Kar

6.3. Algoritmus sszefsls


Bemenet: x T tmb, bal egsz, center egsz, jobb egsz; ahol T sszehasonlthat
Kimenet: x T tmb
1: eljrs sszefsl(cmszerint x : T tmb, bal : egsz, center : egsz, jobb : egsz)
2:
n1 center bal + 1
3:
n2 jobb center
4:
y1 Ltrehoz(T)[n1 + 1]
5:
ciklus i 1-tl n1 -ig
6:
y1 [i] x[bal + i 1]
7:
ciklus vge
8:
y2 Ltrehoz(T)[n2 + 1]
9:
ciklus j 1-tl n2 -ig
10:
y2 [j] x[center + j]
11:
ciklus vge
12:
y1 [n1 + 1] +
13:
y2 [n2 + 1] +
14:
i1
15:
j1
16:
ciklus k bal-tl jobb-ig
17:
ha y1 [i] y2 [j] akkor
18:
x[k] y1 [i]
19:
ii+1
20:
klnben
21:
x[k] y2 [j]
22:
j j+1
23:
elgazs vge
24:
ciklus vge
25: eljrs vge
Felhasznlt vltozk s fggvnyek
x: A rendezend tmb. A tmb bal s center kztti rsze, valamint center + 1 s jobb kztti
rsze az algoritmus elejn rendezett. Az algoritmus vgre a tmb bal s jobb kztti rsze vlik
rendezett.
bal: Az x tmb sszefslend rsztmbjnek kezd indexe.
jobb: Az x tmb sszefslend rsztmbjnek zr indexe.
center: Index, amely megadja, hogy a kt rendezett rsztmbnek hol van a hatra.
y1 : Segdtmb, melybe a kezdeti x bal s center kztti rszt msoljuk t, illetve a vgre tesznk
egy elg nagy rtket.
n1 : Az x tmb bal s center indexek kztti elemeinek szma.
y2 : Segdtmb (y1 -hez hasonlan) a kezdeti x center + 1 s jobb kztti elemeinek trolsra.
n2 : Az x tmb center + 1 s jobb indexek kztti elemeinek szma.
Ltrehoz(T)[n]: Utasts, mely ltrehoz egy n elem T tpus tmbt.

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

elem tmb esetn a futsi id? A gondolatmenet hasonl, teht


n
n
n
T
=2T
+O
.
2
4
2

(6.4)

Ezek alapjn viszont a 6.3. kplet gy alakul:


n
n
n
+2O
+ O (n) = 4 T
+ O (n) + O (n) .
(6.5)
T (n) = 4 T
4
2
4


Folytathatnnk tovbb a felezgetst meghatrozva T n4 , majd T n8 , stb. rtkt. Mindenhol azt
kapnnk, hogy
n
n
n
T
=2T
+O
.
(6.6)
k
2k
k
A f krds az, hogy mikor nem tudjuk mr tovbbosztani a tmb aktulis mrett. Erre tudjuk viszont
a vlaszt: egy elem tmb esetn. T (1) ugyanis 1-gyel egyenl.
Hny felezgets kell addig elvgeznnk, amg egy n elem tmbt 1 elem rsztmbkre tudunk
sztszabdalni? Kzeltleg log2 n.
Mindezek alapjn kijelenthet, hogy
T (n) = n T (1) + O(n) + . . . + O(n) n (1 + log2 n) = O (n log n) .
{z
}
|

(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)

bal center jobb

(a) Rendez eljrs hvsa az 1. s 6. elemek kztti rsztmbre.

(b) Rendez eljrs hvsa az 1. s 3. elemek kztti rsztmbre.


sszefslRendezs(x, 1, 1)

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

(c) Rendez eljrs hvsa az 1. s 2. elemek


kztti rsztmbre.

bal
center

jobb

(e) Rendez eljrs hvsa az 2. elembl ll rsztmbre. Az egy elem tmb mr eleve rendezett
is.

jobb

(f) Kt rendezett rsztmb sszefslse egy


rendezett rsztmbb.

6.2. bra. sszefsl rendezs.


Sergyn Szabolcs

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:

bal center jobb

jobb

bal

(g) Rendez eljrs hvsa az 3. elembl ll rsztmbre. Az egy elem tmb mr eleve
rendezett is.

(h) Kt rendezett rsztmb sszefslse


egy rendezett rsztmbb.

sszefslRendezs(x, 4, 5)
sszefslRendezs(x, 4, 6)

sszefslRendezs(x, 4, 6)

sszefslRendezs(x, 1, 6)

sszefslRendezs(x, 1, 6)

x:

x:

(i) Rendez eljrs hvsa a 4. s 6. elemek


kztti rsztmbre.

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)

(j) Rendez eljrs hvsa a 4. s 5. elemek


kztti rsztmbre.

sszefslRendezs(x, 4, 4)

bal
center

bal center jobb

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.

6.2. bra. sszefsl rendezs (folyt.).


Sergyn Szabolcs

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

(m) Kt rendezett rsztmb sszefslse egy


rendezett rsztmbb.

(n) Rendez eljrs hvsa a 6. elembl ll


rsztmbre. Az egy elem tmb mr eleve rendezett is.

sszefsl(x, 4, 5, 6)
sszefslRendezs(x, 4, 6)

sszefsl(x, 1, 3, 6)

sszefslRendezs(x, 1, 6)

x:

sszefslRendezs(x, 1, 6)

x:

bal center jobb

center

bal

(o) Kt rendezett rsztmb sszefslse


egy rendezett rsztmbb.

jobb

(p) Kt rendezett rsztmb sszefslse


egy rendezett tmbb.

6.2. bra. sszefsl rendezs (folyt.).

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

(a) Eredeti tmb, melyben az els elem a tmpont.


x:

17

10

23

(b) Sztvlogatott tmb. A tmpont eltt csak nla nem nagyobb,


mgtte pedig csak nla nagyobb elemek vannak.
x:

10

17

23

(c) Rendezett tmb. A tmpont eltti s utni elemek is rendezve


lettek.

6.3. bra. Tmpont alap sztvlogats s rendezs.


Ha szt tudjuk a tmbt vlogatni az elbb lert mdon, akkor mr csak annyi a feladatunk, hogy a
tmpont eltti, illetve utni rsztmbt kln-kln rendezzk. Ezt kveten viszont az egsz tmb is
rendezett vlik, ahogy ez a 6.3c. brn is lthat. Mr csak az a krds, hogy miknt rendezzk a tmpont eltti s utni elemekbl ll kt rsztmbt. Erre egyszer a vlasz: rekurzv mdon alkalmazzuk
rjuk a gyorsrendezst.
Az eddigiek alapjn az lthat, hogy az Oszd meg s uralkodj! elv a gyorsrendezsnl msknt alakul
mint a korbbi kt esetben. A feloszts a tmpont alap sztvlogatssal trtnik meg. Az uralkods a
tmpont eltti s utni rsztmbk rekurzv rendezst jelenti. Az egyestsre pedig itt nincs szksg,
mert mr az uralkods fzis vgre rendezett vlik az egsz tmb.
Egyetlen krds maradt mr csak megvlaszolatlanul. Mi biztostja, hogy a rekurzv gyorsrendezs
lelljon, azaz mi a rekurzi alapesete? Mivel az egy elem tmbk eleve rendezettek, ezrt az egy (illetve
nulla) elem tmbknl nem vgznk jabb rekurzv hvst.
A gyorsrendezs konkrt megvalstst a 6.4. algoritmusban mutatjuk be. Az algoritmust megvalst GyorsRendezs eljrs bemenete a rendezend x tmb, valamint az aktulis rsztmb indexhatrait
jell bal s jobb paramterek. Az els eljrshvs esetn bal = 1 s jobb = n. Az eljrsnak nincs kln
kimenete, hanem a cmszerinti paramtertadssal megadott x tmbben trtnik meg a rendezs. Emiatt
kijelenthet, hogy a gyorsrendezs is egy helyben rendez algoritmus.
Els lpsben meghvjuk a Sztvlogat fggvnyt (ld. 2. sor), mely megvalstja a tmpont alap
sztvlogatst. Mivel a Sztvlogat (ld. 6.5. algoritmus) fggvny a helyben trtn sztvlogatst
(ld. 2.17. algoritmus) valstja meg, ezrt rszletes ismertetstl eltekintnk. Csak kt lnyeges klnbsget emltnk meg. Az egyik, hogy a sztvlogats nem a teljes x tmbben trtnik, hanem csak a bal
s jobb indexek kztti rsztmbben. Msrszt a sztvlogatsnl hasznlt P tulajdonsg, a tmpont
elemhez kpesti kisebb egyenlsg.
A Sztvlogat fggvny mivel cm szerinti paramter tadssal adjuk t az x tmbt trendezi
az x tmbt gy, hogy az x[bal] tmpont elem eltt csak nla nem nagyobb, mgtte pedig csak nla
nagyobb elemek lesznek. Kimenetknt pedig visszaadja a tmpont elem j helyt a tmbben.
3 Angolul:
4 Angolul:

quicksort
pivot element

Sergyn Szabolcs

209

budai Egyetem
Neumann Jnos Informatikai Kar

6.4. Algoritmus Gyorsrendezs


Bemenet: x T tmb, bal egsz, jobb egsz; ahol T sszehasonlthat
Kimenet: x T rendezett tmb
1: eljrs GyorsRendezs(cmszerint x : T tmb, bal : egsz, jobb : egsz)
2:
idx Sztvlogat(x, bal, jobb)
3:
ha idx > bal + 1 akkor
4:
GyorsRendezs(x, bal, idx 1)
5:
elgazs vge
6:
ha idx < jobb 1 akkor
7:
GyorsRendezs(x, idx + 1, jobb)
8:
elgazs vge
9: eljrs vge
Eljrs hvsa: GyorsRendezs(x, 1, n)
Felhasznlt vltozk s fggvnyek
x: A rendezend tmb. Az algoritmus vgn x nvekv mdon rendezett lesz.
bal: A tmb ppen rendezs alatt lv rsznek als indexe.
jobb: A tmb ppen rendezs alatt lv rsznek fels indexe.
idx: A rendezs alatt lv tmbrsz els elemnek a tmpont elemnek a helye a Sztvlogat
fggvny lefutst kveten.
n: Az x tmb mrete.
Sztvlogat: Egy tmbt gy alakt t, hogy a tmb els elemt (tmpont elem) gy teszi helyre
(ez lesz az idx index), hogy minden idx eltti elem nem nagyobb s minden idx utni elem nagyobb
az tmpont elemnl.

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

6.5. Algoritmus Gyorsrendezs sztvlogatsa


Bemenet: x T tmb, bal egsz, jobb egsz; ahol T sszehasonlthat
Kimenet: x T tmb, idx egsz
1: fggvny Sztvlogat(cmszerint x : T tmb, bal : egsz, jobb : egsz)
2:
segd x[bal]
3:
ciklus amg bal < jobb
4:
ciklus amg (bal < jobb) (x[jobb] > segd)
5:
jobb jobb 1
6:
ciklus vge
7:
ha bal < jobb akkor
8:
x[bal] x[jobb]
9:
bal bal + 1
10:
ciklus amg (bal < jobb) (x[bal] segd)
11:
bal bal + 1
12:
ciklus vge
13:
ha bal < jobb akkor
14:
x[jobb] x[bal]
15:
jobb jobb 1
16:
elgazs vge
17:
elgazs vge
18:
ciklus vge
19:
idx bal
20:
x[idx] segd
21:
vissza idx
22: fggvny vge
Felhasznlt vltozk s fggvnyek
x: A rendezs alatt lv tmb.
bal: Kezdetben az x tmb ppen vizsglt rsztmbjnek als indexe, majd a bejrst segt vltoz.
jobb: Kezdetben az x tmb ppen vizsglt rsztmbjnek fels indexe, majd a bejrst segt
vltoz.
segd: Segdvltoz, melyben eltroljuk a vizsglt rsztmb els elemt, azaz a kezdeti x[bal]-t.
idx: Az eltrolt segdvltoz helye a fggvny vgn. Az idx-nl kisebb index elemek mind
kisebbek vagy egyenlk a segd-del, mg az idx-nl nagyobb index elemek mind nagyobbak a
segd-nl.

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)

Ezek szerint a gyorsrendezs legjobb esetben versenykpes az sszefuttat rendezssel, legrosszabb


esetben viszont a korbban megismert nem hatkony rendez algoritmusokhoz hasonl futsi idvel
rendelkezik.
Az tlagos esetet bizonyts nlkl kzljk. A gyorsrendezs tlagos esetben O(n log n) futsi idej.
Fontos megemlteni, hogy a gyorsrendezs memria ignye viszont lnyegben csak a rendezend tmb
mretvel azonos, hiszen a sztvlogatsnl egyetlen tbbletrtket kell tmenetileg eltrolnunk.

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

(c) Az 1. s 2. elem kztti rsztmb rendezse. A tmpont elem az 1. helyre kerl.


Tovbbi rendezs itt nem szksges.

6.4. bra. Gyorsrendezs.

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.

6.4. bra. Gyorsrendezs (folyt.)

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.

6.4. bra. Gyorsrendezs (folyt.)

Sergyn Szabolcs

215

budai Egyetem
Neumann Jnos Informatikai Kar

Sztvlogat(x, 11, 14)


12
GyorsRendezs(x, 11, 14)
GyorsRendezs(x, 9, 14)
GyorsRendezs(x, 5, 14)
GyorsRendezs(x, 1, 14)

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.

6.4. bra. Gyorsrendezs (folyt.)

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

6.4. A k-adik legkisebb elem kivlasztsa


Feladatunk, hogy egy tmbben megkeressk a valahnyadik legkisebb elemet. Ha pldul az els legkisebb elem kell, akkor ezt egyszeren meghatrozhatjuk a minimumkivlaszts hasznlatval. Hasonlan
egy n elem tmb n-edik legkisebb elemt a maximumkivlasztssal adhatjuk meg. Ha viszont nem egy
szlsrtkre van szksgnk, hanem egy ltalnos k-adik legkisebb elemre (pldul az tdikre), akkor
nehezebb dolgunk van.
A problmt eddigi ismereteink alapjn is megoldhatjuk. Amennyiben a feladatunk az tdik legkisebb elem meghatrozsa, akkor eljrhatunk a kvetkez lpseket kvet mdszerrel. Minimumkivlasztssal meghatrozzuk elszr a legkisebb elemet, majd ezt elhagyjuk a tmbbl. Ezt kveten a maradk
elemek kztt ismt meghatrozzuk a legkisebbet, ami az eredeti tmb msodik legkisebb eleme. Majd
ezt az elemet is elhagyjuk a tmbbl. Ezt folytathatjuk mindaddig, amg az tdik legkisebb elemhez nem jutunk. Futsi id szempontjbl egy minimumkivlaszts arnyos a vizsglt tmb mretvel.

Teht, ha pldul a tmb kzps elemt (medinjt) kell megadnunk, akkor a futsi id O n2 -es.
Msik lehetsges megkzelts, ha nvekv sorrendbe rendezzk a tmb elemeit, majd kivlasztjuk a
k-adik elemet. A rendezst jelenlegi ismereteink szerint leggyorsabban O(n log n) id alatt vgezhetjk
el. Krdses, hogy van-e ennl gyorsabb lehetsg a k-adik legkisebb elem kivlasztsra.
A bemutatsra kerl mdszer a gyorsrendezsnl mr megismert sztvlogatson (ld. 6.5. algoritmus)
alapul. A vizsglt tmbnket elszr sztvlogatjuk, gy megkapjuk, hogy a tmpont elem hova kerl
a tmbben. Jellje ennek a helynek az indext idx. Ha a k rtk egyenl az idx-szel, akkor a k-adik
legkisebb elem maga a tmpont elem, hiszen a sztvlogatsnl a tmpont elem a vgleges helyre kerl
egy rendezett tmbben. Ha k kisebb az idx-nl, akkor a tovbbi keresst csak az idx-edik elem eltti
rsztmbben kell folytatnunk, mert ott tallhatk a tmpontnl kisebb rtk elemek. Ha viszont k
nagyobb az idx-nl, akkor a tmpontot kvet elemek kztt kell keresnnk. Itt viszont mr nem a
k-adik, hanem a (k idx)-edik elemet kell megtallnunk.
Az elbbi Oszd meg s uralkodj! elv tletet a 6.6. algoritmusban rjuk le. Az algoritmus bemenete
a vizsglt x tmb, az aktulisan vizsglt rsztmb bal s jobb hatrindexei, valamint a k rtk. Kimenetknt a k-adik legkisebb elem rtkt kapjuk meg. Az algoritmust megvalst k-adikLegkisebbElem
rekurzv fggvnyt bal = 1 s jobb = n paramterekkel hvjuk meg.
Megjegyzs

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

6.6. Algoritmus k-adik legkisebb elem kivlasztsa


Bemenet: x T tmb, bal egsz, jobb egsz, k egsz; ahol T sszehasonlthat
Kimenet: k-adik legkisebb tmbelem rtke
1: fggvny k-adikLegkisebbElem(x : T tmb, bal : egsz, jobb : egsz, k : egsz)
2:
ha bal = jobb akkor
3:
vissza x[bal]
4:
klnben
5:
idx Sztvlogat(x, bal, jobb)
6:
ha k = idx bal + 1 akkor
7:
vissza x[idx]
8:
klnben ha k < idx bal + 1 akkor
9:
vissza k-adikLegkisebbElem(x, bal, idx 1, k)
10:
klnben
11:
vissza k-adikLegkisebbElem(x, idx + 1, jobb, k (idx bal + 1))
12:
elgazs vge
13:
elgazs vge
14: fggvny vge
Fggvny hvsa: k-adikLegkisebbElem(x, 1, n, k)
Felhasznlt vltozk s fggvnyek
x: Tmb, melybl a k-adik legkisebb elem rtkt akarjuk kivlasztani.
bal: Az x tmb aktulisan vizsglt rsznek als indexe.
jobb: Az x tmb aktulisan vizsglt rsznek fels indexe.
k: A k-adik legkisebb elemet akarjuk kivlasztani az x tmbbl.
idx: A gyors rendezsnl megismert Sztvlogat fggvny kimenete.
n: Az x tmb elemszma.
tmbt gy, hogy az aktulis tmpont elem a negyedik helyre kerl (ld. 6.5a. bra). Ezek alapjn az
tdik legkisebb elemet a tmponttl jobbra lv elemek kztt tudjuk megtallni, viszont mr nem az
tdik, hanem az els legkisebb elem kivlasztsa a cl.
Meghvsra kerl ismtelten a k-adikLegkisebbElem fggvny a bal = 5, jobb = 14 s k = 1
paramterekkel. Kvetkezik a Sztvlogat fggvny hvsa, amely a tmpontot a 8. helyre (a vizsglt
rsztmbn bell a 4. helyre) teszi (ld. 6.5b. bra). Mivel az els legkisebb elemet keressk, ezrt a
rsztmb tmpont eltti elemei kztt kel a keresst folytatnunk.
Ismt a k-adikLegkisebbElem fggvny hvsa kvetkezik, de most a bal = 5, jobb = 7 s k = 1
paramterekkel. A sztvlogats az aktulis tmpontot az 5., az aktulis rsztmbn bell pedig az 1.
helyre teszi. gy megtalltuk a keresett elemet, ezrt a rekurzvan hvott fggvnyek ennek rtkvel
trnek vissza (ld. 6.5c. bra).
Futsi id elemzse. A futsi id szempontjbl vizsgljuk meg elszr a legkedvezbb esetet. Ez
termszetesen az, ha az els sztvlogatsnl a tmpont rgtn a k-adik helyre kerl. Ilyenkor egyetlen
sztvlogatst kell vgezni az n elem tmbben, aminek futsi ideje O(n)-es.
Vizsgljuk most azt az esetet, amikor tbb rekurzv hvs, gy tbb sztvlogats is trtnik. Legrosszabb esetben egszen addig kell a rekurzit folytatnunk, amg a vizsglt rsztmb egy elemv nem
vlik. Ha kzben a mg vizsglat alatt lv tmb mrete mindig felezdik, azaz a tmpont kzpre kerl,
akkor a futsi idrl a kvetkezt mondhatjuk:
n
n


n n
T (n) = O (n) + O
+O
+ . . . + O(1) = O n + + + . . . + 1 .
(6.11)
2
4
2
4
Az n + n2 + n4 + . . . + 1 sszeg egy mrtani sorozat sszege, melynek els eleme 1, kvciense 2, elemszma
pedig megkzeltleg 1 + log2 n. gy viszont


21+log2 n 1
T (n) = O 1
= O (2n 1) = O(n).
(6.12)
21
Az algoritmus futsnak legrosszabb esete termszetesen most
 is az, ha a tmpont elem mindig a
vizsglt tmb valamelyik szlre kerl, ilyenkor a futsi id O n2 -es.
Sergyn Szabolcs

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

(c) Az 5. s 7. elemek kztt keressk az els legkisebb elemet. Mivel a tmpont az


5. helyre kerl, ami a vizsglt rsztmb els helye, ezrt megtalltuk a keresett elemet.

6.5. bra. tdik legkisebb elem kivlasztsa.

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

(a) A kincsmez. Zld


mez: kiindulsi pont,
piros mez:
rkezsi
pont.

(b) Nhny lehetsges


bejrs.

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

7.1. Dinamikus programozs


A dinamikus programozs az Oszd meg s uralkodj! elvhez hasonlan a megoldand feladatot rszfeladatokra bontssal oldja meg. Lnyeges klnbsg viszont, hogy az Oszd meg s uralkodj! elv a
feladatot egymstl fggetlen rszfeladatokra bontotta (fentrl lefele ptkezett), melyeket rekurzvan
megoldott, majd a megoldsokat egyestette. A dinamikus programozs viszont akkor hasznlhat, ha a
rszproblmk egymstl nem fggetlenek, azaz kzs rszproblmk vannak. Ilyenkor is lehetne persze
az Oszd meg s uralkodj! elvet hasznlni, de a kzs rszproblmkat az tbbszr is megoldan. Ezzel
szemben a dinamikus programozsnl minden egyes rszproblmt csak egyszer oldunk meg (lentrl felfel ptkeznk), a megoldst pedig egy tblzatban troljuk el. A rszproblma megoldst felhasznl
tovbbi feladatrszek ebbl a tblzatbl tudjk kiolvasni a szksges rtkeket.
Megjegyzs

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:

0-1 knapsack problem


longest common subsequence

Sergyn Szabolcs

224

budai Egyetem
Neumann Jnos Informatikai Kar

7.1.1. 0-1 htizsk problma


Egy rabl elltogat a kirlyi kincstrba. Nagy mennyisg kincset tall ott, de a htizskjba csak
egy slykorltot nem meghalad mennyisg kincset tehet, mivel egybknt nem brja el azokat. Hogyan
tud a rabl gy kivlasztani kincseket, hogy a kivlasztottak befrjenek a htizskba, s emellett az
sszrtkk a lehet legnagyobb legyen?
A feladat megoldsa rdekben elszr formalizljuk a feladatot.
Adott egy n elem K halmaz, mely a kincstrban lv kincsek halmaza. Az K halmaz elemei rtk
s slyprok. Teht az K halmaz i-edik eleme: (pi , wi ), ahol pi az i-edik kincs rtke, wi pedig az i-edik
kincs slya. A rabl htizskjnak kapacitsa legfeljebb c. (Az egyszersg kedvrt minden pi s wi
rtk, valamint c is pozitv egsz szm.) Ki kell vlasztani az K halmaznak egy olyan S rszhalmazt,
hogy
X
wj c,
(7.1)
jS

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.1. tblzat. A 7.1. feladat kincseinek konkrt rtkei s slyai.

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.2. Algoritmus Kivlasztott elemek kiolvassa


Bemenet: F egsz tbla, n egsz, c egsz
Kimenet: S egsz halmaz
1: fggvny Kiolvas(F : egsz tbla, n : egsz, c : egsz)
2:
S
3:
in
4:
xc
5:
ciklus amg (i > 0) (x > 0)
6:
ha F [i, x] 6= F [i 1, x] akkor
7:
S S {i}
8:
x x wi
9:
elgazs vge
10:
ii1
11:
ciklus vge
12:
vissza S
13: fggvny vge
Felhasznlt vltozk s fggvnyek
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.
n: A kincsek szma.
c: A htizsk kapacitsa.
S: Az optimlis kivlasztsban szerepl kincsek indexeinek halmaza.

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

7.1.2. A dinamikus programozs elve


Egy pldn keresztl megismertk a dinamikus programozst, amely az albbi ngy lpsbl llt:
1. Az optimlis megolds szerkezetnek jellemzse.
2. Az optimlis megolds rtknek rekurzv mdon trtn definilsa.
3. Az optimlis megolds rtknek kiszmtsa n. alulrl felfel trtn mdon.
4. Az elzek alapjn egy optimlis megolds megadsa.
Felmerl viszont krdsknt, hogy milyen esetekben alkalmazhat a dinamikus programozs elve.
Az optimalizlsi problmnak kt tulajdonsgot kell ahhoz teljestenie, hogy a dinamikus programozs
mdszervel megoldhat legyen. Els az optimlis rszstruktrk, msodik pedig az tfed rszproblmk
tulajdonsg.
Akkor mondjuk, hogy egy feladat optimlis rszstruktrj, ha a problma egy optimlis megoldsa
nmagn bell a rszfeladatok optimlis megoldsait is tartalmazza. A 0-1 htizsk problma megoldsnl ez teljeslt, hiszen pont ezt hasznltuk ki a 7.3. kplet megadsnl.
A dinamikus programozs alkalmazhatsgnak msik felttele, hogy a rekurzv megold algoritmus
(vagy kplet) mindig ugyanazokat a rszfeladatokat oldja meg. Ilyenkor az optimalizlsi feladat rszfeladatai tfedek. Ez egy lnyeges klnbsg az Oszd meg s uralkodj! elvnl trgyalt feladatokhoz
kpet. Azok ugyanis pont olyan rszfeladatokat tartalmaztak, melyek egymstl teljesen fggetlenek
voltak, nem voltak kzttk tfedek.
Az tfed rszfeladatok gyors megoldsa rdekben a dinamikus programozsnl nem rekurzv fggvnyeket hasznlunk, hanem az n. feljegyzses mdszer t6 alkalmazzuk. Ennek lnyege, hogy a rszproblmk megoldsait egy tblzatban troljuk el. Ennek a tblzatnak minden egyes rtkt csak egyszer
szmoljuk ki. Mivel a tblzatot gy alkotjuk meg, hogy elszr a legelemibb rszproblmkat oldjuk
meg, majd ezekbl ptjk fel az egyre bonyolultabb problmk megoldsait, a dinamikus programozst
alulrl felfel halad mdszernek tekintjk.

6 Angolul:

memoization

Sergyn Szabolcs

230

budai Egyetem
Neumann Jnos Informatikai Kar

7.1.3. Leghosszabb kzs rszsorozat


Ahhoz, hogy kt sorozat leghosszabb kzs rszsorozatt meg tudjuk hatrozni elszr definilnunk kell
nhny fogalmat.
Az X = hx1 , x2 , . . . , xn i egy sorozat, mely vges hossz s a benne szerepl x1 , x2 , . . . , xn elemek
sorrendje adott. Ebbl lthat, hogy egy n elem sorozat eltrolhat egy n elem tmbben.
Az X sorozat egy rszsorozatt gy kapjuk, ha X-bl valahny elemet trlnk, a megmarad elemek sorrendjt pedig nem vltoztatjuk meg. Pldul az h1, 4, 8, 9, 12, 15, 17i sorozatnak rszsorozata az
h1, 8, 9, 15, 17i sorozat, amit a msodik s tdik elem elhagysval kaptunk.
Megjegyzs

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)

max {F [i, j 1], F [i 1, j]} , ha i, j > 0 s xi 6= yj


Termszetesen az F [i, j] rtkeket most sem rekurzv fggvny hasznlatval lltjuk el, hanem egy
tblt hasznlunk az adatok trolsra, amivel gyorsabb futs vlik lehetsgess. A tbla ellltst
a 7.3. algoritmus valstja meg.
Sergyn Szabolcs

231

budai Egyetem
Neumann Jnos Informatikai Kar

7.3. Algoritmus Leghosszabb kzs rszsorozat hossza


Bemenet: X T tmb, n egsz (tmb mrete), Y T tmb, m egsz (tmb mrete)
Kimenet: F egsz tbla
1: fggvny LKRHossza(X : T tmb, n : egsz, Y : T tmb, m : egsz)
2:
F TblaLtrehoz(egsz)[n + 1, m + 1]
3:
ciklus j 0-tl m-ig
4:
F [0, j] 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 j 1-tl m-ig
11:
ha xi = yj akkor
12:
F [i, j] F [i 1, j 1] + 1
13:
klnben
14:
F [i, j] max {F [i 1, j], F [i, j 1]}
15:
elgazs vge
16:
ciklus vge
17:
ciklus vge
18:
vissza F
19: fggvny vge
Felhasznlt vltozk s fggvnyek
X: Az egyik sorozat elemeit tartalmaz tmb.
n: Az X sorozat elemeinek szma.
Y : A msik sorozat elemeit tartalmaz tmb.
m: Az Y sorozat elemeinek szma.
F : Tbla, melynek mrete (n + 1) (m + 1). F [i, j] megadja, hogy az X i s az Y j sorozatoknak
milyen hossz a leghosszabb kzs rszsorozata. F [n, m] hatrozza meg az X s Y sorozatok
leghosszabb kzs rszsorozatnak hosszt.
TblaLtrehoz(egsz)[n+1, m+1]: Utasts, mely ltrehoz egy (n + 1)(m + 1) mret egsz
tpus tblt.

Sergyn Szabolcs

232

budai Egyetem
Neumann Jnos Informatikai Kar

Az algoritmus bemenete az X s az Y sorozat, melyek elemei tmbben vannak eltrolva. A kt


bemeneti sorozatnak ismerjk az elemszmt is, melyek n s m. Kimenetknt az F tblt adja vissza az
algoritmus, melynek mrete (n + 1) (m + 1). A tblt most is 0-tl indexeljk.
Az algoritmus nem tesz mst, mint sorfolytonos bejrssal ellltja a 7.4. kplet alapjn az F [i, j]
rtkeket. A 3. sorban kezdd ciklussal feltltjk az F nulladik sornak minden elemt 0 rtkkel.
Hasonl mdon az F nulladik oszlopnak elemei a 6. sorban kezdd ciklusban kapnak 0 rtket. A
tnyleges sorfolytonos bejrst a 9. sorban kezdd kt egymsba gyazott ciklus valstja meg. A kls
ciklus vgighalad az sszes soron az elstl az n-edikig, mg a bels ciklus kzben az elstl az m-edik
oszlopig az aktulis i-edik sor minden elemt bejrja. A ciklusok magjban megvizsgljuk, hogy az X
sorozat i-edik eleme megegyezik-e az Y sorozat j-edik elemvel (ld. 11. sor). Amennyiben megegyezik
a kt vizsglt elem, akkor a 7.4. kpletnek megfelelen az F [i, j] rtk az F [i 1, j 1] rtknl eggyel
nagyobb lesz. Amennyiben nem teljesl az egyezsg (ld. 13. sor), akkor viszont az F [i 1, j] s az
F [i, j 1] rtkek kzl a nagyobbikat kell eltrolni F [i, j]-ben. Az algoritmus vgn vissza kell adni a
feltlttt F tblt (ld. 18. sor).
Futsi id elemzse. Mivel a 7.3. algoritmusban kt egymsba gyazott ciklussal valstottuk meg
az F tbla feltltst, ezrt az algoritmus futsi ideje minden esetben O (n m)-es, azaz a kt vizsglt
sorozat hossznak szorzatval arnyos.
7.3. Plda. Feladatunk, hogy megadjuk a leghosszabb kzs rszsorozatt a kvetkez kt sorozatnak:
X = hC, A, L, E, N, D, A, Ri s Y = hC, A, L, L, C, E, N, T, E, Ri. Ehhez els lpsknt el kell lltani
a 7.4. kplet ltal meghatrozott F tblt a 7.3. algoritmus hasznlatval. A feladat tovbbi rsznek
megoldst, egy konkrt leghosszabb kzs rszsorozat meghatrozst a 7.4. pldban mutatjuk be.
Elszr helyet kell foglalni a memriban az F tbla szmra. Az F mrete 9 11-es lesz, mivel
az X sorozat 8, az Y sorozat pedig 10 elem. Ezt kveten a tbla nulladik sort s nulladik oszlopt
feltltjk csupa 0 rtkekkel. Ezutn jn a tbla rtkes elemeinek meghatrozsa. Mivel az X sorozat
els eleme megegyezik az X sorozat els elemvel, ezrt F [1, 1] az F [0, 0] rtknl 1-gyel nagyobb lesz.
Az X sorozat els eleme nem egyezik meg az Y sorozat msodik elemvel, ezrt F [1, 2] rtke az F [0, 2]
s az F [1, 1] kzl a nagyobbikkal lesz egyenl. Hasonlan jrunk el minden ms elemnl is a 7.4. kplet
szerint, ahogy az a 7.3. algoritmusban is lthat.
Az elll F tbla a 7.4. brn lthat. Az brn a feketvel jelzett F [i, j] rtkek mellett, kk sznnel
feltntettk a tbla sorainak s oszlopainak indexeit, valamint piros sznnel az X s Y sorozat megfelel
elemeit. Vilgoskk nyilak mutatjk azokat az eseteket, amikor az X sorozat i-edik eleme megegyezett
az Y sorozat j-edik elemvel, ezrt az F [i, j] elem rtke az F [i 1, j 1] rtknl 1-gyel nagyobb lett.

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

Most mr tudjuk, hogy miknt lehet hatkonyan meghatrozni az X i s Y j rszsorozatok leghosszabb


kzs rszsorozatainak hosszait, amit az F tbla F [i, j] elemben trolunk el. Megllaptottuk azt is,
hogy az F [n, m] rtk megadja az X s Y sorozatok leghosszabb kzs rszsorozatnak hosszt. Miknt
lehet viszont egy konkrt leghosszabb kzs rszsorozatot meghatrozni?
A krds megvlaszolsban a 7.3. algoritmus elemzse nyjt segtsget. Igaz, hogy a 7.3. algoritmus
kimenetknt csak az aktulis hosszrtkeket tartalmaz F tblt lltja el, de azrt ha tovbb gondolkodunk ennl tbb informci is tallhat benne. A tbla ellltsa sorn akkor tudunk csak rtknvekedst elrni, amikor az X sorozat i-edik eleme megegyezik az Y sorozat j-edik elemvel. Ilyenkor pedig
kijelenthet, hogy az X i1 s az Y j1 sorozatok leghosszabb kzs rszsorozathoz, ha hozztesszk az
xi (vagy az azzal megegyez yj ) elemet, akkor az X i s Y j egy leghosszabb kzs rszsorozatt kapjuk
meg. Ezen logika alapjn azt kell vizsglnunk, hogy melyek azok a helyek az F tblban, ahol igaz, hogy
rtknvekeds trtnt. Minden ilyen (i, j) helyen igaz, hogy
F [i, j] = F [i 1, j 1] + 1.

(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

7.4. Algoritmus Leghosszabb kzs rszsorozat ellltsa


Bemenet: F egsz tbla, X T tmb, n egsz, Y T tmb, m egsz
Kimenet: S T tmb
1: fggvny LKRElllts(F : egsz tbla, X : T tmb, n : egsz, Y : T tmb, m : egsz)
2:
S Ltrehoz(T)[F [n, m]]
3:
in
4:
jm
5:
idx F [n, m]
6:
ciklus amg idx > 0
7:
ha X[i] = Y [j] akkor
8:
S[idx] X[i]
9:
idx idx 1
10:
ii1
11:
j j1
12:
klnben ha F [i 1, j] > F [i, j 1] akkor
13:
ii1
14:
klnben
15:
j j1
16:
elgazs vge
17:
ciklus vge
18:
vissza S
19: fggvny vge
Felhasznlt vltozk s fggvnyek
X: Az egyik sorozat elemeit tartalmaz tmb.
n: Az X sorozat elemeinek szma.
Y : A msik sorozat elemeit tartalmaz tmb.
m: Az Y sorozat elemeinek szma.
F : Tbla, melynek mrete (n + 1) (m + 1). F [i, j] megadja, hogy az X i s az Y j sorozatoknak milyen hossz a leghosszabb kzs rszsorozata. F [n, m] hatrozza meg az X s Y sorozatok
leghosszabb kzs rszsorozatnak hosszt. Az F tblt a 7.3. algoritmusban bemutatott LKRHossza fggvnnyel lltjuk el.
S: Az X s az Y sorozatok egyik leghosszabb kzs rszsorozata. Az S elemei egy F [n, m] elemszm tmbben vannak eltrolva.
Ltrehoz(T)[F [n, m]]: Utasts, mely ltrehoz egy F [n, m] elem T tpus tmbt.

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

7.6. bra. Az X = hB, D, C, A, B, Ai s az Y = hA, B, C, B, D, A, Bi


sorozatok legnagyobb kzs rszsorozatnak meghatrozsa. Kt leghosszabb kzs rszsorozatot is
tallhatunk: S1 = hB, C, B, Ai s S2 = hB, D, A, Bi.

Sergyn Szabolcs

237

budai Egyetem
Neumann Jnos Informatikai Kar

7.2. Moh algoritmusok


A msodik optimalizlsi mdszer, amit megismernk, a moh megkzelts. A mdszer lnyege nagyon
egyszer: minden dntsnket moh mdon hozzuk meg. Ez azt jelenti, hogy brmikor dntsi helyzetbe
kerl az algoritmus, az ppen legjobbnak tn megoldst vlasztja. Ezeket a dntseket ksbb sem
vizsglja fell. Mivel nem vgznk minden esetre kiterjed elemzseket, ezrt a mdszer nem biztos,
hogy az optimlis megoldst tallja meg. Viszont a futsi id tekintetben gyors algoritmusok vrhatk.
A fejezet elejn egy konkrt problmn keresztl ismerjk meg a moh stratgit. Ez a plda a pnztri kifizets eljrsa (ld. 7.2.1. alfejezet). Ezt kveten a dinamikus programozsnl mr megismert 0-1
htizsk problmnak adjuk meg a moh megoldst (ld. 7.2.2. alfejezet). A dinamikus programozs s
a moh algoritmus sszehasonltsa rdekben a 7.2.3. alfejezetben megadjuk a fejezet elejn ismertetett
kincs gyjt feladat megoldst mindkt megkzelts hasznlatval. A 7.2.4. alfejezetben sszefoglaljuk
a moh algoritmusok legfontosabb jellemzit. A fejezet vgn a 7.2.5. alfejezetben temezsi feladatokat
s azok megoldsait ismertetjk, melyek esetn a moh stratgia optimlis megoldst eredmnyez.

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

7.2.2. 0-1 htizsk problma


A 7.1.1. fejezetben mr megismerkedtnk a 0-1 htizsk feladattal, s lttuk miknt lehetsges a megoldsa dinamikus programozs hasznlatval. Most ugyanezt a feladatot moh algoritmussal oldjuk meg.
A moh megkzeltshez elszr meg kell fogalmaznunk, hogy milyen szempontbl kvnunk mohk
lenni. Mivel clunk a htizskba kerl sszrtk maximalizlsa a slykorlt figyelembe vtele mellett,
ezrt tbb lehetsg is felmerlhet. Az els, hogy a trgyak rtkt vesszk csak figyelembe a kivlasztsnl. Ilyenkor kivlasztjuk a legnagyobb rtk trgyat s behelyezzk a zskba, ha lehetsges. Ezutn
kivlasztjuk a mg nem vizsglt trgyak kzl a legnagyobb rtkt s ezt is behelyezzk a zskba, amg
lehetsges. Ezt az eljrst kvetjk addig, amg meg nem telik a zsk, vagy el nem fogynak a trgyak.
Megvalsts szempontjbl szksges, hogy a trgyaink az rtkk szerint cskken sorrendben legyenek s mris knnyen megalkothat az algoritmus. Mieltt lernnk a konkrt algoritmust ejtsnk szt a
mohsg tovbbi lehetsgeirl. Dnthetnk gy is, hogy nem a trgyak rtkt tekintjk a legfontosabb
jellemznek, hanem a slyukat. Ekkor elszr a legkisebb sly trgyat vlasztjuk ki, majd az egyre
nagyobb slyakat. Igaz, hogy ilyenkor nem figyeljk a feladat szempontjbl fontos rtket, viszont a
lehet legtbb trgyat tudjuk a zskba tenni, melyek sszrtke is nagyobb lehet, mint pldul egy nagy
rtk, de nagyon nagy sly trgynak. Harmadik lehetsges megkzelts, ha az rtk s sly arnyt
vesszk figyelembe, teht elsknt a legnagyobb rtk-sly arny trgyat vlasztjuk ki. Ezen utols
megkzeltst fogjuk hasznlni, teht ha p a trgyak rtkeinek n elem tmbje, w pedig a megfelel
slyok tmbje, akkor teljesl az albbi relcisorozat:
p[2]
p[n]
p[1]

...
.
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

7.2. tblzat. A 7.8. feladat kincseinek konkrt rtkei s slyai.


Az els trgy befr a htizskba, ezrt be is helyezzk (S = {1}), a htizsk szabad kapacitst
pedig c = 40-re cskkentjk. A msodik kincs is befr mg a htizskba, ezrt S = {1, 2} lesz, a szabad
kapacits pedig 20-ra cskken. A harmadik trgy viszont mr nem fr be a htizskba, mivel a slya
meghaladja a htizsk szabad kapacitst.
Knny beltni, hogy a 7.6. algoritmus ebben az esetben nem szolgltatott optimlis megoldst. A
kivlasztott kincsek sszrtke 160. Ha viszont az els s harmadik trgyat vlasztjuk, melyek befrnek
a htizskba, az sszrtk akkor 180. A msodik s harmadik trgy is befr a zskba, az sszrtk ebben
az esetben mr 220.
Az algoritmus ott hibzott, hogy moh mdon az els trgyat rgtn betette a zskba, mg egy kicsit
elreltbb szemllettel mrskletet gyakorolva ezt nem kellett volna megtennie. De a moh algoritmusok
nem tekintenek elre, csak a pillanatnyilag legjobbnak tn esetet nzik.
A 7.7. brn lthat, hogy dinamikus programozst hasznlva a 7.1. algoritmus milyen F tblt
llt el, ha az x rtkek 10-esvel vltoznak. Az bra szemllteti a 7.2. algoritmus ltal szolgltatott
optimlis megoldst is. Lthat teht, hogy a dinamikus programozsi megkzelts ebben az esetben is
megtallta az optimlis megoldst.
Futsi id elemzse. Mivel a 7.6. algoritmusban egyetlen ciklus van, mely legfeljebb n-szer fut
le, ezrt az algoritmus futsi ideje O(n)-es. gy megllapthat, hogy a moh megkzelts gyorsabb
futsi idt eredmnyez, mint a dinamikus programozsi mdszer hasznlata, viszont nem minden esetben
eredmnyez optimlis megoldst.

Sergyn Szabolcs

242

budai Egyetem
Neumann Jnos Informatikai Kar

x
0

10

20

30

40

50

60

60

60

60

60

60 100 160 160 160

60 100 160 180 220

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

7.2.3. Moh algoritmus szemben a dinamikus programozssal


A kt trgyalt optimalizlsi mdszernket mr sszehasonltottuk a 0-1 htizsk problma kapcsn.
Vizsgljuk meg most, hogy a fejezet elejn emltett kincsbegyjtsi problmt melyik megkzelts miknt
oldja meg.
A megoldand feladat a kvetkez. Egy m sorbl s n oszlopbl ll mezn minden egsz koordintj
rcspontban kincs van elhelyezve. A kincsek rtkeit a C m n mret ktdimenzis tmbben troljuk.
A mez bal als sarkbl, azaz az (1, 1) index helyrl el akarunk jutni a jobb fels sarokba (az (m, n)
koordintj helyre) gy, hogy a bejrs kzben csak jobbra s felfel haladhatunk. Amely mezn
thaladunk, ott kissuk a kincset. Krds, hogy milyen tvonalon haladjunk annak rdekben, hogy a
legtbb kincset gyjtsk ssze.
Oldjuk meg elszr a feladatot a dinamikus programozs hasznlatval. Ehhez ltrehozunk egy F
m n mret ktdimenzis tmbt. Az F [i, j] rtke megmutatja, hogy ha az (i, j) koordintj helyig
jutunk a bejrs sorn, akkor mennyi kincset tudunk maximlisan sszegyjteni. Teht a teljes bejrs
sorn sszegyjttt kincsek mennyisgt az F [m, n] rtke adja meg. Krds, hogy miknt hatrozhatk
meg az F [i, j] rtkek.
Induljunk ki a legegyszerbb esetbl. Az (1, 1) koordintj helyre csak egyflekppen juthatunk
el, hiszen onnan indulunk. Ezrt F [1, 1] = C[1, 1]. Miknt rhetnk el a legals sor tovbbi elemeihez.
Ennek is csak egyetlen mdja van: az (1, j) koordintj helyre csak az (1, j 1) koordintj helyrl
lphetnk, ha 2 j n. Ezrt az sszegyjttt kincs mennyisgre ilyenkor igaz, hogy F [1, j] =
F [1, j 1] + C[i, j]. Hasonlan az els oszlop elemeirl kijelenthet, hogy F [i, 1] = F [i 1, 1] + C[i, j],
ha 2 i m. Mi a helyzet akkor, ha nem az els sorban s nem is az els oszlopban vagyunk? Ilyenkor
az (i, j) koordintj helyre rkezhetnk a bal oldali vagy az als szomszdjtl. A kt hely kzl onnan
rdemesebb rkezni, ahol nagyobb az addig sszegyjttt kincs mennyisge. Ez alapjn kijelenthet,
hogy F [i, j] = max {F [i 1, j], F [i, j 1]} + C[i, j], ha 2 i m s 2 j n. sszefoglalva a
megllaptsainkat:

C[i, j],
ha i = 1 s j = 1,

F [i, j 1] + C[i, j],


ha i = 1 s j 2,
(7.8)
F [i, j] =
F [i 1, j] + C[i, j],
ha i 2 s j = 1,

max {F [i 1, j], F [i, j 1]} + C[i, j], ha i 2 s j 2.


A 7.7. algoritmusban adjuk meg az gy definilt F ktdimenzis tmb ellltsnak algoritmust. Az
algoritmust rszletesebben nem rjuk le, mert semmi ms nem trtnik benne, mint hogy a 7.8. kplet
alapjn sorfolytonos bejrst kvetve ellltja az F tmb rtkeit.
A 7.1. brn bemutatott plda esetn az F tmb a 7.8b. brn lthat lesz.
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.

(c) Az optimlis bejrs.

7.8. bra. Kincsek begyjtse dinamikus programozssal.


Hogyan lehet az F tmb ismeretben megtallni a legtbb kincset eredmnyez bejrs tvonalt.
Ehhez az (m, n) koordintj pontbl visszalpkedve kell megnzni, hogy egy adott mez bal vagy als
szomszdja-e a nagyobb. A nagyobb rtk helyre kell visszalpni, majd tovbb folytatni az ilyen jelleg
visszalpkedst. A konkrt megvalstst a 7.8. algoritmusban rjuk le. Az algoritmus kimenete egy P
tmb lesz, melynek elemei a bejrs sorn rintett mezk koordintit tartalmazzk.
Vizsglt pldnk esetn az optimlis tvonal a P = {(1, 1) , (2, 1) , (2, 2) , (2, 3) , (3, 3) , (3, 4) , (4, 4)}
lesz, ahogy az a 7.8c. brn is lthat.
Megllapthatjuk, hogy a dinamikus programozs hasznlatval megkaptuk az optimlis megoldst.
Ehhez szksgnk volt egy tmeneti F ktdimenzis tmbre, teht a memria igny a C tmb mretnek
duplja volt. Futsi id tekintetben az alkalmazott algoritmusok O(m n)-esek.
Sergyn Szabolcs

244

budai Egyetem
Neumann Jnos Informatikai Kar

7.7. Algoritmus sszegyjttt kincsek sszege (dinamikus programozs)


Bemenet: C egsz tmb, m egsz (C sorainak szma), n egsz (C oszlopainak szma)
Kimenet: F egsz tmb
1: fggvny Kincssszeg(C : egsz tmb, m : egsz, n : egsz)
2:
F Ltrehoz(egsz)[m, n]
3:
F [1, 1] = C[1, 1]
4:
ciklus j 2-tl n-ig
5:
F [1, j] = F [1, j 1] + C[i, j]
6:
ciklus vge
7:
ciklus i 2-tl m-ig
8:
F [i, 1] = F [i 1, 1] + C[i, j]
9:
ciklus vge
10:
ciklus i 2-tl m-ig
11:
ciklus j 2-tl n-ig
12:
F [i, j] = max (F [i 1, j], F [i, j 1]) + C[i, j]
13:
ciklus vge
14:
ciklus vge
15:
vissza F
16: fggvny vge
Felhasznlt vltozk s fggvnyek
C: Kincsek rtkt tartalmaz ktdimenzis tmb.
m: A C tmb sorainak szma.
n: A C tmb oszlopainak szma.
F : A C tmbbel azonos mret ktdimenzis tmb. Az F [i, j] rtke megadja, hogy mennyi a
maximlisan sszegyjthet kincs mennyisge az (i, j) koordintj mezig jutva a bejrsban.
Ltrehoz(egsz)[m, n]: Utasts, mely ltrehoz egy m n mret ktdimenzis egsz tpus
tmbt.

Sergyn Szabolcs

245

budai Egyetem
Neumann Jnos Informatikai Kar

7.8. Algoritmus Bejrsi t kiolvassa (dinamikus programozs)


Bemenet: F egsz tmb, m egsz (F sorainak szma), n egsz (F oszlopainak szma)
Kimenet: P egsz tmb
1: fggvny BejrsitKiolvas(F : egsz tmb, m : egsz, n : egsz)
2:
P Ltrehoz(egsz)[m + n 1]
3:
im
4:
jn
5:
k m+n1
6:
ciklus amg (i 2) (j 2)
7:
P [k] (i, j)
8:
k k1
9:
ha F [i 1, j] > F [i, j 1] akkor
10:
ii1
11:
klnben
12:
j j1
13:
elgazs vge
14:
ciklus vge
15:
ciklus amg i 2
16:
P [k] (i, j)
17:
k k1
18:
ii1
19:
ciklus vge
20:
ciklus amg j 2
21:
P [k] (i, j)
22:
k k1
23:
j j1
24:
ciklus vge
25:
P [1] (1, 1)
26:
vissza P
27: fggvny vge
Felhasznlt vltozk s fggvnyek
F : A 7.7. algoritmus ltal meghatrozott ktdimenzis tmb.
m: Az F tmb sorainak szma.
n: Az F 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.

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

7.9. bra. Kincsek begyjtse moh algoritmussal.


A moh megkzelts teht nem eredmnyezett optimlis megoldst. Memria ignye viszont kisebb
a moh algoritmusnak, hiszen nem kellett egy segdtmbt eltrolnunk. Futsi id tekintetben is jobb
eredmnyt kapunk, mint a dinamikus programozsnl, hiszen a 7.9. algoritmus futsi ideje csak O(m+n)es.
rdemes szrevenni mg egy klnbsget a kt hasznlt mdszer kztt. A konkrt bejrsi tvonal
meghatrozsa klnbz irnyban trtnt ugyanis. A dinamikus programozsnl az t vgtl haladtunk vissza az eleje fel, mg a moh megkzelts az t elejtl haladt a vge fel. Ezt gy is ki szoks
fejezni, hogy a moh algoritmus fellrl lefel halad, mg a dinamikus programozs alulrl felfel haladva
hatrozza meg az optimlis megoldst.
Mit is jelent a fellrl lefel, illetve az alulrl felfel elnevezs? Ennek megrtsben segt a 7.10. bra,
melyen feltntettk az (1, 1) koordintj pontbl a (4, 4) koordintj pontba juts sszes lehetsgt.
Minden egyes cscsbl kiindul lefel halad lek mutatjk a lehetsges tovbbhaladsi irnyt. A moh
megkzelts hasznlatnl elindulunk a fels cscsbl s dntnk, hogy az alatta lv kt cscs kzl
melyik fel menjnk tovbb. A dntst kveten tovbblpnk, majd megint megvizsgljuk az adott
cscs alatti kt cscsot. Ezt gy tesszk addig, amg el nem jutunk a legals cscsba. A bejrs kzben
lesznek olyan cscsok, amiket teljesen kihagyunk.
A dinamikus programozs hasznlatnl minden egyes cscsba eljutunk, hiszen minden mez esetn
kiszmtjuk, hogy addig eljutva mennyi az sszegyjthet kincsek maximuma. Majd amikor mr minden
cscsnl ismerjk a kincssszegeket, akkor alulrl indulva visszafel, teht felfel haladva hatrozunk
meg egy konkrt optimlis bejrst. gy itt a tnyleges optimlis megolds megadsa alulrl felfel
haladva trtnik gy, hogy kzben minden egyes cscsnl pontosan tudjuk az addig sszegyjthet
kincsek sszrtkt.

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

7.2.4. Moh stratgia


Foglaljuk ssze, hogy milyen jellemzit talltuk meg eddig a moh stratginak. A moh algoritmusok
gy alkotjk meg egy problma optimlis megoldst, hogy vlasztsok sorozatt hajtjk vgre. Az algoritmus minden egyes dntsi helyzetben azt a lehetsget vlasztja, ami az adott helyzetben optimlisnak
tnik. Ez a mdszer nem mindig ad globlis, a teljes feladatra vonatkoz optimlis megoldst, de nhny
esetben igen.
A moh algoritmusok ltalban olyankor alkalmazhatk, amikor kt tulajdonsg teljesl. Ezek a
moh vlasztsi tulajdonsg, illetve az optimlis rszproblmk tulajdonsg.
A moh vlasztsi tulajdonsg azt jelenti, hogy a globlis optimlis megolds elrhet loklis optimumok vlasztsval. A moh stratgia alkalmazsnl minden dntsi helyzetben a loklis optimumot
vlasztjuk, ezrt ez a tulajdonsg szksges felttel a moh stratgival val megoldhatsghoz. A moh
vlasztsi tulajdonsg kpezi a lnyeges klnbsget a moh algoritmusok s a dinamikus programozs
kztt. Ez az, amit az elz alfejezetben fentrl lefel, illetve alulrl felfel mdszerknt emltettnk. A
moh stratgia loklis optimumokon keresztl fentrl lefel haladva oldja meg a problmt. A dinamikus
programozs a rszproblmk optimumainak ismeretben alulrl felfel haladva ad optimlis megoldst
a problmra.
A moh stratgia alkalmazhatsgnak msik felttele az optimlis rszproblmk tulajdonsg teljeslse. Ahogy a dinamikus programozsnl mr lttuk, ez a tulajdonsg azt jelenti, hogy az optimlis
megolds felpthet a rszproblmk optimlis megoldsbl. A moh stratgia csak abban az esetben
ad optimlis megoldst, ha teljesl az optimlis rszproblmk tulajdonsg. Minden ms esetben csak
n. loklis optimumot hatroz meg.

Sergyn Szabolcs

250

budai Egyetem
Neumann Jnos Informatikai Kar

7.2.5. temezsi feladatok


A moh stratgira kvnunk mg nhny pldt mutatni. temezsi feladatokat ismertetnk s oldunk
meg, melyek mind optimlis megoldst eredmnyeznek a moh megkzelts alkalmazsa mellett.
Esemny kivlasztsi problma
Az esemny kivlasztsi problma esetn erforrs temezst kvnunk megvalstani egymssal verseng feladatok kztt. Egyetlen erforrs ll rendelkezsnkre s azt szeretnnk minl tbb esemnyhez
hozzrendelni.
A pontos feladat a kvetkezkppen fogalmazhat meg. Adott n darab esemnynk, melyeknek ismerjk a kezdsi s befejezsi idpontjait. A kezdsi idpontok az s tmbben, a befejezsi idpontok
pedig az f tmbben vannak eltrolva. Ezek az idpontok fixek, nem mdosthatk a feladat megoldsa
sorn. rtelemszeren tudjuk azt is, hogy egy feladat kezdsi idpontja soha nem haladja meg ugyanazon
feladat befejezsi idpontjt, azaz s[i] f [i] minden 1 i  n esetn. Ha egy esemnyt kivlasztunk,
azaz hozzrendeljk az adott erforrshoz, akkor az s[i], f [i] intervallumot foglalja el. Teht a kezdsi
idpont benne van az idintervallumban, a befejezsi
nincs benne. Az i-edik s j-edik
 idpont viszont

esemnyt kompatibilisnek nevezzk, ha az s[i], f [i] s s[j], f [j] intervallumok nem fedik egymst, azaz
s[i] f [j] vagy s[j] f [i]. A feladatunk az, hogy kivlasszuk pronknt kompatibilis esemnyeknek egy
legnagyobb elemszm halmazt. Ezt gy is mondhatjuk, hogy az adott erforrshoz minl tbb pronknt kompatibilis esemnyt szeretnnk hozzrendelni. Fontos megemlteni, hogy nem az a clunk, hogy
az erforrs a legtbb ideig szolgljon ki esemnyeket, hanem ez, hogy minl tbb esemnyt kiszolgljon.
Mivel moh megkzeltst kvnunk kvetni, elszr el kell dntennk, hogy miben is kvnunk mohk
lenni. A stratgink az lesz, hogy az esemnyek befejezsi idpontjban lesznk mohk. Mgpedig azrt
ebben, mert gy gondoljuk, hogy ha elszr a legkorbban befejezd esemnyt vlasztjuk ki, akkor mg
a lehet legtbb esemny marad meg, amik kzl tovbbi vlasztst eszkzlhetnk. Ennek rdekben
elszr gy rendezzk az esemnyeket, hogy a befejezsi idpontjuk szerint nvekv rendezettsgben
legyenek. Ezutn kivlasztjuk a legkorbban vget r esemnyt, s hozzrendeljk az erforrshoz.
Majd kivlasztjuk a soron kvetkez azon esemnyt, amely az eddig kivlasztottal kompatibilis, teht a
kezdsi idpontja nem kisebb a kivlasztott esemny befejezsi idpontjval. Ezt a metdust kvetjk
mindaddig, amg az esemnyek sorozatnak vgre nem rnk.
Az esemny kivlasztst a 7.10. algoritmus valstja meg. Az algoritmus bemenete az s tmb, melyben
az esemnyek kezdsi idpontjai vannak. Az f nvekv mdon rendezett tmbben adjuk meg a megfelel
esemnyek befejezsi idpontjait. Az s s f tmb is n elemet tartalmaz. Az algoritmus kimenete a
kivlasztott esemnyek indexeit tartalmaz A tmb.
Az algoritmus elejn kivlasztjuk az els esemnyt, ezrt az A halmazba bekerl az 1-es index
(ld. 2. sor). Az aktulisan utoljra kivlasztott elem indext az utols vltozban troljuk el. Ez
azrt szksges, mert a kvetkez kivlasztott esemny az lesz, amely ezen esemny befejezsnl nem
kezddik korbban. Az utols vltoz kezdeti rtke 1 lesz (ld. 3. sor). Meg kell vizsglnunk a tovbbi
esemnyeket, hogy azok kompatibilisek-e az utoljra kivlasztott esemnnyel. Ennek rdekben szksges egy bejrst megvalst ciklus. Mivel az sszes fennmarad esemnyt meg kell vizsglni, ezrt
szmlls ciklust hasznlunk (ld. 4. sor). A cikluson bell megvizsgljuk, hogy az i-edik esemny kezdsi
idpontja hogyan viszonyul az utoljra kivlasztott esemny befejezsi idpontjhoz (ld. 5. sor). Ha nem
kezddik korbban, akkor kompatibilis az utoljra kivlasztott esemnnyel s minden ms kivlasztott
esemnnyel is , ezrt betesszk az A halmazba (ld. 6. sor) s az utols vltoz rtkt is mdostjuk
(ld. 7. sor). Amikor elfogyott minden esemny, teht a ciklus futsa vget r, akkor mr csak vissza kell
adni a kivlasztott esemnyek indexeinek A halmazt (ld. 10. sor).
7.9. Plda. A 7.11a. brn megadtunk 11 esemnyt, melyek a befejezsi idpontjaik szerint rendezettek.
Feladatunk, hogy kivlasszuk kzlk a lehett legtbb olyat, melyek pronknt kompatibilisek.
A 7.10. algoritmus hasznlatval a 7.11b. brn lthatjuk, hogy mely esemnyek kerltek kivlasztsra. Esetnkben teht 4 esemnyhez tudjuk ugyanazt az erforrst hozzrendelni. Vegyk szre, hogy
nem csak ez a megolds ltezik. Szmos olyan ms megoldst is tudunk adni, melyek 4 klcsnsen kompatibilis esemnyt tartalmaznak. Ilyen pldul a msodik, negyedik, nyolcadik s tizenegyedik esemnyek
kivlasztsa is.
Futsi id elemzse. Az esemny kivlasztsi problmt megold 7.10. algoritmus futsi ideje O(n)-es,
mivel egyetlen szmlls ciklus tallhat benne.
Sergyn Szabolcs

251

budai Egyetem
Neumann Jnos Informatikai Kar

1
2
3
4
5
6
7
8
9
10
11
0

10

11

12

13

14

(a) Befejezsi idpont szerint rendezett esemnyek.

1
2
3
4
5
6
7
8
9
10
11
0

10

11

12

13

14

(b) Kivlasztott esemnyek.

7.11. bra. Esemny kivlaszts.

Sergyn Szabolcs

252

budai Egyetem
Neumann Jnos Informatikai Kar

7.10. Algoritmus Esemny kivlaszts


Bemenet: s id tmb, f id rendezett tmb, n egsz (tmbk mrete)
Kimenet: A egsz halmaz
1: fggvny EsemnyKivlaszts(s : id tmb, f : id tmb, negsz)
2:
A {1}
3:
utols 1
4:
ciklus i 2-tl n-ig
5:
ha s[i] f [utols] akkor
6:
A A {i}
7:
utols i
8:
elgazs vge
9:
ciklus vge
10:
vissza A
11: fggvny vge
Felhasznlt vltozk s fggvnyek
s: Az esemnyek kezdeti idpontjait tartalmaz tmb.
f : Az esemnyek befejezsi idpontjait tartalmaz tmb. Az f tmb nvekv mdon rendezett,
emiatt alkalmazhat a moh stratgia.
n: Az s s f tmb elemszma.
A: A kivlasztott esemnyek indexeit tartalmaz halmaz.
utols: Az aktulisan utolsknt kivlasztott esemny indexe.

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

jk a msodik erforrshoz A soron kvetkez esemnynl is megvizsgljuk, hogy az els erforrshoz


hozzrendelhet-e. Ha igen, akkor gy tesznk, ha viszont nem, akkor tovbblpnk a msodik erforrsra. Ha ahhoz hozzrendelhet, akkor ezt tesszk, ha ahhoz sem, akkor a harmadik erforrst is
hasznlatba vesszk. Ezen logika mentn jrunk el vgig, teht minden erforrst sorban megvizsglunk,
hogy az adott elemet hozz tudjuk-e rendelni. Ha egyikhez sem, akkor j erforrst vonunk be a feladat
megoldsba.
A konkrt megvalstst a 7.11. algoritmusban mutatjuk be. Az algoritmus bemenete az esemnyek
kezdeti idpontjait tartalmaz s tmb, valamint a befejezsi idpontok f tmbje. Mindkt tmb n
elemet tartalmaz. Mivel az esemnyek a kezdsi idk alapjn rendezettek, ezrt s rendezett tmb.
Kimenetknt egy n elem A tmbt lltunk el, melynek minden egyes eleme meghatrozza, hogy a
megfelel esemnyhez melyik erforrst rendeltk hozz.
7.11. Algoritmus Esemny elklnts
Bemenet: s id rendezett tmb, f id tmb, n egsz (tmbk mrete)
Kimenet: A egsz tmb
1: fggvny EsemnyElklnts(s : id rendezett tmb, f : id tmb, n : egsz)
2:
A Ltrehoz(egsz)[n]
3:
utols 0
4:
ciklus i 1-tl n-ig
5:
j1
6:
ciklus amg (j utols) KompatiblisEsemnyErforrssal(A, s, f, i, j)
7:
j j+1
8:
ciklus vge
9:
ha j utols akkor
10:
A[i] j
11:
klnben
12:
utols utols + 1
13:
A[i] utols
14:
elgazs vge
15:
ciklus vge
16:
vissza A
17: fggvny vge
Felhasznlt vltozk s fggvnyek
s: Az esemnyek kezdsi idpontjainak nvekv mdon rendezett tmbje.
f : Az esemnyek befejezsi idpontjainak tmbje.
n: Az s s f tmbk elemeinek szma.
A: n elem tmb, melynek i-edik eleme megadja, hogy az i-edik esemnyt hnyadik erforrshoz
rendelktk hozz.
utols: A hasznlatba vett erforrsok legnagyobb indexe.
Ltrehoz(egsz)[n]: Utasts, mely ltrehoz egy n elem egsz tpus tmbt.
KompatiblisEsemnyErforrssal(A, s, f, i, j): A fggvny megadja, hogy az i-edik esemny
kompatibilis-e a j-edik erforrshoz mr hozzrendelt esemnyekkel. Ennek meghatrozshoz
szksges a kezdsi (s) s befejezsi (f ) idpontok, valamint az erforrs hozzrendelsek A tmbjnek ismerete.
Az utols vltozban troljuk el, hogy hny darab erforrst vontunk mr hasznlatba. Kezdetben
ez a szm 0 lesz (ld. 3. sor). A 4. sorban kezdd szmlls ciklus vgighalad az sszes esemnyen. A
cikluson bell megvizsgljuk, hogy melyik erforrst lehet az i-edik esemnyhez rendelni. Kiindulsknt az els erforrssal prblkozunk majd, ezrt a j vltozt az 1 rtkkel inicializljuk (ld. 5. sor).
A 6. sorban kezdd ciklusban megvizsgljuk, hogy a mr hasznlatba vett erforrsok kzl valamelyikhez hozzrendelhet-e az i-edik esemny. Ha lehetsges a hozzrendels (ld. 9. sor), akkor ezt meg is
tesszk (ld. 10. sor). Egyb esetben pedig j erforrst vesznk hasznlatba (ld. 12. sor), majd ezt sszekapcsoljuk az i-edik esemnnyel (ld. 13. sor). Az algoritmus vgn az A tmbt adjuk vissza kimenetknt
(ld. 16. sor).

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

(a) Az esemnyek egy lehetsges elklntse.

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

(b) Az esemnyek egy optimlis elklntse.

7.12. bra. Esemny elklntsi problma.


7.10. Plda. Adott 10 esemnynk, melyeket a lehet legkevesebb erforrshoz kvnjuk hozzrendelni.
A 7.12a. brn megadjuk egy lehetsges elklntst az esemnyeknek. Minden egyes sor egy erforrst
jell. Lthat, hogy ebben az esetben 4 erforrs szksges.
A 7.11. algoritmus hasznlatval egy msik lehetsges elklnts addik, ami a 7.12b. brn lthat.
Ebben az esetben csak 3 erforrs szksges a feladat megvalstshoz.
Futsi id elemzse. A 7.11. algoritmus futsi ideje nagymrtkben fgg attl, hogy hny erforrs
hasznlata szksges. Ez azrt van gy, mert a bels ciklus maximlis vgrehajtsi szma a hasznlatba
vett erforrsok szmval egyezik meg. Legrosszabb eset az, ha az esemnyprok nem kompatibilisek.
Ilyenkor ugyanis n darab erforrs szksges, gy a kt egymsba gyazott ciklus miatt az algoritmus
futsi ideje O(n2 )-es.
temezs kss minimalizlssal
A kss minimalizlssal trtn temezsnl azt kell meghatroznunk, hogy rgztett idtartam, hatridvel rendelkez feladatokat hogyan tudunk gy temezni, hogy a lehet legkevesebb kss lljon el.
Adott teht n darab feladat, melyek egyetlen s ugyanazon erforrst ignyelik. Minden feladatnak ismerjk a teljestshez szksges idtartamot. Ezeket az idtartamokat a t tmbben troljuk el. Minden
feladatnak van hatrideje is, melyek rtke a d tmbben van eltrolva. Egy feladat ksst kell tudnunk
rtelmezni. Ha a feladatot a hatrideje eltt tudjuk teljesteni, akkor a kss mrtke 0. Viszont, ha
csak a hatrid utn tudjuk befejezni, akkor a befejezsi idpont s a hatrid klnbsge lesz a kss.
Ha f [i] jelli az i-edik feladat befejezsi idpontjt (ez elre nem ismert) s l[i] az i-edik feladat ksst,
akkor
l[i] = max {0, f [i] d[i]} .
(7.9)
Clunk, hogy az sszes feladat kssnek maximumt minimalizljuk. Ez azt jelenti, hogy jobb neknk
sok kicsi kss, mint egy nagy.
A megalkotand algoritmusnl arra fogunk koncentrlni, hogy a feladatokat a hatridejk szerint
rendezetten temezzk. Azrt gy jrunk el, mert ha a legkorbbi hatridvel rendelkez feladatot tudjuk
elsknt vgrehajtani, akkor a ksse biztos a lehet legkisebb lesz. Feltesszk teht, hogy az esemnyek
a hatridejk szerint rendezettek. Ezt kveten nincs ms dolgunk, mint a feladatokat egyms utn
helyezni gy, hogy pronknt kompatibilisek legyenek, hiszen csak egy erforrs ll rendelkezsnkre.
A problmt a 7.12. algoritmussal oldjuk meg. Az algoritmus bemenete a hatridk d rendezett
tmbje s az idtartamok t tmbje. Mindkt tmb n elem. Kimenetknt a kezdsi s befejezsi idk s
s f tmbjeit lltja el az algoritmus.
Az algoritmus elejn ltrehozzuk a kimeneti s s f tmbket (ld. 2. s 3. sorok). Az utols vltoz
jelzi, hogy a soron kvetkez feladat mikor kezddhet el legkorbban. Kezdeti rtke a 0 idpillanat
(ld. 4. sor). Ezutn a hatrid szerint feladatokat kell idzteni, amit az 5. sorban kezdd ciklussal
valstunk meg. Az aktulis feladat kezdsi ideje az utols vltozban trolt rtk lehet (ld. 6. sor).
Sergyn Szabolcs

255

budai Egyetem
Neumann Jnos Informatikai Kar

7.12. Algoritmus temezs kss minimalizlssal


Bemenet: d id rendezett tmb, t id tmb, n egsz (tmbk mrete)
Kimenet: s id tmb, f id tmb
1: fggvny KssMinimalizls(d : id rendezett tmb, t : id tmb, n : egsz)
2:
s Ltrehoz(id)[n]
3:
f Ltrehoz(id)[n]
4:
utols 0
5:
ciklus i 1-tl n-ig
6:
s[i] utols
7:
f [i] s[i] + t[i]
8:
utols f [i]
9:
ciklus vge
10:
vissza (s, f )
11: fggvny vge
Felhasznlt vltozk s fggvnyek
d: Hatridk nvekv mdon rendezett tmbje.
t: Idtartamok tmbje. A d[i] hatridej feladat idtartama a t[i].
n: A d s t tmb elemszma.
s: A kezdsi idpontok kimeneti tmbje.
f : A befejezsi idpontok kimeneti tmbje.
utols: Az aktulisan utolsknt idztett feladat befejezsi idpontja.
Ltrehoz(id)[n]: Utasts, mely ltrehoz egy n elem id tpus tmbt.
Ennek a feladatnak a befejezsi ideje a kezdsi idejnek s az idtartamnak az sszege (ld. 7. sor). A
kvetkez feladat majd az aktulis feladat befejezsi idejekor kezddhet el, ezrt aktualizljuk az utols
vltoz rtkt is (ld. 8. sor). Miutn minden feladatot temeztnk a kezdsi s befejezsi idpontok
tmbjeit adja vissza az algoritmus (ld. 10. sor).
7.11. Plda. Adott 6 feladat, melyek idtartamait s hatridejeit a 7.3. tblzatban adjuk meg. gy
kell temeznnk a feladatokat, hogy az egyes feladatok kssnek maximuma minimlis legyen.

ti
di

1
3
6

2
2
8

3
1
9

4
4
9

5
3
14

6
2
15

7.3. tblzat. Feladatok idtartama s hatridejeik.


A 7.13a. brn egy temezs, mely esetn a maximlis kss 6 idegysg.
A 7.12. algoritmus alkalmazsval a 7.13b. brn lthat temezst kapjuk eredmnyl, melynl a
legnagyobb kss csak 1 idegysg.

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

(a) Egy lehetsges temezs.


max kss = 1
d1 = 9
0

d2 = 8
3

d3 = 9
5

d4 = 9
7

d5 = 14
9

10

11

12

d6 = 15
13

14

15

(b) Optimlis temezs.

7.13. bra. temezs kss minimalizlssal.

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

8.2. bra. Teljes binris fa. A fa minden szintje teljesen kitlttt.


2 Angolul:

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

8.5. bra. Majdnem teljes balrl kitlttt binris fa s tmb megfeleltetse.


Vizsgljuk meg, hogy egy majdnem teljes balrl kitlttt binris fban mi az i-edik elem baloldali,
illetve jobboldali gyermeknek indexe. A 8.5. bra alapjn azt ltjuk, hogy az i-edik elem baloldali
Sergyn Szabolcs

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

8.6. bra. Kupac binris fa s tmb reprezentcija.

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

8.1. Algoritmus Kupactulajdonsg fenntartsa


Bemenet: x T
tmb, n egsz
(tmb mrete), k egsz
egsz; ahol T sszehasonlthat
Kimenet: x T tmb
1: eljrs Kupacol(cmszerint x : T tmb, n : egsz, k : egsz, i : egsz)
2:
bal 2 i
3:
jobb 2 i + 1
4:
ha bal k x[bal] > x[i] akkor
5:
max bal
6:
klnben
7:
max i
8:
elgazs vge
9:
ha jobb k x[jobb] > x[max] akkor
10:
max jobb
11:
elgazs vge
12:
ha max 6= i akkor
13:
x[i] x[max]
14:
Kupacol(x, n, k, max)
15:
elgazs vge
16: eljrs vge

(kupac mrete), i

Felhasznlt vltozk s fggvnyek


x: A feldolgozand tmb, amelybl kupacot akarunk kszteni.
n: Az x tmb elemszma.
k: Az x tmb els k darab elemt vesszk figyelembe a kupac kialakts sorn.
i: Az aktulis index, amely alatti elemekre az algoritmus biztostja a kupactulajdonsg teljeslst,
ha az i-edik elem alatti kt rszkupac mr eleve kupactulajdonsg.
bal: Az i-edik elem bal oldali gyereknek indexe.
jobb: Az i-edik elem jobb oldali gyereknek indexe.
max: Az i, a bal s jobb index elemek kzl a legnagyobb elem indexe.

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

(a) A 2-es index elemre vonatkozan kell kupacolni.


1

16
4

14

16

17

18

19

20

10

11

10

12

13

14

15

(b) A 2-es index elemre vonatkozan kell kupacolni.


1

16
4

14

10

16

17

18

19

20

10

11

12

13

14

15

(c) Az 5-s index elemre vonatkozan kell kupacolni.


1

16
4

14

10

16

17

18

19

20

10

11

12

13

14

15

(d) A 10-es index elemre vonatkozan kell kupacolni.

8.8. bra. Kupacols.

Sergyn Szabolcs

266

budai Egyetem
Neumann Jnos Informatikai Kar

8.3. Kupac ptse


A kupacrendezs megvalstsa fel vezet ton kvetkez lpsnk annak meghatrozsa, hogy egy
tetszleges tmbt miknt lehet kupacc talaktani. Ennek rdekben azt fogjuk megvizsglni, hogy a
tmb mely elemeibl mint gykrbl kiindul rszfkra teljesl mr eleve a kupactulajdonsg, illetve a
tbbi elemre milyen mdszerrel biztosthat az elvr tulajdonsg teljeslse.
Tudjuk, hogy minden tmbnek van egyrtelm majdnem teljes balrl kitlttt binris fa reprezentcija. Knnyen lthat, hogy egy binris fa levl elemeibl mint gykrbl kiindul rszfkra eleve
teljesl a kupactulajdonsg, hiszen a nemltez gyermek elemeknl nem kisebb a bennk trolt elemek
rtke. Azt is tudjuk, hogy egy majdnem teljes balrl kitlttt binris fa minden bn/2c + 1 s n kztti
index eleme levl. gy az x tmb bn/2c + 1-edik s n-edik eleme kztti elemekre mr kezdetben is
teljesl a kupactulajdonsg.
Hogyan lehetne a tbbi, nemlevl elem esetn elrni, hogy teljesljn a bellk mint gykrbl indul
rszfra a kupactulajdonsg. Amennyiben az alattuk lv elemek mr eleve kupacok, akkor ezt kupacolssal (ld. 8.1. algoritmus) el tudjuk rni. Ennek rdekben a nemlevl elemeket a tmb vge fell elre
haladva fogjuk bejrni. Akkor ugyanis elszr a tmb bn/2c-edik elemvel foglalkozunk. Ennek minden
gyermeke levl, teht kupactulajdonsg. Kupacols utn mr az bn/2c-edik elembl mint gykrbl indul rszfra is teljesl a kupac tulajdonsg. Ahogy lpnk elre mindig olyan elemhez jutunk, melynek
gyermekei mr kupacok, hiszen nagyobb indexek. gy viszont az egsz tmb is kupacc tehet.
A konkrt megvalstst a 8.2. algoritmusban mutatjuk be. Az algoritmus bemenete egy n elem x
tmb, kimenete pedig a kupacc alaktott tmb.
Az algoritmus 2. sorban kezdd ciklussal vgigjrunk a nemlevl elemeken. A ciklusban csak
annyit kell tennnk, hogy az aktulis elemre meghvjuk a Kupacol eljrst gy, hogy a kupacmretet
s a tmbmretet azonosnak tekintjk (ld. 3. sor).
8.2. Algoritmus Kupac ptse
Bemenet: x T tmb, n egsz (tmb mrete); ahol T sszehasonlthat
Kimenet: x T kupac
1: eljrs Kupacotpt(cmszerint x : T tmb, n : egsz)
2:
ciklus i bn/2c-tl 1-ig
3:
Kupacol(x, n, n, i)
4:
ciklus vge
5: eljrs vge
Felhasznlt vltozk s fggvnyek
x: A feldolgozand tmb, amelybl kupacot ptnk.
n: Az x tmb elemeinek szma.
8.2. Plda. Alkalmazzuk a kupacpts 8.2. algoritmust a ??. brn adott tmbre. Kezdetben az
utols t elemre mr teljesl a kupactulajdonsg (ld. 8.9a. bra). Elindul az algoritmus 2. sorban
kezdd ciklus, i kezdeti rtke ngy lesz. A kupacols hatsra a negyedik s nyolcadik elem cserjt
kveten mr teljesl a negyedik elemre a kupactulajdonsg (ld. 8.9b. bra). A ciklusban tovbblpnk a
harmadik elemre (ld. 8.9c. bra). Erre az elemre mr eleve teljesl a vizsglt tulajdonsg, gy lphetnk a
msodik elemre. A kettes index elem esetn kt cservel rhet el, hogy a a kupactulajdonsg fennlljon
(ld. 8.9d. bra). A ciklusban vgl az els elemre is meghvjuk a Kupacol eljrst, aminek eredmnyeknt
egy csert kveten az egsz tmb kupacc vlik (ld. 8.9e. bra).
Futsi id elemzse. A Kupacotpt eljrsban a ciklus pontosan bn/2c-szer fut le. A cikluson
bell a Kupacol eljrst hvjuk meg, melynek futsi ideje O (log n)-es, gy a kupacpts futsi ideje:
T (n) = O (n log n)-es.

Sergyn Szabolcs

267

budai Egyetem
Neumann Jnos Informatikai Kar

x:

(a) A kezdeti tmb s annak majdnem teljes balrl kitlttt


binris fa reprezentcija.
1

x:

(b) A negyedik elemre kupacolunk. Egy csert kveten


teljesl a kupactulajdonsg.
1

8
2

x:

7
6

(c) A harmadik elemre kupacolunk. Most nincs szksg


cserre.

8.9. bra. Kupacpts.

Sergyn Szabolcs

268

budai Egyetem
Neumann Jnos Informatikai Kar

x:

(d) A msodik elemre kupacolunk. Most kt csert kell elvgeznnk.


1

9
2

x:

2
6

(e) Az els elemre kupacolunk. Egy csert kveten az egsz


tmb kupacc vlik.

8.9. bra. Kupacpts (folyt.).

Sergyn Szabolcs

269

budai Egyetem
Neumann Jnos Informatikai Kar

8.4. Kupac rendezse


Elrkeztnk oda, hogy vgre kpesek vagyunk kupacok segtsgvel rendezni egy tmbt. Tudjuk, hogy
egy kupacban az els elem mindig a legnagyobb, hiszen csak gy teljeslhet r a kupactulajdonsg.
Egy nvekven rendezett tmbben viszont a tmb vgre szeretnnk vinni a legnagyobb elemet. Ennek
rdekben cserljk meg a tmb els s utols (n-edik) elemt. gy a legnagyobb elem biztos a helyre
kerl s tbb mr nem is kell vele foglalkozni.
Emiatt a tovbbiakban tekintsk a tmbnek csak az els n 1 darab elemt. Ez majdnem kupacnak
tekinthet, csak az els elembl mint gykrbl indul rszfra nem teljesl biztosan a kupactulajdonsg,
hiszen a korbbi cservel ezt elronthattuk. Hvjuk meg ezrt az els elemre a Kupacol eljrst. Figyeljnk arra, hogy a tmb mrete ekkor n, de a kupacknt vizsglt rsze mr csak n 1 elem. (Emiatt van
arra szksg, hogy a Kupacol eljrsban kln adjuk meg a tmb s a kupac mrett.) Az n 1 elem
kupac legnagyobb eleme biztos az els helyre kerl. Cserljk meg az els s az (n 1)-edik elemet,
majd a tovbbiakban csak az els n 2 darab elemmel foglalkozzunk.
Iteratvan vigyk mindig az aktulisan vizsglt kupac els elemt htra, majd cskkentsk a kupac
mrett eggyel s kupacoljunk ismt az els elemre. Tegyk ezt mindaddig, amg a msodik elem is a
helyre nem kerl. Ekkor mr biztos, hogy az els elem is a helyn lesz, gy a tmbnk rendezett vlik.
A 8.3. algoritmusban rjuk le a rendezst megvalst eljrst. Bemenetknt az x tmbt s annak n
elemszmt adjuk meg, kimenetknt pedig a rendezett tmbt kapjuk vissza.
Az algoritmus 2. sorban a 8.2. algoritmusban ismertetett kupacptst hvjuk meg. Miutn mr van
kupacunk egy ciklussal bejrjuk a kupacot az n-edik elemtl a msodik elemig (ld. 3. sor). A cikluson
bell megcserljk az els s az i-edik elemet (ld. 4. sor), majd kupacolunk az els elemre gy, hogy
kupacnak csak a tmb els i 1 darab elemt tekintjk (ld. 5. sor). A ciklusbl kilpve rendezett tmbt
kapunk vissza.
8.3. Algoritmus Kupacrendezs
Bemenet: x T tmb, n egsz (tmb mrete); ahol T sszehasonlthat
Kimenet: x T rendezett tmb
1: eljrs Kupacrendezes(cmszerint x : T tmb, n : egsz)
2:
Kupacotpt(x, n)
3:
ciklus i n-tl 2-ig
4:
x[1] x[i]
5:
Kupacol(x, n, i 1, 1)
6:
ciklus vge
7: eljrs vge
Felhasznlt vltozk s fggvnyek
x: A feldolgozand tmb, amelyet rendeznk.
n: Az x tmb elemeinek szma.
8.3. Plda. A 8.10. brn vgig kvethetjk, hogy miknt rendezi a kupacrendezs 8.3. algoritmusa
az adott x tmbt. Az eredeti tmbt a 8.10a. brn adtuk meg. Elszr felptjk a kupacot, aminek
eredmnyt a 8.10b. brn lthatjuk. Ezt kveten megcserljk az els s a kilencedik elemet, majd
az els nyolc elembl kpzett rsztmbt az els elemre trtn kupacolssal visszaalaktjuk kupacc
(ld. 8.10c. bra). Az j kupac els elemt a nyolcadik helyre mozgatjuk, majd ismt kupacolunk az
els elemre, mikzben mr csak az els ht elemet vesszk figyelembe (ld. 8.10d. bra). Hasonl logikt
kvetve jrunk el, ahogy a 8.10e-8.10j. brkon lthat. Az eljrs vgn a tmbnk rendezett vlik.

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:

(a) A kezdeti tmb s annak majdnem teljes balrl kitlttt


binris fa reprezentcija.
1

9
2

x:

(b) Az eredeti tmbbl felptett kupac.


1

8
2

x:

9
6

(c) A legnagyobb elem a helyre kerlt. Az els nyolc elemet


az els elembl indulva kupacoljuk.

8.10. bra. Kupacrendezs.

Sergyn Szabolcs

271

budai Egyetem
Neumann Jnos Informatikai Kar

x:

(d) A nyolcadik elem a helyre kerlt. Az els ht elemet


kupacoljuk az els elembl indulva.
1

x:

(e) A hetedik elem a helyre kerlt. Az els hat elemet


kupacoljuk az els elembl indulva.
1

5
2

x:

9
3

(f) A hatodik elem a helyre kerlt. Az els t elemet kupacoljuk az els elembl indulva.

8.10. bra. Kupacrendezs (folyt.).

Sergyn Szabolcs

272

budai Egyetem
Neumann Jnos Informatikai Kar

x:

(g) Az tdik elem a helyre kerlt. Az els ngy elemet


kupacoljuk az els elembl indulva.
1

x:

(h) A negyedik elem a helyre kerlt. Az els hrom elemet


kupacoljuk az els elembl indulva.
1

2
2

x:

9
3

(i) A harmadik elem a helyre kerlt. Az els kt elemet


kupacoljuk az els elembl indulva.

8.10. bra. Kupacrendezs (folyt.).

Sergyn Szabolcs

273

budai Egyetem
Neumann Jnos Informatikai Kar

x:

9
3

(j) A msodik elem a helyre kerlt. gy az els elem is


biztos a helyn van, teht a tmb rendezett lett.

8.10. bra. Kupacrendezs (folyt.).

Sergyn Szabolcs

274

budai Egyetem
Neumann Jnos Informatikai Kar

Magyar-angol sztr
0-1 htizsk feladat

0-1 knapsack problem

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

Leghosszabb kzs rszsorozat

Longest common subsequence

Lineris keress

Linear search

Logaritmikus keress

Logarithmic search

Loklis vltoz

Local variable

Msols

Copy

Metszet

Intersection

Moh algoritmus

Greedy algorithm

Nyers er

Brute force

Oszd meg s uralkodj

Divide and conquer

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

0-1 htizsk feladat

Algorithm

Algoritmus

Binary search

Binris keress

Binary tree

Binris fa

Brute force

Nyers er

Bubble sort

Buborkrendezs

Copy

Msols

Decision

Eldnts

Divide and conquer

Oszd meg s uralkodj

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

Longest common subsequence

Leghosszabb kzs rszsorozat

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

You might also like