Professional Documents
Culture Documents
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
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.
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.
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
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:
1.2. Alapfogalmak
Mindenekelott nhny alapfogalmat fogunk definilni.
Pldk
Egszek: rtkek: 0 . . . 1000 Muveletek: + s
Logikai: rtkek: igaz, hamis Muveletek: , s
Karakter: rtkek: a . . . z Muveletek: < (relci a beturend szerint)
A kifejezs . . .
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.)
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.)
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.
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.
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.
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.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:
14
Utasts 1
Utasts 2
Utasts 3
Az egyszeres elgazs szintaktikja Java nyelven az albbi (ahol az else elotti utas-
ts vgn, kivve, ha szekvencia, ktelezo a ;)
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!
Felttel
15
Ha igaz Ha hamis
Felttel
utastsok utastsok
switch (kifejezs)
{
case 1. eset: utasts break;
case 2. eset: utasts break;
default: utastsok 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 esetben, ha a felttel hamis, egyszer sem fut le. (Eloszr gondolkodunk,
aztn cseleksznk, majd jra gondolkodunk . . . )
Ciklusfelttel
Ciklusmag
Ciklusmag
Ciklusfelttel
17
FOR ciklus. Vegyk a kvetkezo WHILE ciklust, ami kiszmolja 210 -t.
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.
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.)
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.
tlag
P
sszeg ( )
Q
Szorzat ( )
Szorzatsszeg
Vektorszorzat
Faktorilis
...
szmtsra.
19
Nvelo fggvny mi mennyit r a szmolsban
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;
}
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;
}
i++ i = i + 1
i+=10 i = i + 10
!logikai vltoz Logikai tagads. (!igaz = hamis);
boolean Logikai tpus
true logikai igaz
false logikai hamis
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.)
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
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:
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]
}
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
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:
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.)
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.
A trols kvetkezmnyei
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.1. Modellezs
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
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
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.
Boolean: boolean
Byte: byte
29
Short: short
Integer: int
Long: long
Float: float
Double: double
Character: char
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;
rtkads
String s = "Szervusz vilg";
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:
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
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];
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:
Tagads: !
Relcis: ==, !=
Logikai s, vagy: &&, ||
rtkads: A vltoznak j rtket ad. = (Az rtk true vagy false)
Osztly ltrehozsa
32
public class osztlynv extends szlo [s mg ms]
{
public int mezonev;
private String mezonev;
...
public osztlyneve (paramterek)
{ // Konstruktor }
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)
{
}
}
Kutya
+Nv: String
+Fajta: String
+letkor: Integer
#Oltsok ideje: Date []
#Oltsok neve: String []
+ugat(): void
+megy(): void
+oltstkap(mikor:Date,mit:String): void
Deklarci
Kutya bodri;
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;
Osztlymezo
Kutya.ALAPRTELMEZETTUGATSIHANGERO
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
}
Fggvnyszignatra
visszatrsitipus fuggvenynev (parameterdeklarcik)
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
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
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.
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.
Tbb programnyelv esetn lehetosg van arra, hogy ezt tmrebben le lehessen rni, az
gy nevezett foreach ciklusok segtsgvel.
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.
int i = 10;
long l = 100;
double d = 200;
dd = 6.6;
(i < l)
(d > l)
(dd = d)
(d = i)
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;
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);
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.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));
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:
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;
}
Fjlba rs plda
PrintStream ps = new PrintStream(
new FileOutputStream(filenv));
Egysoros megjegyzs
int i = 0; // szmll
Tbbsoros megjegyzs
/* Ez itt egy tbbsoros megjegyzs eleje
kzepe
s vge
*/
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:
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.
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:
43
Java ME Mobil verzi (Pldul telefonokra)
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
47
48
3. fejezet
Absztrakt adatszerkezet
F muvelet specifikcija
F
DF RF
F
DS RS
F muvelet implementcija
S program
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
muveletek
llapottr
paramtertr
elofelttel
utfelttel
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.
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).
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
53
A verem muveletekhez tartoz aximk, amelyeknek logikai kifejezsknt minden
esetben igaznak kell lennik:
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.
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.
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.)
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
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.
58
4.7. bra. Dinamikus verem kd 2. 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:
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]
_ 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.
61
4.10. bra. Statikus sor kd 2. rsz
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.
63
4.13. bra. Dinamikus sor kd 1. 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
65
adatot is tartalmaz lncszemek.
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
null
66
null
null
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.
Konstruktor
Headnull
Tailnull
67
Aktnull
isEmpty()
return Head==Tail==null
isLast()
return Akt==Tail
isFirst()
return Akt==Head
getAkt()
HA Akt6=null AKKOR return Akt.Ertek
setAkt(ujertek)
HA Akt6=null AKKOR Akt.Ertekujertek
stepForward()
HA Akt6=null S isLast() AKKOR AktAkt.Kovetkezo
stepBackward()
HA Akt6=null S isFirst() AKKOR AktAkt.Elozo
stepLast()
AktTail
stepFirst()
AktHead
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
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
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)
removeFirst()
HA isEmpty() AKKOR
HA isFirst() AKKOR AktHead.Kovetkezo
HeadHead.Kovetkezo
HA Head6=null AKKOR
Head.Elozonull
KLNBEN
Tailnull
removeLast()
HA isEmpty() AKKOR
HA Tail==Head AKKOR removeFirst(); VGE
HA isLast() AKKOR AktTail.Elozo
TailTail.Elozo
Tail.Kovetkezonull
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.4. Fa
Ebben a rszfejezetben a hierarchikus adatszerkezetek egyikvel a fval, azon bell is a
binris keressi fval, majd a kupac adatszerkezettel ismerkednk meg.
71
4.22. bra. Lncolt lista kd 2. rsz
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.
73
4.25. bra. Lncolt lista kd 5. rsz
74
4.27. bra. Lncolt lista kd 7. rsz
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.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
76
+
- *
/ x 5 ^
10 3 y 2
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:
Fa bejrsok
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
Preorder
6, 4, 2, 1, 3, 0, 9, 7, 5, 8
Postorder
1, 3, 2, 0, 4, 7, 8, 5, 9, 6
Inorder
1, 2, 3, 4, 0, 6, 7, 9, 8, 5
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
6
4 5 7 0
null null null null null
Aritmetikai reprezentci
6 4 9 2 0 7 5 1 3 - - - - 8 -
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
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.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.
Lefut O(h) ido alatt, ahol h a fa magassga. Hasonlan megkeresheto a maximum rtk
is, ami a legjobboldalibb elem.
82
X
K O
A D L M
4.6.2. Muveletek
Gykr trlse
K O
A D L M
Beszrs
83
M
K O
A D L
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
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
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.
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.
Pldul
100n 300 = (n), hiszen n 300; c = 99-re teljeslnek a felttelek.
Theta
Definci Theta
Ha f = O(g) s f = (g) is teljesl, akkor f = (g).
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
25
Lineris
Loglineris
Ngyzetes
20 Kbs
15
10
0
0 1 2 3 4 5 6 7 8 9 10
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.
87
1000
900
Kbs
800
Exponencilis
700
600
500
400
300
200
100
0
1 2 3 4 5 6 7 8 9 10
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:
89
5.5. bra. A lengyelforma kirtkelsnek stuktogrammja
5.3. Rendezsek
Ebben a szakaszban a rendezsi problmval ismerkednk meg, majd nhny jl hasznl-
hat rendezoalgoritmussal.
Bemenet
90
n szmot tartalmaz (a1 , a2 , . . . , an ) sorozat
Kimenet
A bemeno sorozat olyan (a01 , a02 , . . . , a0n ) permutcija, hogy a01 a02 . . . a0n
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:
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.
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.
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
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
Muveletigny
A muveletigny kiszmtshoz az albbi gondolatmenetet kvetjk:
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
Algoritmus
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)
}
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.
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
O(n)
gy az algoritmus lpsszma:
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
Algoritmusa
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.)
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
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
Szintn ehhez hasonlt hasznlunk a vals letben is, legtbbszr amikor dolgozatokat
rendeznk pontszm szerint, csak egyidejuleg tbb elemet szrunk be ltalban.
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!
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.
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
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
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
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.
99
Feloszt(A, also, felso)
gdtmbbe, fogjuk gyujteni a rendezendo tmb elemeit, aszerint, hogy melyik rekeszbe
tartoznak.
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
Msodik fzis
1 1 2 2 2 3 4 5 5
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