Adatszerkezetek�2022.10.18
Ismétlés
Mohó algoritmusok
,,optimálisnak tűnő döntés”
Nem minden probléma oldható meg mohó algoritmussal és nem mindig ad optimális megoldást.
Pénzváltás probléma
Pénzváltás probléma
A pénztáros az alábbi címleteket fogja adni:
3 db 20.000 Ft-os = 60.000 Ft
1 db 10.000 Ft-os = 10.000 Ft
1 db 5.000 Ft-os = 5.000 Ft
2 db 2.000 Ft-os = 4.000 Ft
1 db 500 Ft-os = 500 Ft
1 db 200 Ft-os = 200 Ft
1 db 100 Ft-os = 100Ft
2 db 20 Ft-os = 40 Ft
1 db 5 Ft-os = 5 Ft 79.845 Ft
Ez összesen 13 db papír pénzt, illetve pénzérmét jelent.
Levélfeladás
Nyugdíjasunk szeretne feladni egy levelet, mely 1400 Ft-ba kerül. Hogyan lehet ezt megtenni, ha a lehető legkevesebb számú bélyeget szeretnénk a borítékra tenni.
Rendelkezésre álló bélyegcímletek:
3.500 Ft
1.000 Ft
700 Ft
340 Ft
210 Ft
100 Ft
10 Ft
Adatszerkezetek
Az adatszerkezetek
Az adatszerkezet adatok tárolására és szervezésére szolgáló módszer (konstrukció), amely lehetővé teszi a(z adatokhoz való) hatékony hozzáférést és (a) módosításokat.
Tanult absztrakt adatszerkezetek:
Az adatszerkezetek
Leggyakoribb műveletek (H: adatok dinamikus halmaza, k: kulcsmező)
KERES(H,k)
BESZÚR(H,k) (Push)
TÖRÖL(H,k) (Pop)
MIN(H)
MAX(H)
ELŐZŐ(H,k)
KÖV(H,k)
Az adatszerkezetek
Adatszerkezet: absztrakt adatszerkezet konkrét megvalósítása.
– Egy programozási nyelven is lehet több megvalósítás,
– bizonyos műveletek hatékonyabbak,
– megfelelő absztrakt adatszerkezet megválasztása fontos az algoritmushoz,
– megfelelő adatszerkezet megválasztása kulcs az implementáció optimális futásidejéhez!
Az adatszerkezetek
Adatszerkezet: absztrakt adatszerkezet konkrét megvalósítása.
– Egy programozási nyelven is lehet több megvalósítás,
– bizonyos műveletek hatékonyabbak,
– megfelelő absztrakt adatszerkezet megválasztása fontos az algoritmushoz,
– megfelelő adatszerkezet megválasztása kulcs az implementáció optimális futásidejéhez!
Láncolt listák
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ó.
Láncolt listák
Típusai:
Egyirányú lista:
Például:
6 → 9 → 5 → NULL
Láncolt listák
Kétirányú lista:
Például: NULL ← 1 ↔ 2 ↔ 3 → NULL
Láncolt listák
Körben láncolt lista:
Láncolt listák
Példa:
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őre 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)
Listák vagy tömbök – Hozzáférési idő
Listák vagy tömbök – Memória igény
Tömbök
Listák
Listák vagy tömbök – Elem beszúrásának költsége
Tömbök
Listák
Három szcenárió: 1. elejére, 2. hátuljára, 3. belsejébe
Listák vagy tömbök – Használat
✓ 🗴
Verem
Verem
Verem
Legyen n a verem mérete. Ekkor:
Verem
Feladat:
Egy V veremben kezdetben egyetlen szám, az 1 van. Utána n-szer végrehajtjuk a
Veremből (V, x)
y = 2x;
z = 2x+1;
Verembe (V, y);
Verembe (V, z);
műveleteket.
Mi lesz ezután a Veremből (V, x) eredménye?
Mi lesz az eredmény, ha sort használunk verem helyett?
Verem
Feladat:
Egy V veremben kezdetben egyetlen szám, az 1 van. Utána n-szer végrehajtjuk a
Veremből (V, x)
y = 2x;
z = 2x+1;
Verembe (V, y);
Verembe (V, z);
műveleteket.
Mi lesz ezután a Veremből (V, x) eredménye?
Mi lesz az eredmény, ha sort használunk verem helyett?
Sor
Sor
A sor egy FIFO (first in, first out) adatszerkezet.
Két műveletet támogat:
Sor
Legyen n a sor mérete. Ekkor:
Feladat
Feladat
Feladat
Feladat
Feladat
Feladat
Betesz
kivesz
Feladat
Feladat
Fontos:
Feladat
Feladat
Mi ezzel a probléma?
Feladat
Előbb vagy utóbb kicsúszunk a tömbből…
Feladat
Feladat
Feladat
Feladat
Feladat
Feladat
Feladat
Enqueue(x)
S1.Push(x)
Deque
If (S2 is empty)
While(S1 is not empty)
S2.Push(S1.pop)
Return S2.pop
O(1)
O(n)
Feladat
Feladat
Feladat
Push (x)
While (Q1 is not empty)
Temp =Q1.deque
Q2.enque = Temp
Q1.enque
While (Q2 is not empty)
Temp =Q2.deque
Q1.enque = Temp
Pop()
Return Q1.deque
1
1
1
2
2
1
1.
2.
3.
4.
5.
O(2n) = O(n)
O(1)
Prioritási Sor
Prioritási sor
Absztrakt adatszerkezet, melyben az elemeket prioritásuk szerint tároljuk
Három műveletet támogat:
Prioritási sor
Legyen n a PriSor mérete.
Egy standard implementációban:
– Min/Max: O(1)
– Beszúrás: O(log n)
– Törlés: O(log n)
Feladat
Feladat
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:
Feladat
Megoldás:
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
Feladat
Hogyan tudjuk megállapítani egy listáról, hogy van e benne kör?
Feladat
Hogyan tudjuk megállapítani egy listáról, hogy van e benne kör?
Kupac
Feladat
A kupac (heap) egy hatékony megvalósítása a prioritási sor absztrakt adatszerkezetnek.
A kupac egy bináris fa, amelynek minden csúcsa legalább akkora, mint gyerekei → maximális elem a gyökérben van
Feladat
A kupac olyan véges elemsokaság, amely rendelkezik az alábbi tulajdonságokkal:
Feladat
Feladat
Egy h magasságú kupacnak legalább (ill. legfeljebb) hány eleme van?
Feladat
Egy h magasságú kupacnak legalább (ill. legfeljebb) hány eleme van?
Legfeljebb Legalább
Feladat
Hol helyezkedhet el a legkisebb elem a maximum-kupacban, ha minden elem különböző?
Feladat
Maximum-kupac-e a 23, 17, 14, 6, 13, 10, 1, 5, 7, 12 sorozat?
Feladat
Maximum-kupac-e a 23, 17, 14, 6, 13, 10, 1, 5, 7, 12 sorozat?
Kitekintő
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein - ÚJ ALGORITMUSOK
Link http://www.informatom.hu/sze/01/LGB_SZ001/Cormen-Lieserson-Rivest-Stein.-.Uj.algoritmusok.pdf