3. TÖMBÖK A tömb absztrakt adattípus Legyen T az E alaptípus feletti k ( 1) dimenziós tömb típus. Vezessük be az I I1

Hasonló dokumentumok
21. Adatszerkezetek Az adattípus absztrakciós szintjei Absztrakt adattípus (ADT) Absztrakt adatszerkezet (ADS) Egyszerű adattípusok Tömbök

22. GRÁFOK ÁBRÁZOLÁSA

5. SOR. Üres: S Sorba: S E S Sorból: S S E Első: S E

Programozás alapjai II. (7. ea) C++ Speciális adatszerkezetek. Tömbök. Kiegészítő anyag: speciális adatszerkezetek

Programozás alapjai II. (7. ea) C++

Speciális adatszerkezetek. Programozás alapjai II. (8. ea) C++ Tömbök. Tömbök/2. N dimenziós tömb. Nagyméretű ritka tömbök

7. BINÁRIS FÁK 7.1. A bináris fa absztrakt adattípus 7.2. A bináris fa absztrakt adatszerkezet

Struktúra nélküli adatszerkezetek

Adatszerkezetek 1. előadás

Érdekes informatika feladatok

Algoritmusok és adatszerkezetek I. 1. előadás

2. AZ ADATTÍPUS ABSZTRAKCIÓS SZINTJEI

6. LISTÁK ábra. A lista absztrakt adatszerkezet (ADS)

1.előadás Tornai Kálmán

Adatszerkezetek 1. Dr. Iványi Péter

Egyirányban láncolt lista

A C programozási nyelv III. Pointerek és tömbök.

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

C programozási nyelv Pointerek, tömbök, pointer aritmetika

A C programozási nyelv III. Pointerek és tömbök.

Adatszerkezetek Adatszerkezet fogalma. Az értékhalmaz struktúrája

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

2. AZ ADATTÍPUS ABSZTRAKCIÓS SZINTJEI...2

4. VEREM. Üres: V Verembe: V E V Veremből: V V E Felső: V E

10. gyakorlat Struktúrák, uniók, típusdefiníciók

Láncolt listák. Egyszerű, rendezett és speciális láncolt listák. Programozás II. előadás. Szénási Sándor

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Bevezetés a programozásba. 5. Előadás: Tömbök

KOVÁCS BÉLA, MATEMATIKA I.

A programozás alapjai előadás. Amiről szólesz: A tárgy címe: A programozás alapjai

8. gyakorlat Pointerek, dinamikus memóriakezelés

Amortizációs költségelemzés

15. A VERSENYRENDEZÉS

Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Objektumorientált paradigma és a programfejlesztés

Algoritmizálás és adatmodellezés 2. előadás

A programozás alapjai előadás. [<struktúra változó azonosítók>] ; Dinamikus adatszerkezetek:

Web-programozó Web-programozó

OOP. Alapelvek Elek Tibor

Algoritmusok és adatszerkezetek

Készítette: Nagy Tibor István

A lista adatszerkezet A lista elemek egymásutániságát jelenti. Fajtái: statikus, dinamikus lista.

Adatszerkezetek II. 1. előadás

Láncolt Listák. Adat1 Adat2 Adat3 ø. Adat1 Adat2 ø Adat3

Adatbázis-kezelő rendszerek. dr. Siki Zoltán

tétel: különböző típusú adatokat csoportosít, ezeket egyetlen adatként kezeli, de hozzáférhetünk az elemeihez is

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)

Adatszerkezetek 2. Dr. Iványi Péter

FEGYVERNEKI SÁNDOR, Valószínűség-sZÁMÍTÁs És MATEMATIKAI

2. előadás. Lineáris algebra numerikus módszerei. Mátrixok Mátrixműveletek Speciális mátrixok, vektorok Norma

1. feladatsor: Vektorterek, lineáris kombináció, mátrixok, determináns (megoldás)

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

Komputeralgebrai Algoritmusok

Műveletek mátrixokkal. Kalkulus. 2018/2019 ősz

Buborékrendezés: Hanoi Tornyai: Asszimptótikus fv.ek: Láncolt ábrázolás: For ciklussal:

26. MINIMÁLIS KÖLTSÉGŰ UTAK MINDEN CSÚCSPÁRRA

C programozási nyelv

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Gráfok 1. Tárolási módok, bejárások. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor

23. SZÉLESSÉGI BEJÁRÁS

Adatszerkezetek Bevezetés Adatszerkezet Adatszerkezet típusok Műveletek Bonyolultság

Algoritmusok és adatszerkezetek 2.

Mutatók és mutató-aritmetika C-ben március 19.

Programozás I gyakorlat

38. A gráfalgoritmusok alkalmazása

Óbudai Egyetem. C programozási nyelv

Gauss-Jordan módszer Legkisebb négyzetek módszere, egyenes LNM, polinom LNM, függvény. Lineáris algebra numerikus módszerei

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Objektumorientált paradigma és programfejlesztés Bevezető

Adatszerkezetek és algoritmusok

Adatbázis rendszerek. dr. Siki Zoltán

Számítógép és programozás 2

2. Milyen értéket határoz meg az alábbi algoritmus, ha A egy vektor?. (2 pont)

Algoritmizálás, adatmodellezés 1. előadás

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

15. tétel. Adatszerkezetek és algoritmusok vizsga Frissült: január 30.

17. előadás: Vektorok a térben

Generikus osztályok, gyűjtemények és algoritmusok

EGYSZERŰ, NEM IRÁNYÍTOTT (IRÁNYÍTATLAN) GRÁF

Adatszerkezetek és algoritmusok

MATLAB alapismeretek I.

Programozási nyelvek Java

Általános algoritmustervezési módszerek

Numerikus módszerek I. zárthelyi dolgozat (2017/18. I., A. csoport) Megoldások

I. VEKTOROK, MÁTRIXOK

Adatszerkezetek I. 7. előadás. (Horváth Gyula anyagai felhasználásával)

Hatékonyság 2. előadás

Adatszerkezetek és algoritmusok

Numerikus módszerek 1.

FEGYVERNEKI SÁNDOR, Valószínűség-sZÁMÍTÁs És MATEMATIKAI

12. előadás. Egyenletrendszerek, mátrixok. Dr. Szörényi Miklós, Dr. Kallós Gábor

hatására hátra lép x egységgel a toll

LINEÁRIS PROGRAMOZÁSI FELADATOK MEGOLDÁSA SZIMPLEX MÓDSZERREL

Elemi adatszerkezetek

30. ERŐSEN ÜSSZEFÜGGŐ KOMPONENSEK

Miért fontos számunkra az előző gyakorlaton tárgyalt lineáris algebrai ismeretek

Felügyelt önálló tanulás - Analízis III.

Objektum orientált programozás Bevezetés

Láncolt listák Témakörök. Lista alapfogalmak

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Átírás:

3. TÖMBÖK Az egyszerű adattípusok ismertetését a tömbökkel kezdjük. Az sem okozna zavart, ha ezt a fejezet nem szerepelne jegyzetünkben, tekintettel arra, hogy a tömböket ismerjük a programozási kurzusokból. Mégis, célszerű néhány jellemző megállapítást tenni ezzel az alapvető struktúrával kapcsolatban. A tömbök legfontosabb tulajdonsága az, hogy elemei indexeléssel közvetlenül elérhetők. Ezt ADT szintű tulajdonságnak tekinthetjük. A tömbről ADS szinten tömbszerű képünk van, de az elemek rákövetkezősége alapján irányított gráfként is felfoghatunk egy tömböt. Ez az absztrakció a láncolt ábrázolás felé mutat. Az megvalósítás során, az ADS szinttel összhangban, ritkán választjuk a tömb láncolt ábrázolását (ahogyan- fordítva a listák esetében sem gyakori a tömbös megvalósítás). A tömbökről nem könnyű megmondani a felhasználás egy körében vagy konkrét esetében, hogy saját műveletekkel rendelkező önálló típusnak, vagy csupán a reprezentáció adatszerkezetének tekinthetők. A tömbök dimenziószámmal rendelkeznek; a vektor egydimenziós, míg a mátrix kétdimenziós ismert struktúra; de magasabb dimenziós tömbök használata sem ritka. A tömb erősen szemléletes fogalom; három dimenzióig könnyű elképzelni, lerajzolni a szerkezetüket. Ma már egy többdimenziós tömb, például egy mátrix nem jutattja eszünkbe, hogy a további lépésként egydimenziós tömbbel kellene reprezentálni. Ez annak köszönhető, hogy a programozási nyelvek elemi lehetőségként kínálják a többdimenziós tömbök használatát. Érdemes azonban tudatosítani, hogy többdimenziós tömbök a számítógép memóriában egydimenziósként ábrázolódnak. Speciális több dimenziós tömbök (például alsóháromszög-mátrix) helytekerékos egydimenziós ábrázolásáról olyakor magunk gondoskodunk. Ezeket a gondolatokat valamivel részletesebben is kifejtjük a következő pontokban. 3.1. A tömb absztrakt adattípus Legyen T az E alaptípus feletti k ( 1) dimenziós tömb típus. Vezessük be az I I1... I k indexhalmazt, ahol I j = [1.. n j ] ( 1 j k). (Megjegyezzük, hogy az indexelés 1 helyett kezdődhetne általában mj-vel is, de az egyszerűség kedvéért 1-et fogunk használni.) Az AT tömbnek így n = n a 1,...,a n jelöli. A T tömbhöz tartozik, mint a típus meghatározó komponense, egy f : I 1.. n indexfüggvény, amely kölcsönösen egyértelmű leképezést létesít az indexhalmaz és a elemek halmazbeli indexei között, ezáltal egyértelmű leképzést valósít meg az indexhalmaz és a tömb elemei között. A tömbelemek egyértelműen és közvetlenül elérhetővé válnak az indexfüggvény alkalmazásával. 1 n2... nk elemet tárol, amelyek halmazát Bevezetjük az A [1.. n 1, 1.. n 2,, 1.. n k ] jelölést az A tömbre, amely magában foglalja az indexhalmazát és utal arra, hogy az indexkifejezések és a tömelemek közötti kapcsolat is adott, így annak alapján az elemekre indexeléssel lehet közvetlenül hivatkozni.

Bevezetjük az Ai 1, i 2,..., i k jelölést a tömbelemek indexelésére. Ha a fenti indexfüggvény szerint f ( i 1, i 2,..., ik ) = j, akkor ez az indexelés az a j elemet választja ki A i 1, i 2,..., i k = a j Az indexelés mechanizmusát (absztrakt megközelítésben) a 3.1. ábra szemlélteti. 3.1. ábra. Tömb absztrakt adattípus A tömb műveleteinek köre szerény: a most bevezetett indexeléssel lekérdezhetjük a tömb elemeit, emellett módosíthatjuk is azokat. A tömb a mérete nem változik; nem lehet a tömbbe egy új elemet beszúrni, és nem lehet a tömbből egy elemet kitörölni. A szokás elnevezések szerint k = 1 esetén a vektorról, k = 2 esetén a mátrixról beszélünk. 3.2. A tömb absztrakt adatszerkezet A tömböktől elválaszthatalan a szerkezetükről alkotott kép, amely jórészt a matematikai tanulmányaink során alakult ki. Ezen a kép alapján például egy cellákból álló lineáris vagy négyzethálós sémában helyezzük el (az egy, illetve kétdimenziós) tömb elemeit. A 3.2. ábrán egy mátrix szokásos ábrája látható. 3.2. ábra. Tömb szemléletes képe (ADS) Az absztrakt adatszerkezet bevezetésével a fenti f indexfüggvény a háttérbe húzódik, hiszen azt lehet mondani például a fenti kétdimenziós tömb esetén, hogy mondjuk az A [2, 3] = 40 elem a 2. sor 3. eleme, vagyis az indexkifejezést vizuálisan megjelenítettük az ADS szintű sémával. 2

Szemléletünk számára tehát a vektor egy beosztásokkal ellátott szalag, a 2-dimenziós tömb egy mátrix, a 3-dimenziós tömb egy cellákra osztott téglatest alakját ölti gondolatainkban. Az előző, bevezető jellegű 2. fejezet szerint, az absztrakt adatszerkezetet általában egy olyan irányított gráf szemlélteti, amelyben az élek az adatelemek közötti rákövetkezéseket jelenítik meg. Egy k-dimenziós tömb elemeinek általában, a dimenziók határát kivéve, k számú rákövetkezőjük van. Formálisan isbevezethetjük a j szerinti rákövetkezés fogalmát: köv j A [ i 1,..., i j,..., ik ] = A [ i 1,..., i j 1,..., ik ] ( i j n j ) A 3.3. ábra egy kétdimenziós tömb, az A [1..3, 1..4] mátrix absztrakt gráfszerkezetét mutatja. Ez egy olyan ortogonális struktúra, amelyben minden csúcsból két él vezet a tömbbeli rákövetkezőkhöz. 3.3. ábra. Tömb gráfja (ADS) Valójában a tömbről nem ilyen képet őrzünk fejünkben, ahogyan a verem sem egy lineáris gráf formájában rögzül a memóriánkban. Annyiban azonban mégsem fölösleges a gráfos szemlélet, mert közelebb hozza a ritka mátrixok láncolt ábrázolásának ötletét. 3.3. A tömb megvalósításai Ebben a pontban két ritkán felmerülő kérdést érintünk. Az egyik a többdimenziós tömbök egydimenziós ábrázolására vonatkozik. A magasszintű programnyelvek elfedik előlünk ennek szükségességét, azonban hasznos lehet megismerni a fordítóprogramokba épített tárolási elvet. A másik kérdés a nagyméretű, de kevés adatot tartalmazó tömbök helytakarékos tárolására vonatkozik. Bemutatjuk a ritka kitöltöttségű mátrixok láncolt ábrázolásának módszerét. 3.3.1. Aritmetikai reprezentáció Egy adatszerkezet aritmetikai ábrázolása során az adatelemeket egy tömbben helyezzük el, az eredti strukturális összefüggéseket pedig függvények formájában adjuk meg. Az adatokat tároló tömb lehet egy- vagy többdimenziós. Szemléletünk számára egy többdimenziós tömb már annyira egyszerű adatszerkezet, hogy nem szükséges mindig újra meggondolni az egydimenziós elhelyezés lehetőségét. A programnyelvek is megerősítenek ebben, hiszen a többdimenziós tömbök használatát az alapvető lehetőségek között nyújtják. 3

A tömb adattípus ismertetésekor azonban, legalább ezen a helyen egyszer, érdemes szóba hozni azt, hogy a többdimenziós tömbök elemeit még el kell helyezni a szalagszerű egydimenziós memóriában. A szekvenciális tárolást általában a sorfolytosnos vagy oszlopfolytonos módszerrel szokás megoldani. (Azzal még itt sem foglalkozunk, hogy a tárolás végállomása egy bájtokból álló vektor, és a bájtokat még tovább finomítva bitek sorozata alkotja.) A 3.4. ábrán a korábban is szereplő mátrixnak az egydimenziós tárolást illusztrálja, mindkét elhelyezési stratégia szerint. 3.4. ábra. Kétdimenziós tömb egydimenziós tárolása A kapcsolatot az elemek mátrixban elfoglalt pozíciója és az újy helye között indexfüggvényekkel adjuk meg. Egy kétdimenziós tömbre, például a sorfolytonos esetben ez a következő: ( ) ( ) ahol és. Esetünkben például, ha az elemet keressük a sorfolytonosan kialakított B tömbben, akkor azt a ( ) indexű helyen találjuk: Ezzel a kérdéssel a további fejezetekben nem foglalkozunk. Ezután már egy többdimenziós tömböt is az ábrázolás eszközének tekintünk. 3.3.2. Láncolt ábrázolás Bizonyos (jobbára gazdasági) problémák modellezése nagyméretű mátrixok alkalmazásához vezet. Előfordul azonban, hogy a mátrix csekély értékes adatot tárol. Ilyenkor gondolhatunk arra a reprezentálási módra, amelyet a 3.5. ábrán láthatunk. A ritka mátrixok láncolt ábrázolásában csak az értékes elemek szerepelnek. Alkalmazhatunk egyirányú láncolást, amelyben minden elemtől a sor- és oszlopbeli rákövetkezőjéhez irányít a két tárolt pointer. A sorok és az oszlopok bejárataira, 4

pontosabban az első bennük szereplő elemre, egy-egy fejelem mutat, amelyek maguk is egyegy litát alkotnak. A két fejelem lista egy közös fejelemből érhető el. 3.5. ábra. Ritka mátrix láncolt ábrázolása Az ábra nem csak a helytakarékosság lehetőségét érzékelteti, hanem azt is, hogy ezzel az ábrázolási móddal feladtuk az elemek közvetlen indexelhetőségét és csak meglehetős nehézkességgel tudunk eljutni az elemekhez. Az elemek elérését, illetve a struktúrában való mozgást valamelyest javítja, ha kétirányú láncolást alkalmazunk, mind a sorokban és az oszlopokban, mind pedig a két fejelem-listában. Azt a kérdést, hogy alkalmazzuk-e adott esetben ezt a tárolási formát, két szempont dönti el. Egyik a helytakarékosság kérdése: az értékes mátrixelemek (várható) számának és méretének ismerete esetén könnyen kiszámítható, hogy előnyösebb-e ez az ábrázolás, mint a hagyományos. Ehhez csak a pointerek számát kell meghatározni, amelyet a memóriacím helyfoglalásával (ami általában 2 vagy 4 bájt) szorozva kell a memóriaigény számításában figyelembe venni. A másik mérlegelendő szempont az, hogy mennyire támogatják a feldolgozó eljárások megvalósíthatóságát a láncolt adatszerkezeten való közlekedés korlátozott lehetőségei. A mai memóriakapacitások mellett lehet, hogy ez a súlyosabb szempont. Ha arra gondolunk például, hogy hogyan kellene két ritka mátrix összegét előállítani, akkor látható, hogy a láncolt ábrázolás mellett a legegyszerűbb feladadása megoldása is körülményessé válhat. 5

3.4. Speciális tömbök A tömbök egydimenziós ábrázolásával azért sem fölösleges megismerkedni, mert találkozhatunk olyan adatszerkezetekkel, amelyeknél azt magunk valósítjuk meg. Ezek az adatszerkezetek általában olyan mátrixok, amelyeknek jelentősen kisebb helyen is tárolhatók, például azért, mert az elemek jó része hiányzik, és a hiány, ezzel együtt értékes rész is szabályos tartományt képez. 3.6. ábra. Alsó-háromszögmátrix sorfolytonos ábrázolása A 3.6. ábrán látható alsóháromszög-mátrixban a főátló fölötti elemek hiányoznak. Az értékes elemeket sorfolytonos módon elhelyezve egy egydimenziós tömbbe memóriatakarékos tárolást valósítunk meg, hiszen így a helyfoglalás közelítőleg a felére csökken. Egy -es négyzetes mátrix esetén az alsó háromszög tárolásához szükséges cellák száma: ( ). Megállapodás szerint, az értékes elemek után még egy nullát is elhelyezünk. Ez az átpakolási stratégia az alábbi index-függvénnyel válik követhetővé: ( ) { ( ) ( ) (A nulla elem tárolása egy általánosabb eljárás következménye. Ha ugyanis a mátrixban lenne néhány olyan elem, amelyek nagyobb számban ismétlődnek egy-egy szabályos tartományban, akkor ezeket rendre elegendő egy-egy példányban tárolni, amennyiben az eredeti előfordulási helyeik egy indexfüggvénybe foglalhatók.) 6