25
0. Bevezető megjegyzések Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag. Az, hogy bevezetés jellegű, senkit ne tévesszen meg és az olvasó ne gondoljon laza eleganciával arra, hogy akkor semmilyen előismeretekkel nem kell rendelkeznie. Kell. Igyekeztünk – ahogy a közmondás mondja – a lehetőségekhez képest egyszerűen ismertetni a témakört, de attól nem egyszerűbben. Az olvasót nem fotelban ülve óhajtjuk kiszolgálni lesve a kívánságait, hanem egy előírt – talán kellően szép és izgalmas – program szerint a témán kívánjuk végigkalauzolni. Eközben elvárjuk tőle az aktivitást, az együtt gondolkodást, valamint az önálló, kellemesen elfárasztó munkát is. Az erre való buzdítás jelei az anyagban előforduló „bizonyítsuk be”, „lássuk be”, „igazoljuk”, „miért” és a többi hasonló kezdetű szövegek. Törekszünk arra, hogy a munkája ne végkimerítő, lidércnyomásos hajsza legyen. Ennek azért persze előfeltétele egy bizonyos ismeretanyag magabiztos birtoklása. Ebben a fejezetben ezen előfeltételezett ismeretanyagból villantunk föl néhány nagyon fontos témakört, tényt és szólunk egy pár szót a szemléletmódról is. Néhány szó definíciókról, tételekről és bizonyításokról A könyvnek a mondanivalója részben absztrakt, sok benne a matematikai jellegű téma és tárgyalásmódja is inkább matematikai, mint elmesélő. Ennek megfelelően törekedni fogunk a viszonylag tömör leírásokra és jelölésekre. Ezek használata megszokást és kellő elmélyülést kíván. Amit cserébe kapunk: a precizitás, a higiénikus gondolkodás. Elkerülhetjük ezáltal a manapság a mindennapi életben oly divatos csúsztatásokat, helytelen következtetéseket, a nem mindig hátsó szándék nélküli információ visszatartást, félrevezetéseket. A matematikai szemléletmód következménye lesz a halmazelméleti alapokhoz történő igazodás, ezt tükrözik majd a jelölések és a fogalmak. A használt matematikai jelölések táblázatában [A. Függelék] felsorolt jelekről feltesszük, hogy ismertek és használatukban az olvasó kellő jártasságra tett szert. (Nem papírja van róla, hanem gyakorlottsága!) A kiemelt formulákat számozni fogjuk. Minden fejezetben és alfejezetben a számozás elölről kezdődik. Formulára történő hivatkozásnál csak a formula számát adjuk meg, ha a formula ugyanazon fejezetben (alfejezetben) található. Ha a hivatkozott formula másik fejezetben (alfejezetben) van, akkor a teljes fejezetsorszámot és a ponttal hozzákapcsolt formulaszámot adjuk meg. Ugyanez a helyzet a tételek és a példák számozásánál. A tárgyalás alapját a definíció, tétel, bizonyítás hármas alkotja. A definíciók (meghatározások) precíz és aktív ismerete megkerülhetetlen, hiszen általuk építjük fel a fogalomrendszerünket. A terminus technicus -ok (szakkifejezések) ismerete és helyes használata is ide tartozik. E nélkül nem tudunk dolgozni, mert nem engedhető meg, hogy valamilyen megnevezés, fogalom ne mindenki számára ugyanazt jelentse. A viccbeli két bombázó sem teljesen ugyanarra gondolt, amikor a belvárosban sétálva és a kirakatokat nézegetve az egyikük bizalmasan odasúgta a másiknak, hogy: „Nem vetted észre, hogy a mögöttünk álló férfi követ?” Mire a másik visszasúgta: „Dehogynem vettem észre! Mi az, hogy követ! Nagykövet!” Itt a félreértés oka nyílvánvalóan a „követ” fogalom eltérő értelmezése a két szereplő részéről. Perdöntőek lesznek a tételek (bizonyított állítások), amelyek a fogalmak közötti fontos összefüggésekre világítanak rá. Ezekre a tételekre azután a későbbiekben rendre hívatkozni fogunk. A tételek továbbá kijelölik a témák tárgyalásának menetét. A tételek egymásra épülnek. Bármelyik csak akkor igaz, ha az összes megelőző is igaz. Ha csak egy állítás is hamis lenne, akkor az elméletünk is ellentmondásos lenne. A bizonyítás ok azért fontosak, mert általuk meggyőződhetünk, hogy a tétel (az állítás) valóban igazat mond. További haszna a bizonyításnak, hogy megtanít higiénikusan, tisztességesen gondolkodni és érvelni, valamint kifejleszti az emberben azt az igényt, hogy csak a kellően alátámasztott és bebizonyított állításokat fogadja el, ne higgyjen el mindent csak azért, mert aki mondta, az

0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

0. Bevezető megjegyzések Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag. Az, hogy bevezetés jellegű, senkit ne tévesszen meg és az olvasó ne gondoljon laza eleganciával arra, hogy akkor semmilyen előismeretekkel nem kell rendelkeznie. Kell. Igyekeztünk – ahogy a közmondás mondja – a lehetőségekhez képest egyszerűen ismertetni a témakört, de attól nem egyszerűbben. Az olvasót nem fotelban ülve óhajtjuk kiszolgálni lesve a kívánságait, hanem egy előírt – talán kellően szép és izgalmas – program szerint a témán kívánjuk végigkalauzolni. Eközben elvárjuk tőle az aktivitást, az együtt gondolkodást, valamint az önálló, kellemesen elfárasztó munkát is. Az erre való buzdítás jelei az anyagban előforduló „bizonyítsuk be”, „lássuk be”, „igazoljuk”, „miért” és a többi hasonló kezdetű szövegek. Törekszünk arra, hogy a munkája ne végkimerítő, lidércnyomásos hajsza legyen. Ennek azért persze előfeltétele egy bizonyos ismeretanyag magabiztos birtoklása. Ebben a fejezetben ezen előfeltételezett ismeretanyagból villantunk föl néhány nagyon fontos témakört, tényt és szólunk egy pár szót a szemléletmódról is.

Néhány szó definíciókról, tételekről és bizonyításokról A könyvnek a mondanivalója részben absztrakt, sok benne a matematikai jellegű téma és tárgyalásmódja is inkább matematikai, mint elmesélő. Ennek megfelelően törekedni fogunk a viszonylag tömör leírásokra és jelölésekre. Ezek használata megszokást és kellő elmélyülést kíván. Amit cserébe kapunk: a precizitás, a higiénikus gondolkodás. Elkerülhetjük ezáltal a manapság a mindennapi életben oly divatos csúsztatásokat, helytelen következtetéseket, a nem mindig hátsó szándék nélküli információ visszatartást, félrevezetéseket. A matematikai szemléletmód következménye lesz a halmazelméleti alapokhoz történő igazodás, ezt tükrözik majd a jelölések és a fogalmak. A használt matematikai jelölések táblázatában [A. Függelék] felsorolt jelekről feltesszük, hogy ismertek és használatukban az olvasó kellő jártasságra tett szert. (Nem papírja van róla, hanem gyakorlottsága!) A kiemelt formulákat számozni fogjuk. Minden fejezetben és alfejezetben a számozás elölről kezdődik. Formulára történő hivatkozásnál csak a formula számát adjuk meg, ha a formula ugyanazon fejezetben (alfejezetben) található. Ha a hivatkozott formula másik fejezetben (alfejezetben) van, akkor a teljes fejezetsorszámot és a ponttal hozzákapcsolt formulaszámot adjuk meg. Ugyanez a helyzet a tételek és a példák számozásánál. A tárgyalás alapját a definíció, tétel, bizonyítás hármas alkotja. A definíciók (meghatározások) precíz és aktív ismerete megkerülhetetlen, hiszen általuk építjük fel a fogalomrendszerünket. A terminus technicus-ok (szakkifejezések) ismerete és helyes használata is ide tartozik. E nélkül nem tudunk dolgozni, mert nem engedhető meg, hogy valamilyen megnevezés, fogalom ne mindenki számára ugyanazt jelentse. A viccbeli két bombázó sem teljesen ugyanarra gondolt, amikor a belvárosban sétálva és a kirakatokat nézegetve az egyikük bizalmasan odasúgta a másiknak, hogy: „Nem vetted észre, hogy a mögöttünk álló férfi követ?” Mire a másik visszasúgta: „Dehogynem vettem észre! Mi az, hogy követ! Nagykövet!” Itt a félreértés oka nyílvánvalóan a „követ” fogalom eltérő értelmezése a két szereplő részéről. Perdöntőek lesznek a tételek (bizonyított állítások), amelyek a fogalmak közötti fontos összefüggésekre világítanak rá. Ezekre a tételekre azután a későbbiekben rendre hívatkozni fogunk. A tételek továbbá kijelölik a témák tárgyalásának menetét. A tételek egymásra épülnek. Bármelyik csak akkor igaz, ha az összes megelőző is igaz. Ha csak egy állítás is hamis lenne, akkor az elméletünk is ellentmondásos lenne. A bizonyítások azért fontosak, mert általuk meggyőződhetünk, hogy a tétel (az állítás) valóban igazat mond. További haszna a bizonyításnak, hogy megtanít higiénikusan, tisztességesen gondolkodni és érvelni, valamint kifejleszti az emberben azt az igényt, hogy csak a kellően alátámasztott és bebizonyított állításokat fogadja el, ne higgyjen el mindent csak azért, mert aki mondta, az

Page 2: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 2 -

magas polcon ül és/vagy hatalommal rendelkezik. A bizonyítások végét a ■ jel jelzi. Sajnos nem fogunk mi sem minden tételt bebizonyítani, mivel kevés az idő és a hely, de a bebizonyítottak elegendő önbizalmat és megalapozott hitet adnak arra, hogy a többit elfogadjuk már csak azért is, mivel a bizonyítások a szakirodalomban elérhetők. A tételek általában egyirányúak és szerkezetük „Ha A, akkor B” alakú, ahol A és B állítások (ítéletek). Az állítás pedig olyan kijelentő mondat, amely vagy csak igaz lehet, vagy pedig csak hamis. Ezen két egymást kölcsönösen kizáró eseten kívül minden más lehetőség nem megengedett. Az „esik az eső” állítás, mert lehet igaz, vagy pedig lehet hamis. Ugyanez a helyzet a „nedves a járda” kijelentéssel. Példa nem állításra (nem ítéletre) a következő kijelentés. Ez a mondatom hazugság. (Lássuk be, hogy sem az igaz, sem a hamis minősítés nem kapcsolható a mondathoz!) A „Ha A, akkor B” tétel értelmezése pedig az, hogy ha az A állítás teljesül (igaz), akkor a B állítás is igaz. Például: „Ha esik az eső, akkor nedves a járda”. Itt az A állítás az „esik az eső”, a B állítás pedig a „nedves a járda”. Azt mondjuk, hogy az A állítás a B-nek elégséges feltétele, a B állítás pedig az A-nak szükséges feltétele. Az „esik az eső” elégséges feltétele annak, hogy „nedves a járda”. A járda nedves állapotához elegendő az, hogy essen az eső. A „nedves a járda” szükséges feltétele annak, hogy „esik az eső”. Amikor esik az eső, akkor szükségképpen nedves lesz a járda. A „Ha A, akkor B” úgy is megfogalmazható, hogy „Csak akkor A, ha B”. Csak akkor esik az eső, ha nedves a járda. Egy tételben az állítások sorrendje általában nem megfordítható. A példánkban a megfordítás – „Ha nedves a járda, akkor esik az eső” - nem igaz. Lehet a járda úgy is nedves, hogy nem esik az eső, például, mert éppen napsütésben mossák a járdát. Vannak olyan tételek, amelyeknek a megfordítása is igaz. Ezeket az „A akkor és csak akkor, ha B” alakban szoktuk megfogalmazni. Ilyenkor azt mondjuk, hogy az A és B két állítás ekvivalens egymással. Azt is szoktuk mondani, hogy az A a B-nek (vagy a B az A-nak) szükséges és elégséges feltétele. Gyakran elkövetett hiba egy tétel megfordításának és a tagadásának az összekeverése. A tétel megfordítása, mint láttuk, nem mindig igaz. A tagadott alak így hangozhat a fenti példában: „Ha nem vizes a járda, akkor nem esik az eső”. A helytelen változat pedig az szokott lenni, hogy „Ha nem esik az eső, akkor nem vizes a járda”, ami, mint láttuk nem igaz. A sémák:

Az eredeti tétel Ha A, akkor B A tétel megfordítása Ha B, akkor A A tétel tagadása Ha nem B, akkor nem A A tétel helytelen tagadása(a megfordítás tagadása)

Ha nem A, akkor nem B

A tételek bizonyításának egy speciális módszere a teljes indukció, amely a matematikában az aritmetika Peano féle axiómarendszerének az egyik axiómája. A teljes indukció axiómája így szól: Ha valamely állítás be van bizonyítva az 1-es számra és ha abból a feltételezésből, hogy az állítás igaz az n-re, mint természetes számra következik, hogy akkor az állítás igaz az n-re rákövetkező számra is (n+1-re is), akkor az az állítás igaz az összes természetes számra is. 1. példa: a teljes indukció alkalmazása bizonyításban: 1. Tétel: Az első k darab páratlan természetes szám összege. Az első k darab páratlan természetes szám összege éppen k2. Tömörebben a tétel egy formula alakjában írható fel:

( ) 212531 kk =−++++ K , ahol K,3,2,1=k természetes szám lehet. (1)

Page 3: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 3 -

Még tömörebben írható a Σ szumma jel (a görög ábécé nagy szigma betűje) használatával:

( ) 2

112 ki

k

i=−∑

=

, k∈N (2)

Bizonyítás A k=1 esetre a tétel igaz, mert akkor az összeg egyetlen tagból áll és 1=12.

(Láthatóan igaz az is, hogy például 1+3=22, 1+3+5=32.) Tegyük fel, hogy a tétel igaz k=n-re is, azaz az indukciós feltételezésünk az lesz, hogy 1+3+5+… +(2n-1) = n2. Megmutatjuk, hogy akkor a tétel igaz k=n+1-re is, azaz az 1+3+5+…+(2n-1)+(2n+1)= (n+1)2 összefüggést kellene belátnunk. Ebben a formulában a baloldalon az utolsó tag kivételével az összeg éppen n2 az indukciós feltételezésünk alapján. Ebből a baloldalon kapjuk, hogy n2+(2n+1), ami éppen a bizonyítandó (n+1)2. Az indukciós feltételezésünk helyes volt és így a teljes indukció axiómáját alkalmazva a tételünk igaz bármely k természetes számra.

■ 2.példa: a teljes indukció helytelen használata: 2. Tétel: ☺

A lovak színéről. (kivonat [2]-ből)

Minden ló azonos színű Bizonyítás ☺ Teljes indukcióval bizonyítunk. Egy ló azonos színű, ez triviálisan teljesül.

Tegyük fel, hogy a tétel igaz n ló esetére is, azaz n ló azonos színű. Megmutatjuk, hogy akkor a tétel igaz n+1 lóra is. Vegyünk n+1 lovat. Ha most egyet közülük kiveszünk, akkor az indukciós feltétel szerint a megmaradtak azonos színűek, mivel n ló marad. Visszatéve a kivett lovat, majd kivéve egy másikat újra n ló marad és így megint azonos színűeket kapunk az indukciós feltételezés szerint. Az eljárást folytathatjuk tovább a kivett ló visszaadásával és egy újabb kiválasztásával. Mivel mindig azonos színűeket kaptunk és minden lovat már kiválasztottunk, ezért az n+1 ló is azonos színű. Alkalmazva a teljes indukció axiómáját, kapjuk, hogy bárhány ló is azonos színű, tehát az összes ló is az, hiszen csak véges számú ló létezik a valóságban. ☺

■ (Hol a hiba?) A halmazelmélet fontos lesz a tárgyalásmódban. Többször kell belátni, hogy két halmaz megegyezik. Ennek belátása általában nem úgy történik, hogy az elemeiket felsoroljuk és párbaállítva belátjuk az azonosságot. Ez a módszer csak a véges sok elemű halmazoknál működik és ott is lehet kényelmetlen. A halmazok gyakran nem véges sok eleműek. Véges halmazról beszélünk, ha a halmaznak nincs vele ekvivalens valódi részhalmaza. (Ekvivalens részhalmazról beszélünk, ha a halmaz és a részhalmaz elemei között létezik egy-egy értelmű megfeleltetés.) Két halmazt azonosnak tekintünk, ha mindkettő a másik részhalmaza. A≡B ⇔ A⊂B és B⊂A.

Néhány érdekes függvény és művelet Az anyagban fogunk függvényeket használni. A szokványos függvények mellett meg kell barátkozni az egészrész függvényekkel, a törtrész függvényel és a kerekítő függvénnyel. Ne tévesszen meg senkit, hogy ezek a függvények hasonlítani fognak a programozási nyelvekben

Page 4: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 4 -

előforduló hasonló nevű függvényekhez, mert nem biztos, hogy teljesen azonosak azokkal. Az egyes programozási nyelvek nem mindig konzekvensek. Az ugyanolyan nevű függvény a különböző nyelvekben némileg eltérő módon viselkedhet. Érdemes tanulmányozni a nyelvi leírást, specifikációt. Definíció: Az alsó egészrész függvény Az alsó egészrész függvény minden valós számhoz egy egész számot rendel

hozzá, éppen azt, amely a tőle nem nagyobb egészek közül a legnagyobb. Az alsó egészrész függvény jele: ⎣x⎦, ahol x valós szám. Tömören:

⎣ ⎦ kxZkxk

∈≤

= max (3)

Más szavakkal formálisan: ⎣x⎦ = k, ahol k olyan egész szám, hogy k ≤ x < k+1.

3. példa:

x 2,5− 5− 5 2,5

⎣ ⎦x 6− 5− 5 5 Definíció: A felső egészrész függvény A felső egészrész függvény minden valós számhoz egy egész számot rendel

hozzá, éppen azt, amely a tőle nem kisebb egészek közül a legkisebb. A felső egészrész függvény jele: ⎡x⎤, ahol x valós szám. Tömören:

⎡ ⎤ kxZkxk

∈≥

= min (4)

Más szavakkal formálisan: ⎡x⎤ = k, ahol k olyan egész szám, hogy k-1 < x ≤ k.

4. példa:

x 2,5− 5− 5 2,5

⎡ ⎤x 5− 5− 5 6 Az alsó és felső egészrész függvények fontos tulajdonságait az alábbi táblázatban foglaljuk össze: (Lássuk be, hogy ezek valóban teljesülnek!)

1. Ha a egész szám, akkor ⎣ ⎦ aa = , ⎡ ⎤ aa = , 2. Ha x valós, a egész szám, akkor ⎣ ⎦ ⎣ ⎦ axax ±=± , ⎡ ⎤ ⎡ ⎤ axax ±=± , 3. Ha x és y valós számok, akkor ⎣ ⎦ ⎣ ⎦ ⎣ ⎦yxyx ±≥± , ⎡ ⎤ ⎡ ⎤ ⎡ ⎤yxyx ±≤± ,4. Ha x valós szám, akkor ⎣ ⎦ ⎡ ⎤xx −=− , ⎡ ⎤ ⎣ ⎦xx −=− , 5. Ha yx ≤ valós számok, akkor ⎣ ⎦ ⎣ ⎦yx ≤ , ⎡ ⎤ ⎡ ⎤yx ≤

Definíció: A kerekítő függvény A kerekítő függvény minden valós számhoz a hozzá legközelebb eső egész

számot rendeli hozzá. Ha a legközelebbi egész szám nem egyértelmű, akkor a nagyobbat választja. A kerekítő függvény jele: Round(x), ahol x valós szám.

Page 5: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 5 -

⎥⎦⎥

⎣ 21

⎢⎢ +=)( xxRound (5)

A legközelebbi egészre kerekít. Pozitív számok esetén, ha a tizedesrész 5/10, vagy annál nagyobb, akkor felfelé, kisebb esetben lefelé kerekít. Negatív számok esetén ha a tízes számrendszer szerinti felírásban a tizedesrész kisebb, mint 5/10, vagy egyenlő vele, akkor felfelé, egyébként lefelé kerekít.

5. példa:

x 6− 8,5− 5,5− 2,5− 5− 5 2,5 5,5 8,5 6 )(xRound 6− 6− 5− 5− 5− 5 65 6 6

Definíció: A törtrész függvény A törtrész függvény minden valós számhoz azt a számot rendeli hozzá, amely azt

mutatja meg, hogy a szám mennyivel nagyobb az alsó egészrészénél. A törtrész függvény jele: { , ahol x valós szám. Tömören: }x

{ } ⎣ ⎦xxx −= . (6) Mindig fennáll a { } 10 <≤ x egyenlőtlenség.

6. példa:

x 8,5− 2,5− 5− 5 2,5 8,5{ }x 0 2,0 8,0 2,0 8,0 0

Felhívjuk a figyelmet két műveletre: Definíció: Az egész hányados képzése, a div művelet Legyen a és b egész szám, b ≠ 0. Definíció szerint az egész osztás műveletén az

a/b osztás eredményének alsó egész részét értjük. Tömören:

⎣ ⎦babivda /= (7) 7. példa: 349 −=− div , 249 =div Definíció: Az egész maradék képzése, a mod művelet Legyen a és b egész szám. Definíció szerint

⎣ ⎦ ( )⎩⎨⎧

≠⋅−=⋅−=

=0,/0,

modbhabbdivaabbaabhaa

badef

(8)

8. példa: , 34mod9 =− 14mod9 = , 1)4(mod9 −=−− , 3)4(mod9 −=− Speciális jelentése van az jelölésnek. Ezt minden valós a-ra értelmezzük és jelentése az valós szám törtrésze, azaz

1modaa

{ }aadef=1mod (9)

Page 6: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 6 -

Rövid betekintés a számrendszerekbe

Szükségünk lesz számok különböző alapú számrendszerben történő felírására. Egy szám lejegyzésekor a használt számrendszer alapszámát mindig tizes számrendszerben adjuk meg és a szám jobb alsó sarkához írjuk indexként. Ha a számrendszer alapja a b ≥ 2 egész szám, akkor az x pozitív egész szám számjegyei:

011 ,,,, cccc nn K− (10) ahol , bck <≤0 nk ,,1,0 K= és az x szám értéke ezekkel a számjegyekkel és az alappal kifejezve:

00

11

11 bcbcbcbcx n

nn

n ⋅+⋅++⋅+⋅= −− K (11)

Az n értékét úgy határozzuk meg, hogy 0≠nc legyen, és minden , ha . Ha a számrendszer alapszáma tíznél nagyobb, akkor a 0,1,2,...,9 számjegyek mellett új számjegyeket kell bevezetni a tíz, tizenegy, ...,

0=kc nk >

1−b számértékekre. Kényelmi és nyomdatechnikai okok miatt a latin ábécé nagybetűit használjuk ezen célra. Ilyen módon tehát az A=10, B=11, C=12, ..., Z=36 jelek használatosak. (Lehet találkozni vegyes jelöléssel is, ahol a számjegyeket tizes számrendszerben jegyzik le. Mi nem fogjuk ezt alkalmazni.) 9. példa: 2006 számjegyei tizes számrendszerben 23 =c , 02 =c , , . Itt n=3 és

. 01 =c 60 =c

0123 1061001001022006 ⋅+⋅+⋅+⋅= Nyílvánvalóan: bxc mod0 = és bdivxcccc nn =− 121K . A következő séma alkalmas a számjegyek egymást követő fordított irányú előhozására:

x b bdivxx =1 bxc mod0 = bdivxx2 = bxc mod111 =

… … bdivxx kk 1−= bxc kk mod11 −− =

… … bdivxx nn 1−= bxc nn mod11 −− =

0 bxc nn mod=

(12)

10. példa: Írjuk fel a 2006-ot kettes (= bináris) számrendszerben és 16-os (= hexadecimális) számrendszerben. 2006 2 2006 16 Tehát 200610=111110100102=7D6161003 0 125 6 501 1 7 13=D16 250 0 0 7 125 0 62 1 31 0 15 1 7 1

Page 7: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 7 -

3 1 1 1 0 1

Átírás tizes alapra a (11) formula átrendezésével történik az úgynevezett Horner séma szerint.

( )( )( ) 011 cbcbcbcx nn +⋅++⋅+⋅= − KK (13) Ezzel azt érjük el, hogy kevés műveletet kell használni, a műveletek azonos jellegűek, másrészt a műveleteket végezhetjük tizes számrendszerben. 11. példa: 7D616=((7)·16+13) ·16+6=2006 111110100102=((((((((((1) ·2+1) ·2+1) ·2+1) ·2+1) ·2+0) ·2+1) ·2+0) ·2+0) ·2+1) ·2+0 200610=(((2) ·10+0) ·10+0) ·10+6 Kellemes az átváltás a két számrendszerbeli ábrázolás között, ha történetesen a bináris és a hexadecimális számrendszerről van szó. Ekkor hexadecimális alakról binárisra történő átírás esetén minden hexadecimális jegyet a jegy bináris megfelelőjével helyettesítünk. Binárisról hexadecimálisra történő átírásnál pedig a törtvesszőtől jobbra is és balra is négyes csoportokra osztva a bináris szám számjegyeit minden csoportot helyettesítünk a hexadecimális megfelelőjével. A megfeleltetés a hexadecimális számjegyek és a bináris négyjegyű csoportok között az alábbi táblázatban látható:

0000 ↔ 0 0100 ↔ 4 1000 ↔ 8 1100 ↔ C 0001 ↔ 1 0101 ↔ 5 1001 ↔ 9 1101 ↔ D 0010 ↔ 2 0110 ↔ 6 1010 ↔ A 1110 ↔ E 0011 ↔ 3 0111 ↔ 7 1011 ↔ B 1111 ↔ F

(Lássuk be, hogy a javasolt módszer helyes eredményre vezet!) Módszerünkkel kikerüljük egyrészt a tizes számrendszerre történő átmeneti átalakítást, másrészt nem kell nem tizes alapú számrendszerben műveleteket végezni Pozitív egész szám b alapú logaritmusa és a szám b alapú számrendszerbeli számjegyei számának a kapcsolatát világítja meg az alábbi tétel. 3. Tétel: A számjegyek számáról Pozitív x egész szám számjegyeinek a száma b alapú számrendszerben eggyel

több, mint a szám b alapú logaritmusának az alsó egészrésze, azaz ha a szám számjegyei , akkor a jegyek száma 011 ,,,, cccc nn K−

⎣ ⎦ 1log1 +=+ xn b

( )

yb

bcbcbccb

bcbcbcbcx

n

y

nnnn

n

nn

nn

⋅=

=++++⋅=

=⋅+⋅++⋅+⋅=

=

−−

−−

444444 3444444 21K

K

/// 01

11

00

11

11

(14) Bizonyítás

(15)

Világos, hogy bycn <≤≤1 . Innen az y logaritmusára kapjuk, hogy

Page 8: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 8 -

1log0 <≤ yb (16)

(15)-ből logaritmálással

yx bb loglog nybn bb loglog +=+⋅= (17) adódik. Azaz

xyn bb loglog =+ (18) (18) mindkét oldalán az alsó egészrészt véve ⎣ ⎦xn blog= adódik, mivel n egész szám és (16) fennáll. Egyet hozzáadva mindkét oldalhoz kapjuk az állításunkat.

Az előzőek megvalósításáról Általában nem fog minket érdekelni, hogy a tanulmányunk tárgyai, objektumai hogyan valósíthatók meg fizikailag (hogyan realizálhatók). Ennek ellenére nem árt egy kis kitekintés a számítástechnikára. Az egyik fontos dolog, hogy a számok hogyan kerülnek tárolásra a számítógép memóriájában. A memóriát úgy lehet elképzelni, mint egymás mellett lineárisan felsorakoztatott tárolórekeszek sorozata. A rekeszeket egymástól a sorban elfoglalt helyük különbözteti meg, amit egy indexszel (címmel) írunk le. A rekesz fogalom szemléletes, de fizikailag nem pontos. A fizikai rekesz ma a byte (= 8 bit). A byte a memória legkisebb fizikailag címezhető egysége. A memóriából kiolvasni, vagy oda beírni egy byte-nál kevesebb adatmennyiséget nem lehet. Ha csak egy bitet akarunk megváltoztatni, akkor is ki kell olvasni az őt tartalmazó byte-ot, a kívánt bitet átírni, majd a byte-ot visszaírni a memóriába. A byte tartalmát a jobb áttekinthetőség miatt hexadecimális számrendszerben szoktuk megadni. Például az 110010012 tartalmú byte hexadecimális alakban C916. A byte bitjeit jobbról balra indexeljük. A jobbszélső bit a nullás indexű bit (a legkevésbé szignifikáns bit, Least Significant Bit, LSB), tőle balra áll az egyes indexű bit, és így tovább. A byte balszélén áll a hetes bit (a legszignifikánsabb bit, a legnagyobb helyiértékű bit, Most Significant Bit, MSB).

MSB LSB bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0bitindex 7 6 5 4 3 2 1 0

Byte és bitjei Már egyetlen byte is alkalmas szám tárolására csak a számtartomány kicsi. A nyolc bit mindegyike lehet zérus, vagy egy. Ennek megfelelően 28 = 256 egymástól különböző byte létezhet. Minden ilyen bitvariációhoz hozzárendelünk egy számot. Természetes módon kínálkozott és a gyakorlat is ezt részesítette előnyben, hogy előjel nélküli (nemnegatív) illetve előjeles számokat különböztessünk meg. A byte tartalmát aszerint interpretáljuk, hogy milyen típusú adatot akarunk benne látni. Előjel nélküli esetben a hozzárendelés a byte tartalomhoz a bitsorozat kettes számrendszerben leírt számként való értelmezése. Ekkor a legkisebb szám a zérus lesz (tiszta zérus bitek), a legnagyobb a 255 (tiszta egyes bitek). Ha előjeles számokat szeretnénk tárolni, akkor az úgynevezett kettes komplemens ábrázolást szokás előnyei miatt alkalmazni. Ekkor az előjeles egész szám hozzárendelése úgy történik, hogy ha a MSB=0, akkor a byte tartalmat az előjelmentes esetnek megfelelően értelmezzük. Ha MSB=1, akkor annyival kell többet tennünk, hogy a kapott előjelmentes számból kivonjuk a 28 = 256 számot, ami biztosan negatív lesz. Ezen a módon a legkisebb szám –128 lesz (MSB=1, a többi bit

Page 9: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 9 -

zérus), a legnagyobb szám 127 lesz (MSB=0, a többi bit egyes). Egy adott bitmintázathoz tartozó kettes komplemensnek a meghatározására egy egyszerű szabály a következő: a mintázat jobbvégétől balfelé haladva leírjuk az összes bitet változatlanul az elsőként előforduló egyes bittel bezárólag, majd ezután minden további bitet ellentétesre változtatunk. (Lássuk be, hogy a módszer valóban helyes! Van-e olyan bitmintázat, amelynek a kettes komplemense saját maga, és ha van, akkor hány van és melyek ezek?) Egy byte tartalmát értelmezhetjük azonban karakterként is. A karakter gyűjtőfogalom, a betű, számjegy, írásjel, vezérlőjel összefoglaló neve. Ha egy byte tartalmát karakterként kívánjuk interpretálni, akkor használhatjuk a szabványos és elterjedt ASCII kódtáblázatot, amely a C. Függelékben megtalálható. Nem célunk most itt belemenni ennek az egyszerű dolognak a gyakorlat által történő elbarokkosításába, amikoris a karakter milyensége függhet az eszköztől, amire azt kiküldjük (képernyő, nyomtató, stb.), a nyelvi megállapodástól stb. Bármilyen meglepő ezekután, egy byte-ot nyolc bitnek is lehet interpretálni, amikor az egyes biteknek más és más a jelentése. Ilyenkor jelzőbitekről (flag-ek) beszélünk. Az egyes bitek szemafor szerepet játszanak, pillanatnyi értéküktől függően döntünk. Visszatérve az egész számok ábrázolására azonnal látszik, hogy az egyetlen byte nagyon szűk mozgásteret enged, kicsi az átfogott számtartomány. A fizikai eszközeink (a hardware) lehetőséget biztosítanak több byte összekapcsolására. Ez azonban a software útján is megvalósítható, csak az kevésbé hatékony. Két byte már 16 bitet ad, ami 216=65536 különböző szám megadhatóságát jelenti. A byte-párt szónak (word) nevezik. A szóban a MSB a szó balszélén a 15-ös indexű bit.

MSB LSB bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8 bit7 bit6 bit5 bit4 bit3 Bit2 bit1 bit0

←⎯⎯⎯ Magas helyiértékű byte ⎯⎯⎯→ ←⎯⎯ Alacsony helyiértékű byte ⎯⎯→ Szó és bitjei

Előjel nélküli számok esetén a legkisebb érték 0 (16 zérus bit) a legnagyobb szám 216-1 = 65535 (16 egyes bit). Előjeles számok esetén ha MSB=1, akkor kivonni a 216=65536-ot kell. A legkisebb szám -215 = -32768 (MSB=1, a többi bit zérus), a legnagyobb 215-1 = 32767 (MSB=0, a többi bit egyes). Mód van négy byte összekapcsolására. Ez a dupla szó (double word). A dupla szóban a MSB bit indexe 31. MSB LSB

31 24 23 16 15 8 7 03. byte 2. byte 1. byte 0. byte

Duplaszó byte-jai és bitjei A lehetőségek száma 232 = 4294967296. Előjel nélküli számok esetén a legkisebb szám a zérus, a legnagyobb 232-1 = 4294967295. Előjeles esetben ha MSB=1, akkor kivonni a 232 = 4294967296 számot kell. A legkisebb szám a -231 = -2147483648, a legnagyobb 231-1 = 2147483647. Ha a byte-okat az egyik számítógépről valamely másikra visszük át, akkor nem lényegtelen, hogy az összekapcsolt byte-ok esetén mi a helyes byte-sorrend. Az Intel processzorok az összekapcsolt byte-okat fordított sorrendben rakják le egymás után a memóriában, ami azt jelenti, hogy elöl a legalacsonyabb helyiértékeket tartalmazó byte áll, majd azt követik az egyre magasabb helyiértékeket adó byte-ok. (A Motorola processzorok az egyenes sorrend hívei, először a legmagasabb helyiértékű byte, majd a csökkenő helyiérték szerintiek következnek.) Szó byte-jai Duplaszó byte-jai memória ... ... 0. byte 1. byte ... ... 0. byte 1. byte 2. byte 3. byte ... ...

Intel byte sorrend → növekvő byte címek Szó byte-jai Duplaszó byte-jai

Page 10: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 10 -

memória ... ... 1. byte 0. byte ... ... 3. byte 2. byte 1. byte 0. byte ... ... Motorola byte sorrend → növekvő byte címek

Az egész számokkal végzett műveletek pontos eredményt adnak, ha az eredmény az ábrázolási tartományba esik. Összefoglalva a számtartományokat:

előjel nélküli szám előjeles szám legkisebb legnagyobb legkisebb legnagyobb

byte 0 28-1 -27 27-1 szó 0 216-1 -215 215-1 dupla szó 0 232-1 -231 231-1

Más a helyzet a valós számokkal. Ezen a téren ma már szabvány létezik, az IEEE 754-es szabvány, amely 1985 óta érvényes és William Kahan a Berkeley egyetem professzora nevéhez fűződik. A szabvány pontos előírásokat ad a valós számok ábrázolására. Pontosabban nem is valós számoknak nevezik az ílymódon kezelhetö számokat, hanem lebegőpontos számoknak. Ezen ábrázolási formát nem tárgyaljuk teljes részletezettséggel, de a két együtt ismertethető esetről - az egyszeres pontosság és a dupla pontosság esete - szólunk néhány szót. Előtte azonban meg kell ismerkedni egy a tizedes törteket más alapú számrendszerbe történő lehetséges átírási módszerrel. Tekintsük egy szám törtrészének a tizes számrendszerbeli felírását. A szám legyen alakú, ahol a törtrész egymást követő tizedesjegyei. Ha 10-zel szorzunk, akkor az első tizedesjegy kicsúszik az egészek helyére, amit levághatunk. További szorzásokkal a többi jegy is előjön egymás után. Ha minket egy b alapú számrendszerbeli felírás jegyei érdekelnek, akkor világos, hugy a 10 helyett b -vel kell szorozgatni. A tevékenység egy sémába foglalható, a számjegyek egyenes sorrendben keletkeznek:

K321,0 ccc K321 ,, ccc

b x ⎣ ⎦bxc ⋅=1 ( ) 1mod1 bxx ⋅=

⎣ ⎦bxc ⋅= 12 ( ) 1mod12 bxx ⋅= … … ⎣ ⎦bxc kk ⋅= −1 ( ) 1mod1 bxx kk ⋅= −

… … A visszaalakítás pedig történhet szintén egy Horneres séma szerint. Az szám értelmezése ugyanis

nccccx K321,0=

n

n bcbcbcbcx //// 33

221 ++++= K (19)

Ez úgy is számolható, hogy

( )( )( )( bcbcbcbcx nnn ////... 121 K )+++= −− (20) A séma kényelmes, felváltva kell számjegyenként osztást és összeadást végezni. 12. példa: Írjuk fel a 0,52734375-öt kettes (= bináris) számrendszerben és 16-os (= hexadecimális) számrendszerben. 2 0,52734375 16 0,52734375 Tehát 0,5273437510=0,100001112=0,8716

Page 11: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 11 -

1 0 0,4,0546875 8 375 0 0 7 0,0,109375 0 0,21875 0 0,4375 0 0,875 1 0,75 1 0,5 1 0,0 13. példa: Visszaírás tizes számrendszerre: 0,8716=0+((7)/16+8)/16=0,52734375

,5273437510=0+((((((((5)/10+7)/10+3)/10+4)/10+3)/10+7)/10+2)/10+5)/10

zek részét, ajd a törtrészt és a kettőt egy törtvesszővel elválasztva egymás mellé helyezzük.

4. példa: 2006,52734375 =11111010010,10000111 =7D6,87

0,100001112=0+((((((((1)/2+1)/2+0)/2+0)/2+0)/2+0)/2+1)/2 0 A tizedes törtek átalakításának van egy a számítógép oldaláról tekintve kellemetlen oldala. Az ugyanis, hogy ami véges tizedes tört az egyik alap mellett, az nem biztos, hogy szintén véges lesz a másik alap mellett. Például 0,110 binárisan végtelen sok törtjegyet tartalmaz. (Ellenőrizzük!) Tárolni viszont mindig csak véges sok bitet tudunk. Valahol a végtelen sorozatot el kell vágni. Ez azt jelenti, hogy az átalakított szám már nem fog megegyezni értékét tekintve az eredetivel. Tehát például, ha egy program bekér egy lebegőpontos számot és 0,1-et billenytűzünk be, akkor az kettes számrendszerbelivé átalakítva értékét tekintve nem fog megegyezni az eredeti tízes számrendszerbeli 0,1-gyel. Ha egy törtjegyeket tartalmazó számnak az egészek helyén álló része nem zérus, akkor először átalakítjuk az egésm 1 10 2 16 A szabvány szerinti lebegőpontos számábrázolás négy byte-on történik egyszeres pontosság esetén és nyolc byte-on dupla pontosság esetén. A kettő között eltérés igazán csak a pontosságban és az átfogott számtartományban van, az ábrázolás elve azonos. Tekintsük először a normalizált szám esetét. Legyen a szám nemzérus. Ekkor a binárisan felírt számot átalakítjuk olyan formára, hogy a törtvesszőt a legelső egyes jegyet közvetlenül követően helyezzük el és megjegyezzük, hogy ezen művelethez a törtvesszőt hány bitpozícióval kellett balra mozgatni. Ez a szám balra mozgásnál pozitív, jobbra mozgásnál negatív lesz és azt mutatja, hogy az átalakítás utáni számot a 2 milyen kitevőjű hatványával kell megszorozni, hogy a kiinduló számot megkapjuk. A törtvesszőt követő bitek sorozatának neve: szignifikáns. Ezen információkat kell elhelyeznünk a rendelkezésre álló négy illetve nyolc byte-on. A bitek iosztása az egyszeres pontosság esetén:

ő lb it ő ns 23 bit n

k

el je it k ev 8 biten szignifiká e

3. byte 0. byte 2. byte 1. byte

Egyszeres pontosságú lebegőpontos szám

ignifikáns (a vezető egyes nélkül, implicit egyes bit) kerül a hátramaradt 23 ites mezőbe.

Az előjelbit pozitív szám esetén zérus, negatív szám esetén 1. A kitevő részére fenntartott 8 bites mezőbe a kitevő 127-tel megnövelt (eltolt) értékét helyezzük el előjel nélküli egész számként. A szb 15. példa:Példa: 2006,52734375 hogyan néz ki egyszeres pontosságú lebegőpontos számként? A szám binárisan, ahogy már kiszámoltuk: 11111010010,100001112. Normalizált alakban: 1,111101001010000111 ahol a kitevő decimálisan 10. Ez eltolva 10+127=137=100010102. (Negatív kitevőt 8 biten kettes komplemens módon tárolunk, majd

Page 12: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 12 -

így adjuk hozzá a 127-et.) A szignifikáns 23 bitre zérusokkal kiegészítve: 11110100101000011100000. Végül a 32 bit 0100 0101 0111 1010 0101 0000 1110 0000, agy hexadecimálisan 45 7A 50 E0. v

A szám ebben a formában történő ábrázolása csak akkor megengedett, ha az eltolt kitevő nem zérus és nem 255. Ez a két szélső eset más célra van fenntartva. A tiszta zérus biteket tartalmazó kitevő mező és a zérus szignifikáns együtt zérusként van definiálva. Van pozitív zérus és negatív zérus az előjeltől függően, de valójában a processzor ezeket azonosként kezeli. Ha a kitevő mező zérus, de a szignifikáns mező nem zérus, akkor nem normalizált (denormalizált) lebegőpontos számról beszélünk. Ekkor az implicit egyes bit is tárolásra kerül, mint a szignifikáns része, mivel ő a törtvessző mögé kerül. Denormalizált tárolásnál komoly jegyveszteségre lehet számítani! Például a 2-126 még normalizált módon tárolódik, de a tőle kisebb kitevőjűeknél már az eddig elhagyott egyes bitet is tároljuk. Az alábbi táblázat

lusztrál néhány esetet.

By n

il

Szám Byte-ok binárisan te-ok hexába2-126 0000 0000 1000 0000 0000 0000 0000 0000 00 80 00 00 2-127 0000 0000 0100 0000 0000 0000 0000 0000 00 40 00 00 2 0000 0000 0010 0000 0000 0000 0000 0000 00 20 00 00 -128

… … … 2-149 0000 0000 0000 0000 0000 0000 0000 0001 00 00 00 01

A kitevő mező legmagasabb értékéhez szintén két eset tartozik. Ha a szignifikáns mező zérus, kkor a tárolt információ előjeles végtelenként van definiálva.

Szim um Byte-ok hexában

a

ból Byte-ok binárisan +∞ 0111 1111 1000 0000 0000 0000 0000 0000 7F 80 00 00 -∞ 1111 1111 1000 0000 0000 0000 0000 0000 FF 80 00 00

A végtelen kezelése során a processzor a végtelennel végezhető műveletek tulajdonságait megtartja. Például végtelen plusz véges eredménye végtelen, vagy véges osztva végtelennel zérust ad. Ha a szignifikáns rész nem zérus, akkor ezt a szituációt nem számként definiálták

aN=Not a Number).

Szi m

(N

mbólu Byte-ok binárisan NaN 0111 1111 1xxx xxxx xxxx xxxx xxxx xxxx NaN 1111 1111 1xxx xxxx xxxx xxxx xxxx xxxx

A sémában az x-szel jelölt bitek nem lehetnek egyszerre mind zérusok. Ilyen eset (NaN) lehet például a végtelen osztva végtelennel művelet eredménye. Azok a számok, értékek, állapotok, amelyek a fenti sémába nem férnek bele, nem ábrázolhatók, velük közvetlen módon számolni em tudunk.

rus és az 2047. gy táblázatban mellékeljük a lebegőpontos aritmetika lehetőségeit, korlátait:

ők Egyszeres pontosság Dupla pontosság

n A dupla pontosságú esetben a nyolc byte-ban a kitevő mező 11 bites, a szignifikáns mező 52 bites. A kitevő eltolás mértéke 1023. A kitevő mező két kitüntetett értéke a zéE

JellemzElőjelbitek száma 1 1 Kitevő bitek száma 8 11 Törtrész bitek száma 23 52

Page 13: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 13 -

Összes bitek száma 32 64 Kitevő ábrázolása 127-es eltolás 1023-as eltolás Kitevő tartománya -126 - +127 -1022 - +1023 Legkisebb normalizált szám 2-126 2-1022

Legnagyobb normalizált szám kb. 2128 kb. 21024

Decimális számtartomány kb 38 kb. 308. 10-38 - 10 10-308 - 10Legkisebb nem normalizált szám kb. 10-45 kb. 10-324

A memória kiválóan alkalmas olyan matematikai objektumok tárolására, mint a vektor vagy a mátrix. Ahogyan a vektor koordinátáit egymást követően soroljuk fel, úgy ezeket a számokat a memóriában is tárolhatjuk azonos tulajdonságú egymást követő rekeszekben. A vektor minket érdeklő koordinátájára az indexe alapján hívatkozunk. Az index és a vektor kezdő elemének címe alapján a keresett indexű elem címe meghatározható. Ha a a vektor kezdőcíme, a keresett elem indexe és h a rekeszméret byte-ban, akkor a keresett elem címe

k

( ) hka ⋅−+ 1 . (21) Itt hallgatólagosan feltettük, hogy a kezdőelem indexe 1. Mátrixokat úgy szokás tárolni, hogy vagy a sorait (sorfolytonos tárolási mód), vagy az oszlopait (oszlopfolytonos tárolási mód) helyezzük egymás után. Legyen a mátrix mérete m×n (m sor és n oszlop) és az (1,1) indexű elem (bal-felső sarokelem) címe legyen a. Sorfolytonos tárolási módot választva ekkor az (i,j)

dexű elem címe a memóriában in

( )[ ] hjnia ⋅−+⋅−+ 11 . (22)

gyanez oszlopfolytonos tárolási mód mellett:

U

( )[ ] himja ⋅−+⋅−+ 11 . (23) A számítógépes programozás területéről több fogalomra lesz szükségünk annak ellenére, hogy igazán egyetlen programozási nyelv mellett sem kötelezzük el magunkat. A számításaink, adatokon végzett tevékenységeink elvégzéséhez gépi utasítások, parancsok sorozatára lesz szükségünk. Ezeket összefogva programnak fogjuk nevezni. A programot valamilyen magas szintű programozási nyelven (az ember gondolkodásmódjához közel álló nyelven) írjuk meg, majd azt a gép nyelvére egy fordítóprogram (compiler) segítségével fordítjuk le (remélhetően jól). Ha van interpreter program, akkor azzal is megoldható a feladatvégzésnek a gépre történő átvitele. A programok általában procedúrák (eljárások) sokaságát tartalmazzák. Ezek a zárt programegységek egy-egy kisebb feladat elvégzésére specializáltak. A program többi részével csak a paramétereik révén tartják a kapcsolatot. Fekete doboznak kell őket tekintenünk. A dobozra rá van írva, hogy miből mit csinál. Vannak (lehetnek) bemenő (input) és vannak (lehetnek) kimenő (output) paraméterei. A bemenetet alakítják át a kimenetté. Ha ismerjük a procedúra belső szerkezetét ⎯ mert mondjuk mi készítettük ⎯, akkor fehér doboz a neve, ha nem ismerjük ⎯ mert nem vagyunk kíváncsiak rá, vagy másoktól kaptuk ⎯, akkor fekete doboz szerkezet a neve. Például készíthetünk olyan procedúrát, amely bekéri (input) az a, b, c három valós számot, melyeket egy ax2+bx+c kifejezés (itt x valós szám, változó) konstans együtthatóinak tekint, majd eredményül (output) meghatározza a kifejezés valós gyökeinek a számát és ha van(nak) gyök(ök) , akkor az(oka)t is megadja. Példa egy lehetséges másik procedúrára: egy file nevének ismeretében a procedúra a file rekordjait valamilyen szempont szerint megfelelő sorrendbe rakja (rendezi). A procedúrák által használt memóriarekeszek ⎯ a paramétereket kivéve ⎯ a zártságnak köszönhetően lokálisak a procedúrára nézve. Csak addig foglaltak, míg a procedúra dolgozik, aktív. A procedúrát

Page 14: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 14 -

munkára fogni az aktivizáló utasítással lehet. Ezt eljáráshívásnak is nevezik. Az aktivizált procedúra lehet saját maga az aktivizáló is, ekkor rekurzív hívásról beszélünk, a procedúrát pedig rekurzív procedúrának nevezzük. A procedúra munkája végén a vezérlés visszaadódik az aktivizáló utasítást követő utasításra. Ezt a mechanizmust a verem (stack) révén valósítjuk meg. A verem a memória egy erre a célra kiválasztott része. A procedúra aktivizálásakor ide kerülnek beírásra a procedúra paraméterei és a visszatérési cím (az aktivizáló utasítást követő utasítás címe). A procedúrából való visszatéréskor ezen cím és információk alapján tudjuk folytatni a munkát, a programot. A visszatéréskor a veremből az aktivizálási információk törlődnek. Ha a procedúra aktivizál egy másik procedúrát, akkor a verembe a korábbiakat követően az új aktivizálási információk is bekerülnek, azt mondjuk, hogy a verem mélyül. A veremmélység szintszáma eggyel nő. Kezdetben a verem üres, a szintszám zérus, procedúrahíváskor a szintszám nő eggyel, visszatéréskor csökken eggyel. A dolog pikantériájához tartozik, hogy a procedúra a lokális változóit is a verembe szokta helyezni, csak ezt közvetlenül nem érzékeljük, mivel a visszatéréskor ezek onnan törlődnek, a helyük felszabadul. Időnként azonban a hatás sajnálatosan látványos, amikor verem túlcsordulás (stack overflow) miatt hibajelzést kapunk és a program futása, a feladat megoldásának menete megszakad. Adódhat azonban úgy is, hogy mindenféle hibajelzés nélkül „lefagy a gép”. A eremnek a valóságban van egy felső mérethatára, amelyet nagyon nem tanácsos túllépni.

Tegyük fel, hogy van még olyan elvetem

v Nézzünk egy példát a veremhasználatra. ült

informatikus, aki nem tudja, hogy ( )2

321 1+⋅=++++

nn

zek után a kósza meggondolások után gy kissé rendezettebb alakban is írjuk le a teendőket.

A Summa procedúra leírása

sszefoglaló adatok a procedúráról:

zeadást elvégezni.r:

Lokális változó k, számláló, amely egytől elszámol n-ig egyesével.

procedúra tevékenysége:

-t és az eredmény s-ben marad.

5. lépés: en, a végértéken. pésnél.

nK , és ezért egy kis procedúrát ír

ennek kiszámítására. Amennyiben az illető a fent említett hibája mellett teljesen normális, akkor igen nagy eséllyel az alábbi módon oldja meg a problémát. A procedúra neve legyen Summa és legyen egy paramétere az n, hogy 1-től kezdve meddig történjen az összeadás. Feltételezzük a procedúra jóhiszemű használatát és így az n pozitív egész szám kell legyen. (Nem írjuk meg a procedúrát első lépésben még „bolondbiztosra”.) Kirészletezzük egy kissé a procedúra teendőit. Szükség lesz egy gyűjtőrekeszre, ahol az összeget fogjuk tárolni és képezni. Legyen ennek a neve s. A procedúra munkájának végén ez lesz a végeredmény, ezt kapjuk vissza, ez lesz a procedúra output paramétere. Szükség lesz továbbá egy számlálóra, legyen a neve k, amellyel egytől egyesével elszámolunk n-ig és minden egyes értékét az s-hez a számlálás közben hozzáadjuk. Az s-et a munka kezdetén természetesen ki kell nullázni, hiszen nem tudjuk, hogy mi van benne az induláskor. Ee

Ö

A procedúra neve: Summa. Bemenő paraméter: n, megadja, hogy meddig kell az össKijövő paraméte s, tartalmazza az összeget a végén.

A

1. lépés: s kinullázása 2. lépés: k beállítása 1-re, innen indul a számlálás 3. lépés: s megnövelése k-val (s-hez hozzáadjuk a k4. lépés: eggyel megnöveljük a k számláló értékét

Ellenőrizzük, hogy a k számláló nem lépett-e túl az n-nHa még nem, akkor folytatjuk a munkát a 3. lé

Page 15: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 15 -

Ha igen, akkor pedig a 6. lépéshez megyünk. 6. lépés: Készen vagyunk, az eredmény az s-ben található.

. lezhetjük ezt formálisan mondjuk egy STOP-pal. Valahogy így néz ki a verem formálisan:

5 s címe STOP

Ezután ha szükségünk van, mondjuk, 1-től 5-ig a számok összegére, akkor csak leírjuk, hogy Summa(Input:5, Output s). Esetleg függvényes alakot használva az s=Summa(5) is írható. Az aktivizálás hatására a verembe bekerül az 5-ös szám, valamint az s rekesz memóriabeli címe és a visszatérési cím, hogy a procedúra munkája után hol kell folytatni a tevékenységet. Miután most nincs több teendő, ezért ez a cím olyan lesz, amelyből ez a tény kiderülJe

Kezdetben üres volt a verem, most egy szint került bele bejegyzésre. Amikor a procedúra munkája véget ér, akkor ez a bejegyzés a veremből törlődik, így az újra üres lesz. (Tulajdonképpen a számláló számára lefoglalt helyet is fel kellett volna tüntetni a bejegyzésben, de ez a számunkra most nem fontos.)

ber egy ggvényt alkot, mondjuk RekurzívSumma néven, és az alábbi módon definiálja azt:

(24)

a most leirjuk, hogy s=RekurzívSumma(5), akkor ezt úgy kell kiszámolni, hogy:

=RekurzívSumma(5)

a(1)+2)+3)+4)+5 5

+5 5

5 =15

ul a verem története. A RekurzívSumma(5) hatására az üres erembe egy bejegyzés kerül:

5 eredmény Az eredmény s-be írási címe

Minden nagyon szép, minden nagyon jó, mindennel meg vagyunk elégedve, és akkor jön egy rekurzióval megfertőzött agyú ember, aki így gondolkodik. Egytől n-ig összeadni a számokat az ugyanaz, mint az egytől n-1-ig összeadott számok összegéhez az n-et hozzáadni. A feladatot visszavezettük saját magára, csak kisebb méretben. Egytől n-1-ig persze megint úgy adunk össze, hogy az n-2-ig képezett összeghez adjuk az n-1-et. Ez a rekurzió. Arra kell vigyázni, hogy valahol ennek a visszavezetésnek véget kell vetni. Amikor már csak egytől egyig kell az összeget képezni, akkor azt már nem vezetjük vissza tovább, hanem ott már tudjuk az eredményt, hiszen az triviálisan éppen egy. Tehát a rekurzív agyú emfü

( ) ( )⎩⎨⎧

>+−=

=1,11,1

nhannakurzívSummeRnha

nakurzívSummeR

H

s = RekurzívSumma(4)+5 =(RekurzívSumma(3)+4)+5 =((RekurzívSumma(2)+3)+4)+5 =(((RekurzívSumm =((1+2)+3)+4)+ =((3+3)+4) =(6+4)+ =10+

Lássuk ezekután hogyan alakv

A továbbiakban pedig a verem az egyes rekurzív hívások hatására a következőképpen alakul:

írási címe RekurzívSumma(5): 5 eredmény Az eredmény s-beRekurzívSumma(4): 4 eredmény Összeadás helye

Page 16: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 16 -

RekurzívSumma(3): 3 eredmény Összeadás helye RekurzívSumma(2): 2 eredmény Összeadás helye RekurzívSumma(1): 1 eredmény Összeadás helye

Itt a rekurzió megakad, további rekurzív hívás már nem lesz, a végleges veremmélység 5, a rekurzív hívások száma 4 (a legelső aktivizálás még nem rekurzív hívás). A legutolsó hívás

ár tud számolni, és az eredmény 1 lesz, ami a veremben meg is jelenik:

írási címe

m

RekurzívSumma(5): 5 eredmény Az eredmény s-beRekurzívSumma(4): 4 eredmény Összeadás helye RekurzívSumma(3): 3 eredmény Összeadás helye RekurzívSumma(2): 2 eredmény Összeadás helye RekurzívSumma(1): 1 1 Összeadás helye

Ezután az utolsó előtti hívásbeli összeadás (1+2) elvégezhető, a hívás befejeződik és a veremből a legutolsó bejegyzés törlődik. A továbbiakban rendre az alábbi veremállapotok llnak elő:

írási címe

á

RekurzívSumma(5): 5 eredmény Az eredmény s-beRekurzívSumma(4): 4 eredmény Összeadás helye RekurzívSumma(3): 3 eredmény Összeadás helye RekurzívSumma(2): Összeadás helye 2 3 RekurzívSumma(5): 5 eredmény Az eredmény s-be írási címe RekurzívSumma(4): 4 eredmény Összeadás helye RekurzívSumma(3): Összeadás helye 3 6 RekurzívSumma(5): 5 eredmény írási címe Az eredmény s-beRekurzívSumma(4): 0 sszeadás helye 4 1 Ö RekurzívSumma(5): 5 15 Az eredmény s-be írási címe

Innen a visszatérés az értékadáshoz, az s-be történő eredmény elhelyezéshez történik, miáltal a verem kiürül. Az elmondottak alapján látszik, hogy a feladat elvégzéséhez szükséges

aximális veremmélység 5 és összesen 4 rekurzív hívás történt.

i fenti problémánk esetében : RekSum(1;5) számolandó. Az ő definíciója így néz ki:

m Itt akár fel is lélegezhetnénk, de ekkor egy újabb, még súlyosabb állapotban lévő fazon jelenik meg, aki azt mondja, hogy lehet ezt még szebben is csinálni. Ő a rekurziót arra építi, hogy az összeg képezhető úgy is, hogy az összeadandó számok halmaza első felének összegéhez hozzáadja a halmaz második felének összegét. A felezést további felezéssel számolja, mígcsak az aprózódás révén el nem jut egytagú ősszegekig. Röviden és tömören ő egy másik függvényt definiál, amely kétváltozós, neve RekSum(m,n), és m-től n-ig adja össze a számokat. Ezzel az általánosabb függvénnyel egytől n-ig összeadni RekSum(1,n)-nel lehet. Speciálisan am

( )⎪⎩

⎪⎨⎧

<⎟⎟⎠

⎞⎜⎜⎝

⎛+⎥⎦

⎥⎢⎣⎢ +

+⎟⎟⎠

⎞⎜⎜⎝

⎛⎥⎦⎥

⎢⎣⎢ +

== nmhannmkSumeRnmmkSumeR

nmhamnmkSumeR ,,1

22,

,, (25)

hogyan is számol ez a ravasz mődszer a mi speciális s=RekSum(1;5) setünkben?

Nézzük csake

Page 17: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 17 -

=RekSum(1;5)

+ RekSum(5;5))(2;2)) + 3) + (4 + 5))

+ 5)) (4 + 5)

9) =15

ogyan alakul a verem sorsa ebben az esetben? Az első aktivizáló hívás után a verem:

1 5 eredmény Az eredmény s-be írási címe

s =RekSum(1;3) + RekSum(4;5) =(RekSum(1;2) + RekSum(3;3)) + (RekSum(4;4) =((RekSum(1;1) + RekSum =((1 + 2) + 3) + (4 =(3 + 3) + =(6 +

H

Ezután következik a RekSum(1;3) hívás. A hatása:

s-be írási címe 1 5 eredmény Az eredmény 1 3 eredmény Összeadásjel

Most jön a RekSum(1;2) hívás a RekSum(1;3)-on belül. A hatás:

s-be írási címe 1 5 eredmény Az eredmény 1 3 eredmény Összeadásjel 1 2 eredmény Összeadásjel

Ez megint nem számolható közvetlenül, tehát jön a RekSum(1;1), mire a verem új képe:

s-be írási címe 1 5 eredmény Az eredmény 1 3 eredmény Összeadásjel 1 2 eredmény Összeadásjel 1 1 eredmény Összeadásjel

Itt már van eredmény, átmenetileg nincs több rekurzív hívás. Az eredmény 1.

s-be írási címe 1 5 eredmény Az eredmény 1 3 eredmény Összeadásjel 1 2 eredmény Összeadásjel 1 1 1 Összeadásjel

A hívás befejezte után a veremből kiürül a legutolsó bejegyzés, visszatérünk az összeadásjelhez, amely után azonban egy újabb rekurzív hívás keletkezik, a RekSum(2;2).

atására a verem képe:

s-be írási címe

h

1 5 eredmény Az eredmény 1 3 eredmény Összeadásjel 1 2 eredmény Összeadásjel 2 2 eredmény Összeadás befejezése

Az innen történő visszatérés után a verem képe:

s-be írási címe 1 5 eredmény Az eredmény 1 3 eredmény Összeadásjel

Page 18: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 18 -

1 2 3 Összeadásjel Az összeadás elvégzéséhez itt azonban egy újabb rekurzív hívás szükséges, a RekSum(3;3).

s-be írási címe 1 5 eredmény Az eredmény 1 3 eredmény Összeadásjel 3 3 eredmény Összeadás befejezése

Innen

dmény s-be írási címe 1 5 ere Az eredmény 1 3 6 Összeadásjel

következik, majd pedig egy újabb hívás, a RekSum(4;5). A veremállapot:

s-be írási címe 1 5 eredmény Az eredmény 4 5 eredmény Összeadásjel

Újabb hívás szükséges a RekSum(4;4). A veremállapot:

e írási címe 1 5 eredmény Az eredmény s-b4 5 eredmény Összeadás vége 4 4 eredmény Összeadásjel

Ennek befejezte után és a veremből történő törlést követően még kell egy hívásnak lennie, ez

edig a RekSum(4;4). A veremállapot:

e írási címe

p

1 5 eredmény Az eredmény s-b4 5 eredmény Összeadás vége 5 5 eredmény Összeadás vége

Innentől kezdve a verem már csak ürül, további rekurzív hívásokra nincs szükség. A feladat elvégzéséhez kevesebb szintből álló verem is elég volt, mint az előző esetben, most a maximális veremmélység csak 4 volt. A rekurzív hívások száma azonban megnőtt, összesen nyolc rekurzív hívás volt. Ebben a rekurzióban minden hívás, kivéve a legalsóbb szinten levőket két újabbat eredményezett, de ezek a veremnek ugyanazon szintjét használták. A hívások szerkezetét egy úgynevezett hívási fa sémával tudjuk ábrázolni, melyben csak a

araméter értékeket tüntetjük fel. Íme: p

Page 19: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 19 -

Az ábrán jól látszik a verem négy szintje. A legfelső szint kivételével a többi szinten lévő hívások rekurzívak. Az azonos szinten lévő hívások a verem azonos szintjét használják csak eltérő időben.

Ezen tömör összefoglaló után egy pár szót é oritmusok

májának a helyéről az informatikában. Egy informatikai alkalmazási rendszer kifejlesztése

(1,1)

(1,2) (3,3)

(1,3)

(4,4) (5,5)

(4,5)

(2,2)

A rgyról

rdemes szólni az adatstruktúrák, algtésorán három fő szintet szokás megkülönböztetni., amit egy helyjegyfoglalási rendszer példájával illusztrálunk. Mondjuk az InterCity vonatjáratra akarunk helyjegyet venni. Sematikusan az alábbi táblázattal lehetne jellemezni a három fő szintet. A középső szint az, amivel a jelen könyvben foglalkozunk.

A szint neve A szint jellemzése A szint fogalomrendszere Felső szint Alkalmazói szint,

modellalkotás útvonalak, szerelvények, dátumok, helyfoglalások

Középső szint Modellezési szint,algoritmizálás

file-ok, táblázatok, listák, adatrekordok, stringek, fák

Alsó szint Csupasz gépszint objektumok, műveletek, gépi reprezentálásuk, bitek, byte-ok

A felső szint az alkalmazó területe. Ő tudja, neki van meg, hogy milyen útvonalakon, mely napokon közlekedtet szerelvényeket, és milyen ezen szerelvények összetétele a helyfoglalás szempontjából. A helyfoglalási rendszer kereteit neki kell kijelölni, ő kell, hogy megmondja, hogy mi a fontos a rendszerében, mi az el nem hagyható tény és mi az ami elhanyagolható. Tudjon-e majd a rendszer mondjuk olyan igényt is kielégíteni, hogy ablaknál akar ülni az utas de csak a menetiránnyal azonos irányban, ne háttal. Az alkalmazó a valóságnak egy modelljéhez a kereteket alkotja meg. A későbbi üzemelő rendszer paramétereit, képességeit,

galmasságát és használhatóságát ez a szint döntően meghatározza. A középső szinten a

anszformáltuk bitekké és byte-okká, hogy ezek majd akár a legfelső szint fogalomrendszere alapján is értelmezhetők legyenek. Nem kevésbé fontos az esetleg egymástól térben és időben is nagy távolságra lévő es k kö i le e e és milyensége.

rumodell gyakorlati megvalósítása következik, amely már az egyes adatkezelési, számítási, tárolási módszereket is magába foglalja. Itt tisztázódik a file-ok rendszere. Rögzítik a használandó táblázatokat, listákat és azok szerkezetét, az adatrekordok felépítését. Az egyes esetekben használt keresési módszerek, az adatmódosítások módszerei is kialakításra kerülnek, miután eldöntötték, hogy mit és hogyan tárolnak. Az alsó szint a gépek, berendezések szintje, amelyek fizikailag meg is tudják valósítani, amit a középső szinten elterveztek. Ezen a szinten nincs modell, nincs szerelvény, dátum, útvonal. Az adatok, a tárolási szerkezetek és a rajtuk végzett műveletsorok bitek és byte-ok özöneként és átalakításaiként jelennek meg. Itt már minden a biteken, a byte-okon múlik. Azon, hogy az egyes adatainkat milyen elvek alapján tr

zközö zött a kommun káció hetőség , tény

(1,5)

Page 20: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 20 -

Tekintsünk most egy elem lémát egoldásait. Legyen adott egy n fős társaság. Az egyes tagok időnként pénzt kérnek kölcsön egymástól. Mindenki felírja, hogy kitől mennyit kért kölcsön, amikor kölcsönkér és ki k me yit a t köl n, amikor kölcsön ad. A társaság tagjai időről-idő szejön k az zegy tarto oka egyenlíteni. Mindenki

sszegyűjti a saját listáján mindenkivel kapcsolatban, hogy kinek mennyivel tartozik. Ezután

i prob és annak m

ne nn dot csöre ös ne öss űlt zás t ki

önémi kavarodást okozva mindenki megkeres mindenkit, hogy kifizesse a tartozását, ami nem kis időbe telik, ha a társaság létszáma nem lebecsülendő. Ha összegyűjtenénk egy táblázatba a tartozik-követel összesítéseket, akkor egy ilyen tábla valahogy így nézhetne ki mondjuk 5 személy esetén, akiket rendre Aladárnak, Bélának, Cecilnek, Dávidnak és Edének-nek hívnak.

Kinek Tartozik tábla Aladár Béla Cecil Dávid Ede

Aladár − 5 3 1 2 Béla 1 − 2 3 4 Cecil 5 1 − 1 2 Dávid 2 3 4 − 6

Ki

Ede 5 5 1 4 − Ha ennél a táblánál maradunk, akkor ennek tárolására n fő esetén n×n-n rekesz szükséges, miután mi gyűjtötte a saját nyilvántartásából a többiekkel kapcsolatos meglévő tartozását. A kölcsönök kiegyenlítésére pedig )/ á zót k , ahol a két fél kölcsönösen kiegyenlíti az egy beni adósságát. Min szerepel egy négyzetes tag, ami ar utal, y h társa mé e d vele kapc rvezé és tá ási m nka egyaránt körülbelül 100-szorosra emelkedik. Nem éppen bíztató következtetés. Van azon job m o . m k minden alkalomm l m kinek ljegy i, h y kit mennyit kért, vagy kinek mennyit adott. Elegendő ha denki eg n ot tárol és azt módosítja kölcsönzés esetén, ez

edig az é pen tuális ö artoz rekesz és a kigyűjtés

ndenki kin×(n-1 2 tal lko ell létrehozni

mással szem d a két formulábanra hog a a ság ret mon juk 10-szeresre nő, akkor a

solatos sze si rol uban b eg ldás is Ne ell

a inden fe ezn og ől , p

min ak

csaksszt

yetleása a többiek felé. Ennek a tárigénye

számp nsem szükséges. A fenti táblázatból ez a következő módon kapható meg. A sorokban is és az oszlopokban is képezzük az összegeket, majd mindenkinél kivonjuk a tartozásból (sorösszeg) a követel (oszlopösszeg) értékeket:

Kinek Tartozik Tábla Aladár Béla Cecil Dávid Ede ∑ Össztartozás

Aladár − 5 3 1 2 11 11 - 13 = -2 Béla 1 − 2 3 4 10 10 - 14 = -4 Ki Cecil 5 1 − 1 2 9 9 - 10 = -1 Dávid 2 3 4 − 6 15 15 - 9 = 6 Ede 5 5 1 4 − 15 15 - 14 = 1 ∑ 13 14 10 9 14

Tárolni csak az össztartozás oszlopot kell, ami n szám. A tartozások kiegyenlítéséhez

ükséges találkozók száma is drasztikusan csökkenthető. A példánál maradva Aladárnak tartoznak 2-vel, ezt Béla megadja Alad Bélának tartoznak 6-tal, azt Cecil adja

eg Bélának. Cecilnek tartoznak 7-tel, amit megad neki Dávid, igy Dávidnak lesz 1 hiánya, i fő van, akkor a szükséges találkozók száma

legfeljebb n-1. Ennél a megoldásnál nem árt, ha Béla és Cecil rendelkeznek némi plusz pénzzel, hogy fizetni tudjanak az elején. Ez elkerülhető azzal, hogy akik tartoznak (Dávid és Ede), azok mindegyike mondjuk Aladárnak adja oda a tartozását és ebből a pénzből Aladár egyenlíti ki a hiányt azoknál, akik pénzre várnak Aladár, Béla, Cecil). Itt tehát ha a méretek 10-szeresre nőnek, akkor a tárolás és a tartozás kiegyenlítéssel kapcsolatos szervezési munka

szárnak. Mostmár

mam t pedig Ede éppen meg tud adni. Ha n

(

Page 21: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 21 -

is csak körülbelül 10-szeresre fog nőni. Érdemes tehát azon elgondolkodni, hogy milyen adatokat milyen formában tárolunk, azokon milyen műveleteket végzünk, hogy a kívánt ered nyre jussunk és az a lehető legkisebb erőforrás lekötéssel és energia felhasználásával valósuljon meg.

FELADATOK

onyítsuk be teljes indukcióval, hogy:

Biz

a. ( )2

1321 +⋅=++++

kkkK

b. ( ) ( )

6121321 2222 +⋅+⋅

=++++kkkkK

c.

1.

( )23333 321321 kk ++++=++++ KK d. 1222221 132 −=+++++ − kkK

e. ( ) 113221

1 n11

f.

+=

+⋅++

⋅+

⋅ nnnK

nn

nn 232132 2

22222

+−= ++++ K

g.

( )( )2

112 1321 nqqq n −=++++ −K

11

qnqqn n

−++ +

h. ( )( )( ) ( )

qq

n

−+

112

qqq−

=−−−− 1111 42 K

i.

qn2

1

( ) ( )( )( )3

3211231 222 21 +++=+++

nnnK

j. )

+n

( ) ( ( )14211231 2333 +++=+++ nnnK

k. ≥+ 11 , és pozitív egé m2. Hol van a logikai hiba a lovak színér szóló tét bizon ításáb3. a. Bizonyítsuk be az alsó és felső eg szrész fü vény nek a

5- tulajdonságait!

2n+ ( ) naa n + ha 1−>a n sz szá .

ől el y an? é gg ek szövegben összefoglalt 1.-

4. Töltsük ki az alábbi táblázatot!

Számrendszer alapszáma és a szám 2 3 8 0 16 36 1 12

10101110 120120 5 7 1234 6 1973 1234 9AB XYZ

5. Töl

ám n er p m s zá

tsük ki az alábbi táblázatot!

Sz re dsz ala szá a é a s m 2 3 8 10 12 16 36

Page 22: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 22 -

101110,111 120,111 4567,111 973,111 , 234 111 AB,111 YZ,111

6. a. T b ázatot!

0 01 12 1 20 0 35 62 80 81 A0 E9 FF

öltsük ki az alábbi tá l

Byte hexában 0 3 3Előjel nélküli egész Előjeles egész ASCII karakter

b. Töltsük ki az alábbi táblázatot! Szó hexában 00 01 12 13 FF 20 30 35 A0 80 81 E9Előjel nélküli egész INTEL

Előjeles egész INTEL

Előjel nélküli ea

gész Motorol

Előjeles egész Motorola

ASCII karakterek

c. Töltsük ki az alábbi táb ázatot!

0 01 12 13 0 30 35 A0 0 81 E9 FF

l

Duplaszó hexában 0 2 8Előjel nélküli egész INTEL Előjeles egész INTEL

Lebegőpontos INTEL

Előjel nélküli egész Motorola

Előjeles egész Motorola Lebegőpontos Motorola

ASCII karakterek Egy millió bitet akarunk elhelyezni a memóriában egymást követő byte-okon. Hány byte-nak foglaljunk helyet? Hány szónak? Hány dupla szónak? Hány quadr-nak (dupla duplaszó)? Adott egy tömb a m n, melyne

7. a.

b. emóriába k elemei 80 byte-osak. A 32. tömbelem 17.

Page 23: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 23 -

byte-jának 6-os bitje hanyadik bit lesz a tömb elejétől számítva. (Ebben a feladatban a

ulát ha az elemek m byte-osak, a elül a bitindex k!

átrixot tárol. Alsó háromszög mátrixnak

nem tároljuk, hiszen tudjuk, hogy azok zérusok. Adjon formulát az elem

tömbelemeket is és a tömbelemeken belül a byte-okat is egytől indítva számláljuk balról-jobbra, a bitindex szokványos.) Adjon formtömbelem indexe i, az elemen belüli byte index j, és a byte-on b

c. Adott egy előjel nélküli egész számokat tároló, duplaszavas elemekből álló tömb a memóriában, amely egy alsó háromszög mnevezzük azt a négyzetes mátrixot, amelynek a fődiagonálisa feletti elemei garantáltan zérusok. A mátrixot sorfolytonosan tároljuk. A fődiagonális feletti elemeket ij

kezdő byte-ja tömbkezdethez képest relatív indexének kiszámítására! A relatív indexeket zérustól kezdve számláljuk. Ha a tömbelem nincs tárolva, az index legyen negatív (mondjuk -1). Feltételezzük, hogy az

a

( )ji, indexpár az nn× -es tömb valódi elemére mutat, azaz nji ≤≤ ,1 teljesül. Az előző feladatot oldjuk meg oszlopfolytonos tárolás esetére! A c. feladatban szereplő mátrix legyen felső háromszög mátrix, azaz olyan négyzetes mátrix, amelynek a főátlója alatti elemek zérusok!

d. e.

uk meg

h.

i.

j.

f. g.

Az előző feladatot oldj oszlopfolytonos tárolás esetére! A c. feladatban szereplő mátrix legyen diagonális mátrix, azaz olyan mátrix, amelynek a főátlón kívüli elemei zérusok! A c. feladatban szereplő mátrix legyen tridiagonális mátrix, azaz olyan mátrix, amelynek a főátlón és a kétoldalról hozzá csatlakozó két mellékátlón kívüli elemei zérusok! A h. feladatban szereplő tridiagonális mátrixot ne sor vagy oszlopfolytonosan tároljuk, hanem először a főátló elemeit, majd a felső mellékátló elemeit és azt követően az alsó mellékátló elemeit rakjuk le egymást követóen a bal felső végükön kezdve. A c. feladatban szereplő mátrix legyen szimmetrikus mátrix, azaz olyan mátrix, amelynél az ( )ji, indexű elem megegyezik a ( )ij, indexűvel! (Csak az alsó háromszög részt tároljuk! Hogyan változik a formula, ha csak a felső háromszög részt tároljuk?) Legyen adott egy nm × -es mátrix számára lefoglalt terület. A mátrixot sorfolytonosan tároljuk. E

k. nnek a mátrixnak a bal felső sarkában van egy lk × -es

méretű részmátrix. A részmátrix sorainak tárolása során a memóriában minden két sor között rekeszek maradnak ki, mert a terület egy nagyobb mátrix számára lett

mátrix korábbi területének a at, más

l. z elő ak a problémáját! Legyen a memóriában elhelyezve egy -es mátrix sorfolytonosan és hézagmentesen. Bővítsük ki a mátrix által elfoglalt te tet egy

lefoglalva. Adjunk módszert a részmátrix elemeinek az eredeti mátrix területe elejéhez történő feltömörítésére úgy, hogy a részmátrix elemek sorfolytonosan, hézagmentesen helyezkedjenek el és ezáltal az eredeti vége felszabadulh célra használható legyen. Oldjuk meg a ző feladat megfordításán

lk ×rüle nm × -es mátrix számára me ő méretű területté!. Ezek

után szeretnénk az eredeti mátrixunkat az új mátrix bal felső sarkában lévő részmátrixnak tekinteni. Hogyan kellene az elemeket átmozgatni ezen célból?

8. a. definiá

amely a feladat elvégzéséhez

gfelel

Az n! (n faktoriális) fogalmát pozitív egész számokra az alábbi rekurzív formulával ljuk:

( )⎩⎨⎧

>−⋅=

=1,!11,1

!nhannnha

n

Procedúrahívással kiszámítottuk a 7! értékét. Hogyan alakult a verem felépítése, mélysége? Mekkora a minimális méretű verem, szükséges? Hány rekurzív hívás volt a számolás során?

Page 24: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 24 -

b. , fü ra va fenn kell, hogy álljon.

Definiáljunk egy P ggvényt, amely pozitív egész m és n argumentumok n definiálva és nm ≤

( )nm

( )⎪⎩

⎪⎨⎧

⎟⎠

⎜⎝ ⎥⎦⎢⎣⎟

⎠⎥⎦⎢⎣

= nmha

22

( )nP ,1 paraméterezéssel. Procedúrahívással számíttassuk ki a 7! számot! Hogyan s méretű verem, amely a

≠⎟⎞

⎜⎛

+⎥⎢ +⋅⎟⎞

⎜⎜⎝

⎛ ⎥⎢ += nmhannmPnmmP

mnmP ,,1,

,,

Világos (de azért lássuk is be), hogy n! ezzel a függvénnyel kiszámítható a

A binomiális együttható szimbólum definíciója:

alakul a verem felépítése, mélysége? Mekkora a minimálifeladat elvégzéséhez szükséges? Hány rekurzív hívás lesz a számolás során?

c.

( )!!!

knkn

kn def⎞⎛

−⋅=⎟⎟

⎠⎜⎜⎝

. A szimbólum

kiolvasása „n alatt a k”. A szimbólumot nemnegativ egész n és k értékekre

⎝rozzuk meg ⎜⎜

⎝3 értékét rekurzívan!

Hogyan alakul a verem felépítése, mélysége? Mekkora a minimális méretű verem, amely a feladat elvégzéséhez szükséges? Hány rekurzív hívás lesz a számolás során? Tudnánk-e ugyanezen kérdésekre általános választ is adni?

d.

nProcedúrahívással számíttassuk ki az F(7) számot! Hogyan alakul a verem felépítése, mélysége? Mekkora a minim is méretű verem ly a feladat elvégzéséhez szükséges? Hány rekurzív hí s a számolás során?

e. egyen az alábbi kétv függvényünk, amelyet nemnegatív egész

párosbés0

l a verem felépítése, mélysége? Mekkora a minimális méretű verem, amely a feladat elvégzéséhez szükséges? Hány rekurzív hívás lesz a számolás során?

9. a. Töltsük ki az alábbi táblázatot! Jegyek száma Számrendszer 2 10 16

definiáljuk, ahol nk ≤≤0 fönn kell álljon, továbbá megegyezés szerint 1!0 = .

Bizonyítsuk be, hogy ⎟⎟⎠

⎞⎜⎜⎝

⎛ −+⎟⎟

⎞⎜⎜⎝

⎛−−

=⎟⎟⎠

⎞⎜⎜⎝

⎛k

nkn

kn 1

11

. Ezt felhasználva adjunk rekurzív

def

módszert ⎟⎟⎞

⎜⎜⎛kn

kiszámítására. Konkrétan ⎞⎛7

⎠hatá ⎟⎟

A nemnegatív egész számokon értelmezzük a következő függvényt rekurzív módon:

( ) ⎪⎧

==

= 1,10,0

nhanha

nF ( )⎪

⎨+−1 FnF ( )− ,2 han⎩ >1

ál , ame vás le z

L áltozós argumentumokra értelmezünk rekurzívan:

( ) ( )⎪⎨

⎧ == bhadivbaP

bhabaP ,2,2

0,0,

( )⎪⎩ −+ egyébkéntbaPa ,1,

Procedúrahívással számíttassuk ki a P(2,5) számot! Hogyan alaku

>

Szám 22

1010 1616

b. Ha egy pozitív egész szám 34 jegyű 2-es számrendszerben, hány jegyű 16-osban? Adható-e általános formula bináris n-jegyű számok esetére? Ha igen, adjon ilyet, ha nem, indokolja meg, miért nem!

c. Ha egy pozitív egész szám 9 jegyű 16-os számrendszerben, hány jegyű 2-es számrendszerben? Adható-e általános formula hexadecimális n-jegyű számok

Page 25: 0. Bevezető megjegyzésekmatnf/adatst/ea/ea0.pdf · Ez a könyv bevezetést szándékozik adni az adatstruktúrák és algoritmusok világába. Témája egyetemen oktatott tananyag

Adatstruktúrák, algoritmusok - 25 -

esetére? Ha igen, adjon ilyet, ha nem, indokolja meg, miért nem!