Algoritmusok és Adatszerkezetek I.

Slides:



Advertisements
Hasonló előadás
Sor láncolt ábrázolással
Advertisements

Nevezetes algoritmusok
Adatszerkezetek Az adatokat két fő csoportra oszthatjuk: egyszerű és összetett adatok.  Az egyszerű adatot egy érték jellemez, tovább nem bontható. (szám,
Minimális költségű feszítőfák
Gráfok szélességi bejárása
Csala Péter ANDN #4. 2 Tartalom  C# - ban előre definiált típusok  Változók  Változókkal műveletek  Elágazás  Ciklus.
7. előadás (2005. április 12.) Láncolt lista File kezelés 1.
4. előadás (2005. március 8.) Pointerek Pointer aritmetika
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
A verem működése fpga-n
3. LOGIKAI ADATSZERKEZETEK
Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő:
Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő:
Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő:
Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő:
Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő:
AVL fák.
Fák, bináris fák INFOÉRA Ez így 60 perc.
16. Verem műveletei Kaszab Gábor.
8. előadás Dinamikus memóriakezelés. Mutatók. Láncolt adatszerkezetek.
Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő:
Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék
Gráf szélességi bejárása
Listák, Vermek és Várakozási Sorok. Vermek Def: Egy sajátos lista amelyben minden beszúrási illetve törlési művelet csak a lista egyik végén történik.
Listák, Vermek és Várakozási Sorok
Adatszerkezetek 1. előadás
Egyirányban láncolt lista
Speciális Listák: Sor A sor adatszerkezet olyan speciális lista, amelyet a műveletei definiálnak. 1. ACCESS HEAD 3. POP itt GET-nek nevezzük 5. INJECT.
Készítette: Tóth Ervin
V. Adatszerkezetek, kollekciók
Fák.
Rekordok Dinamikus tárkezelés és pointerek Dinamikusan láncolt listák
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 8. gyakorlat.
A Helyes Zárójelezés Struktogramja
Generics Krizsán Zoltán. Bemutató A.NET 2.0 verziótól. A.NET 2.0 verziótól. Típusparaméter Típusparaméter Más nyelvben ez a template (sablon). Más nyelvben.
Nevezetes algoritmusok: Fa megvalósítása Készítette: Várkonyi Tibor Zoltán.
Egyenesvonalú (lineáris) adatszerkezetek
1 Szélességi Bejárás Györgyi Tamás – GYTNAAI.ELTE 2007 Március 22 Algoritmusok És Adatszerkezetek 2 Gráfalgoritmus S b a d e f h g c.
1 Dijkstra Algoritmusa Györgyi Tamás – GYTNAAI.ELTE 2007 Április 02 Algoritmusok És Adatszerkezetek 2 Gráfalgoritmus S a b c d e
Adatbázisok tervezése, megvalósítása és menedzselése
BINÁRIS FA Definició: A fa olyanösszefüggő gráf, amelyben nincs kör
Sapientia - Erdélyi Magyar TudományEgyetem (EMTE) Csíkszereda IRT-2. kurzus 2. Előadás tartalma 1. Elemi adatok és adatszerkezetek (struktúrák)‏ 2. Az.
Példa kettő-három fa felépítésére - törlés művelet Készítette : Krizsai Petra
Minuet: A Scalable Distributed Multiversion B-Tree Írta: Benjamin Sowell, Wojciech Golab, Mehul A. Shah Feldolgozta: Fokin Miklós, Hodosy Gábor, Tóth Tamás.
Gráfok ábrázolása teljesen láncoltan
Horváth Bettina VZSRA6.  Célja: Az eljárás célja egy véges gráf összes csúcsának bejárása a kezdőcsúcstól való távolságuk szerinti növekvő sorrendben.
Útkeresések.
SZÉLESSÉGI BEJÁRÁS Pap Imre DVX468. A bejárás Meglátogatjuk az első csúcsot, majd ennek a csúcsnak az összes szomszédját. Aztán ezen szomszédok összes.
Bináris kereső fák Itterátorok.
Diszjunkt halmazok adatszerkezete A diszjunkt halmaz adatszerkezet diszjunkt dinamikus halmazok S={S 1,…,S n } halmaza. Egy halmazt egy képviselője azonosít.
Algoritmusok és adatszerkezetek
Gráfalgoritmusok Szélességi bejárás.
Szélességi bejárás Gráf-algoritmusok Algoritmusok és adatszerkezetek II. Gergály Gábor WZBNCH1.
Fájlszervezés Adatbázisok tervezése, megvalósítása és menedzselése.
Prim algoritmus Algoritmusok és adatszerkezetek 2. Újvári Zsuzsanna.
(Bináris) Kupac (heap) adattípus
A verem és a sor adatszerkezet
BFák Kiegyensúlyozott keresőfák
Logikai programozás 6..
Készítette: Révész Lajos Bálint
Dinamikus adatszerkezetek
Algoritmusok és Adatszerkezetek I.
Algoritmusok és Adatszerkezetek I.
Depth First Search Backtracking
Algoritmusok és Adatszerkezetek I.
Algoritmusok és Adatszerkezetek I.
2-3-fák A 2-3-fa egy gyökeres fa az alábbi tulajdonságokkal:
Algoritmusok és Adatszerkezetek I.
Algoritmusok és Adatszerkezetek I.
Előadás másolata:

Algoritmusok és Adatszerkezetek I. Elemi adatszerkezetek 2017. október 3.

Adatszerkezetek

Adatszerkezetek Az adatszerkezet adatok tárolására és szervezésére szolgáló módszer, amely lehetővé teszi a hatékony hozzáférést és módosításokat. Az algoritmushoz válasszunk adatszerkezetet! Sőt van az algoritmus a megfelelő adatszerkezeten alapul.

Absztrakt adatszerkezetek Adatok „dinamikus halmaza” (H) kulcsmező (k) kísérő adatok is társulhatnak hozzá, de ezzel általában nem foglalkozunk Műveletei definiálják az absztrakt adatszerkezetet!

Absztrakt adatszerkezetek Leggyakoribb műveletek: KERES(H,k) BESZÚR(H,k) TÖRÖL(H,k) MIN(H) MAX(H) ELÖZŐ(H,k) KÖV(H,k) módosító műveletek lekérdező műveletek

Adatszerkezetek Minden absztrakt adatszerkezetnek számtalan megvalósítása lehet 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, de megfelelő implementáció megválasztása is kulcs az optimális futásidőhöz!

Lista

Lista – absztrakt adatszerkezet Az adatok lineáris sorrendben követik egymást. Egy kulcs többször is előfordulhat. Műveletei: ÉRTÉK(H,i): p. pozíción (index) a kulcs, ÉRTÉKAD(H,i,k) KERES(H,k): az első k érték pozíciója BESZÚR(H,k, i): i. pozíció után beszúr TÖRÖL(H,k): első k érték törlése

Lista – megvalósítás közvetlen eléréssel 1 2 3 9 16 4 Adatok összefüggő memóriaterületen, minden index közvetlen elérésű, azaz közvetlenül olvasható/írható ÉRTÉK(H,i) O(1) KERES(H,k) O(n)

Lista – megvalósítás közvetlen eléréssel 1 2 3 4 25 9 16 1 2 3 9 16 4 BESZÚR és TÖRÖL esetén változik a méret és át kell mozgatni elemeket! BESZÚR(H,25,0) növeljük/csökkentsük a tömb méretét 1-el? minden beszúrás új memóriaallokáció és másolás n elem beszúrása 1+2+ …+n=O(n2) másolást jelentene…

Lista – megvalósítás közvetlen eléréssel 1 2 3 4 5 6 7 25 9 16 nil 1 2 3 9 16 4 Cél: átméretezés minél ritkábban kelljen! Tömb méret = kapacitás Ha tele van a tömb duplázzuk meg a kapacitást Ha negyedére csökken felezzük meg a kapacitást Így nem kell mindig az egész tömböt másolni

Lista – láncolt listás megvalósítás Minden kulcs mellé mutatókat tárolunk a következő/megelőző elemre (nem feltétlenül vannak egyazon memóriaterületen) Egyszeresen láncolt lista: csak a következő elemre mutat Kétszeresen láncolt lista: minden kulcshoz két mutató, következő és megelőző elemre ciklikus lista: utolsó elemre rákövetkezője az első elem őrszem: egy nil elem ami mindig a lista elejére (fej) mutat

Lista – láncolt listás megvalósítás

Lista – láncolt listás megvalósítás

Lista – megvalósítás közvetlen eléréssel 1 2 3 9 16 4 ÉRTÉK(H,i) O(n) KERES(H,k) O(n) BESZÚR(H,k,i) =ÉRTÉK()+O(1) TÖRÖL(H,k) =ÉRTÉK()+O(1)

Lista megvalósítások Közvetlen elérésű megvalósítás: ÉRTÉK() konstans idejű módosító műveletek lassúak Láncolt listás megvalósítás: módosító műveletek gyorsak sok memória kell a mutatóknak

Lista – JAVA megvalósítások import java.util.*; List<Object> al = new ArrayList<>(); List<Object> ll = new LinkedList<>(); interface ami definiálja a szükséges Lista műveleteket különböző megvalósítások

private static void test_list(List<Object> l) { long t = System private static void test_list(List<Object> l) { long t = System.currentTimeMillis(); for(int i=0;i<100000;++i) l.add(0, i); System.out.println("insert:"+ (System.currentTimeMillis()-t)+"ms"); t=System.currentTimeMillis(); for(int i=0;i<l.size();++i) l.get(i); System.out.println("get:"+ }

test_list(new ArrayList<>()); insert: 1042ms get: 2ms test_list(new LinkedList<>()); insert: 5ms get: 4157ms

Lista megvalósítások Tömböket (int[] a = new int[100000];) is lehet, de csak akkor érdemes használni ha fix a méret Általában ArrayList gyorsabb és kevesebb memóriát igényel DE ha a módosító műveletek vannak többségben válasszuk a LinkedList-et!

Iterátorok Az iterátor egy mutató az adatszerkezet egy elemére. Lista esetében előre(hátra) léptethetjük. JAVA: List<String> list = new ArrayList<>(); Iterator<String> i = list.iterator(); while(i.hasNext()){ i.next(); } vagy összes elem bejárása: for(String s : list) s="hi";

Verem és Sor

Verem(Stack) és Sor (Queue) Olyan listák ahol a beszúrás és törlés csak meghatározott pozícióban történhet. Verem: legutoljára beszúrt elemet vehetjük csak ki (last-in, first-out = LIFO) Sor: legrégebbi elemet vehetjük csak ki (first-in, first-out = FIFO) Speciális műveletigény miatt hatékonyabb (spec) megvalósítások!

Verem(Stack) és Sor (Queue)

Verem alkalmazások Fordítsunk meg egy szót: alga → agla

Verem Megvalósítás fix méretű tömbbel

Verem O(1)

Sor alkalmazások

Sor

Sor O(1)

Prioritási Sor

Prioritási (elsőbbségi) sor Kulcsok érkezése sorrendje lényegtelen mindig maximális (minimális) elemet akarjuk kivenni Műveletek: BESZÚR(H,k) MAX(H) KIVESZ-MAX(H)

Prioritási sor hatékony megvalósítása 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

Kupac https://visualgo.net/en/heap

Kupac tömbös megvalósítása

Kupactulajdonság fenntartása

Kupactulajdonság fenntartása Mester 2.

Prioritási sor O(logn)

Prioritási sor – kivesz max Forrás: www.tutorialspoint.com

Prioritási sor beszúrás Szúrjuk be levelet (tömb végére) Szülővel való cserével emeljük a helyére a levelet O(logn) a kupac magassága logn

Prioritási sor kupac megvalósítással BESZÚR(H,k) O(logn) MAX(H) Θ(1) KIVESZ-MAX(H) O(logn) O(log n)

Stack<Integer> s = new Stack<>(); s. push(4);s. push(3);s Stack<Integer> s = new Stack<>(); s.push(4);s.push(3);s.push(5); while(!s.isEmpty()) System.out.print(s.pop()+" "); Queue<Integer> q = new ArrayDeque<>(); q.add(4);q.add(3);q.add(5); while(!q.isEmpty()) System.out.print(q.poll()+" "); PriorityQueue<Integer> pq = new PriorityQueue<>(); pq.add(4);pq.add(3);pq.add(5); while(!pq.isEmpty()) System.out.print(pq.poll()+" ");

Minden programozási nyelven megvalósítottak!!! Java C++ std:: C# python Scala Közvetlen elérésű lista ArrayList vector List -- ArrayBuffer Láncolt lista LinkedList list deque Verem Stack stack list.pop() Sor ArrayDeque queue Queue queue. LifoQueue Prioritási sor PriorityQueue priority_queue SortedList

Összegzés Absztrakt adatszerkezet megválasztása az algoritmus fontos építőeleme Algoritmus igényei szerint a különböző megvalósítások közül válasszunk! lista, sor, verem, prioritási sor (kupac)