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

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

Elemi adatszerkezetek

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

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

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 és algoritmusok

Egyirányban láncolt lista

Algoritmusok és adatszerkezetek gyakorlat 07

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

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

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

Adatszerkezetek 7a. Dr. IványiPéter

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

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

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

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++

Algoritmuselmélet 2. előadás

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

Hierarchikus adatszerkezetek

Számláló rendezés. Példa

Fák Témakörök. Fa definíciója. Rekurzív típusok, fa adatszerkezet Bináris keresőfa, bejárások Bináris keresőfa, módosítás B-fa

Információs Technológia

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.

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

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

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

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

15. A VERSENYRENDEZÉS

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

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

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

Edényrendezés. Futási idő: Tegyük fel, hogy m = n, ekkor: legjobb eset Θ(n), legrosszabb eset Θ(n 2 ), átlagos eset Θ(n).

Kupacrendezés. Az s sorban lévő elemeket rendezzük a k kupac segítségével! k.empty. not s.isempty. e:=s.out k.insert(e) not k.

Általános algoritmustervezési módszerek

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

6. előadás. Kiegyensúlyozottság, AVL-fa, piros-fekete fa. Adatszerkezetek és algoritmusok előadás március 6.

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

Adatszerkezetek 1. előadás

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

Algoritmuselmélet. Mélységi keresés és alkalmazásai. Katona Gyula Y.

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

Programozás I gyakorlat

Haladó rendezések. PPT 2007/2008 tavasz.

Programozási segédlet

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

Adatszerkezetek 1. Dr. Iványi Péter

Számjegyes vagy radix rendezés

Fa (Tree): csomópontok (nodes) halmaza, amelyeket élek (edges) kötnek össze, és teljesülnek az alábbi feltételek:

Web-programozó Web-programozó

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

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

Adatszerkezetek és algoritmusok

Hierarchikus adatszerkezetek

Táblázatok fontosabb műveletei 1

A programozás alapjai 1 Rekurzió

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

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

Programozás alapjai. 8. előadás

Információs Technológia

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

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:

Adatszerkezetek 2. Dr. Iványi Péter

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

Rekurzív algoritmusok

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

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

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

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

Programozás II. előadás

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Láncolt listák. PPT 2007/2008 tavasz.

Algoritmusok és adatszerkezetek gyakorlat 09 Rendezések

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

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

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

Adatszerkezetek 2. Dr. Iványi Péter

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

1. ábra. Számláló rendezés

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

Nagy HF u tmutato 2011/2012 II. fe le v

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

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

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

Adatszerkezetek és algoritmusok

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

Óbudai Egyetem. C programozási nyelv

9. előadás. A táblázat. A táblázatról általában, soros, önátrendező, rendezett és kulcstranszformációs táblázat

Gyakori elemhalmazok kinyerése

Rendezettminta-fa [2] [2]

III. Adatszerkezetek és algoritmusok

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

Rekurzió. Programozás alapjai C nyelv 9. gyakorlat. Rekurzív algoritmus. Rekurzív algoritmus fajtái. Példa: n! (2) Példa: n!

Algoritmusok és adatszerkezetek 2.

Programozás alapjai C nyelv 9. gyakorlat. Rekurzió. Rekurzív algoritmus

Rekurzió. Dr. Iványi Péter

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

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

Átírás:

A programozás alapjai 1 Dinamikus adatszerkezetek:. előadás Híradástechnikai Tanszék Dinamikus adatszerkezetek: Adott építőelemekből, adott szabályok szerint felépített, de nem rögzített méretű adatszerkezetek. A tényleges méret futás közben alakul ki. A méret és a szerkezet is megváltoztatható. Megvalósításához szükséges: önhivatkozó struktúra olyan összetett adattípus, amely összetevőként tartalmaz olyan mutatót, amely saját típusára képes mutatni. Önhivatkozó struktúrák Önhivatkozó struktúrák Struktúra deklaráció alakja: struct [<struktúra címke>] { <struktúra tag deklarációk> } [<struktúra változó azonosítók>] ; Önhivatkozó struktúra deklaráció alakja: struct <struktúra címke> { [<struktúra tag deklarációk>] struct <struktúra címke> * <azonosítók>; [<struktúra tag deklarációk>] } [<struktúra változó azonosítók>] ; 1

Önhivatkozó struktúrák Önhivatkozó struktúrák Példa: Példa: struct elem1 { int adat; struct elem1 * kovetkezo; } e1,*e2; struct elem1 e3,*e4; typedef struct kamu { int adat; struct kamu * kovetkezo; } elem2; elem2 e5,*e; Egyszerűbb esetben az adatszerkezet egy fa gráfot valósít meg. A fa olyan irányított gráf, amelyben nincs kör, vagyis egyetlen pontjáról sem lehet visszajutni a kiindulás helyére. K-ágú fa: Minden csomópontból legfeljebb K él indul ki. Egyirányban láncolt lista: K = 1 egyirányban láncolt lista 2

Egyirányban láncolt lista: Hogy kezelni tudjuk, két mutatóra van szükségünk: Az egyik az adatszerkezet elejét jelzi, A másik az éppen feldolgozott elemre mutat. A listát ez a két mutató testesíti meg. A beszúráshoz egy segédmutató kell. Hogy a tárolt adatokat vissza tudjuk keresni, rendezni kell (vagy eleve rendezetten felépíteni) Kézenfekvő megoldás: közvetlen beszúrásos rendezés. Beszúrni csak az aktuális elem mögé lehet! Beszúrni csak az aktuális elem mögé lehet! temp->next=spot->next; 3

Beszúrni csak az aktuális elem mögé lehet! temp->next=spot->next; Beszúrni csak az aktuális elem mögé lehet! spot->next=temp; Beszúrni csak az aktuális elem mögé lehet! Beszúrni csak az aktuális elem mögé lehet! spot->next=temp; A beszúrás helyét lineáris kereséssel találhatjuk meg: A legelső elemtől kiindulva megkeressük az első olyan elemet, amely után következő elem kulcsa nagyobb a beszúrni kívánténál. Ez a módszer hibás! Nem lehet beszúrni az első elem elé, és az utolsó elem után. Ezek esetleges szükségességét minden esetben külön meg kell vizsgálni. Ez körülményes, ezért nem így járunk el. 4

Helyette: Mindkét végén kiegészítjük a listát egy-egy elemmel. Egy olyannal, amelynek kulcsa kisebb minden elvileg tárolható eleménél, és egy olyannal, amelynek kulcsa nagyobb minden elvileg tárolható eleménél. Ezeket az elemeket strázsának (sentinel) nevezzük. Egyirányban láncolt lista strázsával: Az üres lista ezek szerint: Elemet törölni is csak az aktuális elem mögül lehet! Elemet törölni is csak az aktuális elem mögül lehet! spot->next=spot->next->next; Elemet törölni is csak az aktuális elem mögül lehet! spot->next=spot->next->next; 5

Elemet törölni is csak az aktuális elem mögül lehet! Elemet törölni is csak az aktuális elem mögül lehet! Listák különleges alkalmazásai: verem (stack) (LIFO), várakozási sor (queue) (FIFO) prioritásos sor (priority queue) Verem (Last In First Out): Elemet mindig csak a lista elejére szúrunk be; mindig csak a lista elejéről veszünk ki. Beszúrás a verembe: A veremet egyetlen mutató testesíti meg. Beszúrni üres verembe is ugyanúgy lehet. Törölni az utolsó elemet is ugyanúgy lehet. Strázsákra sincs szükség.

Beszúrás a verembe: Beszúrás a verembe: temp->next=head; temp->next=head; Beszúrás a verembe: Beszúrás a verembe: head=temp; head=temp; Beszúrás a verembe: Beszúrás üres verembe: 7

Beszúrás üres verembe: Beszúrás üres verembe: temp->next=head; temp->next=head; Beszúrás üres verembe: Beszúrás üres verembe: head=temp; head=temp; Beszúrás üres verembe: Elem törlése a veremből: 8

Elem törlése a veremből: Elem törlése a veremből: head=head->next; head=head->next; Elem törlése a veremből: Elem törlése a veremből: Az utolsó elem törlése a veremből: Az utolsó elem törlése a veremből: head=head->next;

Az utolsó elem törlése a veremből: Az utolsó elem törlése a veremből: head=head->next; A várakozási sort két mutató testesíti meg. Várakozási sor (First In First Out): Elemet mindig csak a lista végére szúrunk be; mindig csak a lista elejéről veszünk ki. Az egyik az első elemre mutat; a másik pedig az utolsóra. Beszúrni az utolsó elem mögé lehet. Egy strázsa elég az elejére, így mindig lesz utolsó elem, akkor is, ha a sor üres. Törölni mindig a strázsa utáni elemet kell. Várakozási sor: Üres várakozási sor: 10

Beszúrás várakozási sorba: Beszúrás várakozási sorba: temp->next=0; Beszúrás várakozási sorba: Beszúrás várakozási sorba: temp->next=0; tail->next=temp; Beszúrás várakozási sorba: Beszúrás várakozási sorba: tail->next=temp; tail=temp; 11

Beszúrás várakozási sorba: Beszúrás várakozási sorba: tail=temp; Beszúrás üres várakozási sorba: Beszúrás üres várakozási sorba: temp->next=0; Beszúrás üres várakozási sorba: temp->next=0; Beszúrás üres várakozási sorba: tail->next=temp; 12

Beszúrás üres várakozási sorba: Beszúrás üres várakozási sorba: tail->next=temp; tail=temp; Beszúrás üres várakozási sorba: Beszúrás üres várakozási sorba: tail=temp; Elem törlése várakozási sorból: Elem törlése várakozási sorból: head->next=head->next->next; 13

Elem törlése várakozási sorból: Elem törlése várakozási sorból: head->next=head->next->next; Elem törlése várakozási sorból: Utolsó elem törlése várakozási sorból: Utolsó elem törlése várakozási sorból: head->next=head->next->next; Utolsó elem törlése várakozási sorból: head->next=head->next->next; 14

Utolsó elem törlése várakozási sorból: Utolsó elem törlése várakozási sorból: if(!(head->next))tail=head;!! Utolsó elem törlése várakozási sorból: Utolsó elem törlése várakozási sorból: if(!(head->next))tail=head; Prioritásos sor: Elemet mindig csak a magasabb prioritású vagy megegyező prioritású de régebben várakozó elemek mögé szúrunk be; mindig csak a lista elejéről veszünk ki. Megvalósítható a lista első változatával. Mivel beszúrásra a legelején és a legvégén is sor kerülhet, kell mindkét strázsa. 15

Beszúrás prioritásos sorba: Beszúrás prioritásos sorba: Beszúrás prioritásos sorba: Beszúrás prioritásos sorba: Ez NEM fa, de nagyon gyakran használjuk! Ez NEM fa, de nagyon gyakran használjuk! Két irányban láncolt lista strázsával: 1

Ez NEM fa, de nagyon gyakran használjuk! Két irányban láncolt lista strázsával: Ez NEM fa, de nagyon gyakran használjuk! Két irányban láncolt lista strázsával: Rekurzívan rendezhető gyorsrendezéssel! Cserénél vigyázni kell a mutatók átállításának sorrendjére! gyorsrendezés (quick sort) Alapgondolata: Válasszuk szét a tömb elemeit a mediánnál kisebb, és annál nagyobb kulcsúakra! A két felet rendezzük ugyanígy! Helyben szétválogatási feladat A vektor elemei közül vegyük előre azokat, amelyek rendelkeznek egy adott tulajdonsággal! A vektor végén helyezzük el azokat az elemeket, amelyek nem rendelkeznek az adott tulajdonsággal. A két csoporton belül a sorrendnek nincs jelentősége. Egy lehetséges megoldás: (ha biztosan van ilyen is, olyan is) Induljunk el előről, és keressük meg az első olyan elemet, amely hátulra való! Induljunk el hátulról, és keressük meg az első olyan elemet, amely előre való! Ha még nem értünk a vizsgálat végére, cseréljük meg a két elemet, és folytassuk a keresést újra előről hátra! 17

Kéket keresünk elöl Kéket keresünk elöl Piros TOVÁBB Kék ÁLLJ, folytatás hátul Pirosat keresünk hátul Pirosat keresünk hátul Kék TOVÁBB Piros ÁLLJ, vizsgálat jön Vizsgáljuk, hogy végeztünk-e Kéket keresünk elöl Jelzők jó sorrendben CSERE, folytatás elöl Kék ÁLLJ, folytatás hátul 18

Pirosat keresünk hátul Vizsgáljuk, hogy végeztünk-e Piros ÁLLJ, vizsgálat jön Jelzők jó sorrendben CSERE, folytatás elöl Kéket keresünk elöl Kéket keresünk elöl Piros TOVÁBB Kék ÁLLJ, folytatás hátul Pirosat keresünk hátul Pirosat keresünk hátul Kék TOVÁBB Kék TOVÁBB 1

Pirosat keresünk hátul Pirosat keresünk hátul Kék TOVÁBB Piros ÁLLJ, vizsgálat jön Hogyan lesz ebből gyorsrendezés? Vizsgáljuk, hogy végeztünk-e Jelzők kifordultak SZÉTVÁLOGATVA! A tulajdonság legyen az, hogy az elem kulcsa kisebb a mediánénál (a medián középső elem) (nem az átlag!) Az átlaghoz legközelebb eső elem 1 3 4 5 8 10 25 28 Hogyan találhatjuk meg a medián elemet? (a vektor végigolvasása nélkül) Sajnos, SEHOGY! Medián elem 20

Hogyan becsülhetjük meg a medián elemet? Minden jó lehet, aminél van kisebb, és van nagyobb kulcsú elem. Mi csak a vektor két szélét látjuk. Használjuk ezek átlagát! Esetleg torzítsuk egy kicsit, hogy valóban vágjon. Hogyan áll le a rekurzió? A rendezendő szakaszok hossza egyre csökken. Ha szerencsénk van, minden lépésben feleződik. Végül 1-elemű szakaszaink maradnak, ami mindig rendezett. Mennyi a várható lépésszám? Minden finomításkor a teljes vektort végig kell olvasni, kivéve az egy hosszúságú szakaszokat. Erre log 2 N-szer van szükség. Tehát a várható lépésszám N log 2 N K = 2 bináris fa Bináris rendezőfa definíciója: Olyan bináris fa, amelyben minden lokális gyökérelem baloldali részfájában csak a lokális gyökér kulcsánál kisebb kucsú elemek vannak. A jobboldali részfában csak a lokális gyökér kulcsánál nagyobb kulcsú elemek vannak. bináris rendezőfa inorder bejárása Alapgondolata: Járjuk be a baloldali részfát, ha van! Dolgozzuk fel a lokális gyökérelemet! Járjuk be a jobboldali részfát, ha van! 21

34 2 4 1 41 2 42 Hogyan áll le a rekurzió? A levélelemeknek nincsenek oldalsó részfái, sőt a csomópontok között is lehetnek olyanok, amelyeknek csak egy van. 5 10 Törlés: Beszúrás: Megkeressük, hol lenne az elem helye, és oda akasztjuk. Az eddigi módszerek nem alkalmazhatók! A kiiktatott elemet nem lehet kifűzni, ha két részfa lóg rajta. Ha csak az egyik oldali részfa létezik, a probléma nem jelentkezik. Megoldás a definíció alapján: Az egyik (pl. a jobboldali) részfát gyökéreleménél fogva felvisszük a törölt elem helyére. A másik (tehát baloldali) részfát felakasztjuk az előbbi részfa legbaloldalibb elemének bal oldalára. 4 10 1 3 5 8 22

4 10 4 10 1 3 5 8 1 3 5 8 4 10 7 10 2 5 8 1 3 5 8 1 3 7 10 7 10 2 5 8 5 8 1 3 2 1 3 23

7 10 Bináris rendezőfa célja: 2 5 8 Gyors visszakeresést tesz lehetővé. Logaritmikus keresés lehetséges, de csak ha a fa kiegyensúlyozott. 1 3 Elem törlése a kiegyensúlyozottságot kevésbé rontó algoritmussal: Az egyik, (például a jobboldali) részfa másik oldali legszélső elemét (tehát a legbaloldalibbat) írjuk be a törölni kívánt elem helyére. Ezután úgy kell eljárni, mintha ez utóbbi elemet akarnánk törölni, csakhogy ennek biztosan nincs legalább az egyik oldali részfája (esetünkben baloldali részfája), így rekurzió nem alakul ki. 4 10 1 3 5 8 4 10 4 10 1 3 5 8 1 3 5 8 24

4 10 5 10 1 3 5 8 1 3 8 5 10 5 10 1 3 8 1 3 8 5 10 5 10 1 3 8 1 3 8 25