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

Hasonló dokumentumok
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

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

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

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

Adatszerkezetek 2. Dr. Iványi Péter

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

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

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

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 9. gyakorlat. Rekurzió. Rekurzív algoritmus

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

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

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)

Programozási segédlet

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

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

Adatszerkezetek 7a. Dr. IványiPéter

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

Adatszerkezetek 1. Dr. Iványi Pé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

Adatszerkezetek 1. előadás

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

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

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

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

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

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

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

Egyirányban láncolt lista

Adatszerkezetek és algoritmusok

Elemi adatszerkezetek

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

Struktúra nélküli adatszerkezetek

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

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

Információs Technológia

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

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

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

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

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Programozás I gyakorlat

Algoritmuselmélet 2. előadás

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

Adatszerkezetek és algoritmusok

8. gyakorlat Pointerek, dinamikus memóriakezelés

Érdekes informatika feladatok

Verem Verem mutató 01

Táblázatok fontosabb műveletei 1

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

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

Adatszerkezetek 2. Dr. Iványi Péter

Programozási alapismeretek 3. előadás

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

Programozási módszertan. Mohó algoritmusok

Web-programozó Web-programozó

22. GRÁFOK ÁBRÁZOLÁSA

Algoritmusok és adatszerkezetek 2.

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

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

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

Algoritmusok vektorokkal keresések 1

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

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

Felvételi tematika INFORMATIKA

Adatszerkezetek és algoritmusok

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

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

III. Adatszerkezetek és algoritmusok

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

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.

Marton József BME-TMIT. Adatbázisok VITMAB november 11.

Algoritmusokfelülnézetből. 1. ELŐADÁS Sapientia-EMTE

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

Algoritmusok és adatszerkezetek gyakorlat 07

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

Kupac adatszerkezet. 1. ábra.

HÁZI FELADAT PROGRAMOZÁS I. évf. Fizikus BSc. 2009/2010. I. félév

Mindenki abból a három tantárgyból tesz szigorlatot, amelyet hallgatott.

2. Visszalépéses keresés

Algoritmusok bonyolultsága

Rakov(34125)= Rakov(12543)= Rakov(14532)= Rakov(54321)=-

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

A félév során előkerülő témakörök

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

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

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

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

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

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

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:

1. Alapfogalmak Algoritmus Számítási probléma Specifikáció Algoritmusok futási ideje

Önszervező bináris keresőfák

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

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

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

Programozási technológia

Átírás:

Programozás alapjai II. (7. ea) C++ Kiegészítő anyag: speciális adatszerkezetek Szeberényi Imre BME IIT <szebi@iit.bme.hu> M Ű E G Y E T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 1 -

Speciális adatszerkezetek A helyes adatábrázolás választása, a helyes adatszerkezet megtalálása igen fontos tervezési és implementációs kérdés. Ügyetlen tárolással teljesen tönkretehetjük az amúgy gondos tervezés eredményét is. Különböző szempontokat kell figyelembe venni: modell, sebesség, méret C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 2 -

Tömbök Ha a méret és a dimenziószám ismert, nincs gond. Ha a dimenziószám változik, akkor nem oldható meg nyelvi eszközzel tárolás sor-, vagy oszlopfolytonosan memóriaterület dinamikus foglalása kiszámítandó az elem címe az indexkifejezés alapján (legutolsó index fut a leggyorsabban) C-ben az index 0-tól n-1-ig megy, de nem minden nyelven van így. C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 3 -

Tömbök/2 I-1,0,0 i I-1,0,K-1 0,0,K-1 I-1,J-1,0 j 0,0,0 k 0,J-1,K-1 0,J-1,0 M[I][J][K] méretű 3D mátrix[i][j][k] elemének címe= J*K*i+K*j+k+bázis C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 4 -

N dimenziós tömb Legyen Li egy N dimenziós tömb i. dimenziójának minimális indexe, Ui pedig a maximális indexe. A tömb i1, i2, i3, i4,..in indexű elemének címe: S2*S3*... *Sn*(i1-L1) + S3*...Sn*(i2-L2) +... + (in-ln) + bázis ahol: Si = Ui Li + 1 C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 5 -

Nagyméretű ritka tömbök Nagyméretű ritka (sok azonos elem) mátrixok tárolásánál fontos lehet a helytakarékos megoldás. Ha a nem nulla elemek száma ismert, akkor statikus táblákkal viszonylag egyszerű a megoldás Az adat mellett tároljuk a sor- és oszlopindexet is. C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 6 -

Nagyméretű ritka tömbök/2 0 1 2 3 4 0 12 14 1 2 26 40 3 4 17 31 5 9 85 OszlElső: 0 1 4 5 7 8 Sor: Érték: 4 0 2 5 4 0 2 5 17 12 26 9 31 14 40 85 0 1 2 3 4 5 6 7 8 C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 7 -

Nagyméretű ritka tömbök/3 0 1 2 3 4 0 12 14 1 2 26 40 3 4 17 31 5 9 85 Sor: Ertek: OszlElso: int elem(int i, int j) { // pl: 2,3 0 1 4 5 7 8 4 0 2 5 4 0 2 6 17 12 26 9 31 14 40 85 for (k = OszlElso[j]; k < OszlElso[j+1]; k++) if (Sor[k] == i) return(ertek[k]); return(0); } C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 8 -

Nagyméretű ritka tömb listával Statikus tábla helyett körkörösen láncolt ortogonális lista. (fésű) Minden listaelemben tárolni kell az elem indexét, és az adatot. A nulla, vagy más ismétlődő adatot nem tároljuk. Minden sorhoz és oszlophoz van egy fej (strázsa), amit a speciális index jelöl. C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 9 -

Nagyméretű tömb ortogonális listával 0 0 0 1 0 2 0 3 0 4 1 0 1 1 8 2 0 2 3 9 3 0 3 1 4 C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 10 -

Sorok és vermek Ez a kép most nem jeleníthető meg. Sor: FIFO (First-In-First-Out) Verem: LIFO (Last-In-First-Out) megvalósítás tömbbel, vagy listával C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 11 -

Sorok felhasználása Természetes eszköz a várakozó sorok megvalósításához. Természetes eszköz a puffereléshez (termelő-fogyasztó sebességkülönbség kiegyenlítése) C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 12 -

Verem felhasználása Viselkedés miatt (dinamikusan növekszik ill. csökken, LIFO) Tipikus megvalósítása az eljáráshívásnak és a paraméterátadásnak. Rekurzió megvalósításának segédeszköze. Lokális változók tárolása. Postfix kifejezések kiértékelése. Visszalépéses (backtrack) algoritmusok segédeszköze. C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 13 -

Hash függvény Egy fix hosszúságú kivonatot készít, ami jellemző az adatra. h = H(z). tulajdonságai: egyirányú h-hoz nehéz találni olyan z z'-t amire h=h(z') H-hoz nehéz találni olyan z z'-t amire H(z)=H(z') Felhasználása: Index leképezése egy véges tartományra. (pl. indexelés stringgel) C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 14 -

Hash tábla Olyan tároló, amelyben hash függvény segítségével tárolunk. A tárolás alapját képező kulcsot (sokszor magát a tárolandó adatot) hash függvény segítségével kivonatoljuk. Az így kapott érték alapján tárolunk, de felkészülünk az esetleges ütközésekre is. Példa H-ra: C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 15 -

Hash tábla/2 z H Ht: ütközés C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 16 -

Hash ütközések feloldása A bemutatott megoldás logikus lenne, de nem ez a szokásos. A táblában keresnek egy újabb szabad helyet. Pl. lineáris kereséssel próbálnak a következő elemekből választani. Hátrány, hogy csoportok alakulnak ki (clustering) Ezért gyakoribb a többszörös hash használata C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 17 -

Lineráis kereséssel int Proba(int s, Key k) { int i = s; do { if (Ht[i] == k) return(i); i = (i + 1) % m; } while (i!= s); return(-1); } Spec. kulcs int Tarol(Key k) { int h = Hash(k); int i = Proba(h, Ures); if (i < 0) return(0); Ht[i] = k; return(1); } Key Keres(Key k) { int h = Hash(k); int i = Proba(h, k); if (i < 0) return(ures); return(ht[i]); } C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 18 -

Többszörös hash A Proba ciklusában d=+1 helyett d = Hash2-t használunk. Pl: Hash2-ben a θ helyett 1-θ-t használunk. int Proba(int s, Key k) { int i = s; int d = Hash2(k); do { if (Ht[i] == k) return(i); i = (i + d) % m; } while (i!= s); return(-1); } C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 19 -

Listák Egyszeresen láncolt Többszörösen láncolt Körkörösen láncolt Rendezett Rendezetlen Fésűs (ortogonális) C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 20 -

Duplán láncolt adatszerkezet KEZD1 ADAT KOV ADAT KOV ADAT KOV ADAT KOV NULL ADAT KOV ADAT KOV ADAT KOV ADAT KOV KEZD2 NIL C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 21 -

Fésűs lista TK KOVTK KOVH TK KOVTK KOVH TK KOVTK KOVH????? KOVTK KOVH NEV,ATL KOVH????? KOVH NEV,ATL KOVH????? KOVH????? KOVH C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 22 -

Fa szerkezetek Bináris fa Rendezett, 1 db kulcs 2 pointer Halom (kupac) speciális bináris fa tömbbel is szokás ábrázolni N-fa N-1 db kulcs, N db pointer ha k < k1 -> p0 ha ki < k < ki+1 -> pi ha kn-1 < k -> pn-1 k k1, k2, k3 p0 p1 p2 p3 C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 23 -

Bináris fa bejárása ism. Ha a fa_nem_üres Akkor kiírjuk_a_bal_részfát kiírjuk_az_elemet kiírjuk_a_jobb_részfát Vege 3 15 6 20 31 2 5 22 91 C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 24 -

Kupac (heap) a 1 a i <= a 2i ha i < n/2 a i <= a 2i+1 ha i < n/2 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 25 -

Süllyeszt a 1 =10 a i <= a 2i ha i < n/2 a i <= a 2i+1 ha i < n/2 a 2 =8 a 3 =11 a 4 =19 a 5 =15 a 6 =12 a 7 =18 a 8 =88 a 9 =35 A kisebb ágon haladunk, addig, amíg cserélni tudunk. C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 26 -

Rendezés algoritmusa Készítsünk kupacot a tetején lesz a legkisebb elem Levesszük a legfelsőt és elsüllyesztjük a -t, így újból kupachoz jutunk aminek a tetején a ismét legkisebb elem van. C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 27 -

Kérdések Hogyan készítünk kupacot? a n/2+1... a n biztosan kupac, ezért ebben elsüllyesztjük az a n/2 -t, majd az a n/2-1 -t, és így tovább. Hogyan ábrázoljuk? tömbben: elem index = tömb index 1 2 3 4 5 6 7 C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 28 -

Kérdések (2) Mit használjunk helyett? Legyen ez a tömb legutolsó eleme! Ezzel kicseréljük a legelső elemet így a kupac mérete eggyel csökken, ugyanakkor a maradék továbbra is kupacot alkot. legkisebb csere maradék kupac C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 29 -

B-tree B-fa (B-tree) kiegyensúlyozott olyan N-fa, amelynek minden csomópontjából legalább N/2 és legfeljebb N ág indul. (gyökér kivételével) kulcsok száma: k = n-1 C példa: http://www.iit.bme.hu/~szebi/prog2/bfa.c k1, k2, k3 p0 p1 p2 p3 C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 30 -

B-tree példa (N=5) 55 ide jönne, de elérte a maximális számot (N=5-höz max. 4 kulcs tartozik) 20 10,12 30,35,40,50 55 C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 31 -

B-tree példa/2 új kulcs jött fel 20, 40 kettéhasadt 10,12 30,35 50, 55 A levelek azonos szinten maradtak. C++ programozási nyelv BME-IIT Sz.I. 2016.04.05. - 32 -