You are on page 1of 35

SzCávi Péter

Zsak{J Lász{ó

Afóászeres programozás:
Programozási tétek�
Módszeres programozás: Programozási tételek

, A kötet beve2'.ető fejei;etében -a µJógia 18 kötetében már taglalt- programozási alap­


fogalmakat foglaljuk össze, és későbbi céljainknak megfelelően formafüáljuk.

Az I. fejei;etben kaptak helyet a legelemibb tételfajták, nevezetesen azok, amelyek


egy sorozathoz rendelnek egy értéket: a sorozatszámitás, az eldöntés, a kiválasztás, a ke­
Szlávi Péter - Z5akó Lá5zl6
resés lineáris változata, a megszámolás s végül a maximumkiválasztás.

Ezt követően rátérünk azokra a "bonyolultabbak" tételekre, amelyeket az jellemez,


hogy mind a bemeneten, mind a kimeneten legalább egy sorozat si;erepel. Kiindulunk a
másolás legáltalánosabb tételéből, amelyre az Adatfeldolgozás című mikrológia kötet is
épül. A fejei;et további öt tétele: kiválogatás, szétválogatás, metszet, unió és egyesités.

M6d5zere5 programozá5:
A harmadik és a negyedik fejei;et egy-egy gyakori, "önálló" témát dolgoz föl; úgy­
mint rendezés és keresés. A rendezés témakör csonka lenne, ha összehasonlító haté­
konysági jellemzőket nem mellékelnénk. Itt megadjuk az egyes nevezetes (10) algorit­
Programozá6i tételek
mus m.inimáli�� maximális lépésszámát (hasonlitások, illetve mozgatások száma), va-
,_:;,

!amint az adatok helyfoglalását Egyes rendezések algoritmusát más mikrológia köte-


tekben lehet m�gtalálni. (µlógia 4 - Quicksort, µlógia 27 - rendezés bináris fával.)

Az utolsó fejezetben jutunk el a csúcspontra: megvizsgáljuk, hogyan lehet tételeket


egymásra építeni. Központi szereplő -érthető okok miatt- a kiválogatás tétel lesz.
Tartalomjegyzék

µ16gla 19
Bevaetés _ _.„.„.„ - ...:.
.„„........ _._ „„ ..„...„„. �--· �� �-....!

ELTE Informatikai Kar I. Elemi pJ"!)gl'lllllozisi tételek .,.-...... „-.„...„„..._._.„ ..... .... -.·----11
.„ •

1. So rozatlzámftJU ---··--·-----·-·---------·---·-· ll

6„ bővített kiadás 2. Eldlntés .„„„„„„.„.„„•• „„„„„....„-.... „... .„„.... -„ ... „„.„„.-„„.-„„ •• „„„ ... .15

3. J(iválasztjs ,.„„.„.„• •„„„„..... „•••• „.„„.„.„„„„.„„ •• „„.-......„.„.„„„• •„„ •• -„.„ ... „ 17


4. (Lineáris) keres& „.„„„„•• -.„„.„...... „„ ... „„.„„„„„„„„„.„„."'„„„••„„„„„„„.„„. 19
S. Meg:szimolú :
.„„„...„ ............ „.„„„.„.„..... „•• „•••••„„.„„„.....„„„„„„ .• -„„„„„.„„. 20
6. Muimumkiválasztás „.• „„.„........ „„ ....„„„„„„... „....-.„„„„„.„„...... „• •„.... .„„„. 22

IL Összetett prognunoúai t6telek ..... „„.•„„„.„.„„.„.....„„„„„.......„„„„„„„„...... „.,.„ 24


1. Múolú „·-···---··--------·---··-..--·--··„····-··-··„„.„ ...„ „ ...24

2. KivAiopds ·-·-·-·--·---·---··„...„.„.„...„.„„ •• „... ...


.. ........ „ ... „.„.... --25
3. Szétv'1ogads „.„„ ... „...„.„„ .... „......... „„„„.„-„„.„.„„.„... „- .. . ...... .27

4. Met17.et ·---·-„„„... -....„„.„ ...„.....„„„........... „.... „•• „„„•• „.„.........„„ 30


S. Egyesitá (uni6) ....„„ •• „.-„.„ ..... „.••„ ..... „.......„...„... ....„.„ .........„...„...... „„„ „
•.• 32
6. Osszefuttatis (rendezettek uai6ja) „„„„•• „.„.....„„.... „.„.„„.„„„„•• „„„•• „„„ ...... 33

m. Rendezések ... „.-.„„_...... „........ „„„....... „„ .....„„... „„...... . „........ -„... .....36

1. Egyszeri esem rendez& ....„...„„......„„„„ •• „.„„-„„.„.„.„.„„.- ......„„... 36

2. Minim� rendez& .... „„-•• -.„....... „„„„„„.„„.„... ..... .„„.„„ ....-37

3. Buborikoll rendez& „„.„„„„.„„„„.„.„ •.„.„„„„„„„ .. .. „.„.„... „.„„„ ..... „„„„„.„. „. 38


4. Javított buborékos rendez& „.• „.„„. „„„..... .„„. „.„.„„.„.„.„„„.„„ ... „„.„„.„ ..... „ 39
Ké5zült az NJSZTgondozáeálian
S. Beillesztéses rendf(lá „.......... „„.„„ •• „.„ ••• „...... „„„„„„„.„••.„„„„„....„„..... „„„.„ 39
200 példányl:ian ,
Fele1Ö5 klad6: dr. Kozma Lászl6 6. Javított beillesztéses rendez& „„„.....„„„„ •• „„.„.„„„„„ ......
.. .....„„„.„.„„.„... „„. 40
5orozatszerkes�: Szlávi Péter· Zsak6 Láez16 7. Szétoszt6 rendez& „„„.„....... „... „„„.„• •„.„„.„._ ... „, .... _, _,..... „„„„„„„.„„„„. 41
@ Szlávi Péter Zsak6 Lá6zl6, 2004.
8. Szim"1Va IZétoszt6 rendez& 42

.„„„.„ .........„„„„„
.. .•• „ .... „ ....„„„„.„
.. ....„.„„....„ ••

9. Szim1'16 rendez& .......„„„


.. ....„„....... „.......„„„.„.„ ..... „„„ ••„.„.„„„.„ ....... .m.„„. 43
10. Rendez& Shell m6dsierrel .......... „„„.„.„.-.„-.„-.„„........„.„ ....... „„„ ....„„ 44

IV. Keresések „....... „•• „„..................„.„„„


.. ........ „„.„„„„.... „„ ....„„„„ ...„„.... .„„.„••„ „ 45
1. Keresés rendezett sorozatban „„...„ •• „„. -„ •• „... „.„„.„• •„„. „„.„.„.„.„„ „„„„„„ 45
2. Visszalépáes keres& (backtnck) „.• -„„„........„.....„„„„„„„
.. •• „„... „„„ .... ..... 47

V. Programozisi tételek egymún épft&e .„„„„„•• „„„.„„„....„„.........„„„„„„„.„„„. 57


1. Másolással összeépítés ·······························
: ························„························„···„ 57
Bevezetés
2. Megszámolással összeépités ••.••.•••••••••••••••••••••••••••• :•••••••••••••.•.••••••••••••••••••••••••••••• 58

3. Maximum kiválasztással összeépftés •• „..••..•••.....•.•.... „..........•.............. „. . . . . . . 59


.. . . . .

4. Kiválogatással összeépítés ...•..•.•.•.•...••••..•.•.•..•.•.••.•.•••••.••••..••••„ ••••••••• •••••••.•„••••••• 61 Programozási feladatok megoldásakor a program felülről lefelé való kifejtésekor há­
romféle programszerkezetet használunk: utasítások egymásutáni végrehajtását, felté­
Irodalomjegyzék 64
teltől függő elágazást, valamint utasítások többszöri megismétlését, ciklust. Ezek vá­
••••..••••••• „ • •••. •••• „•.•. •••••••••••• ••••••.•••.•••••••••••••••••• •••••••••••„„••• „•••••••••••• „••

lasztása a megoldandó feladat specifikációjától függ.

A programozási bevezetővel foglalkozó füzetben átte kintettük a specifikáció témakö­

rét, a specifikáció és a programszerkezet kapcsolatát E kötetben is alapvető szerepet ját­

szanak ezek az ismeretek, í� emlékeztetőül röviden áttekintjük őket, illetve a szükség­


leteknek megfelelően formali71íljuk.

A feladatot mindig valamilyen adatok együttesén fogalmazzuk meg (ezt ismerjük,

erre vagyunk kfváncsiak), ezen adatok értékhalmazai direktszorzatát nevezzük állapot­


témek 1. E tér egy pontját -ami a programfutás pillanatnyi rögzítése- nevezzük állapot­
nak (innen s7lÍrmazik a tér neve), koordinátáit pedig változóknak. (Egyes állapottér­
koordinátákról kiderülhet á feladatmegoldás során, hogy nem elemi értékkel rendel­
keznek.) A változók tehát tulajdonképpen az állapottér projekciói (vetítései).

lA _O_o/
-1-
� ----�,- -
_

a programfutása: tf1!1tS 'fázisai"

Példa:
Állapottér: A=BxCx...xH
Egy állapota: a=(b,c, .. „h), ahol beB, cEC, . . „ heH.
Egy változó ja : P:A -+B projekci6

1 Az állapottér a feladatmegoldás során a kezdeti elképzeléshez képest altalában bövlll; többnyire minden
finomítási lépésben.

5
4
Hevezetes
Programozási tételek

Feladaton mindig egy relációt értünk, amely része az AxA állapotpárok halmazának
Bemenő paraméterek Kimenő paraméter
(FkA"XA). A fenti ábrán pl. az (ao,aN)eF, azaz az F-t a lehetséges kezdőállapotok és a
hozzátartozó végállapotok párjai alkotják. (ao = (bo.co.„.Jlo), a1 = (b1>c1„„,h1)„„ ar N sorozat sorszám
=(bN,cN„ „,hN)) Tehát elsődleges dolog minden feladatnál megállapítani az állapotteret,
s az egyes koordinátáinak lehetséges kapcsolatait. Ezután meg kell határozni az állapot­
témek azt a részét, amelyre a feladat megoldását meg kell kapnunk. Ezt írhatjuk le az

elöfeltétellel; az elérendő eredmény, azaz a cél meghatározására smlgál az utófeltétel.

(Pusztán technikai okok miatt történik e két A-beli részhalmaz megadása egy-egy felté­
tellel, azaz matematikai formalizmust fblhasználva egy-egy logikai formulával.)
Állapottér: N x N*x N
A fogalmak formális szemléltetésére használjuk ugyanazokat a példákat, amelyeket a
3. feladat 0. változat):
bevezető kötetben áttekintettünk!
Adjuk meg N ember közül a második legmagasabb sorszámát és magasságát! A ma­
1. feladat:
gasságokat centiméterben adjuk meg, s az eredményt méterben várjuk.
Adjuk meg egy legfeljebb másodfokű egyenlet megoldását! Az egyenlet ax2+bx+c=O
formában adott. A megoldás(ok) mellett szövegesen is adjuk meg a megoldás milyensé­ Bemenő paraméterek Kimenő paraméterek

gét (két különböző valós megoldás , két egybeeső valós megoldás, nincs valós megoldás, N sorozat sorszám magasság
elsöfokű egyenlet egy megoldása)!

1 l _J
Bemenő paraméterek Kimenő paraméterek

a b e szöveg

L� �lrr-
Állapottér: N x N *x N x R

A feladat pontos megadásához ismernünk kell a bemenő és a kimenő adatok leírását.

3 2 Azaz a specifikációnak tartalmaznia kell az állapottér egyes komponenseit. Hogy hivat­


Állapottér: R x Szöveg X R
kozni lehessen ezekre: nevezzük: el őket! Ezek lesznek egyben a program bemenő, ill.
2. feladat 0. változat): kimenő változói.
Adjuk meg N ember közül a legmagasabb sorszámát! A magasságokat centiméterben
1. feladat:
adjuk meg.
Bemenet: a,b,cER - együtthatók.
Kimenet: sz t::Szöveg - a megoldás esetére utaló szöveg
x1,x2ER - az egyenlet megoldásai.
2. feladat:

Bemenet: Nt:: N - az emberek száma,


At::fli - a magasságukat (cm) tartalmazó tömb.
Kimenet: MAXEN - a legmagasabb ember sorszáma.
3. feladat:

Bemenet: Nt::N - az emberek száma,


At::N"' - a magasságukat (cm) tartalmazó tömb.

6
7
Bevezetés Programozási tételek

Kimenet: MAX2 EN - a második legmagasabb ember sorszáma, szokványosnak mondható formális eszközöket, úgymint: az egymásba ágyazás, vagy
MAG2 ER - a második legmagasabb ember magassága (m). faggvénykompozíció, az alternatfva és a rekurzió. Egy egyszerű példán is könnyen
Most a fenti absztrakt fogalmakat kissé gyakorlatiasabb szemszögből tekintve újrafo­ b�látható, hogy a fiiggvényműveletek és az algoritmikus szerkezetek között a következö

galmazzuk. A specifikációnak tartalmaznia kell a feladatban használt fogalmak defi­ kapcsolat áll filnn:

nícióját, valamint az eredmény kiszámftási szabályát. A bemenő, illetve a kimenő


fiJggvénymilvelet algoritmikus sr.erkeut
adatokra kirótt feltételeket neveztilk elc'lfeltételnek, illetve utófeltételnek. Mint az aláb­
hb:=g(x)
biakból kiderül: szükség esetén bővítjük az állapotteret új (munka-) változ.ókkal. kompozfció h(x): = (f g)(x)
o szekvencia
h:=f(hb)

1. feladat:
Állapottér kibővítve: WxSzövegxWxR alternatfva {l
<x>, ha T<x>
h( x>·= g(x),
· különben
Ha T(x) akkor h:=f{x)
különben h:=g(x)
elágazás

Új változó: d ER - diszkrimináns.
Előfeltétel: a;t!() vagy b;t!(). rekurzió h(x).·-{1 (X)'
- (g. , ha T(x)
h i)(,x), különben
o
k:=O
Ciklus am(g nemT(x)
ciklus

Utófeltétel: d=b*b-4*a*c és x:=i(x): k:=k+ 1


Ciklus vége •
(a=O =>x1=-c!b, sz="elsőfokú az egyenlet, egy megoldása van'? és x:=x: hx:=f{x )
(a;t!() és d<O =>sz="nincs valós megoldás'? és Ciklus != l-től k-ig
hx:=g(hx)
(a;t!() és d=O ::x>x1=-b/(2*a), sz="egy kétszeres valós megoldás van'? és Ciklus vége

(a;t!() és d>O :::>x1=(-b+.../b • b- 4 * a * c )/(2 *a), x2=(-b-.../b * b- 4 a * c )/ (2 *a), h:=hx

sz="két különböző valós megoldás van'?· A struktúraszerinti feldnlgozás -már korábban megismert2- elve további támpontokat
2. feladat: nyújt az algoritmus formálásához. Emlékezzünk. hogy az adatok szerkezete és az őket
Előfeltétel: -. feldolgoz.6 programszerkez.et között is -az előbbihez hasonló könnyedséggel belátható­
Utófeltétel: ls.MAXS'N és \1i (JS15N): A(MAX).?A(i). viszony található:
3. feladat:
Állapottér kibővítve: NxN°xNxRxN. adatszerkezet programszerkezet
Új változó: MAX EN - a legmagasabb sorszáma.
skalár „elemi adat" értékadás(filggvény),eljárás
Előfeltétel: N:::2 és 3i,j (1 SiJ5N): A(i)#A(j).
Utófeltéte/: 15.MAXsN és \1i (JsísN): A(MAX).?A(i) és direktszorzat rekord mezök szerinti szekvencia

ls.MAXlsN és \1i (1Si5N): (A(MAX2 ).?A(i) vagy A(MAX2)<A(MAX)) és iteráció sorozatféle=sokaság „elemfeldolgoz.6 magú" ciklus
MAG=A(MAX2)/100.
unió alternatív rekord feltétel szerinti elágazás
A feladatot megoldó algoritmus, illetve program természetesen lehet a kitűzött fela­
datnál általánosabb. Ez azt jelenti, hogy a program utófeltétele lehet erősebb, azaz a
Ezek a felismerések, elvek sem adnak azonban segítséget abban, hogy teljes precízi­
feladat által meghatározott helyes eredmények halmazánál szűkebbet adó, előfeltétele
tásában „generáljuk" a program algoritmusát. Hogy ebben az értelemben előbbre juthas­
pedig gyengébb, azaz a feladat által meghatározott bemenő adatoknál bővebb körre is
sunk, fel kell ismernünk a programozási feladatokban rejlő lényeges jellemzőt: a felada­
működhet.
tok nagy feladatosztályokba sorolhatók a feladat jellege szerint, s e fe/adatosztályokhoz
A most következő rövid okfejtésből látszik majd, hogy a specifikáció megfelelően tudunk készíteni a teljes feladatosztályt megoldó algoritmusosztályt. Ezeket a típusfela­
precíz megadása komoly segítséget jelenthet a későbbi algoritmizálásnál. Induljunk ki datokat programozási tételeknek fogjuk nevezni, ugyanis bebizonyítható (s ezt meg is

abból, hogy a feladatot megoldó program valamilyen leképezést valósít meg a bemenő tesszük), hogy a megoldásaik a feladat gar.mtáltan helyes megoldásai.
és a kimenő adatok között. Ezt a leképezést, amely sokszor egyértelmű, hívják program­
faggvénynek. A programfüggvény definiálására használjunk a függvények körében 2 Természetesen "algoritmikus rekurzióval" még triviálisabb megoldást lehet találni. (Speciális esetekben
lényegesen egyszerűbb az iteratív yáltozat.)

8 9
Bevezetés Programozási tételek

E programozási tételek ismeretében már a legtöbb feladat megoldása során nincs más JELÖLÉSEK
dolgunk, mint felismerni a megfelelő programozási tételt, megfelelteni a konkrét adatait
A könyvben használunk néhány jelölést, ezért a továbblépés előtt tekintsük át ezeket:
az általános feladatosztálynak, majd ezeket az általános megoldó algoritmusban a konk­
rétumokkal helyettesíteni. Ezzel a módszerrel a feladatnak mindig egy -elvileg- helyes No - 0, 1, 2, .. . (nem negatív egész számok)

megoldst kapjuk3, azonban ez nem mindig a leghatékonyabb, legegyszerűbb, legügye­


H - tetszőleges halmaz (halmazmüveletekkel)
sebb megoldás lesz. A helyes megoldásból a különféle szempontok szerinti hatékony
00
H• H-beli véges sorozatok hal­
megoldáshoz vezető úttaf a sorozat egy másik kötetet foglalkozik - H• = U Hk (i. elemére h,-vel hivatkozunk)
mazá
k=O
Nyilvánvalónak látszik, hogy a programfüggvény három lehetséges esete közül a cik­
H-beli N elemű sorozatok halmaza
lussal (illetve rekurzióval) megoldandó feladatok lesznek a legnehezebbek. A programo­

zási tételek éppen ezért az ilyen feladattfpusokhoz kapcsoldnak. L • logikai értékek halmaza: { igaz,hamis}

Ezek a feladatok mindig olyanok lesznek, hogy egy (vagy több) adatsokasághoz kell H rendezett halmaz - \:/ hbh2eH: h1�2 vagy h1�2

rendelnünk valamilyen eredményt. E sokaságot az egyszerűség kedvéért mindig valami­


Megjegyzés:
lyen sorozatként fogjuk fel. A „sorozatság" az elemek feldolgozási sorrendjét határozza
ha egy H halmazr61 rendezettséget feltételezünk, akkor azt így írjuk le: Rendezett(H).
meg. s A legtöbb esetben elég olyan sorozatokkal foglalkozni, amelyek elemei egymás
S rendezett sorozat - \:/ i (19<N): si�i+I 7
után -egyesével- feldolgozhatók . Ez a bemenő sorozatra olyan művelet létét feltételezi,
amely elölről, egyenként képes adni a sorozat elemeit, az eredmény sorozatba pedig az SeH• halmazfelsorolás - \;/ ij ( lS:ij�: i*,j => Sj*Sj
addig belekerült elemek mögé képes tenni egy új elemet. További egyszerűsítést veze­
X,YeH*:X!:;;; Y •
X =(x1,... ,xMf=(yip„·•YiM)=Y és
tünk be a megfogalmazásba: a sorozatokat mindig egy tömbbel6 ábrázoljuk.
X részsorozata Y-nak i
1
<...<� (természetesen: MsN)

A vizsgált feladatosztályokat 4 típusra osztjuk a bemenet és a kimenet alapján:


X,YeH*:x&Y •
X&Y = (x1,....,XN.Y1>····YM)
• egy sorozathoz egy értéket rendelő feladatok,
két sorozat egymásután írása
• egy sorozathoz egy sorozatot rendelő feladatok,
R halmaz: S =Permutáció(R) R=(r1) és S=(r1) vagy S=(s1)&8' és s1eR
• egy sorozathoz több sorozatot rendelő feladatok,

S R permutációja és 8'=Permutáció(R\s1)
• több sorozathoz egy sorozatot rendelő feladatok.
X,Y,ZeH*: X=YuZ -X=Y&Z és YnZ=OB
Mindegyik programozási tétel tárgyalását néhány konkrét példával kezdjük. E példák
Y és Z az X diszjunktfelbon­
alapján határozzuk meg a feladattípus általános jellemzőit. Ezután definiáljuk az általá­
tása
nos megoldásban használt adatokat mind szöveges leírással, mind pedig formális (mate­

matikai) eszközökkel lefrva. A formális leírásokat a szövegből keretezéssel kiemeltük, a


tételek ezek kihagyásával is megérthetők.

Következő lépésként áttérünk a megoldás kialakítására, majd folytatjuk az általános

megoldás algoritmusával. Ha a tételnek többféle variációját tárgyaljuk, akkor itt ezek


követkemek, s befejezésként megoldunk néhányat a fejezet elején közölt példákból.

3 Tennésztesen ez nem véd a hibás gondolkodástól, illetve a kódolás során elkövetett hibák ellen.
4 L. µlógia 6 - Módszeres programozás: Hatékonyság.
7 Sokszor kényszerülünk arra, hogy az S sorozat i. elemét S; helyett S(i)-vel jelöljllk. Ez ne okozzon
5 Azaz fflltételeZZOk, hogy létezik elemei között egy egyértelmű rákővetkezési reláció és ezen nyugvó
elemeléréshez van valamilyen definiált szelekciós, illetve konstrukciósfaggvény. zavart.

6 Adott, rögzített elemszámú sorozat, indexelés művelettel. 8 azaz az X minden eleme pontosan egyszer szerepel az Y vagy a Z sorozatban.

10 11
Programozási tételek

f5. Adjuk meg az első N természetes szám szorzatát (N faktoriális)!


1. Elemi programozási tételek Vizsgáljuk meg, mi a közös a fenti öt feladatban! Mindegyikben adatok valamilyen
sorozatával kell foglalkoznunk, e sorozathoz kell hozzárendelnünk egyetlen értéket. Ezt
Feladataink egy jelentős csoportjában egyetlen bemenő sorozat alapján kell meghatá­ az értéket egy, az egész sorozaton értelmezett függvény adja (N szám összege, M betű

roznunk egy értéket eredményként. egymásutánírása, K halmaz uniója, N szám szorzata). Ezt a függvényt azonban felbont­

*
hatjuk értékpárokon kiszámított függvények sorozatára (2 „valami" összegére, egymás­
Bemenet : NeN0, XeHN, F: H --+G t- az állapottér bemeneti
után írására;uniójára, szorzatára).
komponensei

Kimenet : SeG t- az állapottér bemeneti Az algoritmus:


komponensei
Vál.tozók:
ef t- Nincs elófel tétel (ef)' N : Egész [a feldolgozandó sorozat elemei száma]
X : Tömb(l . . N:Elemtipus) [a feldolgozandó sorozat elemei]
uf t- Utófeltétel (uf), amilyen FO: Elemtípus1 [a művelet nulleleme]
tulajdonsággal megálláskor s : Elemtipus2 [az eredmény]
az S rendelkezni fog. (Most
hogy éppen az adott értékű
Bemenet
lesz.)

Kimenet SeG
Az elő-, illetve az utófeltételben pontosan meg kellene fogalmaznunk azt is, hogy a
ef 3F0eG (nullelem) és 3f :GxH�G és
bemenő adatok, paraméterek értéke a megoldás során változatlan marad, ettől azonban
F(X1,.. ;,XN)=f(F(X1, ... ,XN-J) ,XN) és F()=Fo
az egyszerűbb felírás miatt -általában- eltekintünk. A pontos használat miatt -mintaként­
uf S=F(X1,... ,XN).
ezen a helyen így is megadjuk. A aposztrofjelöli a paraméter, bemenő változó régi érté­
két. Így tehát minden olyan művelet szerepelhet e feladattípusban, amelyre a matematika
* valamilyen „egységes" jelölést használ: összeg, szorzat, unió, metsi.et, logikai művele­
Bemenet NENo, XeHN, F:H --+G
tek, konkatenáció, .... Mindegyik művelet visszavezethető egy bináris műveletre, s meg­
Kimenet SeG
adható mindegyikhez egy semleges elem (nullelem) is, amelyre egy tetszőleges elemmel
ef
és vele elvégzett 2 operandusú művelet az adott elemet adja.
uf
Variációk: F = r., TI, v, n, A, v, & (konkatenáció).
Ez a csoport több feladattípust tartalmaz, nézzükvégig ezeket!
F 0=-0, 1, {},alaphalmaz, Igaz, Hamis,"".

A megoldás a nullelemre, valamint a 2 operandusú műveletre épül, a matematikában


1. Sorozatszámítás is szokásos módszer, az indukció alapján:

Kezdjük a legelső témakört néhány feladattal! • 0 elemre tudjuk az eredményt: Fo.

F 1. Egy osztály N db tanuló osztályzatának ismeretében adjuk meg az osztály átlagát! • ha i-1 elemre tudjuk az eredményt (Fi-1), akkor i elemre (F1) a következőképpen kell
kiszámítani: Fi=f(Fi-J;x;).
F2. Egy M elemű betűsorozat betűit fűzzük öss":z.e egyetlen szöveg típusű változóba!
Az F-re vonatkozó alábbi rekurzív definícióból:
F3. Készítsünk algoritmust, amely egy autóversenyző körönkénti ideje alapján meg­
{Fo ,hai=O
határozza a versenyző egy kör megtételéhez szükséges átlagidejét! F :=F(Xr·•X;):= f(Fi-1, X;)), különben
i
F4. A Balaton mentén K db madarász végzett megfigyeléseket. Mindegyik megadta,
-a korábbiak alapján, a specialitásokat figyelembe véve- így kapható az algoritmus
hogy milyen madarakat látott. Készítsünk algoritmust, amely megadja a megfigyelés­
első változata:
ek alapján a Balatonon előforduló madárfajokat!

12 13
Programo7Jlsi tételek
Elemi programozási tételek

F4. K halmaz uniója


a bevezetésbeli jelölésekkel a specialitásokfllJYelembe vétele
k:-0 elemek száma : K Unió(K,X,H) :
megfigyel ések: X N db elem H:={) [üres halmaz]
Ciklus amig nem T(x) [T(x)=i=O]
F, f, Fa U, u, {} Ciklus !=l-től K -ig
x:=i(x): k:=k+l k := N : x:= ( ) [i:(Xz, • • Xi)-+(X z,X i-1�
Ciklusvége H : =HuX (I)
x*:=x : hx:=f(x*) x*:=(): hx:=F [h()=F] Ciklus vége
Ciklus 1=1-től k-ig Eljárás vége.
hx:=g(hx) hx:=f(hx,X)
Cik lus vége
h:=hx F:=hx

2. Eldöntés
A „fölöleges" dolgokat kihagyva mindössze ennyi marad:

hx:=F a Az előző programozási �l két speciális esetében az ott közölt megoldás sok feles­
Ciklus 1=1-től N-iq annak a hiányosságait pótolja e speciális esetekben.
leges lépést tartalmazhat. Ez a tétel
hx:=f(hx X)
i Az alábbi példákban keressük meg a közös vonást (ami speciális esetét jelenti az előző­
Ciklus vége
F:=hx
nek)!

Végezetül az algoritmikus nyelvünkben szokásos jelölésekkel a feladatot megoldó al­


F6. Döntsük el egy számról, hogy prímszám-e!
goritmu s:
F7. Döntsük el egy szóról a hónapnevek sorozata alapján, hogy egy hónap neve-e!
. :
Sorozatazámítás(N,X,S)
S:=Fo
F8. Döntsük el egy tanuló év végi osztályzatai alapján, hogy kitűnő tanuló-e!
Ciklus !=l-től N-ig
S:=f(S,X(I)) F9. Júniusban minden nap délben megmértük, hogy a Balaton Siófoknál hány fokos.
Ci kl.us vége
Eljárás véqa. Döntsük el a mérések alapján, hogy a víz hőfoka folyamatosan emelkedett-e!

Alkal mazzuk az általános megoldást a fejezet elején kitűz.ött egyes feladatokra! E feladatok közös jellemzője, hogy a bemenetként megadott sorozathoz egy logikai

értéket kell rendelni: a feltett kérdésre igeruiel vagy nem- mel kell válaszolni. A vizsgált
F 1. N szám összege
sorozat elemei tetszőlegesek lehetnek, egyetlen jellemzőt kell feltételeznünk róluk: egy
elemek száma: N Összegzés(N,X,S): tetszőleges elemről el lehet dönteni, hogy rendelkezik-e egy bizonyos tulajdonsággal.
os ztályzatok: X N elemű S:=O
·vektor •Ciklus !=l-től N-ig A feladatok így két csoportba sorolhatók, az egyikben azt kell eldönteni, hogy egy
iF, f, Fa : s, +, 0 S:=S+X(I) sorozatban létezik-e adott tulajdonságú elem, a másikban pedig azt, hogy mindegyik
Ciklus vége
elem rendelkezik-e ezzel a tulajdonsággal. Vizsgáljuk először az elsöfajtájúakat!
Eljárás vége.

Bemenet NeNa, X e HN , T:H�L


F2. M betű egymásutánirása
Kimenet VANeL
elemek száma M Egymásután(M,X,SZ):
ef
betűk X M elemű SZ:="" [üres szöveg]
vektor uf VAN = (3i (l�i:;;N): T(Xil l
Ciklus !=l-től M-iq
f, +, "",
•F, Fa &, SZ:=SZ+X(I)
Ciklus vége lz algoritmus:
Eljárás vége.
Függvény:
T: Elemtipus -+ Logikai

15
14
Programozási tételek
Elemi programozási tételek

ha az egyik operandus értéke alapján a végeredmény egyértelműen eldönthető lenne. E


Vá1tozók:
N Egész [a f eldolgo zandó sorozat elemei s z áma ] programozási tételnél így az I:;;N feltétel nem teljesülése esetén is meg kell vizsgálni a
X : Tömb ( l . . N : E l emtípu s ) [ a feldo lgozandó s o r o zat] T(X(l)) értékét. Ha a felhasznált tömb pontosan N elemű, akkor ez tömbindexelési hi­
VAN : Logikai [ a z eredmény]
bához vezet. Többféle megoldással foglalkoztunk a kódolási kérdések kapcsán:
A feladattípus megoldására az előző programozási tétel is alkalmas a következő meg•
• vegyünk fel egy fiktív (N+l.) elemet a tömb végére,
feleltetéssel: F = V, f= v, F 0 =hamis.
• a ciklus egy lépéssel hamarabb álljon le, s vizsgáljuk a leállás okát,
E 1döntés ( N , X, S) :
S:=hamis • válasszuk szét a két részfeltétel kiértékelését, s a T(X(l))-t csak akkor értékeljük ki,
Cik 1us I = l -tó 1 N-ig
S: = S v X ( I) amikor szükséges.
Cik 1us vége
E 1j á rás vége . Néhány feladat megoldása következik.

Észrevehetünk azonban egy fontos tulajdonságot. Ha a megoldásban az S válto2'.ó ér­ F6. Létezik-e a számnak l-től és önmagától különböző osztója?
téke egyszer igazra változik, akkor a megoldás végéig biztosan az is marad. Tehát az ez­
el emek s z áma N-2 E 1döntés ( N , PRIM ) :
utáni műveletek elvégzése teljesen felesleges. Ezt a tulajdonságot kihasználva készíthet­ o s z tó k 2 , 3, . . . , N-1 1 : =2
T ( e ) = T' ( e , N ) ejN Cik 1us amíg I :;;N - 1 és
jük el az igazi megoldást.
nem I IN
( T ' ( e, N ) : a valódi függést
Ebben az esetbe� egy olyan ciklus a megoldás, amely vagy akkor áll le, ha találtunk I : =I + l
kifejező leképezés)
Ciklus vége
egy, a keresett tulajdonsággal rendelkező elemet, vagy pedig akkor, ha ilyen elem a so­ PRIM:= ( I >N-1 )
rozatban már nem létezhet, azaz elfogytak a megvizsgálandó elemek. Elj á rás vége .

E 1döntés ( N , X , VAN ) : F9. A hőmérsékletek sorozata monoton növekedő-e?


I : =l
Cik1us amíg I� és nem T ( X ( I ) ) el emek s z áma : N - 1 Eldöntés ( N , X , MONOTON ) :
I : =I+l
hőmé r s é k l etek : X N db elem I : =l
Cik1us vége
T (X ( e) ) =T' ( e) : X ( e) :;;x ( e + l ) Cik 1us amíg I:;;N -1 és
VAN : = ( I :;;N )
X ( I ) :;;x ( I+ l )
E 1j á rás vége .
I : =I + l
Cik1us vége
Fordítsuk most figyelmünket a másik csoportra! Azt, hogy mindegyik elem rendelke­
MONOTON : = ( I >N - 1)
zik egy adott tulajdonsággal, átfogalmazhatjuk arra, hogy nem létezik az adott tulajdon­ E 1j á rás vége .
sággal nem rendelkező elem. Ezek alapján a fenti megoldásban 2 helyen tagadást alkal­
mazva megkapjuk ennek a csoportnak a megoldástípusát is. (Ez a sorozatszámítás az F

= /\, f = A, Fa= igaz értékekkel).


3. Kiválasztá.s
E 1döntés ( N , X , MI N D ) : Há-kicsit belegondolwtlc, az előző programozási tétel megoldása a tőle vártnál több
I : =l
Cik1us amíg r:;;N és T ( X ( I ll eredményt is adhat. Ennél a tételnél ezt a többet vizsgáljuk.
I: = I+ l
Cik 1us vége FIO. Ismerjük egy hónap nevét, a hónapnevek sorozata alapján mondjuk meg a sorszá­
M I N D : = ( I>N) mát!
E 1j á rás vége.
Fl 1. Adjuk meg egy természetes szám legkisebb, l-től különböző osztóját!
Az eldöntés tipikusan olyan feladat, amelynél kódolási problémák merülhetnek fel.
Ilyenekkel foglalkozunk az algorimusok kódolásával kapcsolatos füzetben, itt csupán Fl2. A naptárban található névnapok alapján adjuk meg legjobb barátunk (barátnőnk)
utalunk a problémára és a lehetséges megoldásaira. névnapját! (Itt nem a „legjobbság" megfogalmazása okozza az algoritmikai problé­
mát.)
A programozási nyelvek egy jelentős részében a logikai kifejezések kiértékelésekor
az és, illetve a vagy műveletek mindkét operandusát kiértékelik futáskor, még akkor is,

17
16
Programozási tételek
Elemi programozási tételek

Könnyen átalakíthatjuk olyanra is, amely ilyenkor az utolsót adja közülük. Ekkor
Keressük itt is a közös jellemzőket! A feladattípus első ránézésre nagyon hasonlít az
csupán annyi a teendő, hogy a sorozat elemeit hátulról visszafelé dolgozzuk fel.
előzőre, csupán itt nem egy eldöntendő kérdésre kell válaszolni, hanem meg kell adni a
sorozat egyik, adott tulajdonsággal rendelkező elemét Kicsit részletesebb, pontosabb Nézzük meg a bevezető feladatok egyikének megoldását!
vizsgálódás után még az is kiderül, hogy ha e feladatokra az eldöntendő kérdést tennénk Fl2. A legjobb barát (barátnő) névnapja.
fel, akkor biztosan igen választ kapnánk.
elemek száma: N Kiválasztás(N,X,BARÁT,NAP):
Azt kell még eldöntenünk, hogy az elemet hogyan adhatjuk meg. Erre két lehetősé­ névnapok : X N db elem I:=l
Rekord(név,névnap) Ciklus amíg X ( I) .név.ioBARÁT
günk van: vagy a sorszámát, vagy pedig az értékét adjuk meg. Felhívjuk a figyelmet
T(e) : e.név=barát I:=I+l
arra, hogy az előbbi változatból az utóbbi megoldását nagyon könnyen megkaphatjuk, Ciklus vége
NAP:=X(I) .névnap
fordítva viszont korántsem ez a helyzet. Emiatt mi az első változatot részesítjük
Eljárás vége.
előnyben, ez az általánosabb eset.

Bemenet NEN0, XEHN, T:H�l

Kimenet SORSZEN
4. (Lineáris) keresés
ef 3i (1$i�): T(Xil [és természetesen: �ll Foglaljuk össze az előző két programozási tétel feladatát: az űj feladattípusban a
uf l�SORSZ� és T(XsoRsz) feltett kérdés az előző kettő mindegyikét tartalmazza!

F13. Ismerjük egy üzlet egy havi forgalmát: minden napra megadjuk. hogy mennyi volt
Az algoritmus:
a bevétel és mennyi a kiadás. Adjunk meg egy olyan napot -ha van-, amelyik nem
Függvény:
T: Elemtípus � Logikai volt nyereséges!
Változók:
Fl4. A Budapest-Nagykanizsa vasűti menetrend alapján két adott állomáshoz adjunk
N: Egész [a feldolgozandó sorozat elemei száma]
X: Tömb(l .. N:Elemtípus) [a feldolgozandó sorozat elemei] meg egy olyan vonatot, amellyel el lehet jutni átszállás nélkül az egyikről a másikra!
SORSZ: Egész [az eredmény]
F15. Egy tetszőleges (nem 1) természetes számnak adjuk meg egy osztóját, ami nem az
A megoldás sokban fog hasonlítani az előző feladattípus megoldásához, annak az
1 és nem is önmaga.
esetnek a vizsgálatát kell kihagyni belőle, amely a keresett tulajdonságú elem nem léte­
Tehát a közös jellemző, hogy egy adott tulajdonságű elemet kell megadnunk, ha
zése esetén állította le a megoldás keresését.
egyáltalán van ilyen. Ha nincs, akkor a válasznak ezt a tényt kell tartalmaznia.
Kiválasztás(N,X,SORSZ):
I:=l
Ciklus amíg nem T(X(I)) Bemenet NeNo, Xe HN
I:=I+l T :H.-.>L
Ciklus vége
SORSZ:=I Kimenet VANel, SORSZeN
Eljárás vége. ef

A megoldásról könnyen megállapíthatjuk, hogy ha több, a kívánt tulajdonsággal ren­ uf VAN = (3i (1$i�): T(Xi)) é s

delkező elem is előfordul a sorozatban, akkor azok közül az elsőt (helyesebben annak VAN� l�SORSZ� é s T(XsoRsz)

sorszámát) adja.
Az algoritmus:
Ebből, mint azt egy korábbi füzetben a specifikáció kapcsán már taglaltuk, az követ­ Függvény:
kezik, hogy a program utófeltétele lehet szigorúbb mint a feladatbeli utófeltétel. Itt ez a T: Elemtipus --> Logikai

következőképpen néz ki:

uf: 1$SORSZ� és T (XsoRsz) és Vi (l�i<SORSZ) •T(Xi)

19
18
Elemi programozási tételek Programozási tételek

Változók: Kimenet DBeN0


N: Egész [a feldolgozandó sorozat elemei száma]
ef
X: Tömb(l. .N:Elemtípus) [a feldolgozandó sorozat elemei]
VAN: Logikai [az eredmény - van-e megfelelő elem] N
SORSZ: Egész [az eredmény - a megfelelő elem sorszáma) uf DB= LX<Xil
í=l
Vegyük az eldöntés algoritmusát, s egészítsük ki a kiválasztásnak megfelelő ered­
ménnyel! tz algoritmus:

Keresés(N,X,VAN,SORSZ): Függvény:
I:=l T: Elemtípus -+ Logikai
Ciklus amíg ISN és nem T(X(I))
Változók:
I:=I+l
N : Egész [a feldolgozandó sorozat elemei száma]
Ciklus vége
X : Tömb(l . . N:Elemtípus) [a feldolgozandó sorozat elemei)
VAN:=(IsN)
DB: Egész [az eredmény - a megfelelő elemek száma]
Ha VAN akkor SORSZ:=I
Eljárás vége. A feladat sorozatszámítás (sőt összegzés), tehát egy ciklust kell alkalmazni a megol-
Az egyik kitűzött feladat megoldása a következő lehet: dáshoz. A ciklus belsejében egy unió típusú (X függvény értéke) adatot kell feldolgozni,
ezt egy elágazással tehetjük meg.
F13. Nem nyereséges nap megadása.
Megszámolás(N,X,DB):
elemek számq: N Keresés(N,X,VAN,NAP): DB:=O
bevételek B N db elem I:=l Ciklus I=l-tól N-ig 1
kiadások K N db elem Ciklus amíg ISN és Ha T(X(I)) akkor DB:=DB+l"
T(k-b) k-b�O K(I)-B(I)<O Ciklus vége
I:=I+l Eljárás .v;ége.
Ciklus vége
NAP:=X(I) .névnap Nézzük meg két feladat megoldását!
Eljárás vége.
F16. Létminimum alattiak száma.

Minden családi létszámhoz �egadható az a jövedelem, amely a létminimumhoz kell,

,5. Megszámolás a megoldásban ezt használjuk fel.

elemek száma: N Megszámolás(N,J,L,DB):


Az előző feladatokban előfordulhatott, hogy több elem is rendelkezik a vizsgált tulaj­ létszámok L N db elem DB:=O
donsággal. Ekkor érdekes lehet annak megvizsgálása, hogy hány ilyen elem van. jövedelmek J N �b elem Ciklus I=l-től N-ig
létminimumok: MIN sorozat Ha J(I)SMIN(L(I))
F16. Családok létszámának, illetve jövedelmének alapján állapítsuk meg, hogy hány T(l-j) j-MIN (1) �O akkor DB:=DB+l
Ciklus vége
család él a létminimum alatt! Eljárás vége.

F 17. Egy futóverseny végeredménye határozzuk meg, hogy a versenyzők hány száz.alé­
FI7. Olimpiai indulási szintet hány száz.a.lék teljesítette?
ka teljesítette az olimpiai induláshoz szükséges szintet!
A feladat megoldása egy megszámolás, majd az eredményből és a résztvevők számá­
Fl8. Adjuk meg egy szöveg magánhangzóinak számát!
ból száz.alékot számolunk.
A közös jellemző itt tehát a számlálás. Vegyük észre, hogy a feladatot sorozatszámí­
tásként is felfoghatjuk, amelyben 1-eseket kell összeadnunk, de bizonyos feltételtől füg­
gően.

{
Bemenet NeNo, XeHN

"'(x) = l, ha T, (x.) .
T:H-+L, x:H-+{0,1}, �
0, egyébként

20 21
Elemi programozási tételek Programozási tételek

elemek sz áma : N Megszámolás ( N ,I D ,SZAZ ) : halmazára, amely az adott elemnél nem kisebb értékű elemeket tartalmazza. Ennek is
idők I D N db elem DB : = O
Ciklus I = l -től N-ig
eleme lesz garantáltan a sorozat maximális eleme. Tehát hibát nem követünk el, ha F 0-
T ( id ) id�SZI NT
Ha I D ( I ) �SZ I NT nak az Art tekintjük. Alakítsuk át úgy a sorozatszámítás megoldását, hogy ne értéket,
akkor DB:=DB+l
hanem sorszámot kapjunk eredményül! (Annyi észre venni valónk van csak az algorit­
Ciklus vége
SZAZ : =Kerekit ( l O O* DB / N) miz.áláskor, hogy most a sorozat a 2. elemmel kezdődik.)
Elj árás vége .
Ma ximumkiválas ztás(N ,X , M AX ) :
MAX:=l
Ciklus ! =2 -től N-ig
Ha X (M AX) <X(I ) akkor M AX : = I
6. Maximumkiválasztás Ciklus vége
Eljárás vége .
A sorozatszámítás egy újabb speciális esetével ismerkedünk meg a következő fela­
Sok esetben túlságosan sok időbe kerül a sorozat egy elemének meghatározása.
dattípusban, először néhány feladaton keresztül. .
Ekkor olyan megoldást készíthetünk, amely a maximális értéket határozza meg, vagy
FI 9. Egy kórházban megmérték minden beteg láz.át, adjuk meg, hogy ki a leglázasabb! pedig a sorszámot is és az értéket is.

F20. Egy család havi bevételei és kiadásai alapján adjuk meg, hogy melyik hónapban Ma ximumkiválasztás (N , X ,M AX ,MAXERT ) :
MAX : =l : MAXERT: = X (l )
tudtak a legtöbbet megtakarítani! Ciklus ! =2 -től N -ig
Ha M AXERT<X (I ) akkor M AX : = I : M AXERT : =X (I)
F21. Egy osztály tanulói nevei alapján adjuk meg a névsorban legelső tanulót! Ciklus vége
Eljárás vége .
Közös jellemzőjük e feladatoknak, hogy minden esetben egy sorozat elemei közül

kell kiválasztani a legnagyobbat (illetve a legkisebbet). Itt is meggondolandó -mint a Ha a feladat minimumkiválasztás, akkor pedig nincs más teendőnk, mint az elágazás

kiválasztásnál-, hogy elem értéket vagy pedig elem sorszámot várunk eredményként. Az feltételében sz.ereplő < reláció átírása >-ra. Erre példa az egyik kitűzött feladat megoldá­

ottani gondolatmenethez hasonlóan most is a sorszám meghatáro7.ását választjuk. sa.

F2 l . A névsorban legelső tanuló.


Bemenet NeN0, X e HN , H rende z e t t halmaz ( 3<,� re l á ció )

Kimenet M AX e N elemek s z áma : N Mini mum(N , X ,M I N , ME V ) :


tanu l ó k neve : X N db elem MI N:=l : NEV : =X (l )
ef N:?:l Ciklus !=2 -től N -ig
Ha NEV>X (! )
uf l � AX� és Vi ( l�i�) : X MAX:?:X i
akkor M I N : = I : NEV : = X (I )
Ciklus vége
Az algoritmus: El járás vége .

Változók :
N Egész [a f e ldolgo z andó sorozat e l emei s z áma ]
X : Tömb ( l . . N : Elemtípus ) [ a f e l dolgozandó soro z at elemei]
M AX : Egész [a maximá l is értékű elem s o r s z áma ]

A sorozatszámításnál használjuk F függvényként a MAX(AJ.A2····AN) függvényt!


Ehhez az f függvényt a következőképpen használjuk:

f(x,y):=max(x,y).
Legyen ehhez F0:=A1! A választás megengedhető, annak ellenére, hogy nem feltétle­
nül lesz az A1 neutrális a max műveletre nézve! Ugyanis a korrekt választás a H mini­

mum eleme lenne, ami vagy ismert, vagy nem. Egy tetszőleges A-beli elem neutrálisnak

akkor fog tűnni, ha a max operátor értelmezési tartományát leszűkítjük a H azon rész-

22 23
Programozási tételek

Másolás ( N , X , Y} :
II. Összetett programozási tételek Ciklus I =l - tól N-ig
Y. ( I ) : =f ( X ( I})
Cik1u a vége
E1j árás vége.
A soronkövetkező feladattípusokban már a bemeneti és a kimeneti oldalon is egy-egy
sorozat jelenik meg, majd a későbbiekben valamelyiket több sorozattal helyettesí�jük. A fejezet elején szereplő példák közül az egyik megoldása:

F23. Magánhangzóra cserélés.

1. Másolás e l emek s z áma : N Máso 1ás ( N , X , Y ) :


bemenet X N db e l em Ciklus I= l - tól N-ig
k i menet Y N db elem Ha magán ( X ( I ) }
Ezt a feladattípust is konkrét példákkal kezdjük, mint tettük azt az előző fejezetben.
f ( 'b ') 'e ' , ha magán ( b } akkor Y (I) : = 'e '
k ülönben 'b' különben Y ( I ) : =X ( I)
F22. Egy osztály tanulóinak átlageredménye alapján határozzuk meg, hogy bizonyítvá­
Ciklus vége
nyukba jeles, j6, közepes vagy elégséges kerül-e! Tegyük fel, hogy bukott tanuló E 1járás vége .

nincs!

F23. Egy szöveg minden magánhangzóját cseréljük ki az e betűre!


2. Kiválogatás
E feladatok közös jellemzője, hogy az eredmény mindig ugyanannyi elemszámú,

mint a bemenet volt, s az i. tagját a bemenet i. tagjából lehet meghatározni. Tehát a be­ Nem minden esetben kell lemásolni a teljes bemenő sorozatot, hanem annak csupán

menő sorozatot le kell másolni, s közben egy -elemre vonatkozó.. átalakítást lehet végez­ egy részére kell korlátozni a vizsgálatot. Legegyszerűbb esetben a "vizsgálat" mindössze

ni rajta.1 elemmásolás. Ilyen feladatok szerepelnek e fejezetben.

F24. Egy személyzeti nyilvántartásban emberek neve és személyi száma szerepel, adjuk
Bemenet N e N a, X e HN , f : H�G
meg a 20 évnél fiatalabb lányokat!
Kimenet XeGN
F25. Adjuk meg egy természetes szám összes osztóját!
ef

uf F26. Adjuk meg egy osztály azon tanulóit, akik jeles átlagúak!

A feladat részben a keresésre hasonlít, részben pedig a megszámlálásra. Adott tulaj­


Az algoritmus:
donságú elemet kell megadni, de nem egyet, hanem az összeset; illetve nem megszámol­
Függvény:
ni kell az adott tulajdonságú elemeket, hanem megadni.
f : H_Elemt ípus � G_E lemtípus
Az eredmény tárolásához egy új tömböt használunk, amelynek elemszámát előre saj­
Vá1tozók:
N Egész [a f e ldolgozandó sorozat e leme i s z áma ] nos nem tudjuk megállapítani, csupán egy felső korlátot ismerünk: a lehetséges elemek
X : Tömb ( l . . N : H E l emt ípus} [a fe ldolgoz andó sorozat]
számát.
Y :::
: Tömb ( 1 . . N : G E lemtípus} [a fe ldolgozott sorozat]
Többféle megoldást készíthetnénk a feladatra. Az első változatban a keresett elemek
A bemenő sorozatból az eredmény elemenként kiszámítható, így nagyon egyszerű
sorszámait gyűjtjük ki egy vektorba. A megoldás hasonlít a megszámolásra, csupán a
megoldást kapunk.
számolás mellett még az elemek sorszámait is feljegyezzük. Éppen ezért e változat neve:

kiválogatás kigyűjtésse/.

Bemenet : N e N 0, X E HN

{l, ha T(x)
"'(x)
=

T :H�l, x:H� { 0, 1}, � .


1 Gyakran e tulajdonságot hlvják elemenkénti feldolgozhat6ságnak. Pontos definlciójával az Adatfeldol­
0, egyébként
gozásról szóló kötetben foglalkozunk.

24 25
összetett programozási.tételek
Programozási tételek

DBeNa, Ye{l . . N }N Kiválogatás ( N , X , DB ,Y ) :


Kimenet
DB : =O
ef
C i klus I = l - tól N-ig
N
Ha T ( X ( I )) akkor DB : =DB+l : X ( DB ) : =X ( I )
uf DB= LX(Xi) és Y �{ 1 . . N } é s 'v' i ( l :Si:SDB ) : T (Xyi)
Ciklus vége
i=l
Eljárás vége.

Az algorümus: � utolsó változatban sem lesz szükség a kihagyott elemekre, de a megmaradtakat


Függ vén y : sem abrjuk mozgatni. Emiatt a felesleges elemek helyére egy speciális értéket teszünk,
T: Elemtipus � Logikai ezzel jelölve a kihagyásukat. Természetesen e megoldás akkor célszerű, ha a későbbi
Változó k : feldolgozások során e speciális érték vizsgálata jóval egyszerűbb, mint maga a kiválo­
N : Egész [ a feldolgozandó sorozat elemei száma ] gatás volt. E módszer neve: kiválogatás kihúzással.
X : Tömb ( l . . N : E l emtipu s ) [ a feldolgozandó s o rozat el emei ]
Kiválogatás ( N , X , DB�Y) :
DB : Egész [ a meg f el el ő el emek s záma ]
Ci klus I=l -tól N-ig
Y : Tömb ( l . .N : E gész) [a megfelelő elemek sorszáma i ]
Ha nem T ( X ( I ) ) akkor X ( I ) : = spe�. érték
Ki válogatás ( N , X , DB , Y ) : Ci klus vége
DB : = O Elj árás vége.
Ci klus I = l - tól N-ig
Ha T ( X ( I ) ) akkor DB : =DB+l : Y ( DB ) : = I Nézzük meg egy feladat megoldását!
Ci klus vége
F26. Jeles átlagú tanulók neve.
Elj árás vége.

Minimális változtatásra lenne szükség, ha nem a sorszámokat, hanem magukat az


el emek száma : N Ki válogatás ( N , X , DB , N EV ) :
tanulók : X N db el em DB : =O
elemeket kellene kigyűjteni. Az Y ( DB ) : =I értékadás helyett az Y ( DB ) : =X ( I ) kell, Rekord ( név,át l a g ) Ci klus I = l - tól N-ig
érdemes a specifikáció átalakulását is meggondolni: jel es s zám DB Ha X ( I ) .átlag�4
jelesek : NEV N db el em akkor DB : =DB+l
N E V ( DB ) : =X ( I ) .név
N
Ci klus vége
uf DB= LX(Xi) és Y �X és 'v'i ( l:Si:SDB ) : T ( Yi)
Elj árás vége .
i=l

A második váltoir.at, a kiválogatás kiírással még ennél is egyszerűbb, ebben nincs


szükség számolásra, a megtalált elemet azonnal kiírhatjuk. Ez természetesen csak akkor 3. Szétválogatás
alkalmazható, ha a kiválogatott elemekre további feldolgozás miatt nincs szükség.
Feltehető az előz.ő fejezetbeli feladattípussal kapcsolatban az a kérdés, hogy mi lesz a
Ki válogatás ( N ,X , DB ,Y ) :
ki nem válogatott elemekkel. E fejezetben erre a kérdésre adunk választ.
C iklus I=l -tól N-ig
Ha T ( X ( I ) ) akkor Ki : X ( I ) F27. Adott N db természetes sz.ám, válogassuk szét a párosakat és a páratlanokat!
Ci klus vége
Elj árás vége. F28. Az osztály tanulóit névsoruk alapján válogassuk szét lányokra, illetve fiúkra!

A harmadik változatban az elemeket gyűjtjük ki, de -feltételezve, hogy az eredeti F29. Az osztály tanulói félévi átlageredményük alapján válogassuk szét jelesekre, jókra,
sorozatra már nincs szükség- ezeket az eredeti vektorban hagyjuk - ez lesz a kiválogatás közepesekre, elégségesekre, valamint elégtelenekre!
helyben. Ehhez módosítjuk az utófeltételt.
Ez egy új feladattípusosztály első tagja: itt egy sorozathoz több sorozatot kell ren­

N delni.
uf DB= LX<Xbe;) és Xki�Xbe é s 'v'i ( l :Si:SDB ) : T ( X ki )
i
i=I E feladatok mindegyike megfogalmazható úgy, hogy végezzünk el egymás után vala­
hány kiválogatást. Az első két feladatban pontosan kettőről van szó, az utolsóban több-

26 27
Összetett programozási_tételek Programozási tételek

Ha az elemeket egyetlen tömbbe helyezzük el, mégpedig úgy, hogy a T tulajdonsá­


röl, de ez utóbbi megoldható úgy, hogy először válogassuk szét jelesekre és a többiekre,
gúakat a tömb elejétől, a nem T tulajdonságúakat pedig a végétől kezdve helyezzük el,
majd a többieket jókra és ... Ezek alapján megállapítható, hogy a szétválogatást elég
akkor N helyet megtakaríthatunk. Ez lesz a szétválogatás egy tömbbe.
megfogalmazni két sorozatra, s ha többről van szó, akkor egyszerűen csak többször kell
Szátválogatás ( N , X , DBY , Y , Z , DBZ ) :
alkalmazni.
DBY : = O : INDZ : =N+ l
A kétfelé szétválogatást azonban felesleges két kiválogatással megoldani, ugyanis Ciklus I = l -tól N-ig
Ba T ( X ( I ) ) akkor DBY : =DBY+ l : Y ( DBY ) : =X ( I )
egyértelmű, hogy amit az első menetben nem válogattunk ki, pontosan azok fognak
különben INDZ : = INDZ - 1 : Y ( I N D ) : =X ( I )
szerepelni a másodikban. Ciklus vége
Elj árás vége .
Az első változatban a kétféle elemet két vektorba válogatjuk szét, ezek elemszáma

sajnos mindkét esetben az eredeti vektor elemszáma kell legyen, ugyanis elképzelhető, Vegyük észre, hogy ebben a megoldásban a nem T tulajdonságú elemek sorrendje az

hogy az összes elemet az egyik vektorba kell majd elhelyezni. eredetihez képest éppen megfordul.

A kiválogatáshoz hasonlóan itt is megoldhatjuk a helyben szétválogatást is, ha nincs


Bemenet : N e N0, XeHN
elemek eredeti sorrendjére. Ehhez az utófeltételt módosítani kell.
T : H�l, x : H� { 0 , 1 } , �
"'(x)
=
{l, ha T(x) .
szükség az

0, egyébként N
uf DB = I z(Xbei) és xki= Permutáció (X bel és
Kimenet í=I

ef 'v'i ( Bi:SDB ) : T (Xil é s 'v'i ( DB<i:SN ) : --,T ( Xi )


N
uf DBY = I z(Xi) és Ys:;;X é s 'v'i ( l :Si:SDBY ) : T ( Yi l és Egyszerű lenne a következő algoritmus: Elindulunk a tömbben elölről és hátulról, s
i=I
keresünk olyan elemeket, amelyeket fel kell cserélni. Ha találunk, akkor cserélünk, majd
DBZ=N-DBY é s Zc;;;X é s 'v'i ( l:Si:SDB Z ) : --,T ( Z i l
folytatjuk a keresést. Mi ennél egy kicsit hatékonyabb változatot fogunk vizsgálni.

Nézzük tehát a szétválogatást két tömbbe! A megoldást úgy végezzük el, hogy a tömb első elemét kivesszük a helyéről. Az
utolsó elemtől visszafelé keresünk egy olyat, amely T tulajdonságú, s ezt előre hozzuk a
Az algoritmus:
kivett elem helyére. Ezután a hátul felszabadult helyre elölről keresünk egy nem T tulaj­
Függvény :
T: Elemtípus � Logi kai donságú elemet, s ha találtunk azt hátratesszük. Mindezt addig végezzük, amíg a tömb­
ben két irányban haladva össze nem találkozunk.
Változók :
Szétválogatás ( N , X , DB ) :
N : Egész [ a feldolgoz andó sorozat e l emei s z áma ]
E : =l : U : =N : segéd : =X ( E )
X : Tömb ( l . . N : Elemt í pus ) [ a feldolgoz andó s o rozat eleme i ]
Ciklus amíg E<U
DBY , DB Z : Egész [a me gfelelő e l emek s z áma ]
Ciklus amíg E<U és nem T ( X ( U ) )
Y , Z : Tömb ( l . . N : Eg é s z ) [ a meg f e l e l ő e l emek sors záma i ]
U : =U-1 [ T tul . elem ker e s é s e ]
Szétválogatás ( N , X , DBY , Y , Z , DB Z ) : Ciklus vége
DBY : =O : DBZ : = O Ha E<U akkor X ( E ) : =X ( U ) : E : =E + l
Ciklus I = l -tól N-ig Ciklus amíg E<U é s T ( X ( E ) )
Ha T ( X ( I ) ) akkor DBY : =DBY+ l : Y ( DB Y ) : =X ( I ) E : =E+l [ nem T tul . e l em kere s é s e ]
különben DBZ : = DBZ+l : Z ( DBZ ) : =X ( I ) ciklus vége
Ciklus vége Ha E<U akkor X ( U ) : =X ( E ) : U : =U - 1
Eljárás vége . Elágazás vége
Ciklus vége
Világos, hogy a két vektor alkalmazásával sok felesleges helyet használunk, hiszen
x ( E ) : =s egéd
2*N helyet foglalunk pedig összesen csak N-re van szükségünk. Ha T ( X ( E ) ) akkor DB : =E különben DB : =E-1
Elj árás vége .

29
28
Programozési tételek
Összetett programozási.tételek

ef x h a lma z f elsorolás és Y halma z felsorolás


Nézzük meg az egyik feladat megoldását, a szétválogatott elemeket egy tömbben el­ N
helyezve elölről, illetve hátulról! uf DB = LX(Xj) és z halma z f e l s o rolás é s
i=l
F27. Párosak-páratlanok szétválogatása �i { l�i�DB ) : ZiEX és ZieY .

A megoldásban válogassuk ki X olyan elemeit, amelyek benne vannak Y-ban! Az al­


e l emek s z áma : N Szétválogatás ( N , X , DB , Y ) :
s z ámok X N db e l em DB : =O : IND : =N+l
.
páros - s z ám DB Ciklus I = l -tól N - ig goritmus tehát egy kiválogatás, amely a belsejében egy eldöntést tartalmaz
eredmény Y N db elem Ha páros ( X ( I ) )
T (i) páros { i ) akkor DB : =DB+l Az algoritmus:
Y { DB ) : =X ( I )
Változók :
különben IND : = I N D - 1
Y { I N D ) : =X ( I ) N , M ..
Eges' z [ a f e ldolgo z andó sorozat e l eme i s z áma ]
Ciklus vége ' ]
Tömb ( l . . N : E l·emtípu s ) [ feldolg oz andó soro z a t o k e e�e i
1
x'Y:
Eljárás vége . [a közös e l eme k s z arna ]
DB : E gesz
,
'' z o
[ a ko
··
s e 1 eme k 'J
z : Tömb ( l . . min ( N , M ) : E gés z )

Metszet { N , X , M , Y , DB , Z ) :
4. Metszet DB : = O
Ciklus I=l -tól N-ig [ k i vá l ogat á s ]

A következő hárgm feladattípus újabb feladattípusosztályba tartozik, ezekben több J : =l


Ciklus amíg J� és X { I ) *Y ( J ) [ e l dönt é s ]
sorozathoz kell egyet rendelni. J : =J+l
Ciklus vége
F30. Adjuk meg két természetes szám osztói ismeretében az összes kö:z.ös osztójukat!
Ha J� akkor DB : =DB+ l : Z { DB ) : =X { I )
F3 l. Nyáron és télen is végeztünk madármegfigyeléseket a Balatonon. Ismerjük, hogy Ciklus vége
Elj árás vége .
nyáron, illetve télen mely madárfajok fordultak elő. Állapítsuk meg ezek alapján,
fela­
hogy melyek a nem költöz.ö madarak! E feladattípus hasonlítható több, az elemi programozási tételek kö:z.ött szerepelt
dattípushoz, ha a feladatot némileg módosítjuk.
F32. Négy ember heti szabad estéi ismeretében állapítsuk meg, hogy a héten melyik este
mehetnek el együtt moziba! Eldöntés: van-e a két halmaznak közös eleme?

Közös jellemz.öjük e feladatoknak, hogy valahány -alapesetben itt is kettő- halmaz Kiválasztás: adjuk meg a két sorozat egyik kö:z.ös elemét
(ha tudjuk, hogy biztosan

elemei közül azokat kell kiválogatnunk, amelyek mindegyikben előfordulnak. E halma­ van ilyen)!
zok elemeit -a többi programozási tétel tárgyalásmódjához hasonlóan- egy sorozatban Keresés: ha van, akkor adjuk meg a két sorozat egyik közös elemét!
(tömbben) felsoroljuk.
Megszámolás: hány közös eleme van a két sorozatnak?
Kérdés: Miért nem a sorozatszámítás tételt alkalmazzuk e feladat megoldására?
Nézzük meg ezek közül például a keresést!
Válasz: A sorozatszámítás tételben halmazokkal végezhettünk műveleteket, itt pedig
olyan sorozatokkal, amelyek halmazelemeket tartalmaznak felsorolva. Emiatt a sorozat­
Bemenet N , M e N o , X e HN , Y e HM , x, : H� { 0 , 1 } , z(x) =
{1, x
0,
eY
.
egyébként
számításban említett, két halmaz közötti metszetműveletet így lehet végrehajtani, ha a
halmazokat sorozatként ábrázoljuk. Kimenet VAN e l , EeH

x h a lma z fe l s orolás é s Y halma z felsor olás


Bemenet N , MeNa, X e HN , Y e HM , x. : H � { 0 , 1 } , ,r(x) =
{
l, x eY
. . .
ef
uf VAN=3 i , j ( l�iSN és l�j � ) : Xi=Y i é s
0, egyébként VAN => 3 i , j { l�i� és l �j � ) : E =Xi= Y j
Kimenet DB e N a , Z e ttmin ( N , M )

31
30
Összetett programozási.tételek Programozási tételek

Változók :
A megoldásban keressünk X-ben egy olyan elemeit, amely benne van Y-ban! Az
algoritmus tehát egy keresés, amely a belsejében egy eldöntést tartalmaz. N , M : Egész [a feldolgozandó sorozat elemei s z ám.a ]
X , Y : Tömb ( l . . N : Elemtipus ) [ feldolgo zandó soro z a t o k eleme i ]
Változók : DB : Egész [ a közös e l eme k s z áma ]
N , M : Egész [a feldolgozandó sorozat eleme i s z áma ] Z : Tömb ( l . . N +M : Egés z ) [ a közös e l eme k ]
X , Y : Tömb ( l . . N : Elemtipus ) [ feldolgozandó s o r o z a t o k e l eme i ] Egyasítés ( N , X , M , Y , DB , Z ) :
VAN : Logikai [ van-e közös e l em] Z : =X : DB : =N [má s o l á s ]
E : Elemtipu s [ egy közös e l em ] Ciklus J=l -tól M-ig [ kiválogatás ]
Mets zetbeli elem ( N , X , M , Y , VAN , E ) : I : =l
I : = l : VAN : =hamis Ciklus amíg I� és X ( I ) *Y ( J ) [ e l döntés ]
Ciklus amíg I�N és nem VAN I : =I + l
J : =l Ciklus yége
Ciklus amíg J� és X ( I ) *Y ( J ) Ha I>N akkor DB : =DB+l : Z ( DB ) : =X ( I )
J : =J+l Ciklus vége
Ciklus vége Elj árás vége .
Ha J� akkor VAN : =ig az : E : =X ( I ) különben I : = I + l
A példák megoldása helyett itt is egy alkalmazást nézzünk: egy sorozatból készítsünk
Ciklus vége
halmazfelsorolást! A feladat tehát az, hogy másoljuk le egy sorozat elemeit, de az azo- ·
Elj árás vége .
nos értékű elemek az eredményben csak egyszer szerepeljenek.

Ez egy furcsa egyesítés, Z=ZuX képlettel írhatnánk le, azaz azokat az elemeket ve­
5. Egyesítés (unió)
gyük bele X-ből az eredménybe,amelyek még nem szerepelnek benne.
Ha halmazokról van szó, akkor a metszet mellett természetesen meg kell jelennie az Halmazfelsorolás_készítés ( N , X , DB , Z ) :
DB : = O
uniónak is.
Ciklus ! = l -től N-ig
F33. Két sz.ám prímosztóinak ismeretében adjuk meg legkisebb közös többszörösük J : =l
Ciklus amíg J�DB és X ( I ) *Z ( J )
prímosztóit!
J : =J+l
F34. Egy iskola két földrajztanára órarendjének ismeretében adjuk meg azokat az órá­ C iklus vége
Ha J>DB akkor DB : =DB+l : Z ( DB ) : =X ( I )
kat, amelyben valamelyikük tud egy órát helyettesíteni!
Ciklus vége
Elj árás vége .
Ebben a feladattípusban tehát azon elemekre vagyunk kíváncsiak, amelyek két hal­
maz közül legalább az egyikben előfordulnak.

y EX 6. Összefuttatás (rendezettek uniója)


Bemenet N , MeNo , X e HN , YeHM , '.)( : H� { O , 1 } , r") =
Xu
{l,
0, egyébként·
Bizonyos esetekben az unió feladattípus megoldása az előző fejezetbelinél hatéko­
Kimenet DB e N o , Z e ttN +M nyabb lehet. Ezt is konkrét feladatokon keresztül vizsgáljuk.
ef X halmaz felsorolás és Y halma z f e l s o r o l á s
F35. Egy osztály lány-, illetve fiútanulóinak névsora alapján állítsuk elő az osztálynév­
N
uf DB= L :X.{X j)
és Z halma z fe l s orolás és sort!
i =l
F36. Egy iskolában négy szakkörre járnak tanulók (van aki többre is). A szakkömévso­
Vi ( l �i�DB ) : ZiEX vagy Zi E Y .
rok alapján állítsuk elő a szakkörre járó tanulók névsorát!
A megoldásban másoljuk le X elemeit Z-be, majd válogassuk ki Y olyan elemeit,
amelyek nincsenek benne X-ben! Az algoritmus tehát egy másolás, majd egy kiváloga­
tás, amely a belsejében egy eldöntést tartalmaz.

32 33
Összetett programozási.tételek Programozási tételek

Megállapíthatjuk, hogy az általános egyesítéshez képest itt az a specialitás, hogy Észrevehetjük a megoldást elemezve, hogy ha olyan szerencsénk volt, hogy X(N)=
mindegyik sorozatként ábrázolt halmaz rendezett, s az eredménynek is rendezettnek kell Y(M), akkor az utolsó két ciklusra tulaj donképpen nincs is szükség, hiszen nem maradt
lenni. másolnivaló. Az a baj , hogy ez a szerencsés eset viszonylag ritkán fordul elő.

Ha nem két sorozatról van szó, akkor az a korábbiaknak megfelelően visszavezethető A második megoldásváltozatban mi magunk idézzük elő e szerencsét: mindkét soro­
két sorozat feldolgozására zat végére egy nagyon nagy (az adott típus legnagyobb értéke), de egyező elemet te­

szünk.

Bemenet N , M eNo, X e HN , Y e HM , x. : H- H O , 1 ) , ,r(y) =


{1,
0,
y �x
egye' bként
. Összefuttatás ( N , X , M , Y, DB , Z ) :
I i = l : J : =l : DB : = O
Kimenet DB e N o , Z e ttN +M X ( N+ l ) : = +oo : Y ( M+l ) : =+oo [ a z el emt ípus maximá l i s értéke ]
Ciklus amíg I<N+l vagy J<M+l
ef X halma z f e l s orolás é s Y halma z f e l s orolás és DB : =DB+l
X rende zett és Y rende z e t t Elágazás
N X ( I ) <Y ( J ) esetén Z ( DB ) : =X ( I ) : I : =I + l
uf DB = L X(Xi)
és Z halma z f e l sorolás és Z rende z e t t X ( I ) =Y { J ) esetén Z ( DB ) : =X ( I ) : I : =I+l : J : =J+l
í =l X ( I ) >Y ( J ) esetén Z ( DB ) : =Y ( J ) : J : =,J+l
és V i ( l SiSDB ) : Z i e X vagy Zi e Y . El.ágazás vége
Ciklus vége
A megoldásban fulladjunk párhuzamosan a két sorozatban! Az eredmény első eleme E l j árás vége .
vagy X J, vagy Y1 lesz. Amelyik kisebb, azt az eredménysorozatba tesszük, abban a so-
Ebben a megoldásban a hozzávett fiktív elem nem kerül be az eredménybe. Ha szük­
rozatban kell továbblépni egy elemmel, s újra egy-egy elemet hasonlítani. Ha egyenlőek
ségünk lenne rá, a ciklus vége után még elhelyezhetnénk az eredmény végére.
voltak, akkor az egyiket másoljuk az eredménybe, majd mindkét sorozatban továbblé­
A harmadik változatban kihasználjuk azt a -nem minden feladatban meglevő- speci­
pünk. Ha az egyiknek a végére értünk, akkor a másikat minden változtatás nélkül az
alitást, hogy a két sorozatban biztosan nincs közös elem. Ilyen például a fejezet elején
eredménybe másoljuk.
szereplő F35 feladat. Ezt az altípust a megkülönböztetés érdekében összefésfilésnek ne­
Változók :
vezzzük.
N , M : Egész [a feldolgoz andó soro z at e l emei s z áma]
X , Y : Tömb ( l . . N : Elemtípus ) [feldolgozandó sorozatok el eme i ) Öss zefésülés ( N , X , M , Y , DB , Z ) :
DB : Egész [a k ö z ö s e l emek s z áma ] I : = l : J : = l : DB : =O
Z: Tömb ( l . . N+M : Egés z ) [ a közös e leme k ) X ( N+l ) : = +oo : Y ( M+ l ) : =+oo [ a z elemtípus maximá l i s érték e ]
Ciklus amíg I <N+l vagy J<M+l
Összefuttatás ( N , X , M , Y , DB , Z ) : DB : =DB+l
I : = l : J : = l : DB : =O Ha X ( I ) <Y ( J ) akkor Z ( DB ) : =X ( I ) : I : =I + l
Ciklus amíg I SN és J::;M különben Z ( DB ) : =Y { J ) : J : =J+l
DB : = DB + l Ciklus vége
Elágazás
E l j árás vége .
X ( I ) <Y ( J ) esetén Z ( DB ) : =X { I ) : I : =I + l
X ( I ) =Y ( J ) esetén Z ( DB ) : =X ( I ) : I : =I+l : J : =J+l
X ( I ) >Y ( J ) esetén Z ( DB ) : =Y { J ) : J : =J+l
Elágazás vége
Ciklus vége
Ciklus amíg I SN
DB : =DB+l : Z ( DB ) : =X ( I ) : I : =I + l
Ciklus vége
Ciklus amíg J::;M
DB : = DB+l : Z ( DB ) : =Y ( J ) : J : =J+l
Ciklus vége
Eljárás vége .

34 35
Programozási tételek

azzal ! Ezzel elérhetjük, hogy a sorozat első helyére a legkisebb elem kerül. Folytassuk
III. Rendezések ugyanezen elven a sorozat második elemével, utoljára pedig az utolsóelöttivel.

Rendezés ( N , X ) :
Ciklus ! = l - től N - 1 -ig
A sorozathoz sorozatot rendelő feladattípus osztály egyik tagját külön vizsgáljuk e
Ciklus J= I + l -től N-ig
fejezetben. Ba X ( I ) >X ( J ) akkor Csere ( X ( I ) , X ( J ) )
Ciklus vége
Az alapfeladat egy N elemű sorozat nagyság szerinti sorba rendezése. A sorozat Ciklus vége
elemei olyanok, amelyekre a <,:5: relációk léteznek. Feltesszük a feladatok mindegyiké­ Elj árás vége . '

ben, hogy a sorozathoz létezik indexelés művelet, s ezt a megoldásban ki is használjuk.


A belső ciklus ciklusfeltétele kiértékelése előtt a sorozat:
Az eredmény a módszerek jelentős részében helyben keletkezik, az eredeti sorrend el­
l=l => 5, 3, 9, 1 , 7 Helyfoglalás: N+ 1
vész. 3, 5, 9, I, 7
3, 5, 9, 1, 7
Hasonlítások száma: N*(N- 1 )/2
Konkrét feladatok ismertetése és megoldása helyett ebben a fejezetben egy számpél­
1 , 5, 9, 3, 7 Mozgatások száma: 0 - 3*N*(N-1 )/2
dát fogunk végignézni az egyes módszereknél. E számsorozat -egy kivétellel- a követ­
1, 5, 9, 3, 7
[a csere mindig 3 mozgatás]
kező lesz: 5, 3, 9, 1 , 7. 1=2 => 1 , 5, 9, 3, 7
1, 5, 9, 3, 7
Bemenet 1, 3, 9, 5, 7
1, 3, 9, 5, 7
Kimenet
1= 3 => 1, 3, 9, 5, 7
ef 1, 3, 5, 9, 7
uf Xki rende z e t t és Xki=Permutáció ( Xbe ) . 1, 3, 5, 9, 7
1=4 => 1, 3, 5, 9, 7
Az algoritmus: 1, 3, 5, 7, 9

Változók :
N : Egész [a feldo l gozandó sorozat e l emei s z áma ]
x : Tömb ( l . . N : H_Elemtipus ) [ a feldolgoz andó so rozat ] 2. Minimumkiválasztásos rendezés
Az egyes módszereket összehasonlítjuk tárigény (a rendezésben résztvevő tároló he- Az előző -egyszerű- módszer hibája a sok felesleges csere. Célszerűbb lenne az aktu­
lyek száma), valamint végrehajtási idő (hasonlítások száma, mozgatások száma) szerint. ális első elemet a mögötte levők közül egyedül a legkisebbel cserélni. Ehhez a rendező
A helyfoglalásba nem számítjuk bele a ciklusváltozókat, a végrehajtási időbe pedig ezek ciklus belsejében cserék helyett egy minimumkiválasztást kell csinálni.
növelését, vizsgálatát, hiszen ezek mérete és ideje nem függ a rendezendő elemek típu­ Rende zés ( N , X) :
sától. Ciklus ! = l -től N - 1 -ig
MIN : = I
A hasonlítások és a mozgatások száma néha nem függ a rendezendő elemek értéké­ Ciklus J=I + l - től N-ig
től, a legtöbb esetben azonban igen, így csak minimális és maximális számukról beszél­ Ha X ( MI N ) >X ( J ) akkor MI N:=J
Ciklus vége
hetünk.
C s e r e ( X ( I ) , X ( MI N ) )
Ciklus vége
Elj árás vége .
1 . Egyszerű cserés rendezés
Itt a számpéldát a külső ciklus ciklusfeltételének kiértékelése előtt vizsgáljuk:

Az első módszer a következő ötletre épül. Hasonlítsuk össze az első elemet a sorozat
összes többi mögötte levő elemével, s ha valamelyik kisebb nála, akkor cseréljük meg

1 A nagy ordó(x) a matematikában szokásos jelölés, jelentése: valamilyen jellemző értékét kifejező poli­
nom legmagasabb hatványkitevöjű tagja x-szel arányos, pl. O(x2) ax2+bx+c típusú mennyiséget jelöl.

36 37
Programozási tételek
Rendezések

1=1 => 5, 3, 9, 1 , 7 Helyfoglalás: N+ 1


4. Javított buborékos rendezés
1=2 => l , 3, 9, 5, 7
Hasonlítások száma: N*(N-1 )/2 Az előző módszer azért nem váltotta be reményeinket, mert nem használtuk ki benne,
1=3 => 1, 3, 9, 5, 7 ·

1 =4 => 1, 3, 5, 9, 7 Mozgatások száma: 3*(N- 1)


hogy az elemek a helyük felé elmozdultak. A legegyszerűbb esetben például, ha a belső
Érdekessége e módszernek az, hogy a mozgatások száma szerencsétlen esetben ciklus egy lefutása alatt egyáltalán nem volt csere, akkor felesleges minden további
rosszabb lehet, mint az előzőé, amelynek javításaként keletkezett. Ez amiatt van, hogy hasonlítás, a rendezéssel készen vagyunk. Ha volt csere, de például a legutolsó a sorozat
itt a külső ciklusban mindenképpen cserélünk. Meg lehetne ugyan vizsgálni, hogy érde­ közepénél volt, akkor ebből tudhatjuk, hogy a sorozat a közepe után biztosan kész,
mes-e cserélni, de ez a vizsgálat a legtöbb esetben növelné a futási időt. rendezett, s csak az előtte levő résszel kell foglalkomi.

Figyeljük tehát minden menetben a legutolsó csere helyét, s a következő menetben

3. Buborékos rendezés csak addig rendezzünk! (Át kell térni 'amíg'-os ciklusra.)

Rende zés ( N , X ) :
Most egy másik rendezési alapelvet vizsgálunk meg: hasonlítsuk egymással a szom­ I : =N
Ciklus amíg I:?:2
szédos elemeket, s ha a sorrendjük nem jó, akkor cseréljük meg őket!
C S : =O
Ezzel a módszerrel egy cikluslépés lefutása alatt a legnagyobb elem biztosan a Ciklus J= l - tól I - 1 - ig
Ha X ( J ) >X ( J+ l ) akkor Csere ( X ( J ) , X ( J+ l ) ) : CS : =J
sorozat végére kerül, s ezen kívül a nagyobb értékű elemek hátrafelé, a kisebbek pedig
Ciklus vége
előrefelé mozdulnak el (innen van a buborékmódszer elnevezés). I : =C S
Ciklus vége
Rende zés ( N , X ) :
Elj árás vége .
Ciklus I=N -tól 2 -ig - 1 -esével
Ciklus J= l-tól I - 1 -ig Az előző módszer számpéldájából sorok maradnak ki:
Ha X ( J ) >X ( J+ l ) akkor Csere ( X ( J ) , X ( J+ l ) )
Ciklus vége 1=5 => 5, 3, 9, 1, 7 Helyfoglalás: N+ 1
Ciklus vége 3, 5, 9, 1, 7
Eljárás vége . 3, 5, 9, 1, 7
Hasonlítások száma: N-I - N*(N-1)/2

3, 5, l, 9, 7 Mozgatások száma: 0 - 3*N*(N- l )/2


Újra a belső ciklusnál nézzük a konkrét rendezési példát:
3, 5, 1, 7, 9
1=5 5, 3, 9, 1 , 7 1=4 3, 5, 1, 7, 9
=> Helyfoglalás: N+ l
=>

3, 5, 9, 1, 7 3, 5, 1, 7, 9
3, 5, 9, 1 , 7
Hasonlitások száma: N*(N-1)/2 3, 1, 5, 7, 9
3, 5, 1, 9, 7 Mozgatások száma: 0 - 3 *N*(N-1)/2 3, 1, 5, 7, 9
3, 5, 1 , 7, 9 1=2 => 1, 3, 5, 7, 9
1 =4 => 3, 5, l , 7, 9 1, 3, 5, 7, 9
3, 5, l , 7, 9 A hasonlítások számában javulást látunk, az igazi javulás azonban nem a minimális
3, l, 5, 7, 9
és a maximális, hanem az átlagos végrehajtási időben van.
3, l , 5, 7, 9
1=3 => 3, 1, 5, 7, 9
l , 3, 5, 7, 9
l , 3, 5, 7, 9 5. Beillesztéses rendezés
1=2 => 1 , 3, 5, 7, 9
1, 3, 5, 7, 9 Újabb rendezési elvvel ismerkedünk meg. Az eddigi módszerek mindegyike olyan

Megállapíthatjuk, hogy a fenti várakozásunk ellenére a hatékonysági jellemzők volt, hogy a sorozatot felosztotta egy már kész, rendezett szakaszra, s a rendezést a má­

egyáltalán nem javultak. sik szakasz elemei között folytatta Másik jellemzőjük volt, hogy a rendezés elkezdésé­
hez már az összes elemnek rendelkezésre kellett állnia.

39
38
Rendezések Programozási tételek

Most a kártyakeveréshez hasonló elvből indulunk ki: egyetlen elem mindig rendezett; 3, 1, 5, 9, 7
ha van egy rendezett részsorozatunk, akkor abba a nagyság szerinti helyére illesszük be 3, 3, 5, 9, 7
1=5 => 1 , 3, 5, 9, 7
a soron következő elemet!
1 , 3, 5, 9, 9
Rende zés ( N , X ) :
Ciklus I = 2 - tól N - ig
J : =I-1 7. Szétosztó rendezés
Ciklus amíg J > O és X ( J ) >X ( J+l )
C s e r e ( X � J ) ,X ( J+ l ) ) : J : = J - 1
A három alaprendezés, s az.ok javításai után speciális rendezésekkel foglalkozunk,
Ciklus vége
Ciklus vége amelyekben előfeltételként speciális megszorításaink lesznek.
Eljárás vége .
A legelsőben feltesszük, hogy a rendezendő elemek olyan rekordok, amelyek kulcs­
A számpélda a belső ciklus feltételénél itt a következőképpen alakul: mezöje (vagy egy abból ki�zámolt számérték) l és N közötti természetes szám lehet, s
1=2 => 5, 3, 9, l , 7 Helyfoglalás: N+l nincs két azonos kulcsú rekord.
3, 5, 9, l, 7
Hasonlitások száma: N-1 - N*(N-1)/2
1=3 => 3, 5, 9, 1, 7 A kulcsmező itt egyértelműen megadja azt a helyet, ahova az elemet tenni kell, így
1=4 => 3, 5, 9, 1 ' 7 Mozgatások száma: 0 - 3*N*(N-1)/2 semmi hasonlításra nincs szükség. A módszerhez az.onban egy újabb tömbre van szük­
3, 5, 1 , 9, 7
ség, ahova az eredményt elhelyezzük.
3, 1, 5, 9, 7 •

1, 3, 5, 9, 7
Bemenet NEN0, X e HN , H= ( kulc s , egyéb )
1=5 => 1, 3, 5, 9, 7
1, 3, 5, 7, 9 Kime n e t YEHN

ef X . kulcs�Permutáció ( [ l , . . . , N ) )

uf Y rende zett és Y=Pe rmutác i ó ( X ) .


6. Javított beillesztéses rendezés
Az algoritmus:
Észrevehetjük az előző módszernél, hogy a beillesztő ciklusban a legtöbb elem egy­
Válto zók :
szer mozdul el, a beillesztendő visz.ont soksz.or. Ezt a sok mozgást is csökkenthetjük
N : Egész [a feldolgoza ndó sorozat elemei s z áma ]_
egyetlenegyre úgy, hogy a beillesztendőt nem tesszük az.onnal be a sorozatba, hanem X , Y : Tömb ( l . . N : H_Elemtípu s ) [ a két soro z a t ]
csak a többieket tologatjuk hátra, s a beillesztendőt csak a végén tesszük a helyére. Rendezés ( N , X , Y ) :
Rende zés ( N , X ) : Ciklus I = l - tól N-ig
Ciklus I = 2 - től N-ig Y ( X ( I ) . kulcs ) : =X ( I )
J : = I - 1 : Y : =X ( I ) Ciklus vége
Ciklus amíg J>O és X ( J ) >Y Elj árás vége .
X ( J+ l ) : =X ( J ) : J : =J-1
Ciklus vége Itt a speciális feltétel miatt meg kell változtatnunk a példasorozatot: 3, 2, 5, l , 4
X ( J+ l ) : =Y (most csak a kulcsmező értékét tároljuk). A feladat másik specialitása miatt pedig két
Ciklus vége
sorozatot kell adnunk, a bemenetet és az eredményt. Az eredmény még nem kitöltött
Elj árás vége .
tagjait jelöli.
Az elemek mozgatása miatt e példában a kivett elem visszahelyezéséig egyes elemek
Bemenet: 3, 2, 5, 1, 4 Helyfoglalás: 2*N
kétszer szerepelnek.
Kimenet: l=l => ®, ®, ®, ®, ® Hasonlítások száma: 0
1=2 => 5, 3, 9, 1 , 7 Helyfoglalás: N+ 1 1=2 => ®, ®, 3, ®· ®
Mozgatások száma: N
5, 5, 9, 1, 7 2 I=3 => ®, 2, 3, ®, ®
1=3 => 3, 5, 9, 1, 7 Hasonlítások száma: N-1 - N*(N-1 )/2 O(n ) 1=4 => ®, 2, 3, ®, 5
Kulcsmezöindexelés : N

1=4 => 3, 5, 9, 1, 7 2 1=5 => 1, 2, 3, ®, 5


Mozgatások száma: 2*(N-l) - 2*(N-l)+N*(N-l )/2 O(n )
3, 5, 1 , 9, 7 1=6 => l , 2, 3, 4, 5

40 41
Rendezések Programozási tételek

8. Számlálva szétosztó rendezés A második ciklusban:


DB: Kimenet:
Egy kicsit kevesebbet követel előfeltételként a következő rendezés: itt az elemek J-2 => 1 , 0, 1 , 0, 2, 0, 1 1=1 => ®, ®, ®, ®, ®
kulcsmezője lehet az [l ,N]-nél szélesebb intervallumban is és nem szükséges feltétel a J=3 => 1 , 1 , 1 , 0, 2, 0, 1 1=2 => ®, ®, ®, 5, ®
J=4 => 1, 1 , 2, 0, 2, 0, 1 1=3 => ®, 3, ®, 5, ®
kulcsok különbözősége.
J=5 => 1 , 1, 2, 2, 2, 0, 1 1=4 => ®, 3, 5, 5, ®
XeHN, H= ( ku l c s , egyéb ) J=6 => 1, 1, 2, 2, 4, 0, 1 1=5 => 1, 3, 5, 5, ®
Bemenet N , MeN0,
J=7 => 1, l , 2, 2, 4, 4, 1 1=6 => l , 3, 5, 5, 7
Kimenet Y e HN l , 1 , 2, 2, 4, 4, 5

ef Vi ( l �iSN): Xi . kulc s e { l . . M } Helyfoglalás: 2*N+M*e Hasonlítások száma: 0

uf Y rende zett é s Y=Permutáció ( X ) . Mozgatások száma: N Kulcsmezőindexclés: 5*N

Itt első lépésként számoljuk le minden lehetséges kulcsértékre, hogy hány ilyen ér- '
tékű elem van! Mivel a kulcsértékekkel indexelhetünk, ezért a számlálás egyetlen in­
9. Számláló rendezés
dexeléssel elvégezhető minden elemre.
Az egyszerű cserés módszer mozgatásaínak számát is javíthatjuk az egyik újabb
Másodjára minden lehetséges kulcsértékhez határozzuk meg a nála kisebb vagy módszer, a szétosztó rendezés segítségével. A cserés rendezésnél ne cserélgessük az ele­
egyenlő kulcsú rekordok számát! meket, hanem csak számoljuk meg mindegyikre, hogy hány nála kisebb, illetve az őt

Harmadik lépésként minden elemet közvetlenül a helyére helyezhetünk a fenti infor­ megelőzők között hány vele egyenlő van (magát is beleértve). Ezzel a rendezendő adat­

máció alapján. sorhoz a [O,N-1] intervallum egész számainak egy permutációját rendeltük. Ez a per­
mutáció lehet a bemenete a szétosztó rendezésnek.
Renclezés ( N , X ) :
DB ( 1 . . M ) : = ( 0, . . . , 0) Rendezés ( N , X ) :
Ciklus I = l -tól N-ig DB ( l . . N ) : = l [ a t ömb l - e s értékekkel feltölté s e ]
DB ( X ( I ) . kul c s ) : = DB ( X ( I ) . ku l c s ) + l Ciklus I = l - tól N - 1 -ig
Ciklus vége Ciklus J= I + l - tól N-ig
Ciklus J=2 - tól M-ig Ba X ( I ) >X ( J ) akkor DB ( I ) : = DB ( I ) + l
DB ( J ) : =DB ( J ) + DB ( J- 1 ) különben DB ( J ) : =DB ( J ) +l
Ciklus vége Ciklus vége
Ciklus I = l - tól N-ig Ciklus vége
Y ( DB ( X ( I ) . ku l c s ) ) : =X ( I ) Ciklus ! = l - től N-ig
DB ( X ( I ) . ku l c s ) : = DB ( X ( I ) . ku l c s ) - 1 Y ( DB ( I ) ) : =X ( I ) [ s zétosztó rende zés ]
Ciklus vége Ciklus vége
Eljárás vége . Elj árás vége .

Itt a speciális rendezés miatt újabb példasorozatot vizsgálunk: 5, 3, 5, 1, 7. A beme­ Újra az eredeti számsorozatot vizsgáljuk (5, 3, 9, 1, 7):
net mellett először a DB vektor értékeit közöljük, majd az eredményt. A DB vektor értékei: Az eredmény:
I=l => l, 1 , 1 , 1 , l Helyfoglalás: 2*N+N*e l=l => ®, ®, ®, ®, ®
Bemenet: DB:
2, l , l , 1 , 1 1=2 => ®, ®, 5, ®, ®
5, 3, 5, 1 , 7 1=1 => 0, 0, 0, 0, 0, 0, 0
2, l, 2, 1, 1 Hasonlítások száma: N*(N-1 )/2 1=3 => ®, 3, 5, ®, ®
1=2 => 0, 0, 0, 0, 1 , 0, 0
3, 1, 2, 1, 1 1=4 => ®, 3, 5, ®, 9
1=3 => 0, 0, 1 , 0, 1, 0, 0 Mozgatások száma: N
3, 1 , 2, 1, 2 1=5 => 1, 3, 5, ®, 9
1=4 => 0, 0, 1, 0, 2, 0, 0
1=2 => 3, 1 , 2, 1, 2 2-szeres indexelés: N 1=6 => 1 , 3, 5, 7, 9
1=5 => 1 , 0, 1 , 0, 2, 0, 0
3, 1, 3, 1, 2
1=6 => 1 , 0, 1 , 0, 2, 0, 1
3, 2, 3, 1, 2
3, 2, 3, 1, 3
1=3 => 3, 2, 3, 1, 3

42 43
Rendezések

3, 2, 4, 1 , 3
3, 2, 5, 1, 3 IV. Keresések
1=4 � 3, 2, 5, 1, 3
3, 2, 5, 1, 4
Ebben a fejezetben kétféle speciális keresési feladattal foglalkozunk. Az elsőben egy
adott értékű elem megkeresése a feladat egy rendezett sorozatban, a másodikban pedig
10. Rendezés Shell módszerrel
N db sorozatban kell keresnünk egy-egy értéket úgy, hogy azok egymásnak valamilyen

Sokat javíthat a rendező módsz.eren, ha először a nagy távolságú elemeket hasonlít­ szempont szerint megfeleljenek.

juk és cseréljük, mert így az egyes elemek nagyon gyorsan közel kerülhetnek a végleges
helyükhöz. Ha egy rendezés ezt az információt kihasználja, akkor az eredetinél lénye­
1 . Keresés rendezett sorozatban
gesen jobbat kaphatunk. Ilyen módszer például a beillesztéses rendezés.

A használt lépésköz többféle lehet, közös jellemzöjük, hogy szigorúan monoton Ebben az esetben tehát adott egy rendezett sorozat, amelyben egy adott értékű elem

csökkenők, s utoljára éppen 1 az értékük. sorszámát kell meghatározni, ha az benne van a sorozatban.

Rende zés ( N , X ) : Bemenet NeNo, X e HN , YEH, T : H� L


L : =L O
Ciklus 8míg 12::1 [ l épé s k ö z - c i klu s ] Kimenet VAN e L , SORS Z e N
Ciklus K= L + l -tól 2 *L-ig [ K : a z L . ré s z sorozat 2 . e l eme ) ef Rende z et t ( X )
Ciklus !=K-tól N-ig L-esével
J : = I - L : Y : =X ( I ) [ j avított be i l l e s z téses rende zé s ) uf VAN = (3i ( l �i�N ) : X i =Y ) és
Ciklus amíg J>O és X ( J ) >Y VAN => l�SORSZ�N és X soRsz= Y
X ( J+L) : =X ( J ) : J : =J-L
Ciklus véqe
Az algoritmus:
X ( J+ L ) : =Y
Ciklus vége Változók :
Ciklus vége N : Egész [a f e l dol g o z andó s o r o z a t elemei s z áma ]
L : =Követke z ő ( L ) X : Tömb ( l . . N : E l emt ípus ) [ a f e l d o l g o z a n dó s or o z a t e l eme i )
Ciklus véqe Y : E lemt ípus [a keresett e l em ]
Eljárás vége . VAN : Logikai [ a z e redmény - v a n - e meg f e l e l ő e l em ]
SORS Z : Egész [ a z er edmény - a me g f e l e l ő elem s o r s z ám a ]
k
Az L értékének meghatározására többféle módszer van. Lehetséges, hogy 2 -1 alakú,
Próbáljuk először a lineáris keresést alkalmazni e feladat megoldására! A feladat spe-
lehetséges, hogy Fibonacci szám alakú. Kezdőértékként mindenképpen olyan értéket
cialitásából következik, hogy ha egy, a keresett elemnél nagyobb értékű elemet találunk,
kell meghatározni, amely nem lépi túl az N értékét, majd a Következő függvény így
akkor a keresett elem már biztosan nem fordulhat elő, a keresést be lehet fejezni. Emiatt
alakul :
a program utófeltétele a következő lesz:
k
Következő ( L ) : [ 2 - l a l akú e s e tb e n ]
Köve t k e z ő : = ( L+ l ) / 2 - 1 uf : VAN � (3í ( l �i�N) : X i =Y ) és VAN � lsSORSZ� é s
Eljárás vége .
X soRsz=Y é s V i ( l�i <SORSZ ) : X i <Y
Következő ( L ) : [ Fibonacci s z ám al akú e s e tben2 )
L2 : =L-L l : L : =Ll : Ll : =L2 : Követke ző : =Ll Keresés ( N , X , Y , VAN , SORS Z ) :
Eljárás véqe . I : =l
Ciklus amíg I� és X ( I ) <Y
I : =I + l
Ciklus vége
VAN : = ( I�N ) és X ( I ) =Y
Ba VAN akkor SORS Z : = I
2 Ha Ll és L egymás utáni Fibonacci számok, akkor L2 az előzö Fibonacci szám lesz. A módszernél Elj árás vége .
nyilván előre adott az LO (kezdő L) és az Ll értéke.

44 45
Keresések Programozási tételek

Nézzük meg, hogy e keresést milyen hasonlitis-szám jellemez! Ennek a keresésnek is meg lehet alkotni a rokonait, mint azt tettük a lineáris keresés­

1 sel, az.az készíthetünk belőle eldöntést, kiválasztást, megszámolást, kiválogatást. Ezek


Minimum:
közül nézzük meg a kiválogatást!
Átlag: {N+l)/2

Maximum: N A módosított specifikáció:


Az átlagos hasonlítás-számban szereplő lin� összefüggés miatt hívják e keresést
Bemenet N e N a , XeHN , Y E H , T : H�L
lineáris keresésnek.
Kime n e t VAN el, SORSZ eN , E , UeN
Logaritmikus keresés ef Rende z e t t ( X )

A rendezettséget (és az indexelhetőséget) rruí!lléppen is kihasználhatjuk. Vizsgáljuk


uf VAN = ( 3 i ( l:S:i:S:N ) : Xi=Y) é s
meg első lépésben a sorozat középső elemét! Ila ez a keresett elem, akkor készen va­
VAN ::::> l:S:E:S:U:S:N é s Vi ( E:S:i:S:U ) : X i=Y
gyunk. Ha a keresett elem ennél kisebb, akkor cS!H. az ezt megelőzőek között lehet, tehát
Nyilvánvaló, hogy az azonos értékű elemek itt mindenképpen egymás mellett fognak
a keresést a továbbiakban a sorozatnak arra a lllCszére kell alkalmazni. Ha a keresett
szerepelni, azaz a kiválogatáshoz elég megadni az első, illetve az utolsó ilyen elem
ennél nagyobb, akkor pedig ugyanezen elv alapjllanl a sorozat ezt követő részére.
sorszámát. Ezt úgy tesszük meg, hogy a logaritmikus keresés után előre, illetve hátrafelé
Ez a megoldás szintén az utófeltételt módosítja, szigorítja. Itt az előzővel ellentétben megkeressük az utolsó megfelelő elemet.
nem lehet tudni, hogy a megtalált érték az azono s értékűek közül az első, az utolsó, vagy Kiválogatás ( N , X , Y , VAN , E , U) ;
pedig valamelyik középső lesz. E : = l : U : =N
Ciklus
uf : VAN s (3i ( l:S:i:s:N ) : X i=�� VAN => l:S:SORSZ:s:N é s
és K : = [ ( E + U ) /2 ]
X soRsz = Y és.Vi ( l:S:i<SORSZ ) : Xi�Y é s Elágazás
Y<X (K) esetén U : =K- 1
V i ( SORS Z<L�N ) : Xi�Y Y>X ( K ) esetén E : =K+l
Elágazás vége
Keresés ( N , X , Y , VAN , SORS Z ) : amíg E:S:U és X ( K ) #Y
E : =l : U : =N Ciklus vége
Ciklus VAN : = ( E:S:U )
K : = [ ( E+U ) / 2 ] ( E +U f e l é n e k egé s z é r t é k e ]
Elágazás Ha VAN akkor akkor E : =K
Y<X ( K ) esetén U : =K- 1 Ciklus amíg E>l és X ( E - l ) =Y
Y>X ( K ) esetén E : =K+ l E : =E - 1
Elágazás vége Ciklus vége
U : =K
amíg E:S:U és X ( K) #Y
Ciklus vége Ciklus amíg U<N és X ( U+l ) =Y
VAN : = ( E:S:U ) U : =U+l
Ciklus vége
Ha VAN akkor SORS Z : =K Elágazás vége
Eljárás vége . Eljárás vége .
Minimum:
Átlag: log2(N)

Maximum: log2(N)+ 1 2. Visszalépéses keresés (backtrack)


Az átlagos hasonlítás-számban szereplő logariltmikus összefüggés miatt hívják e ke­
Újra konkrét feladatokkal kezdjük e feladattípus ismertetését.
resést logaritmikus keresésnek, illetve a sorozat felezésére utalva felezéses vagy bináris
keresésnek. F37. Helyezzilnk el egy sakktáblán 8 vezért úgy, hogy egyik se üsse a másikat!

46 47
Keresések Programozási tételek

F38. Egy vállalat N db mtmkára szeretne mtmkásokat felvenni. Jelentkezik N db mun­


uf : VAN=3YeNN : Megoldá s ( Y ) és VAN=> Megoldá s ( X )
kás, mindegyik megmondja, hogy milyen mtmkát tudna elvégezni. Osszuk el közöt­ De f i n í ci ó : Megoldás ( X ) = ( Vi ( l :o;i� ) : 1:o;xi� i é s
tük a mtmkákat úgy, hogy mindenkinek jusson mtmka, s minden mtmkát elvégezze­ 'll'i , j ( l :o;j <i � ) : f k ( i , S i (X i ) , j , S j (X j ) ) é s ft ( i , S i ( X i ) ) )
nek!
Változók :
F39. N db közért M db pékségtől rendelhet kenyeret. Ismerjük a közértek kenyérigé­ N : Eqész [ a f e l do l g o z andó s o r o z a t s z áma ]
nyét, a pékségek sütési kapacitását, valamint azt, hogy melyik közért mely pékségek­ M: . . N : Eqész )
Tömb ( l [ a f e l do l g o z andó s o r o z a t o k e l ems záma ]
VAN : Loqikai [ v a n - e me g f e l e l ő e l emsoroza t ]
kel áll kapcsolatban. Adjuk meg, hogy melyik közért melyik pékségtől rendelje a ke­
X : Tömb ( l . . N : Eqész ) [ a meg f e l e l ő e l eme k s o r s z áma ]
nyeret, ha mindegyik csak egyetlentől rendelhet!
A megoldás legfelső szintjén keressünk az I. sorozatból megfelelő elemet! Ha ez
E feladatok közös jellemzője, hogy eredményük egy sorozat. E sorozat minden egyes
sikerült, akkor lépjünk tovább az I+ 1. sorozatra, ha pedig nem sikerült, akkor lépjünk
tagját valamilyen sorozatból kell kikeresni, de az egyes keresések összefüggenek egy­
vissza az I- 1 .-re, s keressünk abban új abb lehetséges elemet!
mással (vezért nem lehet oda tenni, ahol egy korábban letett vezér ütné; egy munkát
A keresés befejeződik, ha mindegyik sorozatból sikerült elemet választantmk (I>N)
nem lehet két munkásnak adni; ha egy pékségnek elfogyott a kenyere, akkor attól már
vagy pedig a visszalépések miatt már az elsőből sem tudunk újabbat választani (I<l).
nem lehet rendelni).
Kere sés ( N , M , X , VAN ) :

Beme n e t : Ne No, M e NN , 'Ifi ( l :o;i:o;N) : SiEH i,


M I : =l : X ( l . . N ) : = ( 0 , . . . , 0 )

*
Ciklus amíq I�l és 1:o;N
fk: NxHxH -+L , ft : NxH-+L Jó_e s e t_kere s é s ( M , X , I , m e l y i k , VAN )
Ha VAN akkor X ( I ) : =me lyi k : I : = I + l [ e lőre l é p ]
Kimenet VAN e L , xe N N különben X ( I ) : =0 : I : =I - 1 [ vi s s z a l é p ]
Ciklus véqe
ef 'll'X e NN : fk ( i , s i ( Xi ) ; S 1 (X 1 ) . . . S i-1
( X i - l l ) => VAN : = ( I;<:l )
V j <i : f k ( j , S j ( X j ) ; . . . ) Eljárás véqe .
N VAN=> Megoldás ( X ) Egy lineáris keresés kezdődik az I. soro?.atban:
uf : VAN=3 Y e N : Megoldás ( Y ) és

Definíc i ó : Megoldás ( X ) = ( 'Ifi ( l:o;i� ) : 1:o;x i �i é s 'If i (1 :-;; i � ) : Jó_eset_keresés (M, X , I , me l y , VAN ) :
me l y : =X ( I ) + l
f k ( i , S i ( X i ) , S 1 ( X 1 ) , . . . , si - l ( X i - l l ) és f t ( i , S i ( Xí ) ) ) 1
Ciklus amíq me l y� ( I ) és
( R o s s z_e set ( I , X , me l y ) vaqy nem f t ( I , me l y ) ) 2
Megállapíthatjuk tehát, hogy minden egyes új választás az összes korábbitól függhet me l y : =me l y + l
(ezt formalizálja azjk függvény), a későbbiektől azonban nem! Egyes esetekben nem­ Cikl.us véqe
VAN : = ( me l y� ( I ) )
csak a korábbiaktól, hanem saját jellemzöjétől is függhet a választás (ezt írja le az .fi
Eljárás véqe .
függvény).
A Rossz_eset függvény az általános esetben a feladattól függő fk függvény kiszámo­
Egyes speciális esetekben a korábbiaktól függés a korábbi elemekre külön-külön
lását jelenti, a fenti speciális esetben pedig egy eldöntés!. Ez utóbbit nézzük meg!
megvizsgálható (F3 7, F3 8), ekkor az előfeltétel triviálisan igaz:
Rossz_eset ( I , X , me l y ) :

N M J : =l
Bemenet : NeNa, MeN , 'Ifi ( i:o;i:o;N ) : s iEH i , Ciklus amíq ,J< I és f k ( I , me l y , J, x ( ,J ) )
f k : NxHxNxH-�L , ft : NxH�L J : =J+l

N Cikl.us véqe
Kime n e t VAN EL, xe N Ro s s z e s e t : = ( J<I )
EJ.j árás-véqe .
ef

1 Szavakkal megfogalmazva: az X akkor megoldás, ha minden X, önmagában helyes, valaniint az össze$


2 A specifikác!ótól eltérünk! Az fi paramétereként az S(mely) az algoritmus végrehajtása közben
öt megelözö X-beli elem szerint is helyes. általában semmit sem mond, ezért nyugodtan helyettesíthetjük magával a 'mely'-lyel.

48 49
Keresések
Programozási tételek

Az alábbiakban meggondoljuk, hogy miként lehet a fenti keresés tételpárjainak ló pontnak vegyünk egy fiktív kezdőértéket, amely minden lehetséges megoldásnál biz­
(eldöntés, kiválasztás stb.) backtrack-es változatait megkonstruálni. A fenti megoldást tosan rosszabb !
könnyen átalakíthatjuk e/döntéssé, kiválasztássá, megszámolássá, valamint kiválogatás­ Minimumkeresés ( N , M , VAN , Y ) :
sá. Az első kettő a legfelső szint minimális átalakítását igényli, a megszámolást a kivá­ I : =l : X ( l . . N ) : = ( 0 , . . . , 0 ) : DB : = O

logatás felhasználja, így ez utóbbit fogalmazzuk meg.


VAN : =hami s : E : = +oo [ f i kt í v ér t é k ]
Ciklus amíg I<:'.1
Jó_e s e t_keres é s ( M , X , I , me l y i k , VAN JO)
Beme net : N E N o , MEN N , V'i ( 1:5i:5N ) :
M
SiEH ; , Ha VANJO akkor X ( I ) : =me l y i k : I : = I + l [ e l ő relép]
fk : NxHxNxH�L , ft : NxH�L különben X ( I ) : = 0 : I : =I-1 [ v i s s z alép]
N *
Ha I >N akkor VAN : =ig a z : I : = I - 1
Kimenet DB E N , Y E (N ) . Ha kt ( X ) <E akkor Y : =X : E : = kt ( X )
/
ef Ciklus vége
Eljárás vége .
uf DB=a me g o l dá s o k s z ámának s z o k á s o s me g f o g a lma z á s a
és Vj ( 1:5j :5DB ) : Megoldás ( Y j l é s Y halma z f e l s o r o l á s A visszalépéses minimumkeresés hatékonyabb lehet abban a speciális esetben, ha a

költségfüggvényt az egyes elemekre vett elemibb értékfiiggvényei összegeként (feltéve,


A kiválogatás alapgondolata: ha egy megoldást megtaláltunk, akkor azt írjuk ki, majd
hogy ezek nemnegatív értékek) kell kiszámolni, azaz ha:
lépjünk vissza, mintha ez nem is .lenne megoldás.
N

Kiválogatás ( N ; M , DB , Y ) : kt(X ) = L;ertelem(X; )


i=l
I : =l : X ( l . . N ) : = ( 0 , . . . , 0 ) : DB : =O
Ciklus amíg r;:,:1 Ekkor ugyanis a teljes megoldás elkészülte előtt is felfedezhetjük, hogy az éppen ké­
Jó e s et kere sés ( M , X , I , me l yi k , VAN ) szülő megoldás lehet-e még jobb az eddigi legjobbnál.
Ha-VAN akkor X ( I ) : =mely i k : I : = I + l [ el ő r e l é p ]
különben X ( I } : = O : I : =I - 1 [v i s s z a l é p ] Minimumkeresés ( N , M , VAN, Y ) :
I : =l : X ( l . . N) : = (0, . . . , 0 ) : DB : = O
Ha I>N akkor DB : =DB+ l : Y ( DB ) : =X : I : =I - 1
VAN : =hami s : E : = +oo [ f i ktív ér ték]
Ciklus vége
Elj árás vége . Ciklus amíg r ;:,: 1
Jó_e s et_k e r e s é s ( M , X , I , me l y i k , VANJO )
A legtöbb esetben nagyon sok megoldást kapunk, így a kiválogatást általában nem Ha VANJO és k t ( X ) + e r t e l em ( me l y i k ) < E
kigyűjtéssel, hanem kiírással végezzük. Van azonban egy eset, amelyben tartósabban akkor X ( I ) : =mel y i k : I : = I + l
különben X ( I ) : = 0 : I : =I - 1
szükség lehet az eredményekre: ez a minimumkeresés. H a I >N akkor VAN : = i ga z : I : =I - 1 : Y : =X : E : = kt ( X )
Ebben a feladatban a valamilyen szempontból legjobb megoldást kell megadnunk.
Ciklus vége
Eljárás vége .
Megadunk egy k t költségfüggvényt, ami alapján az egyes megoldásokat összehasonlít�
A visszalépéses keresés egy másik változatában nem rögzített elemszámú az ered­
hatjuk.
mény. Egy lehetséges esetben meg kell adni minden olyan (korlátozott elemszámú) so­
N M rozatot, amelyet egy nem megfelelő elem zár le.
Bemenet : NENo, MEN , V'i ( 1:5i :5N ) : SiEH ;,
f k : NxHxNxH�L, ft : NxH�L, kt : H*�N
Def i ní c i ó : Megoldá s ( X ) =3K ( 1 :5K:5N ) : ( V'i ( 1 :5i:5K ) : 1:5X i :5M i é s
Kimenet Vi , j ( 1:5j <i:5N ) : f k ( i , S i ( X i ) , j , S j ( X j ) ) é s ft ( i , S i ( X i ) ) é s

ef (3j ( 1 :5j < K:5N ) : f k ( K , S K ( X i l , j , S j ( X j ) ) vagy f t ( K , S K ( X K ) ) ) )

uf VAN=3YeNN : Megoldá s ( Y ) és VAN=> Alakítsuk át a korábban szerepelt ki válogatási algoritmust úgy, hogy a belső ciklus
( Megoldá s ( X ) é s V'Y : Megoldás ( Y ) =>kt ( Y ) ;:o:kt ( X ) )
állj on le, ha vissza kellene lépni! Ekkor jegyezzük fel az aktuális állást, lépjünk vissza,

majd folytassuk a keresést!


Az algoritmusban a kiválogatásra alapozva állítsunk elő egy megoldást, ezt hasonlít�
suk össze az eddigi legjobb megoldással, s ha jobb nála, akkor ezt őrizzük meg! Kiindu-

50 51
Keresések Programozási tételek

Kiválogatás ( N , M , DB , Y ) : Jó_eset_kere sés ( M , X , I , me l y , VAN ) :


I : = l : X ( l . . N ) : = ( 0 , . . . , 0 ) : DB : = O me l y : =X ( I ) + l
Ciklus amíg I�l Ciklus amíg mel y$M ( I ) és R o s s z_eset ( I , X , me l y )
VANJO : =i g a z me l y : =me l y+ l
Ciklus vége
Ciklus amíg I�l és I � és VANJO
Jó e s et keresés ( M , Y , I , me l y i k , VANJO ) VAN : = ( me l y91 ( I ) )
X ( I ) : =mel yi k : I : = I + l Elj árás vége .
Ciklus vége Rossz ese t ( I , X , me l y ) :
Ha nem VANJO akkor DB : = DB + l : Y ( D B ) : =X : I : =I-1 J : =l
Ciklus vége Ciklus amíg J<I és nem (mel y=X ( J ) vagy I - J= l mel y - X ( J ) JJ4
Elj árás vége . J : =J+l
Ciklus vége
Itt is megvizsgálhatnánk a legjobb megoldás algoritmusát, de ezt az előző minimum­
Ro s s z e s e t : = ( J< I )
-
kereséshez való hasonlósága miatt az Olvasóra hagyjuk. Elj árás vége .

Egy másik lehetséges esetben nem tudjuk, hogy az eredmény hány elemű, csupán a:zt, F38. N ember - N munka
hogy mikor van készen. Ezt a ké s z ( X ) fogikai értékű függvény adja meg.
A megoldást két változatban készítjük el. Az elsőben az egyes emberek által végez­
Kiválogatás ( N , M , bB , Y ) :
hető munkákat egy-egy sorozatban tároljuk.
I : = l : X ( l . . N ) : = ( O , . . . , 0 ) : DB : =O
Ciklus amíg . I�l és nem ké s z ( X ) az emberek és az állások száma
N
J ó e s e t kere s é s ( M , X , I , me l y i k , VAN )
-
Ha VAN ikkor X ( I ) : =me l yi k : I : = I + l [ előrelép] M(i) az i. ember által végezhető munkák száma
különben X ( I ) : = O : I : =I-1 [ vi s s z a l é p ]
Ciklus vége S (iJ) az i. ember által végezhető j. munka
Elj árás vége .
ft(iJ)=igaz azonosan igaz függvény
Nézzük meg a fejezet elején közölt feladatok megoldását!
fk(iJ,k,l)=(S(ij}1'S (k ,l)) nem végezhetnek azonos munkát
F37. 8 vezér a sakktáblán
Itt is a két belső eljárást kell újrafogalmazni.
Oszloponként egy-egy vezért helyezünk el, a sakktáblán 8 oszlop, oszloponként 8 sor
Jó eset keresés ( M , X , I , mely , VAN ) :
van. Bármelyik két vezér akkor van helyesen elhelyezve, ha nincsenek azonos sorban me l y : ";;;X ( I ) + l
vagy azonos átlóban. Ciklus amíg me l y91 ( I ) és Ro s s z_e s e t ( I , X , me l y )
me l y : =me l y + l
N=8 a sorozatok száma, Ciklus vége
VAN : = ( me l y$M ( I ) )
M(i)=N mindegyik sorozat elemszáma egyforma . E ljárás vége .

ft(a,b) = igaz azonosan igaz függvény3 Ros s z_e s e t ( I , X , me l y ) :


J : =l
fk(iJ,k,l) = nem G=l vagy 1 i-k 1 = l j -1 I ) Ciklus amíg J<I és S ( J , X ( J ) ) *S ( I , me l y )
J : =J+l
A keresés legfelső szintje változatlan, a két további eljárást kell újrafogalmazni. Ciklus vége
Ros s z_e s e t : = ( J< I )
Elj árás vége .

4 I biztosan nagyobb, mint J, ezért nem kell 1 1-J l -nél az abszolút érték.
3 A vezér önmagában bárhova tehető.

53
52
Programozási tételek
Keresések

Újra a két belső eljárást fogalmazzuk meg;


A második változatban az emberek tudását egy mátrixban !tároljuk, amelyben egy
ember és egy munka sorszámához rendelünk igaz vagy hamis értéket aszerint, hogy az
Jó eset keresés ( M , X , I , me l y , VAN ) :
rne l y : ;;:X ( I ) + 1
ember azt a munkát el tudja-e végezni vagy sem. Ciklus amíg me ly:.:;;M ( I ) és ( Ro s s z e s e t { I , X , me l y ) vagy
nem KAPCS { I , me l y ) )
N az emberek és az állások száma
me l y : =me l y+ l
Ciklus vége
N az i. ember által végezhető munkák száma
VAN : = { me l y$;M { I ) )
S(ij) az i. ember el tudja-e végezni a j . munkát Eljárás vége .

Rossz ese t { I , X , me l y ) :
ft(ij )=S (ij)
S : =O
tk.(iJ ,k,l )= G *l) nem végezhetnek azonos munkát Ciklus J= l - től I - ig
Ha X { I ) =X { J ) a�kor S : =S + I GENY { J )
Megint a két belső eljárást fogalmazzuk újra. Ciklus vége
Ro s s z e s e t : = { S > KAPAC I TAS (me l y i k ) )
Jó eset keresés ( M ,. X , I , me l y , VAN ) : -
Eljárás vége .
me l y: :::x ( I ) .+ l
Ciklus amíg me l ySM ( I ) és ( Ro s s z_e set ( I , X , me l y ) vagy Elképzelhető, hogy e feladatnak nincs megoldása. Ekkor módosítsuk úgy a feladatot,
nem S { I , me l y ) ) hogy olyan megoldást adjunk, amelyben a lehető legtöbb közért kap kenyeret valame­
me l y : =me l:t+ l
Ciklus vége lyik pékségtől.
VAN : = { me l y91 { I ) )
Ezt a -hiányos- megoldást úgy állítjuk elő, hogy felveszünk egy M+ 1 ., fiktív péksé­
Elj árás vége .
get, amely tetszőleges menny iségű kenyeret képes sütni, s akivel mindenki kapcsolatban
Rossz_eset { I , X , mely) :
J : =l van. Előállítjuk az összes megoldást, s azt választjuk ki közülük, amelyben a legtöbb
Ciklus amíg J<I és X { J ) ;tome l y olyan közért van, amely nem a fiktív szállítótól kapja a kenyeret. A költségfüggvényt
J : =J+l
kell definiálnunk:
Ciklus vége
R o s s z_e s e t : = ( J< I )
Eljárás vége .
N

(
kt(X) L: x X; * M + 1) , ahol
= ( )
x Iog =
{1 ha log

i=I
0 ha -. log

F39. N közért - M pékség


A fejezet befejezéseként egy másik "módszert" is leírunk, amellyel némileg egysze­
Tároljuk a közértek kenyérigényét, a pékségek sütési kapacitását, a közértek és a pék­ rűbb megoldásokat lehet kreálni a backtrack-es tételvariánsokhoz. Egy apró észrevenni
ségek kapcsolatát! valóra építünk, amely után teljesen mechanikusan kaphatók meg az algoritmusok a már
jól ismert aiapvariánsa iból.
N,M közértek száma, pékségek s7,áma
. Induljunk ki a backtrack első algoritmusának legfelsőbb szintjéből, és hasonlítsuk
IGENY(i) az i. közért kenyérigénye
össze a lineáris keresés tétel algoritmusával. Alighanem a következő analógiákat fedez­
KAPACITASG) a j . pékség sütési kapacitása
zük föl:
KAPCS(ij) van-e kapcsolat az i. közért és a j. pékség között

ft(ij)=KAPCS(ij)

.fk( i,X ( i),X (l), . . . ,X{ i - 1)) =[ ti!GENY(j)l :.:;;


X(j}=X(i)
KAPACJTAS(X ( i))

55
54
Keresések

Backtrack-es keresés Lineáris keresés


I : =l [ komponens sorszám) I : =l [ e lemsors zám) V. Programozási tételek
X(l . . N ) : = ( 0 , . . . , 0 ) [ k e zdőindexe k ]
I�l [ v an-e még keresniv a l ó ) ISN [ van-e még elem] egymásraépítése
ISN [ v an-e még megoldás komponens ] T ( X ( I ) ) [ T tul - e )
Jó e s e t keres é s ( I , me l y , VAN ) I : = I + l [ köv . e l em]
Ha VAN akkor X ( I ) : =me l y : I : = I + l Gyakran előfordul, hogy programozási tételeket egymás után kell használnunk. Ezen
különben X ( l ) : = O : I : = I - 1 egymásutániságnál azonban sok esetben a két megoldóalgoritmus egybeépítése egysz.e­
[ a köve t ke z ő komponens ]
rííbb, rövidebb, hatékonyabb megoldást eredményez. Ebben a részben ez.ekkel foglalko­
Nézzük ez alapján pl. az kiválasztást!
zunk. Az egymásraépítés mindig két programozási tétel összefogását jelenti, a fejez.ete­
Kiválas z tás ( N , M , X ) : Kiválasztás ( N , M , X ) : ket a korábban alkalmazandó tétel szerint fogalmaztuk meg.
I : =l : X ( l . . N ) : = ( 0 , . . . , 0 ) I : =l
Ciklus amíg ISN Ciklus amíg nem T (X ( I ) )
J ó e s e t ker e s é s ( M , X , I , me l y , VAN )
-
Ha VAN akkor X ( I ) : =mely : I : =I + l I : =I+l 1. Másolással összeépítés
különben X ( I ) : = O : I : = I - 1
Ciklus vége Ciklus vége Másolással bármelyik programozási tétel egybeépíthető, hisz.en csupán annyi a
Eljárás vége . Eljárás vége .
teendő, hogy a programozási tételben szereplő xi bemenő adatra hivatkozást kicseréljük
A megszámolás és a kiválogatás tételek származtatásának egy látszólagos akadálya g(X;)-re.
van. Nevezetesen az, hogy abban nem 'amíg'-os ciklus szerepel. Ezen azonban keresztül
Ha például egy számsorozat elemei négyzetösszegét kellene megadnunk, az egy má­
tudunk siklani azzal, ha átírjuk a számlálásos ciklust amíg-osra:
solást (s7.ámokhoz számok négyzetei rendelése) és egy sorozatszámítást (összegzés) tar­
C i k l u s I : = l - t ő l N-ig I : =l talmaz. Nézzük meg e két tétel általános egymásraépítését!
C i klus amíg r:o;N
N *
Bemen e t N e N o, XEH , F : G �G , g : H�Gl
I : =I+l
C i k l u s vége C i k l u s vége Kimen et SeG

ef 3FoEG és 3 f : GxG�G és
Az átírásnak most már semmi akadálya nincs. Pl. a megszámolávé az alábbi:

F ( Y 1 1 • • • 1 YN) =f ( F ( Y 1 , „ . , YN-1 ) , YN) és F ( ) = Fo


Megszámolás ( N , M , X , DB) : Megszámolás ( N , DB ) :
DB : = O DB : =O uf S=F ( g ( X 1 ) , . . . , g ( X N) ) .
I : =l : X ( l . . N ) : = ( 0 , . . . , 0) I : =l
Ciklus amíg I � J. Ciklus amíg ISN Az algoritmus:
Ha nem ISN akkor Ha T ( X ( I ) ) akkor
DB : =DB+ l DB : = DB + l
Függvény
X ( I ) : =O : I : =I - 1 I : =I + l g: H_e lemtipus � G_e lemtípus
különben különben I : = I + l Változók :
Jó e s e t keresés ( M , X, I , me l y , VAN ) N : Egész [ a feldolgoz andó sorozat e l ems z áma )
-
Ha VAN akkor X ( I ) : =me l y : I : = I + l X : Tömb ( l N : H_e l emtípus )
. . [ feldolgo z a ndó e l eme k ]
különben X ( I ) : =O : I : = I - 1 FO : G_Elemtipus [a műve l e t nu l l e l eme ]
Elágazás vége Elágazás vége S : G_Elemtipus [ a z eredmény ]
Ciklus vége Ciklus vége
Eljárás vége . Elj árás vége . A megoldásban -mint azt a sorozatszámításnál tettük- induljunk ki a nullelemböl,
alkalmazzuk a/függvényt az addig kiszámított értékre és a sorozat eleméből kiszámított

értékre!

lAz algoritmus szempontjából adottságnak, másként bemenetnek tekinthetjllk az F és a g függvényeket


is.

56 57
V · Progra m i té_
á s_ k_
le_ á sraép lt�
�� �=�==__
oz_ _te_ egym_
:;:::. ... _ ----'�-_e���������������� �i
Programoz á si tételek

Másolás_s orozatszámi.tás (N , X , S ) :
S : =FO Az általánossága miatt nézzük a megszámolás és a keresés egymásraépítését! Az e/­
Ciklus I = l -től N-ig döntésnél, illetve a kiválasztásnál hasonlóan kellene eljárnunk, hiszen e két típusalgorit­
S : =f ( S , g ( X ( I ) ) )
mus megoldásszövege része a keresés megoldásszövegének.
Ciklus vége
Eljárás vége .
Beme net : NeNa, X e HN
Második példaként vegyük a másolás és a maximumkiválasztás összeépítését! Ebben
T : H�l, x : H� { O , l } ,
( {
z x) =
1, ha T(x)
.
a maximális elem értékét és az indexét i� meghatározzuk. (Az előző feladat analógiájára 0, egyébként

ilyen lehet a legnagyobb abszolűtértékű szám abszolútértékének meghatáro7.ása egy Kimenet VAN e l , SORS Z e N
számsorozatból.)
ef
N
Bemen e t : NeNo, Xe HN , G rende zett ha lmaz ( < , � relációk ) , uf DB = L x(Xj ) és VAN= ( DB�K) és

g : H�G
i=l
SORSZ

MAX e N
VAN => l�SORSZ� és T ( X soRsz ) és :Lx<X i ) = K
Kim ene t
i=]
ef Na
Az algoritmus:
uf l�� és �i ( l�i� ) : g ( XMAX) �g ( X í )
Függvény :
T: E l emtípus � Logikai
A z algoritmus:
Változók :
Függvény
N Egész [a feldolgozandó sorozat e l emei s z áma ]
g : H_e lemtípus � G_elemtípus
X Tömb ( l . . N : E l emt ípus ) [a feldolgozandó sorozat e l eme i ]
Változók : K Egész [ a z e redmény - a megfelelő e leme k s z áma ]
N Egész [ a feldo lgo z andó sorozat e l emei s z áma ) VAN : Logikai [ a z eredmény - van-e meg f e l e l ő e l em]
x : Tömb ( l . . N : H-E l emt í pu s ) [ a feldolgoz andó sorozat e l emei SOR S Z : Egész [ a z e redmény - a meg felelő e l em s o r s z áma )
MAX : Egész [a maximá l i s értékű e l em s o r s záma ]
MAXERT : G_e lemtípus [a maximá l i s é r t é k ] Induljunk ki a keresés megoldásából! A keresés ciklusa akkor állt le, amikor megta­
láltuk az első T tulajdonságú elemet. Ezt kell kicserélni arra, hogy csak a K.-nál álljon le
Ebben a megoldásban -a maximumkiválasztás alapján- vegyük az első elemből ki-
(ha egyáltalán van K.). A ciklusmagban viszont számolnunk kell a T tulajdonságú ele­
számított függvényértéket induló maximumnak, ezt hasonlítsuk a további elemekből ki­
meket - ahogyan azt a megszámolásnál tettük!
számított függvényértékekkel, s a legnagyobbat őrizzük meg!
:Karesés ( N , X , K , VAN , SORS Z ) :
Másolás maximumkiválasztás ( N , X , MAX , MAXERT ) :
I : = O : DB : = O
MAX : =l : MAXERT : =g ( X ( l ) )
Ciklus amíg I<N és DB<K
Ciklus I=2 -tól N-ig
I : =I+l
Ha MAXERT<g ( X ( I ) ) akkor MAXERT : =g ( X ( I ) ) : MAX : = I
H a T ( X ( I ) ) akkor DB : =DB+l
Ciklus vége
Ciklus vége
Elj árás vége .
VAN : = ( DB=K )
Ha VAN akkor SORS Z : = I
Elj árás vége .
2. Megszámolással összeépítés

A megszámolást három elemi programozási tétellel érdemes egybeépíteni, az e/dön­ 3. Maximumkiválasztással összeépítés
téssel, a kiválasztással, valamint a kereséssel.
Maximumkiválasztással kapcsolatban azt a kérdést fogalmazhatjuk meg, hogy hány
Itt olyan kérdéseket tehetünk fel, hogy van-e egy sorozatban legalább K db T tulaj­
darab maximális értékű elem van, s hogy melyek a maximális értékű elemek.
donságú elem, adjuk meg a sorozat K. T tulajdonságú elemét stb.

58
59
v. Progra mozási tételek egymásraépftése
Programozási tételek

Itt tehát a maximumkiválasztást kell egybeépíteni a megszámolással, illetve a kiválo­


4. Kiválogatással összeépítés
gatással.
Elsőként a kiválogatást a sorozatszámítással építjük egybe. Olyan feladatoknál alkal­
Az a kérdés, hogy van-e egyáltalán több maximális értékű elem, egy menetben nem
·

mazható ez, amikor a számítást egy sorozat T tulajdonságű elemeire kell csak elvégez­
dönthető el, azaz a három tételt nem lehet egymásbaépíteni, hanem csak egymás után al­
nünk.
kalmazni.

A korábbiakban megállapítottuk, hogy a kigyűjtéses kiválogatás mindig tartalmaz Bemenet NeNo, XeHN , F : H* --+H

egy megszámolást, így csak a kiválogatással kell foglalkoznunk. T : H-..+l, X : H--+ { 0 , 1 } , z(x = ){ l, ha T(x)
0, egyébként
.

Bemenet : NeNo, XeHN , H rende zett ha lma z


DB e N o , Y e NN , SeH

')(, : H-..+ { O , l } , z(x)


{ 1, ha x :?: max(X)
= 0, egyébként
.
Kim ene t

ef 3F0eH és 3 f : H xH-..+H és
F ( X 1 1 • • • 1 XN) = f ( F ( X 1 1 · · · 1 XN-1 l 1 XN) és F ( ) =Fo
Kimenet DB e N , YeNN, MAXERT e H N

ef
uf DB=
.
l: x(X; ) és Y e { l . . N } DB és Y halma z f e l s o ro l á s
i-1
N
uf DB = l: x(X; ) és Y e { l . . N } DB és Y halma z fe l sorolás és Vi ( lSiSDB ) : T ( X ( Y í ) ) és
i-1
é s Vi ; j ( l Si� 1 l Sj SDB ) : XíSX ( Yj l és MAXERT=X ( Y 1 ) Az algoritmus:

Függvény :
Az algoritmus: T: Elemtípus -..+ Logikai
Változók : , Változók :
N : Egész [a fe ldo lgo z andó sorozat e l emei s z am J � N : Bqész [ a f·e ldolgozand ó sorozat e l emei s záma ]
x : Tömb ( l . . N : Elemtípu s ) [a feldo l g o zandó sorozat e l eme i]
X : Tömb ( l . . N : E l emtípus ) [ a feldolgo z andó sorozat e l emei ]
DB : Egész [ a maximá l i s e l eme k s z áma )
FO : E l emtípus [a műve l e t nul l e leme ]
Y : Tömb ( l . . N : Egé s z ) [ a maximá l i s e l emek sors z áma i ]
S : E l emtípus [ a z e redmény ]
Az össz.eépítés alapgondolata, hogy a lokális maximumok megőrz.ésével együtt válo­
A megoldásban vegyük a sorozatsz.ámftás algoritmusát, de a műveletet ne minden
gassuk is ki a lokális maximumokat. Természetesen űj lokális maximum megtalálásakor esetben végezzük el, hanem csak akkor, ha a megfelelő elem T tulajdonságű! Sokszor
a korábbi kigyűjtést el kell felejteni. A kiválasztó ciklus végén a lokális maximum nincs az eredményhez szükség a DB-re, a mostani megoldásban ezt is képezzük.
éppen a keresett maximumérték, tehát az éppen kigyűjtött sorsz.ámok a maximumok
Kiválogatás_sorozatszámítás ( N , X , S , DB ) :
sorszámai lesznek. S : = FO : DB : = O
Ciklus I = l -tól N-ig
Maximumkiválogatás ( N , X , DB , Y , MAXERT ) :
Ha T ( X ( I ) ) akkor DB : =DB+ l : S : =f ( S , X ( I ) )
MAXERT : =X ( l ) : DB : = l : Y ( DB ) : = 1
Cikl.us vége
Ciklus I=2 -tól N-ig
El.járás vége .
Elágazás
X ( I ) >MAXERT esetén MAXERT : =X ( I ) : DB : = l : Y ( DB ) : =I
Második példánkban a kiválogatást a maximumkiválasztással építjük egybe. Tipiku­
X ( I ) =MAXERT esetén DB : =DB+l : Y ( DB ) : = I
Elágazás vége san ilyen feladatok azok, amelyekben meg kell határozni egy sorozat T tulajdonságű
Ciklus vége elemeinek maximumát, minimumát.
Eljárás vége .
Bemen e t : N e N a , XeHN, VAN e l

T : H-..+l, l(. : H-..+ { 0 , 1 } , z(x ){=


1, ha T(x)

O, egyébként
.

Kim enet MAX e N , MAXERT e H

60 61
V. Programozási tételek egymásraépitése
Programozási tételek

ef ef
uf VAN= ( 3 i ( l�i� ) :
T (Xi) és N

VAN � l�� és T ( X Maxl és uf DB=:Lx( X; ) és Ye { l . . N } 08 és Y halma z fe l s o r o l á s


i-1
MAXERT=XMAX és 'v'i ( l�i�N ) : T ( X i ) � X�1
és 'v'i ( l�i�DB ) : T (X (Yi) ) és 'v' i ( l�i �DB ) : Z í=f ( X ( Yi ) )

Az algoritmus: Az algoritmus:

Függvény : Függvény :
T : E l emtípus --+ Loqikai T: H_E lemtípus --+ Logikai
f: H_e lemtípus --+ G_e lemtípus
Vál.tozók :
N : Egés z [a feldolgozandó sorozat e l emei s záma ] Változók :
x : Tömb ( l . . N : Elemtípu s ) [ a feldolgozandó s orozat e l eme i ] N : Egész [a feldolgoz andó sorozat e l emei s záma ]
VAN : Logikai [van-e maximá l i s T tulaj don ságú e lem] X : Tömb ( l . . N : H_elemt í pu s ) [ fe l dolgoz andó e l eme k ]
MAXERT : E l emtípus [ a maximá l i s értékű e l em értéke ] DB : Egész [ a megfelelő eleme k s záma ]
MAX : Egész [a maximá l i s értékű elem s o r s záma ] Z : Tömb ( l . . N : G_elemtípu s ) [ fe l dolgo zott el eme k ]
Vegyük a megoldáshoz a maximumkiválasztás algoritmusát! Ne akkor jegyezzük fel A megoldásban vegyük a kiválogatás kigyűjtéses algoritmusát, de ne a megfelelő
ele­
az új elemet maximumnak, amikor az nagyobb az addigi maximumnál, hanem ennek mek sorszámait gyűjtsük ki, hanem az ezen elemeken kiszámított függvényértéket!
még az is legyen a fe!tétele, hogy az új elem T tulajdonságú! Csupán egyetlen probléma
Kiválogatás-másolás ( N , X , DB , Z ) :
van: semmi nem garantálja, hogy az első elem T tulajdonságú, sőt hogy egyáltalán ilyen DB : =O
elem lesz (amit pedig a maximumkiválasztás kihasznált). Ciklus I = l -tól N-ig
Ha T ( X ( I ) ) akkor DB : =DB+ l : Z ( DB ) : = f ( X ( I ) )
Egyik lehetséges megoldás lenne, ha megkeresnénk az első T tulajdonságú elemet, s Cikl.us vége
Eljárás vége .
innen indítanánk a maximumkiválasztást. A másik -s mi ezt követjük- egy fiktív kezdő­
értékkel indít, s elölről vizsgálja a sorozatot. (Ha e fiktív érték marad a MAXERT-ben E fejezet algoritmusai nagyon hasonlóan alkalmazhatók szétválogatással, metszettel,
az azt jelenti, hogy nincs T tulajdonságú elem a sorozatban.) unióval való egymásraépítésre. A szükséges módosításokat a kiválogatás ciklusa helyett
Kivál.ogatás_maximumkivál.asztás ( N , X , VAN , MAX , MAXERT ) : a megfelelő programozási tétel ciklusában kell elvége:zni. A szétválogatás specialitása
MAXERT : = -oo lehet, hogy az eredményeként szereplő két sorozatra különböző programozási tételeket
Cikl.us I = l - tól. N-ig is lehetne alkalma:zni (például lehetne feladat a T tulajdonságú elemek maximumának és
Ha T ( X ( I ) ) és X ( I ) >MAXERT akkor MAXERT : =X ( I ) : MAX : = I
Cikl.us vége a nem T tulajdonságú elemek összegének meghatározása a feladat).
VAN : = ( MAXERT*-oo)
El.járás vége .

A harmadik példában a kiválogatást a másolással építjük egybe. Ezt olyan feladatok­

nál kell alkalmazni, ahol egy sorozat T tulajdonságú elemeit kell lemásolni, rajtuk egy
függvény kiszámításával.

Bemenet : N e N a , X e HN

T : H--+L, f : H--+G' X.: H--+ { 0 ' 1 } ' z(x) =


{ 1, ha T(x)
0, egyébként

Kimenet DB e N a , Y e NN, Z e GN

62 63
A µlógia sorozat eddig megjelent tagjai
Irodalomjegyzék
1. Horváth László - Szlávi Péter - Zsakó László: Modellezés és szimuláció

2. Szlávi Péter - bakó László: Programozásiforgácsok - KÖMALfeladatmegoldás2


1. O.J.Dahl-E.W.Dijkstra-C.A.R.Hoare: Strukturált programozás.
3. Turcsányiné Szah6 Márta: A Comnwdore-64 Terrapin WGO leírása
Műszaki Könyvkiadó, 1978
4. Szlávi Péter - Zsakó László: Módszeres programozás: Rekurzió
2. Varga L.:Programok analízise és szintézise. 5. Szlávi Péter: A számítógépről népszetűsítő stJ.1usban
Akadémiai Kiadó, 1981
6. Zsakó László: Módszeres programozás: Hatékonyság
3. N. Wirth: Algoritmusok + adatstrukturák = programok. 7. Makány György: Programozási nyelvek: PROLOGIKA
Műszaki Könyvkiadó, 1982 8. Szlávi Péter: A programkészítés technológiája

4. Fóthi Á.: Bevezetés a programozáshoz. 9. Szlávi Péter - Zsakó László: Szimulációs modellek a populációbiológiában
Tankönyvkiadó, egyetemi jegyzet, 1983 10. Pintér László: Programozási tételek rekurzív megvalósítása

5. Szlávi P.-Zsakó L.: A programozás ABC-je = az ABC' programozása. 11. Temesvári Tibor: Alkalmazói rendszerek: QUATTRO PRO 3.0
ELTE TTK Informatikai Tanszékcsoport, ABC-s füzetek, 1984 12. Szlávi Péter - Zsakó László: Módszeres programozás: Adatfeldolgozás


6. Szlávi P.-Zsakó L : Módszeres programozás. 1 3. Krammer Gergely: Turbo Grafika

Műszaki Könyvkiadó, 1986 14. Pap Gáborné - Szlávi Péter - Zsakó László: Módszeres programozás: Szövegfel­
dolgozás
7. Szlávi P.-Zsakó L. et al.: Számítástechnika középfokon.
15. Pintácsi Imréné - Siegler Gábor - Zsakó László: Szimulációs modellek a kémiában
OMIKK, 1987
16. Horváth László - Szabadhegyi Csaba - Szlávi Péter - Zsakó László: Függvényábrá-
8. D.Knuth: A számítógép programozás művészete 3. zolás
Műszaki Könyvkiadó, 1988 17. Szabadhegyi Csaba - Szlávi Péter - Zsakó László: Szimulációs modellek a fizikában

9� T.H Cormen-C.E. Leiserson-R.L. Rivest: Algoritmusok. 1 8. Szlávi Péter - Zsakó László: Módszeres programozás : Programozási bevezető
Műszaki Könyvkiadó, 1998 1 9. Szlávi Péter - Zsakó László: Módszeres programozás: Programozási tételek

itmusok.
10. Rónyai 1.-Ivanyos G.-Szabó R.: Algor 20. Hack Frigyes: Számítógéppel támogatott problémamegoldás

TYPOTEX, 1999 2 1 . Szlávi Péter - Temesvári Tibor • Zsakó László: Módszeres programozás: A prog­
ramkészítés technológiája

22. Szlávi Péter - Temesvári Tibor - Zsakó László: Programozási nyelvek: Alapfogal-
mak

23. Illés Zoltán: Programozási nyelvek: C++

24. Szlávi Péter - Temesvári Tibor - Zrakó László: Programozási nyelvek: ELAN

25. Ökrös László: Programozási nyelvek: Az LCN WGO leírása

26. Hack Frigyes: Informatika

27. Pap Gáborné - Szlávi Péter - Zsakó László: Módszeres programozás: Rekurzív tí­
pusok

28. Hack Frigyes: Programozási nyelvek: BASIC

2A µlógia-soro7.at dőlt betfilckel szedett tagjai már nem kaphatók. ·


29. Kincses Z:Oltán: Gólyakalauz az Internet használatához

30. Zsakó László: Az informatika ismeretkörei

3 1 . Hack Frigyes: Informatikai ismeretek

32. Hack Frigyes: DERIVE

33. Pozsár Erika: Internet és társadalmi viszonyok

34. Pap Gáborné - Szlávi Péter - Z'lakó László: Módszeres programozás: Adattípusok

35. Köves Gabriella: TEX lépések

36. Nagy István: Szövegszerkesztés a Word 97-tel

37. Gábor Béla: Programozási nyelvek: A Delphi programozása

38. Szlávi Péter - Z�akó László: Módszeres programozás: Gráfok, gráfalgoritmusok

39. Fejezetek a számítástechnika történetéből I.

40. Fejezetek a számítástechnika történetéből II.

4 1 . Vágvölgyi István: Prezentáció és grafika oktatása

42. Nagy Sándorné: Adatbázis-kezelés Access 97-tel

43. Hack Frigyes: 30-grafika geometriai alapjai

44. Z'lakó László (szerk.): Fejezetek a számítógépi grafikából

45. Dávid András - Pap Gáborné: Adatszerkezetek példatár

Szilánkok rés7Sorozat3
1. Szlávi Péter: A típusfogalomfejlődése az algoritmikus nyelvekben.

2. Temesvári Tibor: ELANJ programozási nyelv leírása

3. Szlávi Péter: Előadás a szövegtípusokról

4. Szlávi Péter: Előadás a rek.urzióról

5. Szlávi Péter: Elöadás a gfáfúpusról


6. Szlávi Péter: Adatok, adattípusok

7. Szlávi Péter: Előadás a sorozattípusokról

8. Szlávi Péter: Előadás afile-tfpusokról és a táblázattípusról

9. Szlávi Péter: Előadás a táblázattípusról

10. Gálos György - Pap Gáborné: Adatszerkezetek példatár

1 1 . Szlávi Péter: Gondolatok a típus-specifikációk kompatibilitásának vizsgálatáról

3A Mikrológia sorozat elöreteseként megjelent könyvek, melyek késöbb beépülnek a sorozatba. (A dölt
betűkkel szedettek ilyenek, emiatt már nem kaphatók.)

You might also like