Professional Documents
Culture Documents
Zsak{J Lász{ó
Afóászeres programozás:
Programozási tétek�
Módszeres programozás: Programozási tételek
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-
,_:;,
µ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
m. Rendezések ... „.-.„„_...... „........ „„„....... „„ .....„„... „„...... . „........ -„... .....36
.„„„.„ .........„„„„„
.. .•• „ .... „ ....„„„„.„
.. ....„.„„....„ ••
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á
••••..••••••• „ • •••. •••• „•.•. •••••••••••• ••••••.•••.•••••••••••••••••• •••••••••••„„••• „•••••••••••• „••
lA _O_o/
-1-
� ----�,- -
_
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
(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
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:
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
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)
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
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
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
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
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,"".
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
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)!
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.
15
14
Programozási tételek
Elemi programozási tételek
É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 .
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.
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
19
18
Elemi programozási tételek Programozási tételek
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.
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á
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 ]
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:
nincs!
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
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!
kiválogatás kigyűjtésse/.
Bemenet : N e N 0, X E HN
{l, ha T(x)
"'(x)
=
24 25
összetett programozási.tételek
Programozási tételek
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
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.
0, egyébként N
uf DB = I z(Xbei) és xki= Permutáció (X bel és
Kimenet í=I
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
Metszet { N , X , M , Y , DB , Z ) :
4. Metszet DB : = O
Ciklus I=l -tól N-ig [ k i vá l ogat á s ]
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
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.
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.
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 . '
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
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, 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 ) )
40 41
Rendezések Programozási tételek
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.
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
46 47
Keresések Programozási tételek
*
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
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
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,
50 51
Keresések Programozási tételek
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 .
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
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
ft(ij)=KAPCS(ij)
55
54
Keresések
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:
értékre!
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
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
.
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
O, egyébként
.
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
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 .
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
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ó
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
24. Szlávi Péter - Temesvári Tibor - Zrakó László: Programozási nyelvek: ELAN
27. Pap Gáborné - Szlávi Péter - Zsakó László: Módszeres programozás: Rekurzív tí
pusok
34. Pap Gáborné - Szlávi Péter - Z'lakó László: Módszeres programozás: Adattípusok
Szilánkok rés7Sorozat3
1. Szlávi Péter: A típusfogalomfejlődése az algoritmikus nyelvekben.
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.)