Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

Hasonló dokumentumok
Algoritmusok és adatszerkezetek gyakorlat 07

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

Adatszerkezetek 1. Dr. Iványi Péter

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

Verem Verem mutató 01

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

Információs Technológia

Egyirányban láncolt lista

10. előadás Speciális többágú fák

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

Ugrólisták. RSL Insert Example. insert(22) with 3 flips. Runtime?

Algoritmuselmélet 2. előadás

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

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus adatszerkezetek. Dinamikus adatszerkezetek. Önhivatkozó struktúrák. Önhivatkozó struktúrák

Adatszerkezetek 7a. Dr. IványiPéter

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

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

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

A számítástudomány alapjai. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem

Adatszerkezetek 1. előadás

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

Adatszerkezetek 2. Dr. Iványi Péter

Elemi adatszerkezetek

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

B-fa. Felépítés, alapvető műveletek. Programozás II. előadás. Szénási Sándor.

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

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

Adatszerkezetek 2. Dr. Iványi Péter

file:///d:/okt/ad/jegyzet/ad1/b+fa.html

Bevezetés a Programozásba II 12. előadás. Adatszerkezetek alkalmazása (Standard Template Library)

félstatikus adatszerkezetek: verem, várakozási sor, hasítótábla dinamikus adatszerkezetek: lineáris lista, fa, hálózat

.Net adatstruktúrák. Készítette: Major Péter

Más szavakkal formálisan:, ahol olyan egész szám, hogy. Más szavakkal formálisan:, ahol olyan egész szám, hogy.

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

Algoritmusok és adatszerkezetek gyakorlat 03 Oszd meg és uralkodj. Nagy

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

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

Kupac adatszerkezet. A[i] bal fia A[2i] A[i] jobb fia A[2i + 1]

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

Módosítható Prioritási sor Binomiális kupaccal. Wednesday, March 21, 12

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

Rendezések. Összehasonlító rendezések

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

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

Adatszerkezetek és algoritmusok

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

Programozás I gyakorlat

ADATSZERKEZETEK (VEREM, SOR)

Adatszerkezet - műveletek

3/1. tétel: Linearis adatszerkezetek és műveleteik

Fájlszervezés. Adatbázisok tervezése, megvalósítása és menedzselése

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

C++ programozási nyelv

Önszervező bináris keresőfák

Adatszerkezetek és algoritmusok

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

file:///d:/apa/okt/ad/jegyzet/ad1/b+fa.html

Programozási technológia

7 7, ,22 13,22 13, ,28

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

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

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

Például számokból álló, egyszeresen láncolt lista felépítéséhez az alábbi struktúra definíciót használhatjuk:

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

Rendezettminta-fa [2] [2]

Programozás alapjai 9. előadás. Wagner György Általános Informatikai Tanszék

A lista eleme. mutató rész. adat rész. Listaelem létrehozása. Node Deklarálás. Létrehozás. Az elemet nekünk kell bef zni a listába

Kupac adatszerkezet. 1. ábra.

22. GRÁFOK ÁBRÁZOLÁSA

10. tétel. Adatszerkezetek és algoritmusok vizsga Frissült: január 28.

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

Adatszerkezetek Hasító táblák. Dr. Iványi Péter

Algoritmusok és adatszerkezetek gyakorlat 09 Rendezések

Alkalmazott modul: Programozás

Algoritmuselmélet. 2-3 fák. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem. 8.

Hierarchikus adatszerkezetek

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

Térinformatikai adatszerkezetek

Kulcs transzformációs táblázat

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

Tartalomjegyzék. Köszönetnyilvánítás. 1. Az alapok 1

Egyesíthető prioritási sor

Fejlett programozási nyelvek C++ Iterátorok

Tuesday, March 6, 12. Hasító táblázatok

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

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

Struktúra nélküli adatszerkezetek

GRÁFOK ÉS ALGORITMUSOK ELMÉLETE VIZSGAKÉRDÉSEK Matematika BSc Elemző szakirány II. év 1. félév

Felvételi tematika INFORMATIKA

Programozás I. zárthelyi dolgozat

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

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

Algoritmusok és adatszerkezetek 2.

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

17. A 2-3 fák és B-fák. 2-3 fák

Algoritmuselmélet. Gráfok megadása, szélességi bejárás, összefüggőség, párosítás. Katona Gyula Y.

Absztrakt adatstruktúrák A bináris fák

Rekurzió. Dr. Iványi Péter

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

Gráfok 2. Legrövidebb utak, feszítőfák. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor

Átírás:

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek Tömb Ugyanolyan típusú elemeket tárol A mérete előre definiált kell legyen és nem lehet megváltoztatni futás során Legyen n a tömb mérete. Ekkor: Elérési idő: O(1), mert az elemek egymás után folyamatosan tárolódnak a memóriában Beszúrás: O(n) legrosszabb esetben, ha a tömb elejére akarunk beszúrni és minden eddigi elemet arrébb kell rakni. Törlés: O(n) legrosszabb esetben, ha a tömb elejéről törlünk és minden további elemet egyel előrébb kell rakni Keresés: O(log n), ha rendezett a tömb (bináris keresés) és O(n), ha nem (szekvenciális keresés) Láncolt listák Minden elem egy adatból és egy (vagy több) mutatóból áll A mérete futás során módosítható Típusai: Egyirányú lista: minden elem egy adatot és egy rákövetkező elemre mutató pointert/referenciát tárol. Az utolsó elem pedig egy NULL-ra mutat. Például: 1 2 3 4 NULL Kétirányú lista: minden elem két pointert/referenciát tárol az adat mellett. Egyet a rákövetkező elemre, egy másikat a megelőzőre. Előnye, hogy mindkét irányban bejárható és törlésnél nem kell tudnunk a megelőző csúcs címét. Az első és utolsó eleme is NULL. Például: NULL 1 2 3 NULL Körben láncolt lista: az összes elem egy körbe van kötve. Nincs NULL elem a,,végén, az utolsó csúcs rákövetkező pointere az első elemre mutat. Lehet egyirányú és kétirányú láncolt is. Előnye, hogy bármelyik elemet kijelölhetjük kezdő elemnek. Legyen n a lista hossza. Ekkor: Elérési idő: O(n), mert a lista elejétől végig kell keresni Beszúrás: O(1), ha már azon a pozíción vagyunk, ami után be akarunk szúrni 1 Gelle Kitti

Törlés: O(1), ha már a törölt elem pozícióján vagyunk és tudjuk a törölni kívánt csúcs megelőzőjének a címét (vagy ha a megelőző elemen vagyunk) Keresés: O(n) Verem A verem egy LIFO (last in, first out) adatszerkezet Két műveletet támogat: push: egy elemet hozzáadunk az eddigiekhez úgy, hogy a verem tetejére tesszük pop: az utoljára beszúrt elemet veszi ki a veremből (a tetejéről) Legyen n a verem mérete. Ekkor: Elérési idő: O(1), de csak a verem tetején lévő elemet tudjuk elérni Beszúrás: O(1), mert mindig a tetejére pakolunk Törlés: O(1), de csak a tetején lévő elemet tudjuk törölni Sor A sor egy FIFO (first in, first out) adatszerkezet Két műveletet támogat: enqueue: egy új elemet adunk hozzá úgy, hogy a sor végére szúrjuk be dequeue: az első elemet töröljük a sorból Legyen n a sor mérete. Ekkor: Elérési idő: O(n) legrosszabb esetben Beszúrás: O(1) Törlés: O(1) Prioritási Sor Absztrakt adatszerkezet, melyben az elemeket prioritásuk szerint tároljuk Három műveletet támogat: insert: beszúr egy elemet pop: kiveszi a legkisebb prioritású elemet min: a legkisebb prioritású elemet adja vissza (pl. int-ek esetén minimumot) Legyen n a PriSor mérete. Egy standard implementációban: Min: O(1) Beszúrás: O(log n) Törlés: O(log n) 2 Gelle Kitti

Feladat Adott a 3, 6, 10, 8, 1, 9, 7 számsorozat, melyeket ebben a sorrendben tárolunk el. Adjuk meg milyen sorrendben vehetjük ki az elemeket verem, sor és prioritási sor adatszerkezet esetén! Verem: Mivel egy LIFO adatszerkezetről van szó, így a legkésőbb berakott elem kerül ki legelőször. A sorrend tehát megfordul: 7, 9, 1, 8, 10, 6, 3 Sor: ez egy FIFO adatszerkezet, tehát az jön ki először, amit legelőször tettünk be. A sorrend megmarad: 3, 6, 10, 8, 1, 9, 7 Prioritási sor: az elemek rendezésre kerülnek az adatszerkezetben, tehát a sorrend: 1, 3, 6, 7, 8, 9, 10 Feladat Szimuláljunk veremmel sort! A sor egy FIFO adatszerkezet, ami azt jelenti, hogy az elem, amit elsőnek adtunk hozzá, elsőnek is kell kikerüljön. Két műveletet kell támogatnunk: enqueue: a sorba művelethez elég egyetlen verem, amibe push művelettel eltároljuk az elemeket dequeue: az első elemet csak úgy tudjuk kiszedni a veremből, ha mindenkit kipakolunk pop művelettel. Mivel csak vermet használhatunk, így ehhez egy második veremre is szükség lesz, amibe át fogjuk rakni a kiszedett elemeket. Adat hozzáadása a sorhoz: Mivel a sorunk vége az első veremben, a sorunk eleje pedig a második veremben megfordított sorrendben van tárolva, egyszerűen az első veremhez push művelettel hozzáadjuk az elemet. Adat eltávolítása a sorból: Amikor a sorból kiveszünk egy elemet, az azt jelenti, hogy a legelső elemet kell kivennünk, ami bekerült a sorba. De ha egyszerűen csak az első veremből () pop-pal veszünk ki elemet, az a legutoljára belerakottat adja vissza. Ha a második verem () üres, pakoljuk át bele az összes elemet az elsőből. Vegyük ki tetejéről az első elemet (mivel -ben épp a fordított sorrend van, így az épp az első elem lesz). Ha üres, dobjunk hibát. 3 Gelle Kitti

Spush(1); Spush(2); (a) enqueue(1) (b) enqueue(2) üres Spush(3); x=.pop(); (c) dequeue() (d) enqueue(3) üres x=.pop(); x=.pop(); (e) dequeue() (f) dequeue() Ábra.: Példa az adatszerkezet működésére. Feladat Adjunk meg egy olyan verem adatszerkezetet, amely támogatja a push és pop művelet mellett a minimum lekérdezését is O(1) időben és plusz O(n) tárban. Minden rész veremre el kell tároljuk a minimumot, nem csak az aktuális teljes veremre, így a,,jegyezzük meg az aktuális minimumot nem jó taktika. Használjunk két vermet. Az egyikben tároljuk ténylegesen az összes elemet (). A másik veremben csak a részvermek minimumát tároljuk (). A műveletek: Push: rakjuk be az elemet az első verembe. Ha a második verem üres, rakjuk be oda is. Ha nem üres, nézzük meg, hogy kisebb vagy egyenlő-e, mint a tetején lévő elem. Ha igen, adjuk hozzá ahhoz is. Pop: Vegyünk ki egy elemet az első veremből. Ha ez az elem ugyanaz, mint a minimumokat tároló verem tetején lévő elem, vegyük ki azt is. 4 Gelle Kitti

FindMinimum: egyszerűen adjuk vissza azt az elemet, amelyik a minimumokat tároló verem tetején van (de onnan ne szedjük ki). Így minden műveletet O(1) időben tudunk megvalósítani, és maximum még egyszer annyi tárat használunk, mint amekkora a teljes verem. üres 1 < 3 (a) push(3) (b) push(1) 4. 4 > 1 4. x=.pop();.push(x); (c) push(4) (d) findminimum() 4. x=spop(); y=.pop(); if(x!=y){.push(y);} x=.pop();.push(x); (e) pop() (f) findminimum() x=spop(); y=.pop(); if(x!=y){.push(y);} x=.pop();.push(x); (g) pop() (h) findminimum() Ábra.: Példa az adatszerkezet működésére. 5 Gelle Kitti

4. Feladat Hogyan tudjuk egy egyszeresen láncolt listában ellenőrizni, hogy van-e benne kör O(n) időben és konstans tárban? A konstans tár azt jelenti, hogy nem tárolhatjuk el az elemeket máshol és nézhetjük meg, hogy már megtaláltuk-e, tehát csak pointereket tárolhatunk, amiket végigfuttathatunk a listán. Ebből egy nem lesz elég, mert hiába megyünk végig a listán, nem tudjuk eltárolni az addig látott elemeket. Két pointer: mindkettőt a lista elejéről indítjuk. Az egyikkel minden iterációban egyet lépünk, a másikkal kettőt (vagy bármilyen más eltérő kombinációban). Ha a két pointer értéke bármelyik iterációban megegyezik (ugyanazon az elemen állnak), akkor van kör a láncolt listában (mert akkor a,,gyorsabb pointer,,utolérte a lassabbat, ami csak akkor lehet, ha egy körben vannak), ha pedig bármelyik mutató a lista végére ér, nincs benne kör (mivel egyszeresen láncolt, ha elérünk a végét jelző NULL elemig, az csak úgy lehet, hogy végig egyenesen haladtunk). z n hosszú kör A két pointer találkozási pontja y x Ábra.: Ha van a listában kör, annak valamely pontján találkozni fognak a pointerek. Itt például míg a lassabb pointer az x + y távot teszi meg, addig a gyorsabb az x + y + z + y-t. Érdekesség: ha tudni akarod, hogyan lehet a minimum műveletet támogató vermet megvalósítani konstans tárral, kattints a nyuszira: 6 Gelle Kitti