You are on page 1of 102

Adatszerkezetek s algoritmusok

Felsofok szakirny tovbbkpzs

Egyetemi jegyzet

2010
2
Tartalomjegyzk

1. Bevezets a programozsba 9
1.1. Algoritmusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.1.1. Mit jelent programozni? . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.1.2. Mi az algoritmus? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.1.3. Feladat specifiklsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2. Alapfogalmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2.1. Tpus, kifejezs, vltoz . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3. Vezrlsi szerkezetek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.3.1. Szekvencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.3.2. Egyszeres elgazs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.3.3. Tbbszrs elgazs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.3.4. Ciklus(ok) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.4. Programozsi ttelek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.4.1. sszegzs ttele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.4.2. Szmlls ttele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.4.3. Lineris keress ttele . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.4.4. Maximumkeress ttele . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.4.5. Az elemenknti feldolgozsrl . . . . . . . . . . . . . . . . . . . . . . . . 21
1.5. (El)Gondolkodtat feladat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.6. Tpusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.6.1. Adatok brzolsa fizikai szint . . . . . . . . . . . . . . . . . . . . . . 24
1.6.2. Memria szervezodse . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.6.3. A vals szmok a memriban . . . . . . . . . . . . . . . . . . . . . . . 25
1.7. Objektumorientlt programozs . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.7.1. Modellezs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.7.2. Osztlyhierarchia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.7.3. Objektumok s llapotaik . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.7.4. Osztly s pldny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.7.5. rklods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

2. Java s Eclipse 29
2.1. Java tpusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.1.1. Java primitvek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.1.2. Objektum tpusok Javaban . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.1.3. Csomagol osztlyok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.1.4. Karakterlncok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.1.5. Tmbk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.1.6. Muveletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.2. Java osztlyok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

3
2.3. Fggvnyek s metdusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
2.3.1. Paramterek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.3.2. Az rtk szerinti paramter tads s kvetkezmnyei . . . . . . . . . 36
2.4. Vltozk lthatsga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.5. Tovbbi eszkzk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.5.1. Foreach ciklus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.5.2. Tpuskonverzi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.5.3. Felsorolsi tpus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.5.4. IO muveletek Javaban . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.5.5. Beolvass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
2.5.6. Kirs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.5.7. Megjegyzsek, dokumentcik a kdban . . . . . . . . . . . . . . . . . . 42
2.5.8. Csomagok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.6. Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.6.1. Hogyan mukdik? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.7. Eclipse hasznlata rviden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.8. Rekurzi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

3. Absztrakt adatszerkezet 49
3.1. ADT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.2. ADS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.3. Adatszerkezetek osztlyozsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

4. Adatszerkezetek 53
4.1. Verem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.1.1. ADT lers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.1.2. ADT funkcionlis lers . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.1.3. Statikus verem reprezentci . . . . . . . . . . . . . . . . . . . . . . . . 54
4.1.4. Dinamikus verem reprezentci . . . . . . . . . . . . . . . . . . . . . . 57
4.2. Sor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.2.1. ADT Axiomatikus lers . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.2.2. Statikus sor reprezentci . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.2.3. Dinamikus sor reprezentci . . . . . . . . . . . . . . . . . . . . . . . . 62
4.3. Lista, Lncolt Lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.3.1. Szekvencilis adatszerkezet . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.3.2. Lista adatszerkezet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.3.3. Absztrakcis szint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.3.4. Statikus reprezentci . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.3.5. Dinamikus reprezentci . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.3.6. Ktirny lncolt lista megvalstsa . . . . . . . . . . . . . . . . . . . 67
4.4. Fa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
4.4.1. Hierarchikus adatszerkezetek . . . . . . . . . . . . . . . . . . . . . . . . 71
4.4.2. Fa adatszerkezet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
4.4.3. Binris fa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
4.4.4. Fa reprezentcis mdszerek . . . . . . . . . . . . . . . . . . . . . . . . 78
4.5. Binris keressi fk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.5.1. Tulajdonsgok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
4.5.2. Muveletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
4.6. Kupac (Heap) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
4.6.1. Kupac tulajdonsg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

4
4.6.2. Muveletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
4.6.3. Indexfggvnyek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.7. Hasznlat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

5. Algoritmusok 85
5.1. Algoritmusok muveletignye . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.1.1. Fggvnyek rendje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.1.2. Sorrend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
5.2. Lengyelforma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
5.2.1. Lengyelformra alakts . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
5.2.2. Lengyelforma kirtkelse . . . . . . . . . . . . . . . . . . . . . . . . . . 89
5.2.3. Lengyelforma plda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
5.3. Rendezsek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
5.3.1. Rendezsi problma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
5.3.2. Bubork rendezs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
5.3.3. Maximum kivlasztsos rendezs . . . . . . . . . . . . . . . . . . . . . . 94
5.3.4. Beszr rendezs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
5.3.5. Gyorsrendezs Quicksort . . . . . . . . . . . . . . . . . . . . . . . . . . 97
5.3.6. Ednyrendezs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.3.7. Kupacrendezs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

5
6
Trgy clja

Ebben a jegyzetben a Pzmny Pter Katolikus Egyetem - Informcis Technolgiai Karn


esti kpzs keretein bell oktatott adatszerkezetek s algoritmusok tantrgy eloadsain s
gyakorlatain elhangzott anyagokat igyekeztem sszegyujteni, rendszerezni. Mivel a trgy
viszonylag rvid ido alatt tbb alapveto programozselmleti, algoritmikus s adatstruk-
trkkal kapcsolatos tudst nyjt, ezrt tbb esetben a trzsanyaghoz tovbbi magyar-
zatok tartoznak, a teljessg ignye nlkl. A trgyat olyanok hallgatjk, akik valamilyen
mrnki (villamosmrnk, informatikai mrnk/szakember) vagy a szakirnynak megfe-
lelo (matematikai, gazdasgi) tudssal rendelkeznek, ezrt nhny esetben igyekeztem
olyan pldkat mutatni, amelyek ezekhez a korbbi tanulmnyokhoz kthetok.
Az elmleti tuds mell, prhuzamosan, a JAVA nyelv is ismertetsre kerl alapszin-
ten. A cl, az hogy miniprogramok rsra, algoritmikus megtervezsre brki kpes le-
gyen a trgy elvgzse utn. (Termszetesen akadnak olyanok is akik korbban mr ta-
nultak programozni, ms nyelven. A jegyzet elksztse sorn igyekeztem nekik is ked-
vkben jrni egy-egy klnbsg, csemege emltsvel.)
Rviden felsorolva a trgy alapveto clkituzseit

Algoritmikus szemllet kialaktsa, nhny pldn keresztl bemutatva a progra-


mozs mibenltt.
Programozsi alapstruktrk megismerse, nyelvfggetlenl, hogy ksobbiekben
ms szintaktikra is tltetheto legyen a tuds. (Termszetesen pldkhoz a JAVA
nyelvet hasznljuk a jegyzetben.)
Java programozsi nyelv alapismeretek
Alapveto adatszerkezetek megismerse valamint implementcija.
Rendezo algoritmusok analitikus vizsglata, implementcija.

7
8
1. fejezet

Bevezets a programozsba

1.1. Algoritmusok
1.1.1. Mit jelent programozni?
Legelsoknt azt a krdst jrjuk krl, hogy milyen rszfeladatokat rejt magban a prog-
ramozs, mint tevkenysg. A programozs feladata nemcsak az utastsok kdolst fog-
lalja magban, hanem annl tbb, a feladat illetve rendszer megtervezsre vonatkoz
problmk megoldst is jelenti.

Rszletes megrts: A feladatot, amit meg kell oldani csak gy tudjuk a szmt-
gp szmra rtheto formban, programkdknt elkszteni, ha mi sajt magunk is
tisztban vagyunk a kvetelmnyekkel, a problma rszleteivel. Ez egy sokrtu s
tbb mdszer ismerett s alkalmazst ignylo feladat, hiszen a problmt gyakran
nem mi magunk talljuk ki, hanem a szoftver megrendelsre kell, hogy elkszl-
jn, valaki ms elkpzelsei alapjn. (Ezzel rszletesebben a szoftvertervezs sorn
foglalkozunk.)
Rendszer tervezse: Bonyolultabb esetekben a programunk nem egy szuszra fog
elkszlni, hanem tbb rszfeladatbl, rszprogrambl ll ssze, amelyeket szintn
meg kell terveznnk. A klnbzo rendszeregysgek s feladataik szintn tervezs
ignyelnek. (Itt nemcsak a rszek, mint nll egysgek, hanem azok sszekapcsol-
dsa, illetve azok elkszlsi sorrendje is fontos.)
Receptkszts: Az egyes egysgek, illetve a program egszre el kell vgeznnk az
algoritmusok, mdszerek gp szmra rtheto mdon trtno lerst. Ez azt jelenti,
hogy az egyes problmk megoldsra el kell ksztennk a legaprbb lepsekbol
ll sorozatot, amely lpssorozatot a gp is megrt s vgrehajt. (Jellemzoen ezen
egyszeru utastsok, vagy olyan mr elore megrt funkcik, amelyeket szintn elemi
lpsekbol llnak ssze.)
Mdszer keresse: A problma megoldshoz szksgnk van a megolds elksz-
tshez, kiszmtshoz mdszerekre. Pldul egy szm ngyzetgykt klnbzo
kzelto numerikus szmtsokkal lehet megoldani. Egy msik mdszer lehet az,
hogy egy tblzatban eltroljuk az megoldsokat s egy keressi problmv ala-
ktjuk t a ngyzetgyk-szmts feladatt. (Termszetesen itt megktsekkel kell
lnnk, mivel az sszes lehetsges vals szm s ngyzetgyknek prosaibl ll
tblzat vgtelen mennyisgu trhelyet ignyelne.)
Matematika: A szmtgp termszetbol fakadan tbbnyire matematikai mu-
veleteket ismer, abbl is az alapvetoeket. Az elozo pldra visszatrve, a ngyzetgyk

9
kiszmtsra egy lehetsges kzelto mdszer a Newton-Rhapson-fle itercis md-
szer. Ebben az esetben ismtelt muveletekkel egyre pontosabb eredmnyt kapunk a
szmts sorn, ami elemi matematikai lpsekbol ll. Ms feladatok esetn msfle
matematikai modellre, mdszerre van szksgnk.

Egy htkznapi pldt vegynk, amely egy robotot arra utast, hogy az ebd elksz-
tshez szerezze be az egyik sszetevot, a burgonyt. Termszetesen a feladatot egyetlen
utastsban is meg lehet fogalmazni, de ahhoz hogy ezt vgrehajtani kpes legyen finom-
tani kell, tovbbi lpsekre kell bontani.

Hozz krumplit!
Hozz egy kilogramm krumplit!
Hozz egy kilogramm krumplit most!
Hozz egy kilogramm krumplit a sarki kzrtbol most!
Menj el a sarki kzrtbe, vgy egy kosarat, tegyl bele egy kilogramm krumplit, adj
annyi pnzt a pnztrosnak, amennyibe a krumpli kerl, tedd le a kosarat, gyere ki
a kzrtbol, s hozd haza a krumplit.

Nyilvn ez sem lesz elg, hiszen a haladssal, a fizetssel s tovbbi muveletekkel kap-
csolatosan mg finomabb lpsekre kell bontani. (Jelenleg egyetlen robot sem rendelkezik
olyan mestersges intelligencival, hogy ezt a problmt nllan megoldja.)
Amikor egy feladatot megoldunk, egy algoritmust elksztnk, a megolds kulcsa a
lpsek meghatrozsban rejlik. Hasonlan a bevsrls pldjbl az algoritmusunkat
egyre finomabb lpsekre tudjuk felbontani.

1.1.2. Mi az algoritmus?
Az algoritmus olyan lpsek sorozata, amely megold egy jl definilt problmt. (Itt r-
demes azt megjegyezni, hogy a problma jl definiltsga olyan kritrium, amelyet nem
minden esetben sikerl teljesteni. Elofordul, hogy a nem ismerjk jl a problmt, vagy
csak az algoritmus kidolgozsa sorn vesznk szre olyan helyzeteket, amelyeket a feladat
kituzsnl nem vettek figyelembe.) A kvetkezo nhny pontban az algoritmus szmt-
gpes vonzatait s tulajdonsgait vizsgljuk.

A szmtgpes algoritmus (elemi) utastsok sorozata a problma megoldsra. Itt


mr tovbbi lpsekre utastsokra bontjuk a megoldsunkat, a korbbiakban rtak-
kal sszhangban.
J algoritmus kritriumai
Helyessg vizsgljuk, hogy a megalkotott algoritmus, a feladatkirs felttelei
mellett, minden esetre j megoldst ad-e.
Hatkonysg vizsgljuk, hogy az algoritmus a rendelkezsre ll klnbzo
eroforrsokkal mennyire bnik gazdasgosan.
Algoritmus s program kapcsolata, algoritmusok lehetsges lersa
Pseudo kd olyan kd, amit az emberek rtenek meg, de mr a szmtgp
szmra is megfeleloen elemi utastsokat tartalmaz.
Programnyelvi kd amelyet begpelve szintaktikailag rvnyek kdot kapunk,
fordthatjuk1 s futtathatjuk.
1
Az a muvelet, amikor a programnyelvi kdot a programozst tmogat krnyezetek, programok a szm-
tgp szmra kzvetlenl rtelmezheto utastsokk, programm alaktjuk.

10
Algoritmusok helyessge
Egy algoritmus helyes, ha a kituztt feladatot korrekt mdon oldja meg. Azaz a feladatspe-
cifikciban meghatrozott megszortsokat figyelembe vve, minden lehetsges esetre,
bemenetre (inputra) megfelelo eredmnyt, kimenetet (output) szolgltat. A helyessget
klnbzo technikkkal lehet bizonytani, ezek tbbsge azonban nagyon kltsges md-
szer.

Ellenpldval bizonyts cfolat, ez a legegyszerubb, azonban ellenplda tallsa


nem mindig knnyu. Termszetesen, amennyiben nem tallunk ellenpldt, az nem
jelenti azt, hogy a kd bizonyosan helyes.
Indirekt bizonyts ellentmondssal bizonyts, ahogyan azt a matematikban
megszoktuk. Ellentmondst keresnk az lltsok, eredmnyek kztt, amihez ab-
bl a felttelezsbol indulunk ki, hogy a megoldsunk helytelen.
Indukcis bizonyts ha n-re helyes megoldst ad s ebbol kvetkezik az, hogy n+1-
re is helyes megoldst fog adni illetve igaz tovbb, hogy n = 1 helyes a megoldst,
akkor bizonytottuk, hogy minden lehetsges inputra jl fog mukdni az algoritmu-
sunk. (Pldul a faktorilis szmts esetn gondolkodhatunk gy.)
Bizonytott elemek hasznlata levezets, olyan rszprogramokat hasznlunk, ame-
lyek bizonytottan jl mukdnek. A tovbbi elemek, rszprogramok helyes mukd-
snek formlis bizonytsa a mi feladatunk.

Algoritmusok hatkonysga
Egy algoritmus hatkony, ha nem hasznl tbb eroforrst, mint amennyi flttlen szks-
ges a feladat megoldshoz. Ezek az eroforrsok legtbbszr a hasznlt memria mennyi-
sge, valamint az ido (processzor hasznlati ideje). Legtbbszr igaz, hogy a futsi ido jav-
tshoz tbb memrira van szksg, valamint kevesebb memriahasznlatot tbb lps-
sel tudunk csak elrni. Az albbi felsorolssal sszefoglaljuk, hogy milyen mdszerekkel
lehetsges a hatkonysgot vizsglni

Benchmark futtats s idomrs. A mdszer csak a megvalstott algoritmusok


esetn hasznlhat, teht elozetes becslst a hatkonysgra nem lehet vgezni vele.
Elemzs, ami az albbiakat foglalja magban
Muveletek megszmolsa, egy meghatrozott (legjobb/legrosszabb/tlagos) eset-
ben mennyi muvelet vgrehajtsra van szksg az eredmny megadshoz. A
muveletek szmt, az megadott input mrethez viszonytva nagysgrendileg
szoks megadni. (Ezt a ksobbiekben fogjuk hasznlni.)
Komplexits elemzs az algoritmus bonyolultsgnak vizsglata.

1.1.3. Feladat specifiklsa


A feladatspecifikci az albbi hrmasbl ll

Lerom, hogy milyen adat ll rendelkezsre a feladat megoldshoz.


Lerom, hogy milyen adatokat/eredmnyeket kell kapnom a feladat megoldsa vgn.
Lerom, hogy mit kell vgeznie a programnak, azaz mi a feladat (Emberi nyelven).

Ezek mindegyike egy-egy felttel. Pldul kikti, hogy a rendelkezsre ll adatok milyen
tpusak, milyen rtktartomnybl kerlhetnek ki. A megktsek pldul a helyessg-
vizsglatkor is fontosak.

11
Plda a ngyzetgyk szmtsra
Bemenet (input): a szm, aminek a ngyzetgykt keressk: x

Kimenet (output): egy olyan szm y, amire igaz, hogy y 2 = x illetve x = y
Feladat (program): a program szmolja ki a bemenet ngyzetgykt
Miutn specifikltuk a feladatot lehet rszletesebben vizsglni a problmt. Az elozo pl-
dnkat folytatva:

Mit csinlok, ha az x negatv . . .


Mit csinlok, ha az x pozitv, vagy nulla . . .

Ezekre a krdsekre, valamint azt, hogy hogyan lehet algoritmikusan megfogalmazni s


lerni keressk tovbbiakban a vlaszt.

1.2. Alapfogalmak
Mindenekelott nhny alapfogalmat fogunk definilni.

1.2.1. Tpus, kifejezs, vltoz


Tpusnak nevezzk egy megadott rtkhalmazt s az azokon rtelmezett muveletek
sszessgt.
Egy programozsi nyelvben, algoritmusban minden egyes rtknek van aktulis t-
pusa. Ez alapjn dntheto el, hogy mit jelent az az rtk, milyen muveletek rvnyesek,
s hogy azokat a muveleteket hogyan kell elvgezni.
Egyszeru esetben, ha a szmokra gondolunk ezek a krdsek trivialitsok. Bonyolul-
tabb sszetett tpusok esetn azonban felttlen vizsglni kell.

Pldk
Egszek: rtkek: 0 . . . 1000 Muveletek: + s
Logikai: rtkek: igaz, hamis Muveletek: , s
Karakter: rtkek: a . . . z Muveletek: < (relci a beturend szerint)
A kifejezs . . .

olyan muveleteket s rtkeket tartalmaz, amelyek egyttesen rtelmezhetoek, van


jelentsk.
esetn is beszlnk tpusrl, pldul az 1 + 1 egy szm tpus kifejezs.
lehet sszetett kifejezs, ahol a rszkifejezsek is rvnyes kifejezsek. Pldul 5 +
6 (7 + 8).

A kifejezseket szt lehet bontani a kirtkels szerint. A kirtkelshez a muveletek


precedencijt (sorrendjt) kell figyelembe venni, illetve a zrjelezst.

Pldul
5 + 6 (7 + 8) (5 + 6) (7 + 8)
Lthat, hogy a zrjelezs hatsra megvlto-
5 + 6 (7 + 8) (5 + 6) (7 + 8) zik a rszkifejezsekre bonts, illetve a kirt-
| {z } | {z } | {z }
| {z } | {z } kels is.
| {z }

12
A vltoz egy nvvel (cmkvel) jellt, adott tpushoz tartoz elem. A memriban egy
szmra fenntartott terletre kerl a vltoz aktulis rtke. Egy vltoznak mindig van
aktulis rtke, gy nem teljesen ugyanaz, amit a matematikai alapfogalmaink sorn is-
meretlenknt hasznlunk. (Ez fontos, mivel olyankor is van valami rtke, amikor mg
nem adtunk neki. Ez az rtk azonban elore ismeretlen, futsonknt ms s ms, a me-
mriacella klso hatsok miatti, vagy egy elozo program utn ottmaradt rtkt jelenti.)

A vltoznak van neve s tpusa


Kifejezsben is szerepelhet: 1+x. Ez csak akkor rvnyes, ha ltezik olyan + muvelet
az x vltozhoz, hogy szmmal sszeads (Praktikusan x pldul szm)

Mielott hasznlatba vesznk egy vltozt, jeleznnk kell a vltoz bevezetst. Ezt hv-
juk deklarcinak. A deklarls utn a programnyelvet rtelmezo rendszer ismeri a vl-
tozt addig nem. Minden tpus vltoznak van egy alapmuvelete, az rtkads, teht
rtket brmilyen vltoznak adhatunk. Azonban gyelni kell arra, hogy az rtkads,
mint kifejezs helyes legyen. Az rtkads sorn hatrozzuk meg, hogy mit tartalmaz-
zon a hozzrendelt memriacella. Az albbiakban nhny pldt lthatunk Java nyelven
a vltozk hasznlatra: (Java-ban a programkd folyamnak gyakorlatilag tetszoleges
pontjn bevezethetnk vltozkat, nincs szksg azokat egy programblokk elejre tenni.
Mindig a tpus neve szerepel eloszr, majd a hasznlni kvnt vltozk nevei.)

Deklarci plda Java nyelven


int x;
int y;
double pi;

Ltrehozunk hrom vltozt a memriban, amelyek kezdo rtke ismeretlen, mivel nem
adtuk meg. A vltozk int illetve double tpusak, amelyek egsz valamint racionlis
szmok. A vltozk nevei rendre x, y, pi.

rtkads plda Java nyelven


x = 10;
y = 10 * x;
pi = 3.14;

Az elozoekben deklarlt vltozk rtket kapnak. Az x rtke egy elore rgztett szm. Az
y rtke azonban mr szmtott rtk egy msik vltoztl fgg. Termszetesen a program
futsa sorn minden egyes pillanatban ez az rtk pontosan meghatrozhat.
Vegyes tpus kifejezsrol akkor beszlnk, ha az egyes rszkifejezsek tpusa k-
lnbzo.

Plda a vegyes tpus kifejezsre


x<5

Az < opertor (muvelet) olyan, hogy (itt) kt szmot fogad, m logikai tpus eredmnyt
ad vissza. (A logikai tpus ktfle rtket vehet fel: igaz vagy hamis.) Amit matemati-
kailag megszokhattunk rvnyes kifejezsnek, az tbb esetben nem helyes a programozs
szempontjbl. Vegyk az albbi hibs pldt:

Hibs plda

13
2<x<5

Ha felbontjuk, akkor a 2 < x eredmnye logikai, azonban egy logikai s egy szm kztt vi-
szont nem rtelmezheto a < opertor. Javtani gy lehet, hogy kt logikai kifejezst ktnk
ssze egy jabb opertorral.

Hibs plda javtsa


(2 < x)&&(x < 5)

Ahol az && opertor a logikai s opertor (). Az s akkor s csak akkor igaz, ha mindkt
oldaln levo rtk igaz. Az elozo pldt megvizsglva csak akkor lesz igaz a teljes kife-
jezs rtke, ha az x egyidejuleg kisebb, mint t s nagyobb, mint ketto, ami megfelel az
eredeti matematikailag lert kifejezsnek.

1.3. Vezrlsi szerkezetek


A jegyzet ezen rszben a programozs sorn hasznlt elemi szerkezetekkel ismerkednk
meg. Tovbb a Java nyelven trtno hasznlatukkal.

1.3.1. Szekvencia
A szekvencia a legegyszerubb programkonstrukci. Lnyege, hogy a program adott rsz-
ben egyms utn vgrehajtand utastsok kerlnek felsorolsra, amely a felsorols rend-
jben kerl majd futtatsra. A legegyszerubb algoritmusok is tartalmaznak legalbb egy
szekvencit, ami akr egyetlen utastsbl is llhat. A szekvencikban lehetosgnk van
a legtbb programozsi nyelv esetn tovbbi szekvencikat lerni. A belso szekvencik a
klso szmra egyetlen egysgknt rtelmezendoek, teht ahova lehet programutastst
vagy lps rni, ugyanoda szekvencia is elhelyezheto. Vegyk az albbi pldt: (Java-ban
a szekvencit, hasonlan a c++-hoz kapcsos zrjelek kz tesszk. Ez hasonlt pldul a
begin-end prosra.)

Szekvencia plda
{ Szekvencia eleje
int x; Ltrejn x
int y; Ltrejn y
x = 10; x-be 10 kerlt
y = 10 * x; y-ba x 10 = 100 kerlt
x = 20; x-be 20 kerlt
} Szekvencia vge
A szekvencit rajzosan az albbi mdon lehet brzolni, struktogrammal:

1.3.2. Egyszeres elgazs


Algoritmusok sorn elofordul, hogy egy vltoz rtktol, vagy a muveletek elvg-
zse sorn az aktulis llapottl fggoen addnak teendok. Pldul egy abszoltr-
tket szmt algoritmus attl fggoen, hogy a bemeneti rtk negatv vagy sem
ms-ms utastst hajt vgre. (Ha a bemenet nagyobb vagy egyenlo nullval, ak-
kor a kimenet a bemenettel lesz egyenlo. Ellenkezo esetben meg kell szorozni 1-el.

14
Utasts 1

Utasts 2

Utasts 3

1.1. bra. Szekvencia struktogram

Abszoltrtk szmts elgazs plda


y = |x|, ha x 0 akkor y = x, klnben y = 1 x

Az egyszeres elgazs szintaktikja Java nyelven az albbi (ahol az else elotti utas-
ts vgn, kivve, ha szekvencia, ktelezo a ;)

Egyszeres elgazs Java


if (logikai felttel) utasts else ms utasts

A felttel logikai tpus, brmi lehet. Az if rsz utn kvetkezik egy utasts, vagy uta-
stsszekvencia, ami akkor fut le, ha a felttel igaz volt. Az else rsz utn kvetkezik
egy utasts, vagy utasts-szekvencia, ami akkor fut le, ha a felttel hamis volt. Az else
elhagyhat!

Egyszeres elgazs Java abszoltrtk


if (x < 0)
y = -1 * x;
else
y = x;

Az elgazst rajzosan az albbi mdon lehet brzolni, struktogrammal illetve folya-


matbrval.

Felttel

utastsok, ha igaz utastsok, ha hamis

1.2. bra. Egyszeres elgazs struktogram

1.3.3. Tbbszrs elgazs


Hasonlan az egyszeres elgazshoz itt is a felttelnek megfeleloen kell cselekedni. Itt
tbb lehetsges esetet is fel lehet sorolni:

Tbbszrs elgazs Java

15
Ha igaz Ha hamis
Felttel

utastsok utastsok

1.3. bra. Egyszeres elgazs struktogram

switch (kifejezs)
{
case 1. eset: utasts break;
case 2. eset: utasts break;
default: utastsok break;
}

A case-ek szma tetszoleges. A break elhagyhat, m akkor a kvetkezo eset(ek)hez tar-


toz utastsok is lefutnak (tcsorog). A default az alaprtelmezett eset, elhagyhat.
Tekintsk az albb elgazsi szerkezetet:

Tbbszrs elgazs problmja


if (x == 1)
nap = "Htfo";
else if (x == 2)
nap = "Kedd";
else if (x == 3)
nap = "Szerda";

Ugyanez tbbszrs elgazssal:

Tbbszrs elgazs problmja


switch (x)
{
case 1: nap = "Htfo"; break;
case 2: nap = "Kedd"; break;
case 3: nap = "Szerda"; break;
case 4: nap = "Cstrtk"; break;
case 5: nap = "Pntek"; break;
case 6:
case 7: nap = "Htvge"; break;
default: nap = "Nincs ilyen nap!"; break;
}

1.3.4. Ciklus(ok)
Sokszor a cl elrse rdekben ugyanazt a muveletsort kell tbbszr egyms utn elis-
mtelni, pldul a szorzs, faktorilis szmtsa, szveg sorainak feldolgozsa (hny betu

16
van egy sorban), . . . A ciklusokkal lehetosg van arra, hogy bizonyos szekvencikat, utas-
tsokat ismteltessnk.

Elltesztelo ciklus. Amg a logikai felttel igaz, a ciklusmagban tallhat utastst,


vagy utasts-szekvencit ismtli:

Elltesztelo WHILE ciklus


while (logikai felttel)
ciklusmag

Elltesztelo WHILE ciklus plda


int x = 0;
while (x < 10)
x = x + 1;

(x a ciklusvltoz ebben az esetben, valamint a ciklusmag az x = x + 1 ). A pldakd az


x rtkt nveli egyesvel kilencig.

Htultesztelo ciklus. Amg a logikai felttel igaz, a ciklusmagban tallhat utastst,


vagy utasts-szekvencit ismtli, de legalbb egyszer lefut a ciklusmag. (Fontos, hogy
amg a felttel igaz, ellenttben ms programozsi nyelveken megszokottal.)

Elltesztelo WHILE ciklus


do
ciklusmag
while (logikai felttel)

Elltesztelo esetben, ha a felttel hamis, egyszer sem fut le. (Eloszr gondolkodunk,
aztn cseleksznk, majd jra gondolkodunk . . . )

Ciklusfelttel

Ciklusmag

1.4. bra. Elltesztelo ciklus struktogram

Htultesztelo esetben, ha a felttel hamis, egyszer akkor is lefut. (Eloszr cseleksznk,


aztn gondolkodunk, hogy kell-e jra . . . )

Ciklusmag

Ciklusfelttel

1.5. bra. Htultesztelo ciklus struktogram

17
FOR ciklus. Vegyk a kvetkezo WHILE ciklust, ami kiszmolja 210 -t.

Elltesztelo WHILE ciklus


int x = 0;
int y = 1;
while (x < 11)
{
x = x + 1;
y = y * 2
}

Ez a kvetkezo mdon rvidtheto le:

FOR ciklus
int y = 1;
for (int x = 0; x < 11; x = x + 1)
y = y * 2;

Formlisan:

FOR ciklus
for (inicializls; logikai felttel; lptets)
ciklusmag

Az inicializls a ciklusba val belpskor fut le. A logikai felttel vizsglata minden egyes
ciklusmagfuttats elott megtrtnik. A lptets pedig a ciklusmag lefutsa utn kvet-
kezik. A lptets utn jra kirtkeli a felttelt, s ennek megfeleloen lp be a ciklusba.

Pr sz a ciklusrl. A ciklusnak mindig van egy kezdeti llapota, egy felttele s


egy ciklusmagja. Az llapottl fgg, hogy egyltaln belpnk-e a ciklusba. Clsze-
ruen a ciklusmag vltoztatja az llapotot, vagyis befolysolja az ismtlods feltte-
ll szolgl llapotot. Knnyen lehetsges egy olyan ciklus rsa, amely sosem ll le:

Vgtelen ciklus
int x = 0;
int y = 0;
while (x < 10)
{ y = x + 1; }

Mivel az x rtke sosem vltozik, mindig kisebb lesz, mint 10, azaz rkk ismtlodik
a ciklusmag. A vgtelen ciklusok gyakran hibk, vagy hibs mdon (pldul egy olyan
esetben kvetkezik be, amire az algoritmus tervezse sorn nem szmtottunk) mukdo
algoritmusok eredmnyei. (Persze vannak kivtelek, van, hogy a vgtelen ciklus hasznos,
pldul a felhasznl beavatkozsra ttlenl vr a program.)

1.4. Programozsi ttelek


Ismerjk az alapveto programszerkezeteket, a szekvencit, a ciklust s az elgazst. Ezek
s tetszoleges kombincijuk segtsgvel brmilyen program megrsra kpesek va-

18
gyunk, azaz ezt a sort kveto rsze a jegyzetnek teljesen felesleges is lehetne.
A tovbbiakban hasznos konstrukcikkal, bizonytottan helyesn mukdo algoritmusok-
kal, adatszerkezetekkel fogunk foglalkozni. Eloszr is a legalapvetobb ttelnek nevezett
algoritmusokkal ismerkednk meg.

1.4.1. sszegzs ttele


Bizonyos, sorban rkezo rtkek sszegzsre szolgl. Pldul kapunk egy szmsorozatot,
aminek az matematikai sszegre vagyunk kvncsiak. A ttelben szereplo rszek kzl
az albbiak tetszolegesen cserlhetok ms muveletre:

Kezdortk milyen szmrl kezdjk az sszegzst


sszegzofggvny / opertor (Lehetsges, hogy az elemeket nem sszeadni, hanem
sszeszorozni akarjuk, vagy az sszegzs elott mg valamilyen lekpezst (fggvnyt)
szeretnnk meghvni.

Az sszegzs ttele hasznlhat

tlag
P
sszeg ( )
Q
Szorzat ( )
Szorzatsszeg
Vektorszorzat
Faktorilis
...

szmtsra.

sszegzo FOR ciklussal


int osszeg = 0;
for (int i = 0; i < rtkek szma; i++)
osszeg = osszeg + kvetkezo rtk;

sszegzo WHILE ciklussal


int osszeg = 0;
int i = 0;
while (i < rtkek szma)
{
osszeg = osszeg + fggvny(kvetkezo rtk)
i += 1;
}

1.4.2. Szmlls ttele


Bizonyos, sorban rkezo rtkek leszmllsra szolgl, valamint a mennyi?, hny?
krdsek megvlaszolsa. A ttelben szereplo rszek kzl az albbiak tetszolegesen cse-
rlhetok ms muveletre:

Felttel, azaz hogy mit akarunk sszeszmolni

19
Nvelo fggvny mi mennyit r a szmolsban

A szmlls ttele hasznlhat

Osztk szmnak meglltsra


Szavak leszmllsra egy szvegben
...

Szmll FOR ciklussal


int szamlalo = 0;
for (int i = 0; i < rtkek szma; i++)
if (felttel(kvetkezo rtk))
szamlalo++;

Szmll WHILE ciklussal


int szamlalo = 0;
int i = 0;
while (i < rtkek szma
{
if (felttel(kvetkezo rtk))
szamlalo++;
i += 1;
}

1.4.3. Lineris keress ttele


Bizonyos, sorban rkezo rtkek kztt egy bizonyos megkeressre; a van-e?, hnya-
dik? krdsek megvlaszolsa hasznlhat. A ttelben szereplo rszek kzl az albbiak
tetszolegesen cserlhetok ms muveletre:

Felttel amit keresnk

A lineris keress ttele ttele hasznlhat

Annak eldntse, hogy szerepel-e egy rtk a sorozatban


Prmszm (Oszt) keressre
...

Lineris keress
boolean van = false;
int hol = 0;
int i = 0;
while ((i < rtkek szma) && !van)
{
if (felttel(kvetkezo rtk))
{
hol = i;
van = true;

20
}
i += 1;
}

1.4.4. Maximumkeress ttele


A Mennyi a leg. . . ? krds megvlaszolssra hasznlhat. (Szlsortkkeressre.) Cse-
rlheto a ttelben a

Felttel, hogy figyelembe vesszk-e az aktulusan vizsglt rtket


Relci min/max
Fggvny, amivel transzformcit lehet vgrehajtani az aktulis rtken.

A maximumkeress ttele ttele hasznlhat

Minimum-, maximumkeress
Zrjelek mlysgnek szmolsra
...

Maximumkeress
int max = fggvny(elso elem);
int hol = 0;
int i = 0;
while (i < rtkek szma)
{
if (max < fggvny(kvetkezo elem)
{
hol = i;
max = fggvny(kvetkezo elem);
}
i += 1;
}

A ttelekben elofordult j jellsek.

i++ i = i + 1
i+=10 i = i + 10
!logikai vltoz Logikai tagads. (!igaz = hamis);
boolean Logikai tpus
true logikai igaz
false logikai hamis

1.4.5. Az elemenknti feldolgozsrl


Az elozoekben ismertetett ttelek mindegyike olyan, hogy az adathalmaz, ami rendelke-
zsre ll, egyszeri vgigolvassval eldntheto a feladatban megfogalmazott krdsre a
vlasz. Idetartozik tovbbi pr algoritmus pldul az sszefsls, vlogats, stb.

21
Egy adathalmaz elemenknt feldolgozhat, ha egyszerre csak pr elemmel dolgozunk
s ha elg egyszer vgignzni mindegyiket. (Ezek gyakorlatban a bemenettol linerisan
idoben fggo problmkat illetve algoritmusokat jelenti.)
Ugyanakkor vannak olyan problmk, amik gy nem megoldhatak, pldul a sorozat
nvekvo/cskkeno sorrendbe rendezse, egy adathalmaz medinjnak szmtsa, vagy an-
nak eldntse, hogy van-e kt egyforma elem az adathalmazban. (De az eldntheto, hogy
van-e mg egy olyan, mint az elso.)

1.5. (El)Gondolkodtat feladat


A feladat egy olyan algoritmus megvalstsa, amely kpes megmondani, hogy egy
adott pnzmennyisg milyen cmletu s hny rmre vlthat fel leggazdasgosab-
ban. Effle algoritmusokat hasznlnak a postn ahhoz, hogy a pnzes posts a le-
heto legkevesebb, ugyanakkor elgsges mennyisgu cmletekkel induljon el reggel.

Gondolkodtat feladat
Bemenet: a felvltand sszeg x
Kimenet: y vektor, ami tartalmazza az egyes rmk darabszmt, illetve n az sszes darabszmot
Feladat: a program szmolja ki, hogy az x hogyan vlthat fel a legkevesebb rmre

Lehetsges megolds. Egyszerusts kedvrt vegyk forintban. Eloszr vizsgljuk


meg, hogy hny darab 200-as kell, azutn a szzasoknak megfelelo rtket vonjuk ki a
felvltand sszegbol s nzzk meg 50-esekre, s gy folytassuk tovbb . . .

Moh algoritmus
int x = 295;
int [] y = {0, 0, 0, 0, 0, 0}
int n = 0;
y[0] = x / 200;
x = x - (y[0] * 200);
y[1] = x / 100;
x = x - (y[0] * 100);
y[2] = x / 50;
x = x - (y[1] * 50);
y[3] = x / 20;
x = x - (y[2] * 20);
y[4] = x / 10;
x = x - (y[3] * 10);
y[5] = x / 5;

Ugyanez ciklussal:

Moh algoritmus ciklussal


int x = 295;
int [] y = {0, 0, 0, 0, 0, 0}
int [] c = {200, 100, 50, 20, 10, 5};
int n = 0;

22
for (int i = 0; x < c.length; i = i + 1)
{
y[i] = x / c[i];
x = x - (y[i] * c[i]);
n = n + y[i]
}

Ez az algoritmus hatkonynak tunik, nagyon keveset lehet mr javtani rajta. Azonban


helyes-e?
Forintban nyilvnvalan, ennek hamar utna tudunk jrni, de mi trtnik, ha az albbi
rmink vannak: c = (25, 20, 5, 1)? Nzzk meg, mi trtnik, ha az x = 42. (Ehhez nem
is kell csodaorszgba mennnk, hiszen van a fldn olyan orszg, ahol hasonl rmk
vannak.)
Rnzsre lthat, hogy kt hszas s kt egyes rme a helyes megolds, de vajon az
algoritmusunk is ekknt szmol? Moh mdon, kezdjk a 25-tel. Kell belole egy, marad
17. Ezt pedig az rmket felhasznlva sszesen 5 rmt kell elhasznlnunk, teht a fel-
vltst 6 rmvel oldjuk meg. Ez tbb, mint amit rnzsre megllaptottunk, teht az
algoritmusunk ebben az esetben aligha nevezheto helyesnek.
Krds, hogy akkor mi a megfelelo algoritmus erre a problmra. Lehetsges egy olyan
megolds, hogy kiprbljuk az sszes rvnyes felvltst, megnzve, hogy melyik a legjobb.
Vajon ez a mdszer hatkony?

1.6. Tpusok
Az elozo rszben szerepelt egy definci, miszerint tpusnak nevezzk egy megadott rtk-
halmazt s az azokon rtelmezett muveletek sszessgt.
A tpusokat az albbiak szerint lehet osztlyozni

Tpusok

sszetett tpusok Elemi tpusok

Iterlt Skalr Mutat

Uni Diszkrt Vals

Direktszotzat Felsorolsi Fixpontos

... Egsz Lebegopontos

1.6. bra. Tpusok osztlyozsa

A tpusok elemi vagy sszetett tpusok. sszetett esetben meglvo elemi tpusokbl
kiindul valamilyen konstrukcirl van sz. Pldul Descartes szorzat esetn kt tpus
lehetsges elemeinek minden lehetsges prbeli kombincii lesznek az j tpus rtkei.
sszetett tpusok tovbb olyan konstrukcik mint a tmb vagy vektor, amely (azonos)
elemi tpusok sorozatbl ll rtkek trolsra hasznlhatk.
Elemi tpusok esetn megklnbztetnk:

Skalrt, amelyek egyetlen rtk trolsra kpesek. Egy skalr lehet

23
Diszkrt tpus, amely valamilyen felsorolhat rtkeket trol. Az egsz szmok
egy meghatrozott intervallumon szintn felsorolhatak, gy ok is a diszkrt
tpus csoportjba tartoznak.
Vals, valamilyen vals (racionlis) szm/rtk trolsra alkalmas tpusok.
Lehetnek fixpontosak, vagy lebegopontosak, ami a tizedespont rgztettsgre
utal. (Lebegopontos esetben nincs megktve, hogy a tizedespont elotti jegyek
pldul az egsz rszt a tizedespont utni rsz pedig a trtrszt jelenti. Lebe-
gopontos szmok a x 10y alakak, ahol az x s y is tetszoleges szm lehet.
Termszetesen a tetszolegessgnek az brzolsi pontossg korltot szab.)
Mutatt, aminek az rtkei a memria lehetsges cmei. Mutat esetn az rtk ltal
meghatrozott memriaterleten tallhat a szmunkra hasznos informci. (Ehhez
a memrit mint rekeszek sorozatt kell elgondolni, ahol minden rekeszbe kerlhet
rtk s az egyes rekeszeknek egyedi sorszmuk van.)

1.6.1. Adatok brzolsa fizikai szint


Fizikai szintet a memria kt llapot megjegyzsre kpest. Ez merevlemez esetn mg-
nesezett/nem mgnesezett vagy memria esetn feszltsg alatt levo/feszltsgmentes l-
lapot. Matematikai rtelemben a kt llapotnak a 1 s 0 rtket feleltetjk meg. Egy po-
zciban egyetlenegy rtk trolhat ez lesz a 0 vagy 1. Ezt nevezzk bitnek. 8 biten lehet
brzolni egy bjtot, kettes szmrendszerbol tzesre trva ez 0 s 255 kztti szmokat
tesz lehetov, teht sszesen 256 klnbzo rtk. Ezt fogjuk bjnak nevezni. A bjtokat
ketto hatvnyai szerint szoks tovbbi egysgekbe foglalni, szlestendo az brzolhat
rtkek halmazt.
Kt bjt (16 bit): 0 s 65535 kztt
Ngy bjt (32 bit): 0 s 4294967295 kztt, (32-bites rendszerekben ezt sznak (word)
is hvjk)
A trolni kvnt rtk tpustl fgg az rtkek jelentse, amiket a knnyebbsg ked-
vrt szmokknt fogunk fel. Pldul 16 biten (2 bjton) trolni lehet:
Elojel nlkli egsz szmokat (0 . . . 65535)
Elojeles egsz szmokat (32768 . . . 0 . . . 32767). (Elso bit elojelbit)
Karaktereket (gynevezett Unicode tblzat alapjn). Minden egyes rtkhez egy
karaktergrafika rendelheto, amely ebben az esetben a vilg sszes rsformjra ele-
gendo szm helyet biztost. (Korbban illetve a kompatibilits megorzse rdekben
8 bjton troltak egy-egy karaktert, ami legfljebb 256 klnbzo karakternek volt
elg. Knnyen utnajrhatunk annak, hogy ez a teljes latin abc s a hozz kapcsold
szmoknak s rsjeleknek sem elg, ha a lehetsges nemzeti kezetes karaktereket
is szeretnnk trolni.)
...
Milyen adatokat lehet trolni a memriban:
Logikai rtkeket ahol a logikai vltoz rtke igaz vagy hamis lehet.
Racionlis szmokat, meghatrozott tizedes pontossggal
Karaktersorozatokat (szvegeket)
Memriarekeszek cmt
Programutastsokat (az egyes bjtoknak utastsok felelnek meg)
Dtumot, idot (pldul eltelt msodpercekben mrve)

24
Az elozoek sorozatt vektorok formjban
...

A fentiekbol lthat, hogy a 64-es rtknek megfelelo binris szm 01000000 sorozat fg-
goen attl, hogy miknt rtelmezzk tbb mindent jelenthet. Lehet a @ karakter. Lehet
a 64, mint szm. Lehet hogy eltelt idot jelent msodpercben.

1.6.2. Memria szervezodse


Pr mondat erejig a memria logikai szervezodsrol lesz sz. A memria rekeszekre van
osztva, ahol a rekeszek hossza rendszerenknt ms, manapsg pldul 32/64 bit szokso-
san egy asztali PC-ben. Egyetlen rekeszben mindig legfeljebb egy rtk van, akkor is, ha
a troland rtk kevesebb helyen is elfrne. (Teht a logikai vltoz trolsa is ugyangy
egyetlen teljes rekeszt elfoglal.) A programoz (gy a gpi utastsokra fordtott program)
tudja, hogy melyik rekeszben milyen tpus rtk van, hogy kell rtelmezni, belertve a
programkdra vonatkoz informcikat. (A rekeszeknek tudunk nevet adni, tulajdonkp-
pen ezek a vltozk. Ez kzvetve felolddik a rekeszek cmre, a program fut kdjban
tnylegesen a cm kerl felhasznlsra.) Vltozkon keresztl a rekeszeket lehet egyt-
tesen is kezelni (sszefogni). Pldul tmbk, karaktersorozatok . . . (Amikor egy rekeszbe
egy msik rekesz cmt tesszk s a hivatkozottat elrjk azt a referencia feloldsnak
nevezzk.)

1.6.3. A vals szmok a memriban


Egyrszt fontos megjegyezni, hogy a vals szmok halmazbl, csakis a racionlis szmo-
kat tudjuk adott esetben pontosan trolni. (Termszetesen a trols pontossg itt is kor-
lt.) Az irracionlis szmok (vgtelen tizedestrt alakak) pontos trolsra nincs md. A
racionlis szmok az X 2Y alakban brzoljuk. Ahol az X s Y rtke kerl tnyleges t-
rolsra. A hosszak pldul egy 32 bites trols esetn 23 bit az X s 8 bit az Y , illetve mg
egy bit az elojelbit. Egy IEEE szabvny esetn a lebegopontos szmbrzols az albbi
alakot lti:
23db
Az X minden esetben 1. xxxxxxxxxxxxxxxxxxxxxxx alak, ahol az x egy binris
z }| {
rtk
Az exponens (Y ), amely a maradk biteken kerl kdolsra adja meg a kettedes
pont helyt. (A kettedes pont a tizedes pont mintjra kpzelendo el, nem feledjk el
ugyanis, hogy itt nem tzes, hanem kettes szmrendszerben kell gondolkodni.)
A vezeto egyest valjban nem troljuk, mivel mindig egy, az elozo felrsban a ket-
tedes pont elotti szmjegy.

A trols kvetkezmnyei

Az elobb lert trolsi mdszerekbol knnyen lthatjuk az albbi gondolatok fontossgt


s rvnyessgt:

Nagyon fontos tudni az rtkek tpust, mert legbell a fizikai szinten minden egy-
forma.
Nem vgtelen a precizits szmok esetn, teht matematikai problmknl ezt fl-
ttlen figyelembe kell venni.

25
Nem vgtelen az brzolhat szmok intervalluma, azaz ha egy bjton trolunk s
vesszk azt a kifejezst, hogy 255+1, akkor is kapunk eredmnyt, mgpedig azt hogy
255 + 1 = 0. Ezt jelensget tlcsordulsnak hvjuk, van egy prja is alulcsorduls
nven, amihez a 0 1 = 255 plda tartozik.
Racionlis szmoknl ha kt eltro nagysgrendu szmot adunk ssze, pldul 23
kettedes jegynl nagyobb a nagysgrendbeli klnbsg, akkor A 6= 0: A + B = B
elofordulhat, mivel az sszeads utn a hasznos jegyekbol az A-hoz tartoz rtkek
eltrolsa lehetetlen adott pontossg mellett. (Ilyen esetben elofordulhat, hogy a pre-
cizits nvelse megoldja a problmt. (Pldul 32 bites lebegopontos helyett 64 bites
lebegopontos szmok hasznlata.)
Nem mindig igaz, pontossgveszts miatt, hogy (x/y) y = x, teht vals szmoknl
ne hasznljunk egyenlosgvizsglatot.

1.7. Objektumorientlt programozs


A tpusok megismershez Java nyelven szksges pr fogalom az objektumorientlt prog-
ramozsi szemlletbol, mivel a Java nyelv az objektumorientlt szemlletet kveti.

1.7.1. Modellezs

A programozshoz a vals vilgot modellezzk, amely sorn olyan absztrakt fogalmakat


vezetnk be a programozs sorn amelyek megfeleltethetok a vilgban tallhat trgyak-
nak, entitsoknak, fogalmaknak. A modellezshez az albbi alapelveket hasznljuk fel

Absztrakci az a szemlletmd, amelynek segtsgvel a vals vilgot leegyszeru-


stjk, gy, hogy csak a lnyegre, a cl elrse rdekben felttlenl szksges r-
szekre sszpontostunk. Elvonatkoztatunk a szmunkra pillanatnyilag nem fontos,
kzmbs informciktl s kiemeljk az elengedhetetlen fontossg rszleteket.
Megklnbztets az objektumok a modellezendo vals vilg egy-egy nll egys-
gt jellik, a szmunkra lnyeges tulajdonsgaik, viselkedsi mdjuk alapjn meg-
klnbztetjk.
Osztlyozs Az objektumokat kategrikba, osztlyokba soroljuk, oly mdon, hogy
a hasonl tulajdonsgokkal rendelkezo objektumok egy osztlyba, a klnbzo vagy
eltro tulajdonsgokkal rendelkezo objektumok pedig kln osztlyokba kerlnek.
Az objektum-osztlyok hordozzk a hozzjuk tartoz objektumok jellemzoit, objektu-
mok mintinak tekinthetok.
ltalnosts, specializls Az objektumok kztt llandan hasonlsgokat vagy
klnbsgeket keresnk, hogy ezltal bovebb vagy szukebb kategrikba, oszt-
lyokba soroljuk oket.

Objektum plda
Sok embernek van kutyja klnbzo nvvel s jellemzo tulajdonsgokkal objektumok
(pldnyok)
A kutyk, mint egy llatfaj egyedei sok mindenben hasonltanak is pldul mindegyik
tud ugatni

26
1.7.2. Osztlyhierarchia
Termszetesen, ha szksg van tovbbi llatok reprezentlsra a program sorn, akkor
tovbbi osztlyokat, objektummintkat vezethetnk be. Legyenek ezek pldul a macskk
a tigrisek s az emuk. A macskkban s a kutykban lehetnek olyan kzs tulajdonsgok,
amelyeket egy felsobb absztrakcis szinten lerhatunk, a hzillatok szintjn. Hasonl
gondolat mentn tudjuk kialaktani az albbi struktrt, amelyben a kapcsos zrjellel
jellt rsz az osztlyhierarchia, illetve nhny Kutya objektumpldn is jellsre kerlt.

Osztlyhierarchia
llat

Hzillat Vadllat

Macska Kutya Tigris Emu

Bodri Morzsi Floki

1.7. bra. Osztlyhierarchia plda

Az objektumorientlt nyelvek eszkzeivel a fenti bra teljes egszben megvalsthat,


olyan mdon, hogy a Macska osztly minden egyes tulajdonsgt rklni kpes a Hzil-
lat osztlynak illetve felfel a hierarchiban.

1.7.3. Objektumok s llapotaik


Az objektumorientlt program egymssal kommunikl objektumok sszessge, ahol min-
den objektumnak megvan a feladata. Az objektum informcit trol, krsre feladatokat
hajt vgre; belso llapota van, zeneten keresztl lehet megszltani s megvltoztatni;
valamint felelos; feladatainak korrekt elvgzsrt.
Objektum = adattagok + muveletek (fggvnyek)
Az objektumoknak Mindig van egy llapota, amit a mezok (objektumhoz tartoz vl-
tozk) pillanatnyi rtkei rnak le. Az objektum muveleteket hajt vgre, melyek hatsra
llapota megvltozhat. Kt objektumnak akkor lesz ugyanaz az llapota, ha az adattagok
rtkei megegyeznek.

1.7.4. Osztly s pldny


Az osztly (class) olyan objektumminta vagy tpus, mely alapjn pldnyokat (objektu-
mokat) hozhatunk ltre. A pldny (instance) egy osztlyminta alapjn ltrehozott objek-
tum. Minden objektum szletstol kezdve egy osztlyhoz tartozik, letciklusa van meg-
szletik, l, meghal. Ltrehozshoz inicializlni kell specilis muvelet, fggvny, a neve
konstruktor, ami a vltozknak kezdortket ad, valamint az objektum mukdshez
szksges tevkenysgek vgrehajtja.
Pldnyvltoz: objektumpldnyonknt helyet foglal vltoz minden pldnynak
van egy sajt.
Osztlyvltoz: osztlyonknt helyet foglal vltoz az osztlyhoz tartoz vltoz.
Pldnyfggvny (-metdus): objektumpldnyokon dolgoz metdus, muvelet, amely
a meghatrozott pldny vltozit ri el, illetve azokon vgezhet muveleteket.

27
Osztlyfggvny (-metdus): osztlyokon dolgoz metdus, muvelet, amely az osztly-
vltozkat ri el.
Lthatsg: Lehetosg van arra, hogy bizonyos fggvnyeket (muveleteket), vltozkat
az osztlyhasznl szmra lthatatlann tegynk. Ez az (informci elrejtsnek alapel-
vhez) tartozik, ahol arrl van sz, hogy az objektumot hasznl szmra csak a szmra
szksges elemei legyenek elrhetoek az objektumbl. Azaz ne tudja gy megvltoztatni
az llapott, hogy azt ne muveleten keresztl tegye, vagy ne tudjon elolltani nem kon-
zisztens (rvnyes) llapotot az objektumban.

1.7.5. rklods
Az llat osztlynak vannak bizonyos tulajdonsgai (mezoi) s fggvnyei. Amennyiben el-
ksztjk a hzillat osztlyt, nyilvnval, hogy sok olyan tulajdonsga lesz, mint ami az
llatnak. Kzenfekvo az tlet, hogy ezt a programozs sorn a OOP-t tmogat nyelv is
kezelje. Erre lehetosg az OOP nyelvekben, hogy a hzillat osztlyt az llat osztly le-
szrmazottjaknt ltrehozni, ekkor az sszes mezot s fggvnyt rkli a hzillat, ami
az llatban megvolt. Termszetesen tovbbi fggvnyeket s mezoket vehetnk a hzil-
latba.
(Az rklods, dinamikus kts s polimorfizmus (statikus s dinamikus tpus) nagyon messzire elvinne
minket, gy elmletben tbbrol nem esik sz. Fontos megjegyezni azonban, hogy a fentebbiek alapelvek, ennl
sokkal sznesebb paletta ll rendelkezsre)

28
2. fejezet

Java s Eclipse

2.1. Java tpusok


A Java egy objektumorientlt nyelv, aminek az a kvetkezmnye, hogy minden beptett
tpus a primitveket kivve objektum.

2.1.1. Java primitvek


A primitv tpusok eddigi fogalmainkkal jl lerhatak, minden egyest trol primitv tpus
rtkhez egy dediklt rsz tartozik a memriban. Java nyelven az albbi primitv tpusok
rhetoek el:

boolean: Logikai tpus, lehetsges rtke true igaz, vagy false hamis.
byte: 8-bites elojeles egsz.
short: 16-bites elojeles egsz.
int: 32-bites elojeles egsz.
long: 64-bites elojeles egsz.
float: 32-bites lebegopontos racionlis szm.
double: 64-bites lebegopontos racionlis szm.
char: 16-bites Unicode karakter.

2.1.2. Objektum tpusok Javaban


Java esetn az objektum tpus vltozknak az rtke egy referencia, amely az objektum-
pldny helyt (cmt) mondja meg a memriban. Amikor a vltozt hasznljuk auto-
matikusan megtrtnik a pldnyra val referls, teht a cmet kzvetlenl nem tudjuk
elrni. Amikor egy rtket adunk egy objektumpldnyt referl vltoznak, akkor vagy
egy j pldny ltrehozsval vagy egy meglvo pldnyra referl vltozval tudjuk meg-
tenni. (Ez utbbi esetben ugyanarra a pldnyra fog kt vltoz hivatkozni.) (Primitv
tpusok esetn a vltoz rtke a tnylegesen trolt rtk.)

2.1.3. Csomagol osztlyok


Az objektumelvu szemllet miatt a primitv tpusoknak Javaban vannak objektum prjaik,
amelyek a kvetkezok:

Boolean: boolean
Byte: byte

29
Short: short
Integer: int
Long: long
Float: float
Double: double
Character: char

Ezeket csomagol osztlyoknak hvjuk, gyakorlatilag a primitv trsukkal felcserlhetoek


a legtbb esetben. Fontos, hogy nem megvltoztathat az rtkk, ami azt jelenti, hogy
az objektumpldny llapota a ltrehozs utn lland. Amennyiben egy csomagol osz-
tly pldnynak rtkt megvltoztatjuk egy kifejezsben, akkor j pldny jn ltre a
memriban s a vltoz az j pldnyra fog hivatkozni.

2.1.4. Karakterlncok
Hasznos tpus a karakterlnc String (objektum), amelybe szvegeket lehet eltrolni.
Hasonlan a csomagol tpusokhoz a karakterlncok sem vltoztathatak meg. Amikor j
rtket adunk, akkor egy j pldny jn ltre, amelyre a korbbi vltoz fog hivatkozni.

Deklarci
String s;

rtket adni idzojelek kztt megadott szveggel lehet:

rtkads
String s = "Szervusz vilg";

Ha idzojelet szeretnnk belevinni a szvegbe akkor:

Idzojelek egy karakterlncban


String s = "Szervusz \"szp\" vilg";

Karakterek szmnak lekrdezse egy String esetn

Karakterek szma
String s = "Szervusz vilg";
int meret = s.length();

2.1.5. Tmbk
A tmb ahhoz hasonlt, amit matematikban vektornak hvunk. A memriban folytono-
san tbb ugyanolyan tpus terlet foglaldik le deklarcikor, amelyet indexelten lehet
elrni. 1
Java nyelven egy egszekbol ll tmb deklarcija a kvetkezokppen trtnik:

Deklarci
1
A folytonos memriaterleten val elhelyezkeds fontos, ugyanis hiba van sok szabad memria, azonban,
ha az nem folytonos nem tudunk maximlis mretu tmbt lefoglalni. Megjegyezendo, hogy tovbbi korltok
is vannak a dinamikusan kezelheto memria nagysgra vonatkozan.

30
tombtipusa [] tombneve;

Egy ltrehozott tmb hossza nem vltoztathat meg a ksobbiekben, viszont lehetosg van
jabb, nagyobb deklarcijra. Egy tmbnek rtket adni tbbflekppen lehet:

rtkads Felsorolssal
int [] tombneve;
tombneve = {1,2,3,4,5};

Ugyanakkor ltrehozhat egy tmb kezdortkek nlkl is, csak a mret megadsval:

rtkads res ltrehozsa


int [] tombneve;
tombneve = new int[10];

Ebben az esetben egy j objektumpldny kerl ltrehozsra, amelynek tpusa egy eg-
szekbol ll tmb tpus.
Illetve a tmb rtkadsnl lehetosg van egy msik tmbbel egyenlov tenni

rtkads Msik tmbbel


int [] masiktomb = {0, 1};
int [] egyiktomb = masiktomb;

Fontos, hogy ekkor a memriban egyetlen tmb lesz csak, ugyanakkor ktfle vltoznv-
vel lehet elrni, kt vltoz referl r.
A tmbk tartalmt indexelssel rjk el, a szmozs 0-val kezdodik.

Pldul
int [] egyiktomb = new int[10];

Az elozo tmb esetn 0 . . . 9 indexek rvnyesek, a tbbi kiindexel a tmbbol.


Egy tmb mretnek megismerst a kvetkezo plda mutatja be:

Tmbmret
int tombmerete = egyiktomb.length;

A egy tmb deklarcija sorn implicit mdot egy j tpust hozunk ltre. Ezzel a tpus-
konstrukcival lehetosg van egy tovbbi tmb tpust meghatrozni, amelyet a kvetkezo
plda mutat be:

Deklarci
tipus [] [] matrix;

Ebben a pldban ezltal egy ktdimenzis tmbt hoztunk ltre. Tovbb folytatva tbbdi-
menzis tmbket is ltre lehet hozni, a korlt a memria mrete. (Ktdimenzis vektorok
a mtrixok).

31
2.1.6. Muveletek
A kvetkezo muveletek rtelmezettek egsz tpusokon, ahol a sorrend a precedencia sor-
rendjben kerlt lersra:

Nvels, cskkents: ++, --


Multiplikatv: *, /, % (Szorzs, Maradkos oszts, s maradkos oszts maradka)
Additv: +, -
Bitenknti eltols: <<, >> (Balra, jobbra) A bitenknti eltols esetn gyakorlatilag
kettovel val szorzsnak (balra) illetve kettovel val osztsnak felel meg (jobbra).
Bitenknti muveletek: , &, |, (Negls, s, vagy, kizr vagy)
Relcis: ==, !=, <, <=, >, >=
Unris: +, - (elojelek)
rtkads: A vltoznak j rtket ad = (Kombinlhat ms muvelettel: +=)

Racionlis tpusok esetn a muveletek:

Nvels, cskkents: ++, --


Multiplikatv: *, /, % (Szorzs, Oszts, s maradkos oszts maradka. Figyelem itt
az oszts nem maradkos.)
Additv: +, -
Relcis: ==, !=, <, <=, >, >=
Unris: +, - (elojelek)
rtkads: A vltoznak j rtket ad. =

A kvetkezo muvelek rtelmezettek logikai tpusokon:

Tagads: !
Relcis: ==, !=
Logikai s, vagy: &&, ||
rtkads: A vltoznak j rtket ad. = (Az rtk true vagy false)

Karakterlncok esetn pedig az albbi rvnyes muveleteink lteznek.

rtkads: A vltoznak j rtket ad. =


sszefuzs: + Tbb klnbzo karakterlncot fuz ssze

A muveletek esetn felmerlo lehetsges problmk a tpusra vezethetok vissza bizo-


nyos esetekben. Mivel a muveletek mindig tartoznak egy tpushoz is, ezrt a tpus dnti
el egy kifejezsben, hogy milyen opertor kerl alkalmazsra. Pldul, ha a 10/3 osztst
szeretnnk elvgezni, akkor azt vrjuk el, hogy az eredmny 3.333 . . . legyen. Ezzel szem-
ben Javaban a 10 / 3 = 3, mivel a 10 egsz szm, ezrt az egszhez tartoz / opertort
veszi, ami a maradkos oszts. Azonban 10D / 3 = 3.3333 ..., ahol a D jelli, hogy ez
itt egy double tpus, teht nem egsz. (Helyette 10.0-t is rhatunk.)

2.2. Java osztlyok


Javaban osztly ltrehozsra az albbi szintaxis szerint lehet ltrehozni. Ez meghat-
rozza az osztlynak a lehetsges vltozit s muveleteit.

Osztly ltrehozsa

32
public class osztlynv extends szlo [s mg ms]
{
public int mezonev;
private String mezonev;
...
public osztlyneve (paramterek)
{ // Konstruktor }

public int fuggvenyneve (paramterek)


{ ...}
...
}

A mezok s s fggvnyek elotti lehetsges kulcsszavakbl nhny:

public: mindenki szmra elrheto a program egszben.


nincs kulcssz: adott osztlyban, leszrmazottjaiban (rklods) s a csomagban r-
heto el.
protected: csak az adott osztlyban s leszrmazottjaiban, a csomag tbbi oszt-
lyban mr nem rheto el.
private: csak az adott osztlyban rheto el, a leszrmazottakban mr nem.
static-kal jelljk az osztlymezot illetve fggvnyt.
Ha egy mezo final, akkor nem mdosthat.
Ha egy osztly final, akkor nem rklheto belole tovbb.

(Tovbbi kulcsszavak az abstract, synhronized, volatile, native . . . , amelyek sz-


munkra most nem relevnsak.)
Az osztlyok elemeinek lthatsgi szablyozsa az eszkz, amivel a klvilg szmra
el tudjuk rejteni egy objektum belso szerkezett, llapott. Az eddigi pldnk folytatsa,
a Kutya osztly Java nyelven:

Kutya osztly
public class Kutya extends Allat
{
public String nev;
public String fajta;
public Integer eletkor;
private Date [] oltasok_ideje;
private String [] oltasok_neve;
public Kutya ()
{
oltasok_ideje = new Date[10];
oltasok_neve = new String[10];
}
public void ugat()
{
}
public void megy()
{
}

33
public void oltastkap(String s, Date mikor)
{
}
}

Lthat, hogy az oltsokkal kapcsolatos informcikat nem lehet kzvetlenl mdostani,


csakis egy fggvnyen keresztl. Ez azrt j, mert gy nem lehet olyan llapotot eloidzni,
ami szerint a Kutya osztly egy pldnynak az oltsok ideje s az oltsok megnevezse
tmb eltro elemszm (ami nyilvnvalan nem rvnyes llapot).

Kutya
+Nv: String
+Fajta: String
+letkor: Integer
#Oltsok ideje: Date []
#Oltsok neve: String []
+ugat(): void
+megy(): void
+oltstkap(mikor:Date,mit:String): void

2.1. bra. A Kutya osztly UML diagramja

Az elozo kutya osztly, mint tpus az albbiak szerint deklarlhat

Deklarci
Kutya bodri;

Ez mg csak deklarci, a tnyleges pldny ltrehozsa a new kulcsszval trtnik.

Pldnyosts
bodri = new Kutya();

A new kulcssz hatsra a memriban ltrejn egy j Kutya objektum, valamint lefut
annak a konstruktora. A korbban emltettek szerint, amikor az Object osztly brmely
leszrmazottjt (legyen az tmb, String, Double, Kutya . . . ) deklarljuk, akkor a vl-
toz, ami lefoglalsra kerl a memriban egy referencit (memriacmet) tartalmaz
rtkknt, nem az objektumot magt. Ez referencia alaprtelmezsben null, azaz nincs
hozztartoz objektumpldny. (Teht a vltoz kpes egy adott tpus objektumra hivat-
kozni, de ppen nem hivatkozik egyre sem.) Ahhoz hogy hivatkozzon, ltre kell hozni egy
j pldnyt, vagy egy meglvo hivatkozst kell tadni rtkknt (egy meglvo pldnyt):

Pldnyosts
Kutya morzsi = new Kutya();
Kutya rex = morzsi;

A msodik miatt egyetlen Kutya pldny van a memriban, csak kt nvvel is hivat-
kozhatunk r: morzsi s rex. Egy objektumvltoz rtke Java-ban egy referen-
cia a memriban! Az olyan objektumpldnyokra amelyekre nincs olyan vltoz ami
a referencit tartalmazza gy kell tekintennk, mint ami nincs is. (Ez Java esetn au-

34
tomatikusan felszabadtsra kerlo memriaterletet jelent, ms nyelveken ez elveszett
memriaterlet.)
Egy objektumpldny mezoit s tagfggvnyeit a pldnyon keresztl lehet meghvni.
(Termszetesen ez csak a lthat elemekre vonatkozik, ahol a lthatsgot a fentebb lert
kulcsszavak hatrozzk meg.)

Tagfggvnyek, mezok
bodri.ugat();
String kutyaneve = bodri.nev;

Egy osztly osztlymezoit s fggvnyeit az osztlyon keresztl javasolt elrni. (Lehet-


sges egy pldnyon keresztl is, de az ellentmond a pldnyfggetlensgnek.)

Osztlymezo
Kutya.ALAPRTELMEZETTUGATSIHANGERO

2.3. Fggvnyek s metdusok


Korbban mr tbb helyen rintolegesen sz volt rla, ezrt most vegyk rszleteiben a
fggvny fogalmt.
A fggvnyek olyan rszprogramok, muveletek, amelyeknek a programokhoz hason-
lan vannak bemeno paramtereik, valamilyen muveletet vgeznek el s egy eredmnnyel
trnek vissza. (Ez nagyon hasonlt a matematikai rtelemben vett fggvny fogalomhoz,
ahol is a bemenetei paramterekhez egy eredmnyt rendelnk. Ugyanakkor bizonyos te-
kintetben nagyon klnbzik attl, pldul egy objektumfggvny az objektum llapot-
nak megvltoztatsra is alkalmas.)
Minden Java programban van egy fggvny, a main fggvny, ami a program elindul-
sakor kezd futni. Ha a main fggvny futsa befejezodik, akkor a program is befejezodik.
A main tovbbi fggvnyeket hv(hat) meg, illetve a fggvnyek is tovbbiakat hvhatnak
meg.
A kvetkezo main fggvny egy i szm ngyzett szmolja ki, amely fggvnyben a
KIIR egy absztrakt parancs, a kpernyore val kirst jelenti.

Plda main fggvnyre


public static void main(String [] arguments)
{
int i = 10;
int negyzet = i*i;
KIIR(negyzet);
}

Vegyk az albbi pldaprogramot, amely egy fggvny egy tetszoleges hromszg ma-
gassgt szmolja ki.

Terletszmts
public double terulet(double oldal, double magassag)
{
return (oldal * magassag) / 2;

35
}

public static void main(String [] arguments)


{
double side = 10;
double height = 8;
double eredmeny = terulet(side, height);
}

Ebben a kdrszletben tallhat egy terletszmt fggvny, aminek


a neve terulet. A fggvnydeklarcinak az albbi szerkezete van:

Fggvnyszignatra
visszatrsitipus fuggvenynev (parameterdeklarcik)

A plda esetn a fggvny deklarlt paramterei a double oldal, double


magassag. Ezeket hvjuk formlis paramtereknek, Attl formlis, hogy a fggvnyen
bell brmilyen hvs esetn ezekkel a vltozkkal (vltozkban) rjk el a fggvnyh-
vs aktulis paramtereinek rtkt. Az aktulis paramterek ebben a pldban a side,
height, amiknek az rtkei rendre 10 s 8. A fggvnyhvs a double eredmeny =
terulet(side, height); sorban trtnik, ahol is a paramterek helyn lvo kifejez-
sek kirtkelodnek. Ezutn tkerl a futtats a fggvnyhez, amely vgrehajtja az utas-
tsokat s a return kulcssz mgtti rtket visszaadja eredmnyknt a hvnak, aminek
hatsra ebben az esetben a double eredmeny vltoz rtke a kiszmtott terlet lesz.
A fggvny visszatrs tpust hvjk a fggvny tpusnak is. A fggvny neve lehet
brmi, kivve a nyelv fenntartott szavait. A szignatra alapjn hasznljuk a fggvny,
amiben a paramterek vesszovel elvlasztott vltozdeklarcik. A szignatrt (lenyoma-
tot) kveti a fggvny trzse, ami

hasznlhatja a bemeno paramtereket, j vltozkat.


tartalmaz (legalbb) egy return, amit a visszatrsi tpusnak megfelelo kifejezs
kvet ez lesz a fggvny visszatrsi rtke.
egy return utastssal befejezodik, mg akkor is, ha van mgtte tovbbi utasts.
(Annak a fggvnynek, aminek nincs visszatrsi tpusa, void a tpusa. A void a
semmilyen tpus, nem hozhat ltre belole pldny.)

2.3.1. Paramterek
A formlis paramterek a fggvnyszignatrban vannak deklarlva, j vltozk! Ezek a
fggvny hvsakor felveszik az aktulis paramterek rtkt, Java nyelv esetn rtk sze-
rint. Teht a formlis s aktulis paramter ms-ms terlet a memriban. A vltoznv
azonban lehet ugyanaz! A fggvnyek aktulis paramterei lehetnek tovbbi fggvnyh-
vsok!
A visszatrsi rtk, a fggvny befejeztekor, annak az rtkad utastsnak a jobb
oldala lesz, amiben a fggvny neve szerepelt

2.3.2. Az rtk szerinti paramter tads s kvetkezmnyei


Java nyelven, amikor fggvnyt hvunk, az aktulis paramter rtke tmsoldik a for-
mlis paramtert jelento vltozba. (Ltrejn(nek) a fggvnyszignatra szerinti j vl-

36
toz(k), s az rtkk az lesz, ami a fggvnyhvskor az aktulis paramter volt.) Teht
egy kln vltoz, aminek pont ugyanaz az rtke.
Az objektumoknak azonban az rtke a referencia, teht a referencia msoldik t, gy
az eredeti objektum egy pldnyban marad meg, csak ktfle nvvel lehet hivatkozni r.
(Aminek az a kvetkezmnye, hogy ha a fggvny megvltoztatja az objektum llapott,
akkor az eredeti objektumot vltoztatja meg.
A csomagol tpusok ugyan objektumok, teht egyetlen pldny ltezik, mivel vltoz-
tatskor j jn ltre, a tnyleges hats ugyanaz, mint a primitvek esetn. (Azaz, ha a
fggvny megvltoztatja az rtkt, akkor az mgsem lesz hatssal az eredeti objektumra
nzve.)

Paramterek plda

public void fuggveny(Double d, int i, Kutya k)


{
d = 5.0;
i = 10;
k.oltastkap("Veszettsg", new Date())
}
public static void main()
{
Double dd = 2.0; // Double d = new Double(2.0)
int ii = 10;
Kutya kk = new Kutya();
fuggveny(dd, ii, kk);
}

A main fggvnyben ltrejn egy Double referencia ami egy pldnyra mutat, aminek
2.0 az rtke. Ltrejn egy int, aminek 10 az rtke, valamint egy j Kutya. Ezek mind-
egyike taddik paramterknt a fggvnybe, a kvetkezo mdon. A Double referencia
tmsoldik, a pldny nem, egyetlen van belole tovbbra is. Az ii rtke egy j int-be
msoldik t. A kk referencia is tmsoldik. Megvltoztatjuk a d rtkt, ami azt jelenti,
hogy ltrejn egy j Double pldny s a d erre fog referlni. (Ez a megvltoztathatatlan-
sg miatt van. A dd tovbbra is 2.0.) Az i eleve egy msik vltoz (pldny) a memri-
ban, annak az rtke megvltozik, semmi hatsa sincs az ii-re. A k objektum llapott
egy fggvnyn keresztl vltoztatjuk, ez pedig az egyetlen ltezo pldnyt mdostja, gy
a kk-t is.

2.4. Vltozk lthatsga


Egy vltoz lthatsgi krnek nevezzk azt a rszt a programban, ahol az adott vl-
toz s ltala kpviselt memriaterlet elrheto, mdosthat. Egy vltoz hatskrnek
nevezzk azt a rszt programban, ahol a vltoz deklarcija rvnyben van. Egy fggv-
nyen bell deklarlt vltoz csak a fggvnyen bell lthat s arra terjed ki a hatskre
is. Egy utastsblokkon bell deklarlt vltoz hasonlan viselkedik a fggvny esetben
lertakhoz. Az blokkon, fggvnyen belli vltozkat loklis vltoznak hvjuk.

37
(Lteznek globlis vltozk is, amelyeket tbb fggvnybol el lehet rni, hasznlatuk
azonban nem javasolt. (Itt nem az osztlyokrl van sz, ez programnyelvtol fggetlen fo-
galom.)
Ha egy blokkon bell tovbbi blokkok vannak, akkor ott is deklarlhatunk j vltoz-
kat azonos nvvel is (a klso blokkokban azonos nevu vltozk szerepelnek). Ekkor a belso
blokkban tallhat deklarci elfedi a klso vltozt, teht az nem lthat. Ugyanakkor
mindketto rvnyes deklarcija van, hatskrrel rendelkezik.

Plda a hatskrre
int i = 10;
int j = 100;
{
int i = 50;
}
i++;
j++;

Az elso i-nek a teljes pldra kiterjed a hatrkre, azonban a belso rszben nem lthat.
A msodik i csak a belso rszben lthat s a hatskre is ugyanaz. Nem engedi ltni a
klso.

2.5. Tovbbi eszkzk


2.5.1. Foreach ciklus
Az albbi for ciklus egy tmb elemein lpked vgig, a tmb elemeinek sszegt kiszmo-
land (sszegzs ttele szerint):

For ciklus sszegzs plda


int [] tomb = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int osszeg = 0;
for (int i = 0; i<tomb.length; i++)
osszeg += tomb[i];

Tbb programnyelv esetn lehetosg van arra, hogy ezt tmrebben le lehessen rni, az
gy nevezett foreach ciklusok segtsgvel.

Foreach ciklus sszegzs plda


int [] tomb = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int osszeg = 0;
for (int aktualis : tomb)
osszeg += aktualis;

Foreach ciklus
for (elemek tpusa vltoz : aminvgigkelllpni)
ciklusmag;

38
A ciklus elejn deklarlt vltoz az itercik sorn felveszi a bejrni kvnt objektum
sszes rtkt. Nem hasznlhat azonban olyan esetekben, ahol meg kell vltoztatni az
egyes rtkeket. (Pldul megszorozni a tmb egyes elemeit.)

2.5.2. Tpuskonverzi
A klnbzo tpusok kztt lehetsges konvertlni. A konvertls trtnhet implicit, vagy
explicit mdon.

Implicit tpuskonverzi. Amikor egy opertor kirtkelsnl klnbzo tpusok van-


nak, ugyanakkor egyik szuktse a msiknak, a nyelv automatikus bovto konverzit hajt
vgre. (Teht int tpusbl automatikusan long-ra konvertl, amennyiben erre szksg
van.) Ugyangy a csomagol s primitv prok kztt is automatikus konverzi trtnik.

int i = 10;
long l = 100;
double d = 200;
dd = 6.6;
(i < l)
(d > l)
(dd = d)
(d = i)

Az sszehasonltshoz szksges, hogy az i s l vltozk azonos tpusak legyenek. Ha-


sonlan igaz ez a tbbi pldra is. Mindig a bovebb tpus fel trtnik a konverzi, teht a
kisebb bitszmon troltbl nagyobb bitszm, az egszbol lebegopontos lesz.

Explicit tpuskonverzi. Lehetosgnk van kzzel knyszerteni a tpuskonverzit


ezt nevezzk explicit konverzinak.

Explicit tpuskonverzi
(jtpus) kifejezs;

Az j tpus nevt kell zrjelek kztt megadni az tkonvertland kifejezs el. Fontos,
hogy a zrjelezsek segtsgvel meg lehet vltoztatni a konvertland rszt a kifejezs-
nek. Gyakran hasznlatos eszkz az oszts pontossgnak belltsra:

Oszts plda
int i = 10;
double d1 = i / 3; // = 3.0;
double d2 = (double)i / 3; // = 3.33333;

Tovbbi, fggvnyekkel tmogatott konverzi Java nyelven. A beptett csoma-


gol tpusok segtsgvel lehetosg van karakterlnc s szmok kztti konverzira is.
Ezek azonban mr fggvnyhvsok Javaban.

39
Egsz karakterlncban
String s = "20";
int i = Integer.parseInt(s);
int i = Integer.parseInt(s, 16); // Hexadecimlis

A patseInt msodik paramtere egy szm amivel megadhatjuk hogy a felismerni kvnt
karaktersorozatot milyen szmrendszer szerint rtelmezze a fggvny. Ha nem adjuk meg
azt a paramtert, akkor automatikusan dnti el az kvetkezoket figyelembe vve. Egy
hexadecimlis szm a 0x karakterekkel kezdodik. Ez nyolcas szmrendszerbeli szm
esetn mindig van egy nulla a szm elejn. (Vezeto nulla.)
String- alaktani is lehet.

Szm karakterlncc
String s1 = Double.toString(100);
String s2 = Integer.toHexString(10);

2.5.3. Felsorolsi tpus


Olyan tpus definilhat, ahol a lehetsges rtkeket sajt magunk adjuk meg.

Enum
enum Nap { HTFO, KEDD, SZERDA, CSTRTK, PNTEK, SZOMBAT, VASRNAP
}
Nap n = Nap.SZERDA;

Ekkor ltezni fog egy Nap nevu tpus, ahol pontosan meg van hatrozva az, hogy milyen
rtkeket vehet fel, sot mg egy explicit sorrendisg is ltezik az egyes rtkek kztt.
A felsorolsi tpus hasznlhat a tbbszrs elgazsban, mint eset, valamint a foreach
ciklusokban is a bejrand kifejezs helyn.
Tovbbi informci: http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html

2.5.4. IO muveletek Javaban


A beolvassra egy egyszerustett mdszer kerl ismertetsre. A Java gynevezett folyamo-
kat (Stream) kezel a be- s kimeneti muveletekbol. Ezen eszkzk rendkvl szles sklja
ll rendelkezsre, ami segtsgvel a tnyleges IO eszkztol fggetlenl lehet kezelni a be-
olvasst s kirst. (Pldul egy hlzati kapcsolat hasonlan olvashat s rhat, mint
egy USB port, vagy egy fjl.)

2.5.5. Beolvass
A java.util.Scanner osztllyal lehetsges a konzolrl, valamint fjlokbl sorokat, il-
letve meghatrozott tpus elemeket beolvasni. A Scanner osztly pldnyostsa:

Scanner
Scanner sc = new Scanner(bemenet)

A bemenet lehet:

40
Fjl (File).
IO Csatorna (Konzol, InputStream, FileReader).
String.

Nhny plda:

Konzolrl beolvass
Scanner sc = new Scanner(System.in);

Fjlbl beolvass
Scanner sc = new Scanner(new File(fjlneve));

A Scanner alkalmas specilis elvlasztjelekkel rt fjlok olvassra, regulris kifejez-


sek rtelmezsre is.

Kvetkezo sor olvassa


String s = sc.nextLine();

Kvetkezo int olvassa


int i = sc.nextInt();

Van-e kvetkezo sor


boolean b = sc.hasNextLine();

Ha nem olyan tpus kvetkezik a beolvasand csatornn, amit krnk, akkor hiba kelet-
kezik.

2.5.6. Kirs
Mg a System.in a konzolos bemenetet (billentyuzetet) egyedl kpviseli, addig kime-
netbol hagyomnyosan ktfle ll rendelkezsre: System.out s System.err. Az elso a
szabvnyos kimenet, a msodik a szabvnyos hibakimenet. Mindketto a kpernyore r ki,
a ltvnyos klnbsg, hogy a hibakimenet pirossal jelenik meg. 2
Hasznlatuk:

Szvegkirs jsor jellel a vgn


System.out.println("Szervusz vilg");

Szvegkirs jsor jel nlkl


System.out.print("Szervusz vilg");

2
Rszben trtnelmi rszben praktikussgi okai vannak ennek. A Java nyelv s krnyezet alapvetoen kon-
zolos, teht karakteres bemenettel s kimenettel rendelkezik, amelytol a modern PC-s opercis rendszerek
esetn elszokhattunk. Termszetesen ez nem jelenti azt, hogy a Java nyelv esetn nem lehet knyelmes gra-
fikus felhasznli interfszt kszteni.

41
A print() paramtere brmi lehet, a primitveket a csomagol osztlyon keresztl, a
tbbi osztlyt a toString() tagfggvny segtsgvel alaktja t a Java karakterlncc.
Sajt osztly esetben clszeru rni egy toString() fggvnyt.

toString() plda
public String toString();
{
return "Kutya, nv: " + nev + " faj: " + fajta;
}

Ha nincs toString() fggvnye egy osztlynak, akkor a szloosztly (vgsosoron az


Object) megfelelo fggvnyt hasznlja, de az legtbbszr nem informatv, mivel az ob-
jektumreferencia rtkt rja ki.
A System.out-hoz hasonl fjl-kimenetet ltrehozni a kvetkezokppen lehet:

Fjlba rs plda
PrintStream ps = new PrintStream(
new FileOutputStream(filenv));

Ms mdszerek is lteznek a fjlok hasznlatra a kimenet / bemenet irnytl, valamint


az rni kvnt egysgtol, illetve puffer hasznlattl fggoen.
Itt rviden megfigyelheto egy plda a Stream-ek hasznlatra.

2.5.7. Megjegyzsek, dokumentcik a kdban


Lehetosg van a kdban megjegyzsek, kommentek elhelyezsre a kvetkezo mdon

Egysoros megjegyzs
int i = 0; // szmll

Tbbsoros megjegyzs
/* Ez itt egy tbbsoros megjegyzs eleje
kzepe
s vge
*/

Ha ezekkel a karakterekkel tallkozik a programot rtelmezo fordt, akkor figyelmen


kvl hagyja az adott szakaszt s nem prblja meg utastsknt rtelmezni. Arra jk a
megjegyzsek, hogy az emberi olvas szmra nyjtsanak tmpontot a programkd funk-
cijval, az algoritmus mukdsvel kapcsolatban.
Lehetosg van a kdban fggvnyek s osztlyok elott dokumentcis megjegyzsek
elhelyezsre. Ezeket a megjegyzseket JavaDoc kommentnek hvjuk, segtsgkkel az
elksztett programrl kddokumentci hozhat ltre pr kattintssal. A JavaDoc-ban
elhelyezhetoek hivatkozsok, html kdok is.

JavaDoc plda
/** Ez itt egy JavaDoc
fggvny lersa

42
@author SzerzoNeve
@param egy paramter lersa
@return visszatrsi rtk lersa
*/

2.5.8. Csomagok
A klnbzo osztlyokat tartalmaz forrsfjlok, JAVA kdok gynevezett csomagokba
rendezhetok. Azt, hogy melyik csomagba tartozik egy Java osztly, a fjl elejn egy
package kulcssz mg rt nvvel kell jelezni. (Amikor ltrehozzuk Eclipse-ben az osz-
tlyt, megkrdezi, hogy milyen csomagba kerljn.) Az osztlyokat mindig a csomag nevn
keresztl lehet elrni:

programcsomag.Osztly a = new programcsomag.Osztly() plda a ltre-


hozsra
java.util.Math.sqrt() osztlyfggvny hvsa esetn

Egyazon csomagban levo osztlyok ltjk egymst, nem kell kirni a csomagnevet!
Amennyiben szeretnnk elrni, hogy ne kelljen ms csomagbli osztlyok neve el ki-
rni minduntalan a csomag nevt, lehetsges importlni (lthatv tenni) egy teljes cso-
magot, vagy osztlyt egy csomagbl. A kulcssz az import.

import java.util.Math csak a Math osztly importlsa


import java.util.* minden osztly importlsa a java.util csomagbl

Ezutn a Math.sqrt() kzvetlenl hasznlhat. A csomagon bell alcsomagok is ltre-


hozhatak, a *-os import az alcsomagokra nem fog vonatkozni.

2.6. Java
2.6.1. Hogyan mukdik?
A Java program a szmtgpen egy Java Virtulis Gpen fut (JVM), ami lehetov teszi,
hogy ugyanaz a Java program tetszoleges opercis rendszeren (amire a JVM elkszlt,
pldul Windows, Linux, MacOS) s gparchitektrn fusson. (Pldul mobiltelefonon is.)
Az ltalunk elksztett forrskdbl a fejlesztokrnyezet egy Java bjtkdot kszt,
amit a JVM rtelmez, s az adott rendszernek megfelelo gpi kd utasts-sorozatt ala-
kt t.
Ennek megfeleloen a Java krnyezet eleve kt rszbol ll:

JVM virtulis gp, a JRE rsze (Java Runtime Environment)


JDK Java Development Kit (a fejlesztoi Java, tartalmaz egy JRE-t is)

Jelenleg a 6-os verzi Update 16 a legfrissebb. JRE-t letlteni a http://www.java.com/ ol-


dalrl lehet, de ez csak a programok futtatsra elg! (A mobilok esetn ez a virtulis gp
beptett.)
A fejlesztsre alkalmas Java, ami tartalmaz pldkat, forrskdokat, teljes JavaDoc-ot,
az a JDK. Tbbfle verzi ll rendelkezsre:

Java SE Standard Edition (Alap verzi, neknk boven elg)


Java EE Vllalati verzi (Alap + tovbbi szolgltatsok)

43
Java ME Mobil verzi (Pldul telefonokra)

A Java SE-t a http://java.sun.com/javase/downloads/?intcmp=1281 oldalrl lehet letlteni.


Ezek az eszkzk, programok pusztn a megrt forrskd fordtsra, futtatsra,
(stb.) alkalmasak. Ez termszetesen elg lehet, hiszen a kdot egy tetszoleges szvegszer-
kesztovel is meg lehet rni (Jegyzettmb), de sokkal knyelmesebb krnyezetek is rendel-
kezsre llnak.
A flvben az Eclipse IDE (Integrated Development Environment) programot hasz-
nljuk, ami Java nyelven rdott. (Az egyszeru szvegszerkesztsnl sokkal bonyolultabb
feladatok gyors elvgzsre is alkalmas.) A http://www.eclipse.org/downloads/ oldalrl az
Eclipse IDE for Java Developers vlasztand.

2.7. Eclipse hasznlata rviden


Az Eclipse programot eloszr elindtva egy Welcome kpernyod minket, amit bezrni a
hozztartoz flecskn lehet.
Az Eclipse minden egyes indtskor (kivve, ha msknt rendelkeznk a belltsok-
ban) megkrdezi a hasznlni kvnt munkaterlet (workspace) nevt. A workspace-ek egy
tbb projektet sszefoglal, llapotukra emlkezo krnyezetek, tbb lehet belolk, azonban
mindegyik egy sajt knyvtrban. Hagyjuk, hogy az alaprtelmezett knyvtrban lvot
hasznlja az Eclipse.
Amennyiben sikeresen elindult a program s az dvzlokpernyot is becsuktuk az
albbi brhoz hasonl kp trul elnk. Az bra azt mutatja, hogy hogyan kell a men-
rendszer hasznlatval egy j Java projektet ltrehozni.
j projekt ltrehozsa sorn meg kell adnunk a projekt nevt, valamint tovbbi para-
mtereket, mint pldul, hogy melyik JRE-t hasznlja a futtatshoz. A projekt neve tar-
talmazhat kezetes magyar karaktereket, szkzt, de javasolt inkbb a szabvnyos latin
abc karaktereit hasznlni.
Ha ksz a projekt osztlyokat hozhatunk ltre a varzsl segtsgvel. Elso s legfon-
tosabb osztlyunk a main fggvny tartalmaz osztly lesz, amire a program futtatshoz
felttlen szksg van. Kattintani a File menpont New s azon bell New class pontjra
kell.
Megadhat ltrehozand osztly neve, mdost kulcsszavak az elrhetosggel kapcso-
latban. Tovbb, hogy mely csomagba tartozzon. (A csomagokrl lesz sz ksobb.) Ide be-
rhat nem ltezo csomag neve is, az Eclipse automatikusan ltre fogja hozni a megfelelo
nevu csomagokat. Megadhat a szloosztly neve is, amelyet egy listbl is kikereshetnk.
(Superclass) Valamint az interfszek. Az ezt kveto opcik sorrendben:

Ltrehozza a main fggvnyt ebben az osztlyban. A ltrejtt fggvny teljesen res.


A szloosztly konstruktorainak megfelelo konstruktorokat ltrehoz ebben az osz-
tlyban is.
Az absztrakt, meg nem valstott metdusokat megvalstja. (res fggvnyknt.)
Az rklodsnl van szerepe.

A ltrejtt osztlyban a main fggvnyt megszerkesztve a programot elindtani az esz-


kztr megfelelo gombjval lehet, vagy a Run menpont Run utastsval. (A gomb egy
zld krben levo hromszg.) Bizonyos esetekben az Eclipse rkrdez, hogy milyen alkal-
mazst akarunk futtatni.
A program futsa sorn ltrejvo kimeneteit alaprtelmezsben alul lehet olvasni a
Console felirat flnl. (Ezek a flek tetszolegesen thelyezhetok, bezrhatk.

44
2.2. bra. j Java projekt ltrehozsa

2.8. Rekurzi
Rekurzv egy fggvny, ha a szmts sorn rsz-szmtsokhoz nmagt hvja meg. lta-
lban egy egyszerubb eset visszavezetsre hasznljuk, vagy a rsz-esetek tovbbi kibon-
tsra. Ennek megfeleloen a fggvnyhvsok szma jcskn nvekedik egy bonyolultabb
szmts elvgzshez.
Pldul, ha egy faktorilist szeretnnk kiszmolni, akkor rekurzv fggvnyhvssal
is meg lehet oldani a problmt a kvetkezokppen: Adott n, az ehhez tartoz n! az nem
ms, mint n ((n 1)!). Azaz a problmt egy szorzss alaktottuk t, most mr csak
az eggyel kisebb szm faktorilist kell kiszmolni. Ezt tudjuk folytatni tovbb, egszen
addig, amg n = 0, mivel annak ismert a faktorilisa.
Rekurzis mdszerek esetn, mivel a fggvny sajt magt hvogatja, nehz kvetni,
hogy hol tart. A faktorilis szmtsa esetn ez nem gond, mivel nincs benne elgazs.
Azonban a legtbb problmnl elgazsok vannak a fggvnyben.
Azt fontos megjegyezni, hogy egy fggvny futsa addig nem fejezodik be, amg nem
futtat egy return utastst. Addig a belso vltozi deklarltak, s van rtkk. Amikor
egy fggvnyt hv, akkor annak a fggvnynek is lesz egy sajt terlete, s gy tovbb. Te-
ht, ha vgiggondoljuk, hogy n = 60 esetre sszesen hatvan hvs trtnik. Minden esetben
lefoglalsra kerl a fggvnyhez tartoz sszes vltoz s paramter, valamint nmi me-
mria szksges a fggvnyllapot trolsra, amelybol a hvs trtnt. Ez jelentkeny
memriahasznlat a problma egyszerusghez viszonytva. Faktorilis szmtsa esetn
linerisan nvekszik a trigny, azonban vannak olyan problmt, ahol sokkal gyorsabban
fogy el a memria a rekurzis szmtsnl. (Szemben egy nem-rekurzv megoldssal.)

45
2.3. bra. j Java projekt ltrehozsa Paramterek

46
2.4. bra. j Java osztly ltrehozsa

2.5. bra. A main fggvny s az eredmny

47
48
3. fejezet

Absztrakt adatszerkezet

Emlkezznk a tpus defincijra, miszerint a tpus a felveheto rtkek halmazt s azo-


kon vgezheto muveletek sszessgt jelenti.
Ebben a fejezetben a tpus specifiklssal s absztrakcival foglalkozunk, legeloszr
ttekintve a tpus absztrakci szintjeit.
A reprezentcis szinten a tpusrtkek brzolsrl beszlnk. A legabsztraktabb
szint, amelyen meghatrozzuk a tpusrtkekhez tartoz brzol elemek halmazt, va-
lamint a muveletek ktirny reprezentcis lekpezst. Teht a tpusrtkek lehetnek
pldul a napok: HTFO, KEDD, SZERDA, CSTRTK, PNTEK, SZOMBAT, VASR-
NAP. Az ehhez tartoz brzol elemek egy lehetsges esetben a termszetes szmok 1 s 7
kztt rtelemszeru megfeleltetssel. A nap tpus esetn egy muvelet lehetsgesen a rk-
vetkezo nap megadsa. Ennek a tpusrtkek halmazn van egy jl definilhat mukdse,
hogy milyen rtk esetn mi lesz a muvelet eredmnye. Ezt a muveletet kell tltetni a
termszetes szmok megszortott halmazra. A reprezentcis szinthez tartoz fogalmak:

brzol elemek H halmaza (tpus-szerkezet), a pldban ezek a szmok.


az brzol elemek s a tpusrtkek kapcsolatt ler lekpezs: : H T, HT
a tpus-invarins kivlasztja a hasznos brzol elemeket: I : H L, [I] Ez a lekpe-
zs vlasztja ki a szmok kzl a hasznland 1..7 intervallumot.

A lekpzst az albbi bra szemllteti: F az eredeti muvelet, a felso szint a a muveletet

F muvelet specifikcija

F
DF RF


F
DS RS

F muvelet implementcija
S program

3.1. bra. F muvelet lekpezse S programra.

49
mint fggvnyt brzolja, ahol az rtelmezsi tartomny DF s az rtkkszlet megha-
trozott RF . Ezzel szemben az als szinten lekpezs utni brzol elemek halmazn
mukdo S program megfelelo halmazait brzoljuk.

3.1. ADT
Absztrakt adattpus (abstract data type) a tpus-specifikci (kzvetett) megadsra szol-
gl. Nem szksges, hogy egy konkrt programozsi krnyezetben brzoljuk a tpusrt-
keket, alapvetoen matematikai eszkzkkel is megadhat. ADT lers esetn elg a muve-
letek programjainak csak a hatst ismerni.
Absztrakt a programozsi krnyezet szmra s a megoldand feladat szmra, amely
adattpust a ksobbiekben egy kivlt (konkrt) tpussal helyettestnk.
Az ADT megkzelts a tpus szemlletnek ez a legmagasabb szintje semmilyen fel-
ttelezssel nem lnk a tpus szerkezetrol, megvalstsrl. Ahogyan az elozoekben
emltve van, a specifikciban csak tisztn matematikai fogalmakat hasznlhatunk. (Ez a
szint nem a formalizls mrtktol absztrakt, lehet informlisan is gondolkodni, beszlni
ADT szinten!)
Az ADT lers rszei:

tpusrtk-halmaz (milyen lehetsges rtkek vannak)


muveletek (mint lekpezsek, ahogyan azt az elozo brn lthattuk)
megszortsok (rtelmezsi tartomnyok, nem minden muvelet rtelmezheto az
sszes lehetsges rtken. Gondoljunk a nullval val osztsra.)
aximk, amelyek biztostjk a tpus s muveleteinek helyes felptst s mukd-
st. (Az aximk alapigazsgok, amiknek mindig teljeslnie kell.)

Krdsek, amelyeket a specifikci sorn vizsglni kell, vagy vizsglni lehet:

helyessg (ellentmonds-mentessg, az egyes aximk kztti ellentmondsokat meg


kell szntetni)
teljessg a lert aximk s specifikcik hinytalanul lerjk a tpus s muveleteinek
mukdst. nehz bizonytani)
redundancia (ugyanazt a tulajdonsgot, aximt nem fogalmaztuk-e meg tbbfle-
kppen, tbbszr. vizsglata a mukds szempontjbl nem fontos)

Pldul egy ADT funkcionlis specifikcija az albbiakbl ll:

tpusrtk-halmaz
muveletek
llapottr
paramtertr
elofelttel
utfelttel

A funkcionlis specifikcihoz a tpus matematikai reprezentcijt hasznljuk. Ez sem-


milyen mdon nem kell, hogy utaljon a tpus brzolsi mdjnak megvlasztsra a meg-
valsts sorn, teljesen ms is lehet, pusztn matematikai eszkzket hasznlunk. (Fon-
tos, hogy leggyakrabban nem gy fogjuk tnylegesen megvalstani, implementlni.)

50
3.2. ADS
Az absztrakt adatszerkezet (abstract data structure) sorn a tpus alapveto absztrakt
szerkezett egy irnytott grffal brzoljuk. A grfban a cscsok az adatelemek az lek
a rkvetkezsi relcik. Teht adatelemek valamilyen struktra illetve relci szerinti
reprezentcijt adja meg egy grf.1
ADS szinten is lehet brzolni a muveleteket, mgpedig a muveletek hatsa szemll-
tetheto az ADS-grf vltozsaival. Egy j adatelem elhelyezse a grfban nveli a csom-
pontok szmt, valamint j leket adunk hozz.

3.3. Adatszerkezetek osztlyozsa


Az adatszerkezetek osztlyozshoz legelobb definiljuk az adatszerkezet fogalmt a k-
vetkezokppen: Az adatszerkezet egy hA, Ri rendezett pr, ahol az A az adatelemek vges
halmaza, valamint az R az A halmazon rtelmezett valamilyen relci (AA). Itt a relci
absztrakt fogalomknt rtendo mindsszesen kt adatelem valamely kapcsolatt jelenti.
(Teht nem a hagyomnyos rtelemben megszokott kisebb < vagy nagyobb > sszefggs-
rol van sz, hiszen ltalnos esetben ezt nem is felttlen tudjuk definilni kt adatelem
kztt. Logikai kapcsolatot jelent kt adatelem kztt. Ezt a logikai kapcsolatot jelljk az
ADS grf leivel.)
Az osztlyozs tbbflekppen lehetsges az adatszerkezetekre nzve:

Az adatelemek tpusa szerint.


Homogn: Az adatszerkezet valamennyi eleme azonos tpus. Pldul mindegyik
szm.
Heterogn: Az adatszerkezet elemei klnbzo tpusak lehetnek. Vegyesen szere-
pelnek klnbzo tpusok, pldul szmok s karakterek.

Az elemek kzti R relci szerint.


Struktra nlkli. Az egyes adatelemek kztt nincs kapcsolat. Nem beszlhetnk
az elemek sorrendjrol (pl. halmaz). (Gyakorlatilag a relci nem hatroz meg vi-
szonyt az elemek kztt, minden egyes elem egyenrang, nincs el-/alrendeltsg.)
Asszociatv cmzsu. Az adatelemek kztt lnyegi kapcsolat nincs, ugyanakkor az
adatszerkezet elemei tartalmuk alapjn cmezhetoek, azaz egy adatelem megtall-
shoz a tartalmval kpzett cmzssel megtallhat a szerkezetben.
Szekvencilis. A szekvencilis adatszerkezet olyan hA, Ri rendezett pr, amelynl
az R relci tranzitv lezrtja teljes rendezsi relci. Minden egyes adatelemprrl
megmondhat hogy egymshoz kpest milyen viszonyban llnak. Ez vagy kzvetle-
nl trtnik, mert az R rtelmezett a kivlasztott pron, vagy pedig tranzitven2 A
szekvencilis adatszerkezetben az egyes adatelemek egyms utn helyezkednek el
logikai mdon, vagyis ez a fizikai reprezentcit nem befolysolja. Az adatok kztt
egy-egy jellegu a kapcsolat: minden adatelem csak egy helyrol rheto el, s az adott
elemrol csak egy msik lthat. Az egyes adatelemekrol a szomszdjaik megllapt-
hatak. Kt kitntetett elemrol beszlhetnk, ami az elso s az utols.
1
A grf egy olyan konstrukci, amelyet csompontok s az azokat sszekto vonalak alkotjk. Ez utbbiakat
hvjuk leknek. Egy grf irnytott, ha az leknek van irny, teht az sszekto vonalak nyilak. Irnytott
grfban az irnyts rkvetkezosgeket definil.
2
Tranzitivits: Ha a relciban ll b-vel s b relciban ll c-vel, akkor a is relciban ll c-vel.

51
Hierarchikus. A hierarchikus adatszerkezet olyan hA, Ri rendezett pr, amely-
nl van egy kitntetett r elem, ez a gykrelem gy, hogy r nem lehet vgpont 3 .
a A \ {r} elem egyszer s csak egyszer vgpont, vagyis minden r-en kvli elem a
relciban egyszer lehet vgpont. a A \ {r} elem r-bol elrheto, azaz minden elem
elrheto az r-bol a relcik kvetsvel. Az adatelemek kztt egy-sok jellegu kapcso-
lat ll fenn. Minden adatelem csak egy helyrol rheto el (egyetlen megelozoje van), de
egy adott elembol akrhny adatelem lthat (akrhny rkvetkezoje lehet. Ilyen
pldul a fa, sszetett lista, B-fa.).
Hls. A hls adatszerkezet olyan hA, Ri rendezett pr, amelynl az R relcira
semmilyen kikts nincs. Az adatelemek kztt a kapcsolat sok-sok jellegu: brme-
lyik adatelemhez tbb helyrol is eljuthatunk, s brmelyik adatelemtol elvileg tbb
irnyban is mehetnk tovbb (Pldul: ltalnos grf, irnytott grf).

Az adatelemek szma szerint.

Statikus. Egy statikus adatszerkezetet rgztett szm adatelem alkot. A feldolgo-


zs folyamn az adatelemek csak rtkket vltoztathatjk, de maga a szerkezet, az
abban szereplo elemek szma vltozatlan. Kvetkezskppen az adatszerkezetnek a
memriban elfoglalt helye vltozatlan a feldolgozs sorn.
Dinamikus. Egy dinamikus adatszerkezetben az adatelemek szma egy adott pilla-
natban vges ugyan, de a feldolgozs sorn tetszolegesen vltozhat. Dinamikus adat-
szerkezetek lehetnek rekurzv vagy nem-rekurzv, lineris vagy nem-lineris struk-
trk. Egy adatszerkezet rekurzv, ha defincija sajt magra val hivatkozst tar-
talmaz. Ha egyetlen ilyen hivatkozs van, akkor lineris a struktra, ha tbb, akkor
nem-lineris. Mivel a dinamikus adatszerkezetek feldolgozsa sorn az adatelemek
szma vltozik, egy-egy elemnek terletet kell lefoglalnunk, illetve a lefoglalt ter-
leteket fel kell szabadtanunk, gy felvetodik a trolhely jrahasznostsnak prob-
lmja.

3
A vgpont gyakorlatilag itt a relci jobboldalt jelenti, azaz ha vgpont akkor a relciban szereplo kt
elem kzl a rkvetkezorol van sz. Pldul az a b esetn a b a vgpont s gy a rkvetkezo elem.
rtelemszeruen az a a megelozo elem. Az a-bl elrheto a b.

52
4. fejezet

Adatszerkezetek

4.1. Verem
A Verem adatszerkezet olyan, mint egy szuk verem. Belekerlnek sorban az elemek. Az
elso legalulra esik, a msodik r, s gy tovbb. Kimszni mindig a legfelso tud, s ha
rnznk fellrol, akkor mindig a legfelsot ltjuk csak.

Kutya
Farkas
Medve
Oroszln
Nyl
Sn

4.1. bra. Verem plda

Az elozo pldban a legelsoknt a Kutya kerl ki a verembol, amiutn a Farkas fog


ltszani a tetejn. Legelsoknt a Sn kerlt bele s a vgn jn ki. A Verem (Stack) egy
LIFO adatstruktra. (Last In, First Out)

4.1.1. ADT lers


Az albbi mdon lehet definilni: A V verem E alaptpus felett jn ltre. Muveletei:

empty: V (res verem ltrehozsa.)


isEmpty: V L (llapot lekrdezse: res-e.)
push: V E V (j elem beszrsa.)
pop: V V E (Legfelso elem kivtele a verembol.)
top: V E (Legfelso elem lekrdezse.)

Az egyes muveleteknl szerepel, hogy milyen bemenettel rendelkeznek s milyen tpus


kimenetet lltanak elo. Megszorts, hogy a pop s top muveletek rtelmezsi tartomnya:
V \ {empty}, azaz res verembol nem lehet kivenni s nem lehet megnzni, hogy mi van a
tetejn.
A V jelenti a vermet mint tpust. E tpus elemek kerlhetnek a verembe s a fentiek-
ben hasznlt L jelenti a logikai tpust.

53
A verem muveletekhez tartoz aximk, amelyeknek logikai kifejezsknt minden
esetben igaznak kell lennik:

isEmpty(empty) Egy resnek ltrehozott verem legyen res.


isEmpty(v) v = empty Ha egy v veremre a lekrdezs, hogy res-e igaz, abbl
kvetkezik, hogy a v az resverem.
isempty(push(v,e)) Ha betesznk egy elemet egy v verembe, az nem lehet res
ezutn.
pop(push(v,e)) = (v,e) Ha betesznk egy elemet egy v verembe, majd kivesszk akkor
az eredeti vermet s elemet kell kapnunk.
push(pop(v)) = v Ha kivesznk egy elemet a verembol, majd visszatesszk az ere-
deti v vermet kell kapnunk.
top(push(v,e)) = e Ha betesznk egy elemet a verembe, majd megnzzk a verem
tetjt a betett elemet kell ltnunk.

4.1.2. ADT funkcionlis lers


Matematikai reprezentci, miszerint a verem rendezett prok halmaza, ahol az elso kom-
ponens a veremben elhelyezett (push) rtk, a msodik komponens a verembe helyezs
(push) idopontja. Megszorts (invarins): az idortkek klnbzoek. Ez egy jl kezelheto
matematikai modell, azonban nem gy implementljuk, hiszen aligha tallni bonyolultabb
implementcis mdszert.
A modellhez tartoz fggvnyekre el kell kszteni a specifikcit, ami a pop esetn az
albbi:

A = V E llapottr (v s e lesz egy-egy aktulis rtk)


B = V paramtertr (v 0 )
Q = (v = v 0 v 0 6= 0) elofelttel, miszerint a bemeneti verem az nem res.
R = ((v = v 0 \ {(ej , tj )}) (e = ej ) ((ej , tj ) v 0 ) (i((ei , ti ) v 0 i 6= j) : tj > ti ))
utfelttel, a kifejezs szakaszai az albbiak: A kimenet v s e, ahol a v verem az
eredeti verem, kivve az ej , tj prt; s az e az ej . Teljeslni kell annak, hogy az ej
s tj pr eredetileg benne volt a veremben, valamint minden ms ei s ti prra igaz,
hogy az idoindex az kisebb mint tj .

4.1.3. Statikus verem reprezentci


A statikus reprezentci esetn a veremben trolhat elemek maximlis szma rgztett,
gy pldul hasznlhatunk egy fix mretu tmbt, ami tmbbe fogjuk a verembe betett
elemeket elhelyezni. (Termszetesen folyamatosan gyelni kell arra, hogy a behelyezs s
kivtel a verem szablyoknak megfelelo legyen.) A kvetkezo egysgei lesznek a Verem
tpusnak a reprezentcin bell:

M ax mezo, a verem maximlis mrett hatrozza meg, emiatt lesz egy jabb fgg-
vny, ami lekrdezi, hogy tele van-e a verem.
M ax mretu tmb, amiben a verembe kerlo elemeket troljuk.
Head vltoz, ami azt mutatja, hogy hol a verem teteje.

A kvetkezo szakaszban egy Java nyelven megvalstott statikus verem forrskdjt


nzzk meg. Vegyk szre, hogy a Verem osztly megvalstsnl a reprezentcihoz tar-
toz specilis mezok nem lthatak az osztlyon kvl senki szmra. Korbban volt sz

54
arrl, hogy egy osztly felelos a sajt llapotrt s annak vltozsrt. Egy verem osz-
tlynak a verem aximk ltal tmasztott kvetelmnyeknek kell megfelelnik, amit r-
vnyes llapotokat jelentenek. A megvalstott muveletek ezeket az rvnyes llapotokat
fenntartjk. Azonban ha kvlrol beavatkoznnk s megvltoztatnnk pldul az index r-
tkt, akkor helytelen llapotba kerlne az objektum, a verem. Ezen hibk kikszblst
segtik a vltozk lthatsgnak helyes belltsai.

Implementci statikusan
Az elso kdszakaszban elsoknt a Verem osztly mezoi kerlnek deklarlsra, az elozoek-
nek megfeleloen egy int tpus head nevu vltoz az indexelsre, valamint egy elemek
nevu vltoz, ami a verembe teheto int rtkeket tartalmaz tmb lesz. Az indexelo vl-
toz a verem reprezentcijra hasznlt tmb azon indext tartalmazza, ahova kvetkezo
bettel sorn elem kerlhet. (Teht a legelso szabad pozcit. A megvalstsnl termsze-
tesen lehetsges, hogy a legfelso elfoglalt elemet indexeljk, csak a megfelelo fggvnyek-
ben erre figyelni kell.)
A mezodeklarcik utn a konstruktor tallhat, ami az empty() res verem ltre-
hozsra, illetve a verem kirtsre hasznlatos fggvny. Amikor res a verem a head
index nulla.

4.2. bra. Statikus verem kd 1. rsz

A push() fggvny egy elemet betesz a verembe. A bettel csak akkor trtnhet meg
ha nincs mg tele a verem. Erre van a felttel vizsglat, ami hiba esetn a konzolra kirja
a problma forrst. Ha azonban nincs tele a verem, akkor a tmbbe berhatjuk a betenni
kvnt elem rtkt, mgpedig a head-edik pozciba, mivel az jelenti a kvetkezo szabad
helyet a tmbben. A head index nvelse utn kszen is van a bettel.
A top() fggvny a legfelso elem rtkvel tr vissza. A legfelso tnyleges elem a
head-1-edik pozciban van, mivel a head a legelso szabad pozcit trolja. Amikor res

55
verembol krdezzk le a legfelso elemez, akkor is ad vissza a fggvny egy rtket, ami
a 1. Az rtk-visszaadsra knyszerbol kerl sor, az effle hibakezels rossz megolds,
mivel nem tudunk klnbsget tenni a hiba s a 1 rtket legfelso elemknt tartalmaz
verem teteje kztt. (Egyelore nincsen jobb eszkz az ismereteink kztt, amivel lehetne
orvosolni ezt a problmt.)

4.3. bra. Statikus verem kd 2. rsz

A pop() fggvny hasonl a top()-hoz. A klnbsg csupn annyi, hogy a head index
cskkentsre is szksg van, hiszen kivesszk a verembol az rtket. Megfigyelheto, hogy
az rtk tnyleges eltntetsre nem kerl sor. Erre azonban nincsen szksg, hiszen a
tmbben lehet brmi, minket csak az ltalunk nyilvntartott s betett rtkek rdekelnek.
Amennyiben kivesznk a verembol, akkor az a pozci a szabad pozcik kz fog tartozni
a veremben hasznlt tmbben. Ugyanis ha ezen utn betesznk valamit a verembe, az
pont a kivett rtk helyre kerl. (A ltrehozott vltozkban is van rtk, a memriacella
aktulis rtke, ami szmunkra nem hordoz hasznos informcit, gyakorlatilag szemt.
Amikor ltrejn a tmb az egyes pozcikban mr eleve lesznek rtkek, amikkel ugyangy
nem trodnk mint a kivettel.)
Az utols szakaszban az ressg s magteltsg vizsglatra kerl sor. res a verem, ha
a legelso szabad pozcit a tmb legelso indexe. Tele a verem, ha a legelso szabad pozci
kiindexel a verembol. (Megjegyzs: egy n hossz verem 0 s n 1 kztt indexelheto.)

56
4.4. bra. Statikus verem kd 3. rsz

4.5. bra. Statikus verem kd 4. rsz

4.1.4. Dinamikus verem reprezentci

Dinamikus reprezentci esetn nem tmbben troljuk az rtkeket, hanem erre a clra
specilisan ltrehozott Elem osztlyokban, amik egy lncolatnak lesznek a csompontjai.
Az Elem osztly tartalmaz egy rtket, valamint egy referencit egy kvetkezo elemre, gy
lehet majd trolni, hogy mi van a veremben egy rtk alatt. A Head referencia trolja a
verem elejt, ami ha nem mutat rvnyes elemre, akkor res a verem. A dinamikus repre-
zentci esetn tetszoleges szm elem elfr a veremben. (Termszetesen a memriakorlt
tovbbra is l.)

57
Implementci dinamikusan

Az elso szakaszban a dinamikus verem belso osztlya a Node tallhat meg legelsoknt.
A Node tartalmazza egy aktulis csompont rtkt, valamint egy referencit a kvetkezo
Node-ra. A gyors ltrehozs rdekben egy kt-paramteres konstruktor a mezoknek r-
tkeket ad. A dinamikus veremben egy head nevu mezo fogja a verem tetejt (azon vgt,
ahonnan kivenni s ahova betenni lehet). A head egy Node tpus referencia, ami a verem
ltrehozskor null, azaz nem referl sehova sem. Ez egyben az ressg felttele is. Akkor
s csak akkor res a verem ha head null.

4.6. bra. Dinamikus verem kd 1. rsz

Elem bettelekor egy j Node ltrehozsra van szksg. Az j Node rkvetkezoje


az aktulis head, gy trtnik a lnc fuzse, valamint az rtke a betenni kvnt rtk.
Termszetesen az jonnan ltrehozott Node lesz a verem j teteje, ezt az rtkadssal va-
lstjuk meg. A pop() fggvny, hasonlan a statikus esethez egy vizsglattal kezdodik.
Ha nem res a verem, akkor eltroljuk a legfelso Node-ban tallhat rtket egy ideig-
lenes vltozba, majd lefuzzk a legfelso csompontot a veremrol, azaz a verem j teteje
a elso csompontot kveto Node lesz. Vgl visszatr az eltrolt rtkkel. Az eltrolsra
azrt van szksge, mert a fuzsnl elvesztjk az egyetlen referencit a legfelso csom-
pontra, amiben a hasznos rtk tallhat. (Viszont a referencik elvesztsre is szksg
van, mert ebbol tudja a Java krnyezet, hogy mr nem hasznljuk azt a csompontot, gy
felszabadthatja a hozztartoz memriaterletet.
A top() hasonl a pop()-hoz, ppen csak nem trtnik meg a lefuzs.

58
4.7. bra. Dinamikus verem kd 2. rsz

4.8. bra. Dinamikus verem kd 3. rsz

4.2. Sor
A Sor adatszerkezet olyan, mint egy vrakozs sor, pldul a postn. Belekerlnek sorban
az elemek. Az elso legelore, a msodik mg az elsonek, s gy tovbb. (Az albbi jellsben
a sor elso elemt dolt, az sorban kvetkezo szabad helyet pedig alhzott kiemelssel van
feltntetve.)

20 30 2 1 0 3 _

Mindig a legelso tud kijnni, teht a legrgebben bekerl elem. Ez az elozo pldban
a 20. Rnzvn a soron kvetkezo elemet lthatjuk mint elso elem. A kvetkezo bekerlo
elem a 3 mg fog kerlni. A Sor (Queue) egy FIFO adatstruktra. (First In, First Out)

59
4.2.1. ADT Axiomatikus lers
A Sor ADT axiomatikus lersa: Az albbi mdon lehet definilni: A S sor E alaptpus
felett jn ltre. Muveletei:

Empty: S (az res sor konstruktor ltrehozs)


IsEmpty: S L (res a sor?)
In: S E S (elem bettele a sorba)
Out: S S E (elem kivtele a sorbl)
First: S E (elso elem lekrdezse)

Az egyes muveleteknl szerepel, hogy milyen bemenettel rendelkeznek s milyen tpus


kimenetet lltanak elo. Megszorts, hogy az Out s First rtelmezsi tartomnya: S \
{Empty} azaz res sorbl nem lehet kivenni s nem lehet megnzni, hogy mi van az elejn.

4.2.2. Statikus sor reprezentci


A statikus reprezentci esetn a sorban trolhat elemek maximlis szma rgztett, gy
pldul a veremhez hasonlan hasznlhatunk egy fix mretu tmbt. A kvetkezo egysgei
lesznek a Sor tpusnak a reprezentcin bell:

M ax mezo, a sor maximlis mrett hatrozza meg, emiatt lesz egy jabb fggvny,
ami lekrdezi, hogy tele van-e a verem.
M ax mretu tmb, amiben a sorba kerlo elemeket troljuk.
Head vltoz, ami azt mutatja, hogy hol a sor eleje. head [1, max]
T ail vltoz, ami azt mutatja, hogy hol a sor vge, vagyis az elso res helyet tail
[1, max]

Nyilvnvalan akkor van tnylegesen tele a a sor, ha a statikus reprezentciban hasz-


nlt tmb esetn nincs mr szabad pozci a tmbben. Tegyk fel az elozoekben lert pldt
kiindulsnak. Ha kivesszk az elso kt elemet s tovbbiakat tesznk be a vgn, az alb-
biakat kapjuk.

_ 2 1 0 3 9 10 5

Ekkor lthatan nincs tele teljesen a tmb, ugyanakkor a bettelnl kifutunk a tmbbol.
Ezt gy tudjuk orvosolni, ha a tmb leheto legjobb kihasznltsga rdekben krkrsen
fogjuk hasznlni, azaz ha a vgn kifut egy index, azt belptetjk az elejn. Teht egy
jabb elem beszrsa az elso tmbpozciba fog trtnni az albbi mdon:

123 _ 2 1 0 3 9 10 5

Ezek utn pusztn egyetlen problmt kell megoldani. Ugyanis ha beszrunk mg egy
elemet, akkor:

123 321 2 1 0 3 9 10 5

Itt a Head s a Tail indexek pontosan egyeznek, teht azt mondhatjuk, hogy a tmb tele
van, ha a Head s a Tail ugyanazt az rtket mutatja. (Emlkeztetol: a Head a soronk-
vetkezo elem indexe, a Tail pedig az elso szabad pozci.) Ugyanakkor, ha mindent kive-
sznk a sorbl:

60
A sor res az elso szabad pozci a pldt folytatva a harmadik, ugyanakkor a kvetkezo
kiveheto elem is a harmadik az indexek szerint. Ebbol azt a kvetkeztets vonjuk le, hogy
a sor res, ha a Head s a Tail ugyanazt az rtket tartalmazza.
gy a Head s Tail vltoz egyenlosge esetn ktfle esemny fordulhat elo, amelyet
nem tudunk megklnbztetni. A problma megoldsra tbb lehetosg ll rendelkezsre:
Vezessnk be mg egy jelzot a reprezentciba, ami mutatja, hogy a sor res-e, a neve
legyen empt. Kezdetben biztosan igaz, ksobb vizsgljuk, s megfeleloen lltjuk. (Ha
kivesznk akkor kirlhet a sor, egyb esetben nem.)
Vezessnk be mg egy attribtumot a reprezentciba, ami mutatja, hogy hny elem
van a sorban. Ha a szmll az a maximlis beteheto rtkek szmval egyenlo,
akkor tele van a sor, klnben biztosa nem.

Implementci statikusan
A kd elso rszben az elozoeknek megfeleloen a vltozk deklarcija trtnik, valamint
az empty() konstruktor elksztse. res sor ltrejttekor a head s tail vltozk az
elemek tmb elso pozcijra vagyis a nulla indexre mutassanak, valamint kezdetben a
sor res. Az ressget s telisget lekrdezo fggvny pedig figyelembe veszi az ressget
jelzo logikai vltozt.

4.9. bra. Statikus sor kd 1. rsz

A kvetkezo fggvny a sorban elemet elhelyezo In() fggvny. Az elhelyezskor az


eddigieknek megfeleloen ellenorizzk, hogy a sor nincs-e tele. Az elem behelyezsekor biz-
tosan nemres sort fogunk kapni. Az elem elhelyezse a tail-edik indexen trtnik, mivel
az jelenti a kvetkezo szabad pozcit. Ezek utn trtnik a tail index nvels, valamint,
ha a nvelst kvetoen kiindexel a tmbbol akkor a krkrssg rtelmben a nulladik
pozcira fog mutatni.
A kvetkezo fggvny a sorbl az elso elemet kivevo Out() fggvny. A visszaadand
rtket egy ideiglenes vltozba kimsoljuk, mivel a return utasts elott kell minden

61
4.10. bra. Statikus sor kd 2. rsz

akcit vgrehajtani. (Az index megvltoztatsa elott, knnyebb az aktulis visszaadand


rtket megtallni.) Az rtk megjegyzst kvetoen hasonlan az In() fggvnyhez az
index krkrs lptetse trtnik meg. Majd annak a vizsglata kvetkezik, hogy a kivtel
utn ress vlt-e a sor.

4.11. bra. Statikus sor kd 3. rsz

A legutols fggvny a First, amely a head-edik pozciban tallhat rtkkel tr


vissza.

4.2.3. Dinamikus sor reprezentci


Dinamikus reprezentci esetn a veremhez hasonlan nem tmbben troljuk az rtke-
ket, hanem erre a clra specilisan ltrehozott Elem osztlyokban, amik egy lncolatnak
lesznek a csompontjai. Az Elem osztly tartalmaz egy rtket, valamint egy referencit
egy kvetkezo elemre, gy lehet majd trolni, hogy mi van a sorban egy rtk utn, ki k-
vetkezik. A head referencia trolja a sor elejt, ami ha nem mutat rvnyes elemre, akkor

62
4.12. bra. Statikus sor kd 4. rsz

res a sor. A tail referencia mutatja a sor vgt, ahova az j elemek fognak kerlni.

Implementci dinamikusan
A kd eleje a dinamikus veremhez kpest mindsszesen a tail mezo deklarcijval eg-
szlt ki. A dinamikus sor belso osztlya a Node. Tartalmazza egy aktulis csompont r-
tkt, valamint egy referencit a kvetkezo Node-ra. A dinamikus sorban egy head nevu
mezo jelzi a sor elejt. A head egy Node tpus referencia, ami a verem ltrehozskor
null, azaz nem referl sehova sem. Ez lesz egyben az ressg felttele is. Akkor s csak
akkor res a verem ha head egy null referencia. Szintn referencia a tail, ami a sor
msik vgt jelenti, ahova az j elemek rkezskor bekerlnek. (Termszetesen res sor
esetn a tail is null.
A sorban j elem bettelekor az elso feladat az j csompont pldnyostsa. Fgget-
lenl a sor korbbi llapottl egy j csompontot senki sem fogja kvetni s az rtke a
beteendo rtk. Amennyiben a sor res volt a betevs elott a head referencia is az jonnan
betett most egyetlen csompontra kell, hogy mutasson. Ellenkezo esetben ezt nem szabad
megtenni, azonban helyette fuzni kell a meglvo lncot. Azaz a tail ltal mutatott cso-
mpont kvetkezojeknt kell megtenni az j elemet. Utols lpsknt a beszrt elemet a
tail-be tesszk, mivel az a vge a sornak.
Az elso elem kivtele esetn megjegyezzk a visszatrsi rtket, majd a head-et lp-
tetjk, aminek az lesz a kvetkezmnye, hogy az eddigi head csompontra vonatkoz refe-
rencinkat elvesztjk s a kvetkezo elem lesz a sor eleje. A sor kirlse esetn a tail-t
is nullra kell lltani, mivel az a specifikcinkban szerepelt. (A head automatikusn null
lesz, mivel az utols csompont rkvetkezoje a csompont pldnyostsa sorn null au-
tomatikusan, valamint az utols csompontot biztosan nem kveti semmi sem, teht a
kvetkezo csompontot jelzo mezot nem lltottuk el.) Legvgl visszatr a fggvny az
elmentett rtkkel.
A First fggvny a head referencia ltal mutatott csompontban trolt rtkkel tr
vissza.

4.3. Lista, Lncolt Lista


4.3.1. Szekvencilis adatszerkezet
A szekvencilis adatszerkezet olyan hA, Ri rendezett pr, amelynl az R relci tranzitv
lezrtja teljes rendezsi relci. A szekvencilis adatszerkezetben az egyes adatelemek

63
4.13. bra. Dinamikus sor kd 1. rsz

4.14. bra. Dinamikus sor kd 2. rsz

egyms utn helyezkednek el. Az adatok kztt egy-egy jellegu a kapcsolat: minden adat-
elem csak egy helyrol rheto el, s az adott elemrol csak egy msik lthat. Kt kitntetett
elem az elso s az utols.

Tipikus s legegyszerubb plda a lista, ahol gondolhatunk egy tennival listra, amely-
nek ttelei vannak, felvehetnk s trlhetnk tetszolegeset kzlk.

64
4.15. bra. Dinamikus sor kd 3. rsz

4.16. bra. Dinamikus sor kd 4. rsz

4.3.2. Lista adatszerkezet


Homogn adatszerkezet, azaz azonos tpus vges adatelemek sorozata. Lehetsges je-
llse a L = (a1 , a2 , . . . an ), amennyiben res listrl beszlnk, gy az elemszm nulla,
n = 0, vagyis L = ().
A lncolt lista egy olyan adatszerkezet, amelynek minden eleme tartalmaz egy (vagy
tbb) mutatt (hivatkozst) egy msik, ugyanolyan tpus adatelemre, ami rkvetkezo-
sget jelenti a lista esetn. A lnc elso elemnek a cmt a lista feje tartalmazza. A listafej
nem tartalmaz informcis rszt, azaz tnyleges listabeli adatot. A lnc vgt az jelzi, hogy
az utols elemben a rkvetkezo elem mutatja res.
Ktszeresen lncolt esetben vissza irnyban is vannak hivatkozsok, teht a lista egy
eleme mindkt szomszdjra vonatkozan tartalmaz referencit, tovbb nemcsak a feje-
lem, hanem a vgelem is kln hivatkozssal kerl eltrolsra.

4.3.3. Absztrakcis szint


Vgiglpkedhetnk a lista elemein, beszrhatunk s trlhetnk tetszs szerint. Az brn
egy egyirny lncols lista tallhat, ahol a tglalalp a listafej, az ellipszisek az rtkes

65
adatot is tartalmaz lncszemek.

4.17. bra. Lista intuitv ADS/ADT

4.3.4. Statikus reprezentci


Statikus reprezentci esetn egy tblzatot hasznlunk, amiben rtk, index prokat
helyeznk el. Az indexek jelentik a rkvetkezosgeket, teht ez fogja a lista elemei k-
ztti ligokai sorrendet kialaktani. (A tblzatban elfogalalt pozci s rkvetkezosg nem
azonos a listban elfoglalt pozcival s rkvetkezosggel.) Tudjuk, hogy melyik az elso
rtket tartalmaz pozci, valamint az elso szabad helyet tartalmaz pozci. A szabad he-
lyekbol is listt kpeznk. Anna kaz elemnek amelyiknek nincs rkvetkezoje, az a lista
vge, illetve a szabad helyek listjnak vge. Ennek a megoldsnak az az elonye, hogy
a beszrsok s trlsek esetn nem kell gyelnk a lista tblzatbeli folytonossgra,
gy hatkonyabb (gyorsabb) s rendelkezsre ll memrit maradktalanul kihasznl
megoldst kapunk.

Elem: 2 SzH: 3

1 2 3 4 5 6 7 8

8 13 7 10 19
6 4 5 1 7 8 0 0

4.18. bra. Lista statikus reprezentci

4.3.5. Dinamikus reprezentci


Az elemek lncolst hasznljuk az elso dinamikus reprezentciban, ami az egirny
lncols esetn a sor esetn megismert mdszerrel gyakorlatilag azonos. Minden elem
referencit tartalmaz a rkvetkezojre. A ktirny lncols az albbi bra mutatja be.

null

4.19. bra. Lista dinamikus reprezentci egyirny lncols

Az egirny lncolshoz kpest a klnbsg az, hogy mindkt szomszdjra tartalmaz


referencit egy csompont.

66
null

null

4.20. bra. Lista dinamikus reprezentci ktirny lncols

4.3.6. Ktirny lncolt lista megvalstsa


A lista llapotvltozi:

Head: referencia az elso elemre. Ami null, ha res a lista.


Tail: referencia az utols elemre. Ami null, ha res a lista.
Akt: egy kivlasztott elemre mutat, lehet lptetni elore s htra. Amikor res a lista
akkor null az rtke.

Az Akt segtsgvel tudjuk a listban trolt elemeket elrni, lekrdezni, megvltoztatni.


Ezt a referencit a megvalstott muveleteken keresztl fogjuk befolysolni, a lista aktu-
lisan vizsglt elemt fogja jelenteni.

Muveletek
insertFirst(E): az E elemet beszrja a lista elejre.
insertLast(E): az E elemet beszrja a lista vgre.
removeFirst(): az elso elemet trli a listbl.
removeLast(): az utols elemet trli a listbl.
getAktValue(): az aktulis elem lekrdezse.
setAktValue(E): az aktulis elem rtknek megvltoztatsa.
stepFirst(): az aktulis elemet az elsore lpteti.
stepLast(): az aktulis elemet az utolsra lpteti.
stepForward(): az aktulis elemet Tail fel lpteti eggyel.
stepBackward(): az aktulis elemet Head fel lpteti eggyel.
insertBefore(E): az E elemet beszrja az aktulis el.
insertAfter(E): az E elemet beszrja az aktulis mg.
removeAkt(): az elso elemet trli a listbl.
isLast(): lekrdezi, hogy az aktulis a lista vgn van-e.
isFirst(): lekrdezi, hogy az aktulis a lista elejn van-e.
isEmpty: lekrdezi, hogy res-e a lista.

A muveletek lersa pseudkdban


A konstruktor, ami ltrehoz egy res listt, az ssze referencia rtkt tlltja null-ra,
ami res listt fog eredmnyezni.

Konstruktor
Headnull
Tailnull

67
Aktnull

Akkor res a lista, ha fej s vg referencik null rtkuek.

isEmpty()
return Head==Tail==null

Az aktulist jelento refrencia rtkre vonatkoz lekrdezsek.

isLast()
return Akt==Tail

isFirst()
return Akt==Head

Az aktulis referencia ltal mutatott listaelem rtknek lekrdezse s belltsa.

getAkt()
HA Akt6=null AKKOR return Akt.Ertek

setAkt(ujertek)
HA Akt6=null AKKOR Akt.Ertekujertek

Az aktulis referencia lptetsnek muveletei:

stepForward()
HA Akt6=null S isLast() AKKOR AktAkt.Kovetkezo

stepBackward()
HA Akt6=null S isFirst() AKKOR AktAkt.Elozo

stepLast()
AktTail

stepFirst()
AktHead

A beszrsi muveleteket fokozatosan ptjk fel, az egyes eseteket visszavezetve ko-


rbbi esetekre. Kezdjk azzal a fggvnnyel, ami a lista elejre szr be egy j adatot. A
beszrs esetn mindenkppen ltre kell hozni egy j csompontot, aminek az rtkt be
kell lltani. Mivel elso elemknt kerl beszrsra ezrt a megelozoje biztosan a null, a
rkvetkezoje pedig az addigi Head. Azonban ha eredetileg res volt a lista akkor a Head
s a Tail rtkt kell az j csompontra lltani, mg ha mr tartalmazott mr (legalbb)
egy elemet, akkor a korbban elso elemknt trol csompont megelozojeknt kell belltani

68
az aktulisan beszrtat, tovbb az jonnan beszrt lesz a Head.

insertFirst(ertek)
AktujCsomopontJ Node
ujCsomopont.Ertekertek
ujCsomopont.Elozonull
ujCsomopont.KovetkezoHead
HA isEmpty()
AKKOR
HeadTailujCsomopont
KLNBEN
Head.ElozoujCsomopont
HeadujCsomopont

Az utolsknt val beszrst teljesen hasonlan lehet megvalstani, mint az elsoknt


val beszrst, azonban az res listba val beszrst az insertFirst() fggvnnyel
oldjuk meg. (Itt a kvetkezosg s a megelozosg felcserlodik az elozo fggvnyhez k-
pest.)

insertLast(ertek)
HA isEmpty() AKKOR insertFirst(ertek)
KLNBEN
AktujCsomopontJ Node
ujCsomopont.Ertekertek
ujCsomopont.ElozoTail
ujCsomopont.Kovetkezonull
Tail.KovetkezoujCsomopont
TailujCsomopont

Aktulis elem el val beszrs esetn, amennyiben az aktulis az elso, vagy res a
lista visszavezetjk az elso beszr fggvnynkre. Az j csompont ltrehozsa sorn
be kell lltanunk az adatot, az j csompont megelozo s kvetkezo csompontjt. A k-
vetkezoje az aktulis maga, hiszen az aktulis el szrunk be. A megelozo az aktulis
megelozoje. Az aktulist megelozo csompont rkvetkezoje lesz az jonnan ltrehozott,
valamint az aktulist megelozonek is be kell lltani az j csompontot. Vgl az j cso-
mpontot tesszk meg aktulisnak.

insertBefore(ertek)
HA isEmpty() VAGY isFirst() AKKOR insertFirst(ertek)
KLNBEN
ujCsomopontJ Node
ujCsomopont.Ertekertek
ujCsomopont.ElozoAkt.Elozo
ujCsomopont.KovetkezoAkt
Akt.Elozo.KovetkezoujCsomopont
Akt.ElozoujCsomopont
AktujCsomopont

A rkvetkezoknt val beszrst megprbljuk visszavezetni vagy res listban val

69
beszrsra, vagy utolsnak val beszrsra. Ha egyik sem sikerl, akkor viszont bizto-
san tartalmaz annyi elemet a lista hogy meg tudjuk tenni azt, hogy lptetnk elore s
megelozoknt szrjuk be gy ekvivalens megoldst kapva. (Ez termszetesen nem a legha-
tkonyabb, azonban ez a legegyszerubb.)

insertAfter(ertek)
HA isEmpty() VAGY isLast() AKKOR insertLast(ertek)
KLNBEN
stepForward()
insertBefore(ertek)

A trlsek esetn hasonlan eseteket vizsglunk. Elsoknt a megfelelo beszrs pr-


jaknt az elso elem kitrlst vizsgljuk. Ilyenkor elso feladat az aktulis elemre mutat
referencia lptetse. (Gondoljuk meg, hogy ez minden esetben mukdik-e. Mi trtnik, ha
az utols elemet trljk a listbl?) A Head referencia lptetse utn, ha azt tapasztal-
juk, hogy a Head referencia rtke null, akkor a Tailt is nullra lltjuk, hiszen kirl
a lista. Ellenkezo esetben a Head ltal mutatott csompont megelozojt lltjuk nullra,
hiszen annak mr nincs tnyleges megelozoje.

removeFirst()
HA isEmpty() AKKOR
HA isFirst() AKKOR AktHead.Kovetkezo
HeadHead.Kovetkezo
HA Head6=null AKKOR
Head.Elozonull
KLNBEN
Tailnull

Az utols elem trlse. Amennyiben ez az egyetlen elem a listban visszavezetjk az


elozo esetre. Ellenkezo esetben simn elvgezzk a trlst, nem kell trodnnk azzal, hogy
kirl a lista, teht csak az utolst megelozo elem rkvetkezokt lltjuk nullra, illetve
a Tail lptetjk eggyel visszafel.

removeLast()
HA isEmpty() AKKOR
HA Tail==Head AKKOR removeFirst(); VGE
HA isLast() AKKOR AktTail.Elozo
TailTail.Elozo
Tail.Kovetkezonull

Aktulis elem trlse, amennyiben kirlne a lista, vagy visszavezetheto a korbbi


fggvnyekre meghvjuk azokat a trlo fggvnyeket. Ha ez nem lehetsges akkor a tr-
lendo elem biztosan kzblso elem, csakis a megelozo csompont rkvetkezojt s a rk-
vetkezo csompont megelozojt kell rkvetkezore s a megelozore lltani. (Azaz a meg-
elozo rkvetkezoje az aktulis rkvetkezoje, illetve a rkvetkezo megelozoje az aktulis
megelozoje kell, hogy legyen, ahhoz hogy az aktulis elemet kiszedjk a listbl.) Tovbb
az aktulis elemet kell egy listabeli elemre lltani.

70
removeAkt()
HA isEmpty() AKKOR
HA isFirst() AKKOR removeFirst(); VGE
HA isLast() AKKOR removeLast(); VGE
Akt.Elozo.KovektkezoAkt.Kovektezo
Akt.Kovetkezo.ElozoAkt.Elozo
AktAkt.Kovetkezo

JAVA kdok
Az albbiakban a pseud kdnak megfelelo Java kdok kerlnek ismertetsre.

4.21. bra. Lncolt lista kd 1. rsz

4.4. Fa
Ebben a rszfejezetben a hierarchikus adatszerkezetek egyikvel a fval, azon bell is a
binris keressi fval, majd a kupac adatszerkezettel ismerkednk meg.

4.4.1. Hierarchikus adatszerkezetek


Definci szerint a hierarchikus adatszerkezetek olyan hA, Ri rendezett pr, amelynl van
egy kitntetett r elem, ez a gykrelem, gy, hogy:

71
4.22. bra. Lncolt lista kd 2. rsz

4.23. bra. Lncolt lista kd 3. rsz

r nem lehet vgpont


a A \ {r} elem egyszer s csak egyszer vgpont
a A \ {r} elem r-bol elrheto

Az adatelemek kztt egy-sok jellegu kapcsolat ll fenn. Minden adatelem csak egy
helyrol rheto el, de egy adott elembol akrhny adatelem lthat. A hierarchikus adat-
szerkezetek valamilyen rtelemben a szekvencilis adatszerkezetek ltalnostsai. (Az
elrhetosg ebben az rtelemben rkvetkezosgek sorozatt jelenti, valamint a vgpont
egy a b jellegu kapcsolat esetn a b rtket jelli, a kezdopont pedig az a rtket.)

4.4.2. Fa adatszerkezet
A fa egy hierarchikus adatszerkezet, mely vges szm csompontbl ll, s kt csom-
pont kztt a kapcsolat egyirny, az egyik a kezdopont, a msik a vgpont, valamint van

72
4.24. bra. Lncolt lista kd 4. rsz

a fnak egy kitntetett csompontja, ami nem lehet vgpont, ami a fa gykere. Ezen kvl
az sszes tbbi csompont pontosan egyszer vgpont. (Vgpont s kezdopont itt a rkvet-
kezosgi kapcsolatnl a rkvetkezosget jello nylra vonatkozik. Eszerint csak a gykr
nem rkvetkezoje semminek sem.)
Az elozo definci lerhat egy rekurzival is, azaz a fa definilsa sorn felhasznljuk
a fa defincijt.

A fa vagy res, vagy


Van egy kitntetett csompontja, ez a gykr.
A gykrhez 0 vagy tbb diszjunkt fa kapcsoldik. Ezek a gykrhez tartoz rszfk.

A fkkal kapcsolatos algoritmusok tbbsge rekurzv.

Elnevezsek s tovbbi defincik


A fa cscsai az adatelemeknek felelnek meg.
Az lek az adatelemek egyms utni sorrendjt hatrozzk meg egy csompontbl
az azt kvetobe hzott vonal egy l.
A gykrelem a fa elso eleme, amelynek nincs megelozoje, az egyetlen csompont
amibe nincs befut l.
Levlelem a fa azon eleme, amelynek nincs rkvetkezoje, belole nem fut ki l.
Kzbenso elem az sszes tbbi adatelem, ami nem gykr s nem levl.

73
4.25. bra. Lncolt lista kd 5. rsz

4.26. bra. Lncolt lista kd 6. rsz

Minden kzbenso elem egy rszfa gykereknt tekintheto, gy a fa rszfkra bont-


hat: rszfa: t rszfja a-nak, ha az a gykere, azaz kzvetlen megelozo eleme
t-nek, vagy t rszfja a valamely rszfjnak.
Elgazsszm: kzvetlen rszfk szma, azt mondja meg, hogy egy adott csompont-
bl hny l indul ki.
A fa szintje a gykrtol val tvolsgot mutatja.

74
4.27. bra. Lncolt lista kd 7. rsz

A gykrelem a 0. szinten van.


A gykrelem rkvetkezoi az 1. szinten, a rkvetkezok pedig a 2. szinten. . . .
A fa szintjeinek szma a fa magassga, azaz a legnagyobb szm szint ha 5, akkor a
fa magassga 6.
Csompont foka: a csomponthoz kapcsolt rszfk szma, azt mutatja meg ez a szm,
hogy hny l indul ki az adott csompontbl.
Fa foka: a fban tallhat legnagyobb fokszm.
Levl: 0 fok csompont, nincs belole kimeno l.
Elgazs (kzbenso vagy tmeno csompont): 6= 0 fok csompont.
Szlo (os): kapcsolat (l) kezdopontja (csak a levelek nem szlok).
Gyerek (leszrmazott): kapcsolat (l) vgpontja (csak a gykr nem gyerek) Ugyan-
azon csompont leszrmazottai egymsnak testvrei. (Hasonlatosan a csaldfban
megszokott mdon.)
Szintszm: gykrtol mrt tvolsg. A gykr szintszma 0. Ha egy csompont szint-
szma n, akkor a hozz kapcsold csompontok szintszma n + 1.
tvonal: az egymst kveto lek sorozata. Minden levlelem a gykrtol pontosan
egy ton rheto el.
g: az az tvonal, amely levlben vgzodik.
resfa az a fa, amelyiknek egyetlen eleme sincs.
Fa magassga: a levelekhez vezeto utak kzl a leghosszabb. Mindig eggyel nagyobb,
mint a legnagyobb szintszm.
Minimlis magassg az a fa, amelynek a magassga az adott elemszm s fa-
fokszm esetn a leheto legkisebb. (Valjban ilyenkor minden szintre a maximlis
elemszm elemet ptjk be.)
Egy ft kiegyenslyozottnak neveznk, ha csompontjai azonos fokak, s minden
szintjn az egyes rszfk magassga nem ingadozik tbbet egy szintnl. Pldul egy
ktfk fa esetn a bal rszfa s a jonn rszfa magassga legfeljebb egyel tr el egy-
mstl tetszleges csompont esetn.
Rendezett fa: ha az egy szlohz tartoz rszfk sorrendje lnyeges, azok rendezet-

75
tek. Ilyenkor valamilyen szably hatrozza meg azt, hogy melyik rszfban milyen
elemek helyezkedhetnek el.

Gykr
0. szint
2

Rszfa Levl

1. szint
6 4

2. szint
5 7 0

4.28. bra. Fa elnevezsek

4.4.3. Binris fa
A binris fa olyan fa, amelynek minde cscspontjbl maximum 2 rszfa nylik (azaz a fa
fokszma 2). Ebbol kifolylag egy szlo mindig a gyerekek kztt (s fltt) helyezkedik el.
(Ennek a bejrsoknl lesz szerepe.) Egy binris fa akkor tkletesen kiegyenslyozott, ha
minden elem bal-, illetve jobboldali rszfjban az elemek szma legfeljebb eggyel tr el.
Teljesnek neveznk egy binris ft, ha minden kzbenso elemnek pontosan kt le-
gazsa van s majdnem teljes: ha csak a levelek szintjn van esetleg hiny. (Teht ha
lerajzoljuk, akkor a jobb szln a legutols szinten hinyzik nhny levl.

Specilis binris fk

Kiszmtsi- vagy kifejezsfa. Korbban foglalkoztunk kifejezsekkel. Minden kifejezs a


kirtkelshez sztbonthat rszkifejezsekre, s annak megfeleloen sszetevokre. (Ope-
rtorok s operandusok.) Ezt egy fban is brzolni lehet, ahol

Az a struktra, amely egy nyelv szimblumai s klnbzo muveletei kztti prece-


dencit jelenti meg.
Aritmetikai kifejezsek brzolsra hasznljk.
Minden elgazsi pont valamilyen opertort,
A levlelemek operandusokat tartalmaznak.
A rszfk kztti hierarchia fejezi ki az opertorok precedencijt, illetve a zrjele-
zst.

A ((10/3) x) + (5 y 2 ) kifejezs fja:

76
+

- *

/ x 5 ^

10 3 y 2

4.29. bra. Kifejezsfa plda

Fa muveletek

Lekrdezo muveletek:

res-e a fa struktra.
Gykrelem rtknek lekrdezse.
Meghatrozott elem megkeresse, az arra vonatkoz referencia visszaadsa.
A megtallt tetszoleges elem rtknek lekrdezse.

Mdost muveletek:

res fa ltrehozsa konstruktor.


j elem beszrsa.
Meghatrozott elem kitrlse.
sszes elem trlse.
Egy rszfa trlse.
Rszfk kicserlse egymssal.
Gykr megvltoztatsa.
Egy meghatrozott elem rtknek megvltoztatsa.

Fa bejrsok

A bejrsi algoritmusok egy tetszoleges fa sszes csompontjn vgiglpkednek egy meg-


hatrozott mdszer szerint. Rekurzis mdszerek tetszoleges fa esetn:

Pre-order bejrs. (Eloszr a gykr kirsa (rintse) majd a rszfk ugyanilyen


mdszeru bejrsa)
Post-oreder bejrs. (Eloszr a rszfk bejrsa bal, majd jobb , majd legvgl a
gykr rintse)

Binris fk esetn mg egy bejrsi mdszer:

In-order bejrs (Eloszr a balgyerek bejrsa, majd a gykr rintse, azutn a jobb-
gyerek bejrsa)

77
A bejrsok esetn az elozo algoritmusok receptek. Egy aktulis csompontban a recept
meghatrozza, hogy mi trtnik. Pldul inorder esetben a teljes bal rszfra alkalmaz-
zuk eloszr a receptet, majd kirjuk az aktulis csompont rtkt, majd folytatjuk a jobb
rszfval.
Pldul tekintsk az albbi rszft:

4 9

2 0 7 5

1 3 8

4.30. bra. Plda fa

Preorder
6, 4, 2, 1, 3, 0, 9, 7, 5, 8

Postorder
1, 3, 2, 0, 4, 7, 8, 5, 9, 6

Mivel binris fa volt a plda ezrt lehetsges az inorder bejrs is:

Inorder
1, 2, 3, 4, 0, 6, 7, 9, 8, 5

4.4.4. Fa reprezentcis mdszerek


Rviden ttekintnk nhny a fa reprezentlsa alkalmas mdszert.

Balgyerek-jobbtestvr
Minden csompont ismeri a szlojt, egyetlen (legbaloldalibb) gyermekt s a kzvetlen
jobbtestvrt. Ezzel lehetsges, hogy brmely csompontnak tetszoleges szm gyereke le-
gyen, amik gyakorlatilag egy lncolt listt alkotnak. Ezeket referencik segtsgvel r-
hatjuk le.

Multilists brzols
Minden csompont egy lncolt lista. A lista elso eleme tartalmazza az adatot, a tbbi
csompont mr csak hivatkozsokat a leszrmazottakra (gyermekcsompontokra). Ennek

78
null

2 null

6 4 null

null

5 7 0 null

null null null

4.31. bra. Balgyerek-jobbtestvr reprezentci

megfeleloen ktfle csompont tallhat, a listk fajtja szerint.

null
6

4 5 7 0
null null null null null

4.32. bra. Multilists brzols reprezentci

Aritmetikai reprezentci

Amennyiben meghatrozunk egy felso korltot a cscsok fokszmra, gy lehetsges az


albbi reprezentcival a ft trolnunk. Vesznk egy tmbt, amibe sorfolytonosan s gy
szintfolytonosan belerjuk az egyes szinteken tallhat rtkeket. A korbbiakban bemu-
tatott binris fa (ami esetn a fokszm korlt ketto) aritmetikai brzolsban: (A teljes
fhoz kpest hinyz rtkek helyt kihagyjuk, hogy a ksobbi beszrs esetn rendelke-
zsre lljon a beszrand elemnek a hely.)

6 4 9 2 0 7 5 1 3 - - - - 8 -

4.33. bra. Aritmetikai brzols

79
Lncolt brzols
Szintn korltos fokszm esetn hasznlhat, a tovbbiakban ezt fogjuk a programok so-
rn alkalmazni. Minden csompont ismeri a szlojt, valamint a jobb s bal gyerekt,
egy-egy referencival hivatkozik a megfelelo csompontokra. Tovbbi referencia mutat a
gykrre. (Ez ltalnostsa a ktirny lncolt listnak, ahol a rkvetkezo elem a kt
gyerek, a megelozo elem pedig a szlo.)
null

4 9

2 0 7 5
null null null null null

1 3 8
null null null null null null

4.34. bra. Lncolt brzols

4.5. Binris keressi fk


Az elozo szakaszban a fk fogalmval ismerkedtnk meg, valamint a tudjuk, hogy egy bi-
nris fa azt jelenti, hogy egy csompontnak legfeljebb kt gyereke lehet. Ezekhez tulajdon-
sgokhoz hozzadva a keresofa tulajdonsgot egy nagyon hasznos konstrukcit kapunk.
Mit is jelent a keresofa:

A rendezsi fa (vagy keresofa) olyan fa adatszerkezet, amelynek kialaktsa a kln-


bzo adatelemek kztt meglvo rendezsi relcit kveti.
A fa felptse olyan, hogy minden cscsra igaz az, (binris esetben) hogy a cscs
rtke nagyobb, mint tetszoleges cscs a tole balra lvo leszll gon s a cscs r-
tke kisebb minden, a tole jobbra lvo leszll gon tallhat cscs rtknl. (Rszfa
cscsainl.)
A T fa brmely x cscsra s bal(x) brmely y cscsra s jobb(x) brmely z cscsra
y<x<z

A rendezsi fa az ot tartalmaz elemek beviteli sorrendjt is visszatkrzi. Ugyan-


azokbl az elemekbol klnbzo rendezsi fk pthetok fel. Figyeljk meg a pldkat:
(A bezrst gy vgezzk el, hogy mindig elindulunk a gykrbol s aszerint haladunk a
jobbra, vagy balra, hogy a beszrand elem kisebb-e vagy nagyobb az aktulisan vizsglt-
nl. Amennyiben egy olyan helyre jutunk, ahol nincs rszfa, akkor a beszrand elemet
betesszk oda. Ellenkezo esetben haladunk felef tovbb.)

80
Elso sorrend
6,3,1,9,7,5,10

Msodik sorrend
9,7,6,5,10,3,1

6 9

3 9 7 10

1 5 7 10 6

4.35. bra. Binris keresofa felptse

4.5.1. Tulajdonsgok
Inorder bejrssal a kulcsok rendezett sorozatt kapjuk. Az algoritmus helyessge a
binris-kereso-fa tulajdonsgbl indukcival addik.
Egy n cscs binris kereso fa bejrsa O(n)1 ideig tart, mivel a kezdohvs utn a fa
minden cscspontja esetben pontosan ktszer (rekurzvan) meghvja nmagt, egyszer a
baloldali rszfra, egyszer a jobboldali rszfra. (A rekurzis algoritmus trhat ciklusra
is.)

4.5.2. Muveletek
Keress. A T binris keressi fban keressk a k kulcs elemet (cscsot). A keress,
ha ltezik a keresett cscs, akkor visszaadja az elem cmt, egybknt null-t. Ennek az
algoritmusnak z algoritmust megadjuk rekurzv s iteratv megoldsban is.
A keress alaptlete, hogy elindulunk a egy csompontbl (gykr) megvizsgljuk, hogy
megtalltuk-e az keresett rtket, vagy kimentnk-e a fbl. (Levl gyereke mindig null.)
Ha egyik sem, akkor eldntjk a kulcs alapjn, hogy a fban merre tovbb. Ha a keresett
rtk kisebb, mint az aktulis csompont, akkor balra, klnben jobbra haladunk tovbb.

Fban-keres(x, k) rekurzv
1
A pontos defincijt lsd a kvetkezo fejezetben.

81
HA x = null VAGY k = kulcs[x]
akkor return x
HA k < kulcs[x]
AKKOR RETURN Fban-keres(bal[x], k)
KLNBEN RETURN Fban-keres(jobb[x], k)

Fban-keres(x, k) iteratv
CIKLUS AMG x 6= NULL S k 6= kulcs[x]
HA k < kulcs[x]
AKKOR x bal[x]
KLNBEN x jobb[x]
return x

Minimum keress. Tegyk fel, hogy T 6=null. Addig kvetjk a baloldali mutatkat,
amg NULL referencit nem tallunk. Ez gyakorlatban a legbaloldalibb elemet jelenti a
fban, ami szksgszeruen a legkisebb is.

Fban-minimum (T) iteratv


x gykr[T]
CIKLUS AMG bal[x] 6= null
x bal[x]
return x

Lefut O(h) ido alatt, ahol h a fa magassga. Hasonlan megkeresheto a maximum rtk
is, ami a legjobboldalibb elem.

4.6. Kupac (Heap)


A kupac adatszerkezet bevezetshez nhny fogalomra van szksg.
Egy binris fa teljes, ha a magassga h, s 2h 1 csompontja van. Egy h magassg
binris fa majdnem teljes, ha res; vagy a magassga h, s a bal rszfja h 1 magas s
majdnem teljes s jobb rszfja h 2 magas s teljes; vagy a magassga h, s a bal rszfja
h 1 magas s teljes s jobb rszfja h 1 magas s majdnem teljes.
A gyakorlatban, amikor a ft felrajzoljuk a majdnem teljessg az jelenti, hogy a leg-
utols szinten jobbrl visszafel hinyozhatnak rtkek pont gy, hogy ha elegendo rtk
lenne, az utols sor jobb szln, akkor teljes lenne a fa. A majdnem teljes fkat balrl
tltjk fel. (Avagy szintenknt haladunk a feltltssel s balrl jobbra . . . )

4.6.1. Kupac tulajdonsg


Egy majdnem teljes binris fa heap (kupac) tulajdonsg, ha res, vagy a gykrben lvo
kulcs nagyobb, mint mindkt gyerekben, s mindkt rszfja is heap tulajdonsg. Na-
gyon fontos, hogy egy ez msik definci a bal/jobb gyerek rtkre vonatkozan, a binris
keressi fhoz kpest!
Reprezentlsuknl kihasznljuk a tmrtettsget s majdnem teljessget gy aritme-
tikai reprezentcival tmbben troljuk az rtkeket s az egy indexfggvny szmtja a
szlot s a gyerekeket.

82
X

K O

A D L M

4.36. bra. Kupac plda

4.6.2. Muveletek

Gykr trlse

A gykr a legnagyobb elem, ami a kupac tulajdonsg betartsbl kvetkezik. Eltvol-


tsa utn a legals szint legjobboldalibb elemt tesszk fel a helyre, hogy a majdnem tel-
jes tulajdonsg megmaradjon. Ezzel azonban elrontjuk kupac tulajdonsgot, amit helyre
kell lltani. A helyrelltshoz cserljk fel a gykeret a nagyobb gyerekvel. Ezzel a
lpssel a nagyobb gyereket tartalmaz rszfban rontottunk el a kupac tulajdonsgot.
(Nem felttlenl romlott el.) gy ismteljk a kupac tulajdonsg helyrelltst, amg
szksges.

K O

A D L M

4.37. bra. Gykr trlse

Beszrs

Amikor beszrunk, tegyk a kvetkezo szabad pozcira, a legals szint legjobboldalibb


elemnek tesszk fel a helyre, hogy a majdnem teljessg megmaradjon. Ezzel valsznu-
leg elrontjuk kupac tulajdonsgot, amit helyre kell lltani, a trlshez hasonlan. Cserl-
jk fel az jonnan beszrtat a szlojvel. Ezt ismteljk egszen a fa tetejig, vagy amg
szksges.

83
M

K O

A D L

4.38. bra. Gykr trlse

4.6.3. Indexfggvnyek
Indexfggvnyek aritmetikai reprezentci esetn. A tmbben az indexfggvnyek segt-
sgvel tudjuk megllaptani egy csompont gyereknek indext, illetve szlojnek inde-
xt.

Balgyerek(k)
RETURN 2k

Jobbgyerek(k)
RETURN 2k+1

Szlo(k)
RETURN bk/2c

Az indexek helyessgnek vgiggondolst az olvasra bzom. (Amennyiben lerajzoljuk


a reprezentcit s a szerepeket, knnyen megoldsra jutunk.)

4.7. Hasznlat
A kupacot meg lehet konstrulni fejjel lefel is, amikor is a legkisebb elem van a kupac
tetejn.
A kupac pldul hasznlhat elemek rendezshez, elsobbsgi sor megvalstshoz. Az
elsobbsgi sor egy olyan sor, amikor nemcsak az utols pozciba lehet bekerlni a sor-
ban, hanem fontossgi alapon elobbre is. (A fontossg az, ami alapjn a kupacban meg-
hatrozzuk a pozcit.) A kupac tmbs reprezentcijt linerisan ki lehet olvasni, ami
megfeleltetheto egy sornak.

84
5. fejezet

Algoritmusok

5.1. Algoritmusok muveletignye


Korbban esett sz az algoritmusok hatkonysgrl, ebben a fejezetben hrom olyan de-
fincit vezetnk be, amivel sszehasonlthatv vlnak az algoritmusok muveletignyei,
hatkonysga. Kt szempontot lehet figyelembe venni az egyik a lpsszm, vagyis az
program ltal megkvnt lpsek mennyisge, ami kzvetlenl a futsi idore van hats-
sal. A msik az algoritmus ltal ignyelt memria mrete. Mindkettot a bemeno adatok
mretvel arnyosan lehet vizsglni, innentol fogva jelentse n a bemenet (input) mrett.
A lpsszm ennek valamilyen fggvny lesz f (n).
A hatkonysg vizsglatnl az f (n)-et vizsgljuk. Azonban az sszehasonltsnl az
albbi pldkat vegyk figyelembe:

100n vagy 101n, ltalban mindegy


n2 vagy n3 mr sokszor nagy klnbsg, de nha mindegy
n2 vagy 2n mr mindig nagy klnbsg

Ahhoz, hogy ezt matematikailag is kezelni tudjuk bevezetnk hrom fogalmat.

5.1.1. Fggvnyek rendje


Ord

Definci Ord
Ha f (x) s g(x) az R+ egy rszhalmazn rtelmezett vals rtkeket felvevo fggvnyek,
akkor f = O(g) jelli azt a tnyt, hogy vannak olyan c, k > 0 llandk, hogy |f (x)| c|g(x)|
teljesl, ha x k.

Ekkor a g aszimptotikus felso korltja f -nek; f nagy ord g.1

Pldul
100n + 300 = O(n), hiszen k = 300; c = 101-re teljeslnek a felttelek.
100n + 300 101n, ha n 300

Azt jelenti, hogy az f fggvny egy meghatrozott ido utn alatta van biztosan a g
fggvny konstans-szorosnak.
1
Az ordo latin sz, jelentse rend.

85
Omega

Definci Omega
Ha f (x) s g(x) az R+ egy rszhalmazn rtelmezett vals rtkeket felvevo fggvnyek,
akkor f = (g) jelli azt a tnyt, hogy vannak olyan c, k > 0 llandk, hogy |f (x)| c|g(x)|
teljesl, ha x k.

Ekkor a g aszimptotikus als korltja f -nek.

Pldul
100n 300 = (n), hiszen n 300; c = 99-re teljeslnek a felttelek.

Ez gyakorlatilag megfordtja az elozo definciban meghatrozott szerepeket.

Theta

Definci Theta
Ha f = O(g) s f = (g) is teljesl, akkor f = (g).

Ekkor a g aszimptotikus les korltja f -nek.


Pldul
100n 300 = (n), az eddigiek alapjn.

5.1.2. Sorrend
Az albb sorrend rhat fel a rendek kztt, ahol is nvekvo komplexitssal kerltek sor-
ban a fggvnyek.

Konstans O(1)
Loglogaritmukus O(log log n)
Logaritmikus O(log n)
Lineris O(n)
Linearitmikus (Loglineris) O(n log n) = O(log n!)
Ngyzetes O(n2 )
Kbs O(n3 )
Polinomilis (Algebrai) O(nc ), ha c > 1
Exponencilis (Geometriai) O(cn )
Faktorilis (Kombinatorilis) O(n!)

Mindez brzolva:
Idoben nyilvnvalan akkor lesz hatkony egy algoritmus, ha a sorrenben minl kisebb
fggvny rendjben fgg a bemenet mrettol a feldolgozs ideje, vagyi a lpsek szma.
Sajnos azonban vannak olyan problmk, amelyeket nem tudunk hatkonyan megoldani,
pldul lineris vagy polinomilis idoben. (Pldul ltezik a problmk egy olyan osztlya
amelyek nehz feladatoknak szmtanak s polinom idoben egy megoldsjellt helyes-
sge dntheto el csupn. Ilyen egy szm prm felbontsa is, amikor egy tetszoleges szmot
felrunk prmszmok szorzataknt.)

86
10

Konstans
LogLog
Log
5 Lineris

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

5.1. bra. Fggvnyek rendje

25
Lineris
Loglineris
Ngyzetes
20 Kbs

15

10

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

5.2. bra. Fggvnyek rendje

5.2. Lengyelforma
A lengyelforma egy specilis formja a kifejezsek felrsnak. Az eddigi megszokott
formban az gynevezett infix mdosn rtuk fel a kifejezst. Az infix forma esetn
a muveleti jel (opertor) a muveletben szereplo rtkek (operandusok) kztt szere-
pel. A kifejezseket a muveleti jel elhelyezstol fggoen lehet mg postfix, vagy pre-
fix mdon lerni. Prefix abban az esetben, ha a az opertor az operandusok elott
van, illetve postfix, amennyiben az operandusok mgtt helyezkedik el az opertor.

Plda infix kifejezsre


ab+c

87
1000

900

Kbs
800
Exponencilis

700

600

500

400

300

200

100

0
1 2 3 4 5 6 7 8 9 10

5.3. bra. Fggvnyek rendje

Plda prefix kifejezsre


ab c+

Plda infix kifejezsre


+ abc

Hagyomnyos mdon a matematikban az infix kifejezseket hasznl-


juk. J. Lukasewitz lengyel matematikus hasznlta eloszr a post- s pre-
fix jells, ezrt hvjk lengyelformnak. Helyes lengyelformt a szmt-
gp sokkal knnyebben rtkel ki, s egyszerubb algoritmust lehet rni r.

Elso plda lengyelformra


(a + b) (c + d) ab + cd +

Msodik plda lengyelformra


(a + b c) (d 3 4) abc +d3 4

A lengyelformnak a kvetkezo elonyei vannak a feldolgozs sorn

A muveletek olyan sorrendben rkeznek, ahogy ki kell rtkelni oket, vagyis a sz-
mtsok sorrendjben
A muveletek mindig a operandusok utn llnak (postfix), kt operandus beolvassa
utn rgvest vgrehajthat a muvelet (s eltrolhat az eredmny jabb operandus
gyannt).
Vermekkel lengyelformra lehet alaktani s az talaktott kifejezs kirtkelheto.
Nem tartalmaz zrjeleket, a precedencia a formba beptetten megtallhat.

88
5.2.1. Lengyelformra alakts
A lengyelformra alaktsnak tbb, egyszeru szablya van. A feldolgozsa alogritmusa
hasznl egy x sort, ami a bemeno jeleket tartalmazza. Tovbb egy y sort, amibe az ered-
mny kerl, tovbb egy s segdvermet az talaktshoz. Attl fggoen, hogy milyen ka-
rakter rkezik kell az albbi szablyok kzl egyet alkalmazni:

Nyitzrjel esetn tegyk t a zrjelet az s verembe, az x sorbl!


Operandust rjuk ki a kimeneti y sorba.
Opertor esetn: legfeljebb egy nyitzrjelig vegyk ki az s verembol a nagyobb
priorits opertorokat s rjuk ki az y sorba, majd ezt az opertort tegyk be az s
verembe!
Csukzrjel: a nyitzrjelig levo elemeket egyesvel vegyk ki az s verembol s
rjuk ki az y sorba, valamint vegyk ki a nyitzrjelet a verembol!
Kifejezs vgt elrve rjuk ki az s verem tartalmt az y sorba.

5.4. bra. A lengyelformra alakts stuktogrammja

5.2.2. Lengyelforma kirtkelse


A lengyelformra hozott kifejezs kirtkelshez egy v vermet hasznlunk. Az y sorbl
egyesvel vesszk az elemeket s az albbi szablyok szerint jrunk el:

Ha operandus, akkor tegyk t a v verembe.


Ha opertor, akkor vegyk ki a msodik operandust, majd az elso operandust a v
verembol. Vgezzk el a muveletet s tegyk az eredmnyt a v verem tetejre.

Az algoritmus befejeztvel a v veremben egyetlen rtk van (ha mindent jl csinltunk) s


az az rtk a kifejezs rtke.

89
5.5. bra. A lengyelforma kirtkelsnek stuktogrammja

5.2.3. Lengyelforma plda


A bemutatott pldt egy papron rdemes kvetni, lpsrol-lpsre felrva a kimenet s a
verem llapott. Vegyk az albbi kifejezst: (1 + 2) (3 + 4). Amennyiben a szablyok sze-
rint haladunk, legeloszr egy nyitzrjellel tallkozunk. Ez tkerl a verembe. A szmot
kirjuk a kimenetre, majd a + opertor kvetkezik. A veremben a nyitzrjel van teht
nem vesznk semmit sem, hanem a betesszk a + jelet is verembe. Kvetkezik egy csuk-
zrjel, teht mindent kivesznk a verembol nyitzrjelig. (Ekkor a kimeneti sorban az
ll, hogy 1 2+.) A szorzs jele bekerl a verem, majd a kifejezs msodik felvel hasonlan
bnunk el mint az elso felvel. Azaz a nyitzrjel a fel kerl a veremben, kirjuk a
3-at, majd a is bekerl a verembe, a sorra pedig semmi, hiszen nyitzrjelig nincsen
fontosabb muvelet a veremben. A csukzrjel hatsra kikerl a jel. (Ekkor a kimene-
ten az albbi tallhat: 1 2 + 3 4.) Mivel a bemeneti kifejezs vgre rtnk a maradk
szimblumokat is kirjuk a verembol, aminek eredmnye: 1 2 + 3 4 . Ez az talaktott
kifejezs.
Ezt kvetoen a kirtkels menete az albbiak szerint trtnik. Kt szm rkezik egy-
mst kvetoen, bekerlnek a verembe, jn egy opertor melynek rtelmben sszeget sz-
molunk s az eredmnyt tesszk a verembe. (3) Azutn szintn jn kt szm, gy a verem-
ben mr hrom elem lesz: 3 3 4. Ezek utn a legfelso kettom vgrehajtjuk a muveletet.
(3 1) Majd a legvgn a muveletet. A veremben egyetlenegy szm lesz, ami a vgered-
mny is egyben: 3.

5.3. Rendezsek
Ebben a szakaszban a rendezsi problmval ismerkednk meg, majd nhny jl hasznl-
hat rendezoalgoritmussal.

5.3.1. Rendezsi problma


A rendezsi problma formlisan a albbi mdon definilhat. Adott a bemenet s a kime-
net:

Bemenet

90
n szmot tartalmaz (a1 , a2 , . . . , an ) sorozat

Kimenet
A bemeno sorozat olyan (a01 , a02 , . . . , a0n ) permutcija, hogy a01 a02 . . . a0n

Ahol a kimenetben teht a megadott sorozat elemei szerepelnek valamilyen ms sorrend-


ben, ami sorrendre igaz, hogy rendezve van. (Itt a jel egy absztrakt muveletet jell, ami
a rendezs alapjul szolgl, az sszehasonltshoz szksges.)
A problma ltalnostsa, amikor a sorozat, amit rendezni szeretnnk, elemei nem
szmok, hanem sszetett adatszerkezetek, pldul osztlyok. Minden egyes elem tartal-
maz egy kulcsot, amely kulcs lesz a rendezs alapjul szolgl adatelem, teht a absz-
trakt muveletet terjesztjk ki tetszoleges tpus (an ) sorozatokra.

Rendezsi relci
A rendezsi relci defincija: Legyen U egy halmaz, s < egy ktvltozs relci U -n. Ha
a, b U s a < b, akkor azt mondjuk, hogy a kisebb, mint b. A < relci egy rendezs, ha
teljeslnek a kvetkezok:

a a a U elemre (< irreflexv) Egy elem nmagnl nem kisebb.


Ha a, b, c U , a < b, s b < c, akkor a < c (< tranzitv).
Tetszoleges a 6= b U elemekre vagy a < b, vagy b < a fennll (< teljes).

Ha < egy rendezs U -n, akkor az (U ; <) prt rendezett halmaznak nevezzk.

Plda
Z az egsz szmok halmaza. A szoksos < rendezs a nagysg szerinti rendezs.

Itt viszont mr a szoksos muveletet jelenti a <.


A kvetkezokben nhny kvetkezik a rendezsre. Az eredeti sorozat az albbi eleme-
ket tartalmazza, ahol egy egyes elemek sszetett tpusok.

Szemly = Nv Magassg Szlets


Abigl Janka Zsuzsi Dvid Dorka
132 128 92 104 70
1996 1998 2001 2000 2002
A rendezs eredmnye, amikor a nv a kulcs a rendezshez:

Nv szerint
Abigl Dvid Dorka Janka Zsuzsi
132 104 70 128 92
1996 2000 2002 1998 2001
A rendezs eredmnye, amikor a szletsi v a kulcs a rendezshez:

Szletsi v szerint
Abigl Janka Dvid Zsuzsi Dorka
132 128 104 92 70
1996 1998 2000 2001 2002

91
A kvetkezoekben hrom ngyzetes (lass) majd kt hatkonyabb rendezo algoritmusa
kerl ismertetsre.

5.3.2. Bubork rendezs


Egyszerustsknt rendezzk az A[1 . . . n] tmbt! A tmb elemtpusa tetszoleges T tpus,
amire egy teljes rendezs rtelmezheto.
Bubork rendezs alaptlete: a tmb elejtol kezdve felbuborkoltatjuk a legnagyobb
elemet. Utna ugyanezt tesszk az eggyel rvidebb tmbre, stb. Vgl, utoljra mg az
elso kt elemre is vgrehajtjuk a buborkoltatst. A buborkoltatst sorn mindig kt
elemet vizsglunk csak s ha rossz sorrendben vannak a tmbben (inverziban llnak)
akkor felcserljk.
A sorozat rendezett akkor, ha nincs az elemek kztt inverzi. Ez a rendezs az inver-
zik folyamatos cskkentsvel rendez.

Bubork rendezs plda Elso futam


Az sszehasonltott elemeket ki vannak emelve:

12 5 6 2 10 11 1
5 12 6 2 10 11 1
5 6 12 2 10 11 1
5 6 2 12 10 11 1
5 6 2 10 12 11 1
5 6 2 10 11 12 1
5 6 2 10 11 1 12

Egyetlen menet utn a legnagyobb elem felkszott a tmb vgre. A kvetkezo l-


psben eggyel rvidebb tmbn vgezzk el ugyanezt. A kvetkezokppen trtnik

Bubork rendezs plda Msodik futam

5 6 2 10 11 1 12
5 6 2 10 11 1 12
5 2 6 10 11 1 12
5 2 6 10 11 1 12
5 2 6 10 11 1 12
5 2 6 10 1 11 12

A mdszert folytatva rendezett tmbt kapunk.

Muveletigny
A muveletigny kiszmtshoz az albbi gondolatmenetet kvetjk:

Elso menetben a tmb hossznak megfelelo sszehasonlts: n


Legrosszabb esetben ugyanennyi csere, legjobb esetben nincsen csere.
Az sszehasonltsok szma lland, a legrosszabb esetbeli cserk szmval azonos.

92
Ezt ismteljk eggyel rvidebb tmbre s gy tovbb:
n
X n(n 1)
n + (n 1) + (n 2) + . . . + 1 = i= = O(n2 )
2
i=1

A bemenet szmnak ngyzetes fggvnye az algoritmus lpsszma, ezltal lefutsi


ideje. Ez kelloen nagy input esetn nagyon lass futst eredmnyez, gondoljunk egy 100000
mretu tmbre pldul.

Algoritmus

5.6. bra. Buborkrendezs struktogramja

Csere fggvny
public void csere(int[] tomb, int i, int j)
{
int ideiglenes = tomb[i];
tomb[i] = tomb[j];
tomb[j] = ideiglenes;
}

Buborkrendezs
public void buborek(int[] tomb)
{
for (int j = tomb.length-1; j>0; j-)
for (int i = 0; i<j; i++)
if (tomb[i] > tomb[i+1])
csere(tomb, i, i+1)
}

Ez kifejezetten egy olyan algoritmus ami ugyan j eredmnyt ad a rendezsre, de en-


nl lassabban csak gy tudnk megoldani a problmt, ha direkt belekevernnk rendezs
kzben.

93
5.3.3. Maximum kivlasztsos rendezs
Ezzel az algoritmussal a bubork rendezshez kpest kevesebb lpssel hajtjuk vgre a
rendezst. A bubork rendezsnl mindig a legnagyobb elemet tesszk fel a tmb vgre,
sok csere sorn. A maximum kivlasztsos rendezs kevesebb cservel, minden egyes fu-
tamban sszesen egy cservel oldja meg a feladatot.
Keressk meg a tmbben a legnagyobb elemet s cserljk fel a tmbben legutols
elemmel. Ezutn eggyel rvidebb rsztmbre ismteljk az eljrst, addig, amg az 1
hossz tmbt kell rendeznnk, ami nmagban rendezett.
A maximlis elemet lineris keresssel tallhatjuk meg a tmbben.

Maximum kivlasztsos rendezs plda


A lineris keress lpseit kihagytuk az albbi pldban.

12 5 6 2 10 11 1
1 5 6 2 10 11 12
1 5 6 2 10 11 12
1 5 6 2 10 11 12
1 5 6 2 10 11 12
1 5 6 2 10 11 12
1 5 6 2 10 11 12
1 5 2 6 10 11 12
1 5 2 6 10 11 12
1 2 5 6 10 11 12
1 2 5 6 10 11 12
1 2 5 6 10 11 12
1 2 5 6 10 11 12

Muveletigny

Az sszehasonltsok szma a keressekben, minden egyes lpsben a (rsz)tmb hossza,


teht az elozoekben megmutatott:
O(n2 )

A cserk szma, a maximum kivlasztsnak ksznhetoen, legfeljebb n teht

O(n)

gy az algoritmus lpsszma:

O(n2 ) + O(n) = O(n2 )

Lthat, hogy ez is egy ngyzetes, azaz lass rendezsi algoritmus. Azonban fontos
megjegyezni, hogy a cserk szma kevesebb, ezltal futsi idoben jobb, mint az elozo, bu-
bork rendezs.

94
5.7. bra. Maximum kivlasztsos rendezs struktogrammja

5.8. bra. Maximum kivlasztsos rendezs struktogrammja

Algoritmusa

Maximum kivlasztsos rendezs


public void maxkiv(int[] tomb)
{
for (int j = tomb.length-1; j>0; j-)
{
int index = 0;
for (int i =1; i<=j; i++)
if (tomb[index] < tomb[i])
index = i;
csere(tomb, index, i)
}
}

Gyakorta alkalmazzuk ezt az algoritmus napi letnkben is, pldul amikor a kr-

95
tykat a keznkben elrendezzk. (Illetve annak kicsit tovbbfejlesztett s a kvetkezo
algoritmussal kevert vltozatt.)

5.3.4. Beszr rendezs


A beszr rendezs az albbi tleten alapul: Tekintsk az tmbt rendezettnek. Egy j
elem beszrsa trtnjen a megfelelo helyre, gy a tmbt rendezettnek tartjuk meg.
Az alapgondolaton tl, tudjuk mg, hogy egyetlen elem mindig rendezett. Az elejn
vesszk az egsz tmb egy rszt, a bal oldalrl szmtott 1 hossz rsztmbt. Ebbe a
rsztmbbe szrjuk be a megfelelo helyre a kvetkezo elemet, amit a tmb msodik eleme.
A beszrs utn a rendezett rsztmbnk mr 2 hossz. Ebbe is beszrjuk a kvetkezo
elemet s gy tovbb.
Nzzk meg a kvetkezo pldt!

Beszr rendezs plda


Az elso elem nmagban rendezett. Ehhez szrunk be egy msodikat, majd harmadikat,
...

12 5 6 2 10 11 1
5 12 6 2 10 11 1
5 6 12 2 10 11 1
2 5 6 12 10 11 1
2 5 6 10 12 11 1
2 5 6 10 11 12 1
1 2 5 6 10 11 12

A beszrshoz a beszrand elem helyt lineris keresssel hatrozzuk meg a tmb


elejn kezdve. Amikor megleltk a pozcit, akkor a maradk elemeket egyesvel felfel
msoljuk, majd beszrjuk a beszrandt. (Ehhez a beszrandt kln eltroljuk.)

Muveletigny
Az sszehasonltsok szma a legrosszabb esetet tekintve szintn nem vltozik, m az
sszehasonlts szempontjbl legrosszabb eset a cserk szempontjbl a legjobb eset.
Ennek beltshoz vegynk egy eleve rendezett tmbt. A beszrs mindig az utols
pozciba fog trtnni, hiszen sorban vannak, emiatt a cserk szma minimlis. Azonban
a lineris keress a tmb elejtol vgig sszehasonltja a beszrandt a tmb elemeivel.
Ez pedig a maximlis rtk.
A cserk szempontjbl legrosszabb esetben a cserk szma szintn O(n2 )el becsl-
heto, amikor tmbben rendeznk. (Lncolt lista esetn pldul hatkonyabb.)

Algoritmus

Beszr rendezs
public void maxkiv(int[] tomb)
{
for (int j = 0; j<tomb.lenght-1; j++)
{

96
5.9. bra. Beszr rendezs struktogrammja

int elmentve = tomb[j+1];


for (int i=j; (i>=0)&&(tomb[i]>elmentve); i-)
tomb[i+1] = tomb[i];
tomb[i+1] = elmentve;
}
}

Szintn ehhez hasonlt hasznlunk a vals letben is, legtbbszr amikor dolgozatokat
rendeznk pontszm szerint, csak egyidejuleg tbb elemet szrunk be ltalban.

5.3.5. Gyorsrendezs Quicksort


Az eddigieknl egy lnyegesen hatkonyabb, a lpsszmot tekintve nem ngyzetes nagy-
sgrendu algoritmussal ismerkednk meg.
Hatkony rendezsi algoritmus C.A.R. Hoare ksztette, 1960-ban. Tpust tekintve
az Oszd meg s Uralkodj elvet kveti, amelyet a kvetkezokppen kell rteni: Kt fzisra
oszthat az algoritmus, rekurzvan hvja meg magt a rszfeladatokra. (Termszetesen a
rekurzit a hatkonysg rdekben ki lehet vltani ciklussal is.) A fzisok

Partcis fzis Oszd a munkt kt rszre!


Rendezsi fzis Uralkodj a rszeken!

Megosztsi fzis. Vlassz egy strzst (pivot), egy tetszoleges elemet, majd v-
lasszunk ennek egy pozcit gy, hogy minden elem tole jobbra nagyobb legyen, s minden
elem tole balra kisebb legyen!

Uralkodsi fzis. Alkalmazd ugyanezt az algoritmust mindkt flre, mint rszprobl-


mra.
A megosztst brzolva:

97
Kisebb elemek Strzsa Nagyobb elemek

A megosztsi fzisban termszetesen nem tudunk tallni mindig egy olyan elemet, ami
teljesti a feltteleket. A kivlasztott strzshoz kpest vizsgljuk a rsztmb tbbi elemt
s gy cserlnk fel nehny elemet, hogy a felttel igazz vljon.

Egyszeru pivot vlaszts esetn legyen (rsz)tmb balszlso eleme a pivot!


A rsztmb also s felso feltol induljunk el egy indexszel a tmb kzepe fel.
A bal indexszel lpegetve felfel megkeressk az elso elemet, ami nagyobb mint a
strzsa, teht rossz helyen ll. Ugyangy lefel lpegetve megkeressk az elso elemet
ami kisebb mint a strzsa, teht a jobb oldalon llva rossz helyen ll. A kt rossz
elemet felcserljk.
Addig folytatjuk az elozo cserlgetst, amg a kt index ssze nem tallkozik.
Ha megvan a bal-indexnl lvo elemet a pivottal felcserljk.
Ezek utn az egsz algoritmust alkalmazzuk a bal rsztmbre s a jobb rsztmbre.

Egyetlen megoszts sorn, garantljuk azt, hogy a pivot elem a rendezs vgeredmnye
szerinti j helyre kerl, valamint sztosztjuk az elemeket ktfel.

Plda

Gyorsrendezs plda
Balszlso a strzsa.

9 5 6 2 10 11 1

Vegyk a kt indexet

9 5 6 2 10 11 1

A jobb oldals rossz, a bal j. Ezrt a jobb-index vltozatlan, mg a bal lp felfel.

9 5 6 2 10 11 1
9 5 6 2 10 11 1
9 5 6 2 10 11 1

Most jn a csere.

9 5 6 2 1 11 10
9 5 6 2 1 11 10

Vgl a pivot elemet betesszk a bal helyre.

1 5 6 2 9 11 10

Ezzel a kilenc a helyre kerlt s a tole balra, majd tole jobbra levo rsztmbkre hajtjuk
vgre ugyanezt az algoritmust.

98
Muveletigny
Feloszts: vizsglj meg minden elemet egyszer O(n)
Uralkods: az adatok ktfel osztsa O(log2 (n)) Ez a sztbontsok optimlis mennyisge.
sszesen a ketto szorzata, ami O(n log2 (n)), ez pedig jobb, mint az eddig megismert ren-
dezseink, de van egy apr gond ugyanis, ha eredetileg egy rendezett sorozatot adunk
bemenetnek, akkor az algoritmusunk minden egyes lpsben felosztja a rendezendo tm-
bt egy 0 s egy n 1 hossz tmbre, majd azon folytatja a rendezst. (A bal a pivot s
minden ms nagyobb tole.) Ennek a muveletignye pedig nO(n), ami egyenlo O(n2 )-el.
Teht azt kaptuk, hogy rossz esetben a gyorsrendezs olyan lass, mint a bubork
rendezs. Lehet ezen segteni klnbzo strzsa vlasztsi stratgival. Minden a pivot
vlasztson mlik, ugyanis ha tudunk jl gy pivotot vlasztani, hogy a partcik m-
rete kzel azonos legyen, akkor hatkonyan mukdik az algoritmus. Lehet tbb strzst
vlasztani, vagy pedig vletlenszeruen vlasztani. (Ami a valsznusgek termszetbol
addan tlagosan j eredmnyt szolgltat.)
ltalnossgban elmondhat, hogy a gyorsrendezs kevs muvelettel gyorsan rendez,
azonban nem stabil az ideje, teht viszonylag nagy hatrok kztt ingadozik.

Algoritmus

Gyorsrendezs (A, also, felso)

also < felso

q := Feloszt(A, also, felso) SKIP


Gyorsrendezs (A, also, q-1)
Gyorsrendezs (A, q+1, felso)

5.10. bra. Gyorsrendezs struktogrammja

Ilyet ember kzzel nem csinl . . .

5.3.6. Ednyrendezs
Vgl egy szintn gyors rendezovel ismerkednk meg.
Tegyk fel, hogy tudjuk, hogy a bemeno elemek (A[1 . . . n] elemei) egy m elemu U hal-
mazbl kerlnek ki. Pldul i-re igaz, hogy i [1 . . . m]. Lefoglalunk egy U elemeivel
indexelt B tmbt (m db ldt), eloszr mind res. A B segdtmb elemei lehetnek brmi,
pldul lncolt lista.
Az ednyrendezs kt fzisbl fog llni, eloszr a ldk szerint (azaz, hogy milyen rtk
tartozik ahhoz a ldhoz) kigyujtjk az elemek, majd sorban visszahelyezzk az eredeti
tmbbe.

Kigyujts. Eloszr meghatrozzuk rendezendo tmb legkisebb s legnagyobb elemt.


Ezek utn lefoglalunk egy megfelelo mretu segdtmbt, amibe az elemeket fogjuk gyuj-
teni. (Ez a tmb a legnagyobb s a legkisebb elem kztti klnbsg plusz egy.) A se-

99
Feloszt(A, also, felso)

str_elem:=A[also]; bal:=also; jobb:=felso;


bal < jobb
A[bal]<= str_elem and bal <felso
bal:= bal+1
A[jobb]>= str_elem and jobb >also
jobb:= jobb-1
bal < jobb

Csere(A[bal], A[jobb]) SKIP

A[also]:=A[bal]; A[bal]:= str_elem; return bal;

5.11. bra. Gyorsrendezs struktogrammja

gdtmbbe, fogjuk gyujteni a rendezendo tmb elemeit, aszerint, hogy melyik rekeszbe
tartoznak.

sszefuzs. A segdtmbbe kigyujttt elemeket azutn sorban visszafuzzk az eredeti


tmbbe, s ezzel ksz a rendezs.

Ednyrendezo plda

2 2 1 1 5 3 2 5 4

Ebben az esetben lthat, hogy a lehetsges rtkek 1 s 5 kztt vannak, ezrt egy
5 1 + 1 = 5 hossz segdtmbt kell lefoglalni.

1 2 3 4 5
2 2 1 1 5 3 2 5 4 Segdtmb:

1 2 3 4 5
2 2 1 1 5 3 2 5 4 Segdtmb:
2
1 2 3 4 5
2 2 1 1 5 3 2 5 4 Segdtmb:
22
1 2 3 4 5
2 2 1 1 5 3 2 5 4 Segdtmb:
1 22
1 2 3 4 5
2 2 1 1 5 3 2 5 4 Segdtmb:
11 22
1 2 3 4 5
2 2 1 1 5 3 2 5 4 Segdtmb:
11 22 5

100
1 2 3 4 5
2 2 1 1 5 3 2 5 4 Segdtmb:
11 22 3 5
1 2 3 4 5
2 2 1 1 5 3 2 5 4 Segdtmb:
11 222 3 5
1 2 3 4 5
2 2 1 1 5 3 2 5 4 Segdtmb:
11 222 3 55
1 2 3 4 5
2 2 1 1 5 3 2 5 4 Segdtmb:
11 222 3 4 55

Ezutn az ednyek tartalmt egyszeru lineris kiolvasssal az eredeti tmbbe helyez-


zk.

Msodik fzis

1 1 2 2 2 3 4 5 5

Amivel a rendezs be is fejezodtt.

Muveletigny
Lpsszm.
Segdtmb ltrehozsa: O(m)
Kigyujto fzis O(n)
Visszarak fzis O(n + m)
sszesen O(n + m).
Ez jobb, mint az eddigi rendezoink!, hiszen egy lineris ideju rendezot kapunk. Azonban
ennek slyos ra van! Az ednyrendezo felhasznl egy segdtmbt, ami bizonyos esetek-
ben akkora, mint az eredeti tmb (esetleg nagyobb is). Teht a trbeli (memria) komplexi-
tsa eddigi rendezoinkhez kpest nagyobb. Ednyrendezo akkor ri meg, ha a rendezendo
rtkek rtkkszletnek halmaza kicsi. Nyilvnval, hogy vannak olyan bemenetek, ame-
lyek ktszer mr nem frnek el a memriban.
Ednyrendezot kznapi letben akkor hasznlunk, amikor a pakli krtyt a sorba ren-
dezshez eloszr sznek szerint sztdobljuk.

5.3.7. Kupacrendezs
A kupac adatszerkezetet rendezoknt is lehet alkalmazni. Gondoljuk el, hogy a rendezendo
tmb rtkeit egyszeruen beszrjuk egy kupacba majd kiolvassuk onnan, gy hogy mindig
eltvoltjuk a gykeret, mint legkisebb elemet.

Muveletigny
A kupacnl a beszrs s maximum trls muveletignye, legfeljebb a fa magassgval
arnyos (O(h)), ami az O(log n)). Ezt megszorozzuk az sszes beszrand elem szmval
ami n beszrs esetn O(n log n) eredmnyt ad. Figyelembe vve, hogy egy egyarnt felso
korltja a beszrsnak s a kitrlsnek, az kapjuk, hogy rendezs teljes muveletignye
O(2 n log n), ami pedig szintn O(n log n).

101
Ez a muveletigny a gyorsrendezovel esik egy rendben. A kupacrendezs azonban sta-
bil lepsszm rendezo, nem fgg a rendezs semmitol, gy mint a gyorsrendezs esetn
a pivot megvlasztstl. ltalban a gyorsrendezs kevesebb lpssel dolgozik, azaz va-
ljban gyorsabb, mint a kupacrendezs, azonban a gyorsrendezs kpes elromlani nem
megfelelo strzsa esetn.

102

You might also like