Kapitel 2: Datenstrukturen

Slides:



Advertisements
Ähnliche Präsentationen
Randomisierte Algorithmen Präfix Suche und Konsistentes Hashing
Advertisements

Man bestimme den „minimalen aufspannenden Baum“ des Graphen.
Eine dynamische Menge, die diese Operationen unterstützt,
Minimum Spanning Tree: MST
Prof. Dr. S. Albers Prof.Dr.Th Ottmann
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Sortieren I - Bubblesort -
Claudio Moraga; Gisbert Dittrich
GIN2 – 2. Vorlesung, SS04 Prof. Dr. Wolfram Conen
7. Natürliche Binärbäume
Durchlaufen eines Binärbaumes
Kapitel 5. Stacks und Queues
Kapitel 3: Listen Lineare Liste: endliche Folge von Elementen eines Grundtyps (n>=0), leere Liste falls n=0 Listenelemente besitzen.
Synonyme: Stapel, Keller, LIFO-Liste usw.
Gliederung Motivation / Grundlagen Sortierverfahren
Sortieren mit Binären Bäumen
Sortierverfahren Richard Göbel.
WS Algorithmentheorie 13 - Kürzeste (billigste) Wege Prof. Dr. Th. Ottmann.
WS Algorithmentheorie 05 - Treaps Prof. Dr. Th. Ottmann.
Algorithmen und Datenstrukturen
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (25 – Fibonacci-Heaps – Analyse) T. Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (13 – Offenes Hashing) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (10 - Suchverfahren) T. Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (19 - Analyse natürlicher Bäume) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (24 – Fibonacci-Heaps) T. Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (17 – Bäume: Grundlagen und natürliche Suchbäume) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (18 - Bäume: Durchlaufreihenfolgen, Analyse nat. Bäume) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (21 – Kürzeste Wege) T. Lauer.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (17 – Fibonacci-Heaps – Analyse) Tobias Lauer.
WS Algorithmentheorie 15 – Fibonacci-Heaps Tobias Lauer.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (17 – Fibonacci-Heaps) Tobias Lauer.
WS Algorithmentheorie 15 – Fibonacci-Heaps Tobias Lauer.
WS03/041 Binomial Queues Prof. Dr. S. Albers Prof.Dr.Th Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 12 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Diskrete Mathematik I Vorlesung 6 Binärer Suchbaum II.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
Heaps und Priority Queues
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
7.1 Externes Suchen Bisherige Algorithmen: geeignet, wenn alle Daten im Hauptspeicher. Große Datenmengen: oft auf externen Speichermedien, z.B. Festplatte.
Splay Trees Von Projdakov Benjamin.
Eine Implementierung einer effiziente externe geordnete (!) lineare Liste Operationen: Search(x) Insert(x) Delete(x)
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Effiziente Algorithmen
Diskrete Mathematik II
Effiziente Algorithmen
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Information und Kommunikation
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Kapitel 5: Von Datenstrukturen zu Abstrakten Datentypen
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Thomas Hilpold: Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger.
Kapitel 6: Suchbäume und weitere Sortierverfahren
SWE1 / Übung 10 ( ) Rekursion Binärbäume.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Algorithmen und Datenstrukturen 1 SS 2002
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik II Vorlesung Datenstrukturen für den Algorithmus von.
Binärer Suchbaum IV AVL-Baum I
Binärer Baum, Binärer Suchbaum I
Institut für Kartographie und Geoinformation Diskrete Mathematik I Vorlesung Binärer Suchbaum I-
Diskrete Mathematik I Vorlesung 7 Binärer Suchbaum III.
Binärbäume.
 Präsentation transkript:

Kapitel 2: Datenstrukturen ACM ICPC Praktikum Kapitel 2: Datenstrukturen

Übersicht Stacks Queues Dictionaries Priority Queues Mengen

Stack Operationen: Init(s): erzeuge leeren Stack s Push(x,s): packe x auf Stack s Pop(s): entferne oberstes Element von s Empty(s): testet, ob Stack s leer ist

Stack ganzer Zahlen Implementierung als Array: s[0] s[1] s[2] s[3] Größe (anfangs 0) Push(x): s[0] = s[0]+1; s[s[0]] = x; Pop(): if (s[0]==0) return -1; s[0] = s[0]-1; return s[s[0]+1];

Stack ganzer Zahlen Implementierung als Pointer-Struktur: s class stackel { int zahl; stackel *nachf; }; stackel *s = NULL; Push(x): q = new stackel; q->zahl = x; q->nachf = s; s = q; Pop(): if (s==NULL) return s; q = s; s = s->nachf; return(q);

Queue Operationen: . . . . . Init(q): erzeugt eine leere Queue q Enqueue(x,q): hängt x hinten an Queue q an Dequeue(q): gibt Element vorne in der Queue zurück Empty(q): testet, ob Queue q leer ist

Queue ganzer Zahlen Implementierung als Array: ….. q[0] q[1] q[2] q[3] q[N-1] Anfang Ende class queue { int q[N]; int Anfang; int Ende; }; q = new queue; q->Anfang=q->Ende=0; Enqueue(x): Ende=(Ende+1)%N; q[Ende]=x; Dequeue(): if (Anfang == Ende) return -1; Anfang=(Anfang+1)%N; return(q[Anfang]);

Queue ganzer Zahlen Implementierung als Pointer-Struktur: Anfang (anfangs NULL) Ende (anfangs NULL) class queueel { int zahl; queueel *nachf; }; class queue { queueel *Anfang; queueel *Ende; }; q = new queue; Enqueue(x): p = new queueel; p->zahl=x; p->nachf=NULL; if (Anfang==NULL) Anfang=Ende=p; else {Ende->nachf=p; Ende = p; } Dequeue(): if (Anfang == NULL) return NULL; p = Anfang; Anfang=Anfang->nachf; if (Anfang == NULL) Ende=NULL; return p;

Dictionary Operationen: Insert(x,d): füge x in das Dictionary d ein 1 15 28 37 57 82 93 Operationen: Insert(x,d): füge x in das Dictionary d ein Delete(x,d): lösche x (Eintrag oder Schlüssel) vom Dictionary d Search(k,d): suche nach Eintrag mit Schlüssel k in d

Dictionary Implementierung als ungeordnete Liste: liste dummy class listel { int zahl; listel *nachf; }; liste = new listel; // dummy Element liste->nachf=NULL; Insert(x): q = new listel; q->zahl=x; q->nachf = liste->nachf; liste->nachf = q; Delete(k): if (liste->nachf==NULL) return NULL; q=liste; while (q->nachf!=NULL) { if (q->nachf->zahl==k) q->nachf=q->nachf->nachf; else q=q->nachf; }

Dictionary Implementierung als Hashtabelle: ……. H[s-1] 1 15 57 p: genügend große Primzahl (> Anzahl Elemente) H: Tabelle mit Pointern auf ungeordnete Listen h: Hashfunktion, h(x) = ((a¢x+b) mod p) mod s, p prim Regel: Element x in Liste H[h(x)]

Dictionary Implementierung als Splay-Baum: 25 Splay-Baum: binärer Suchbaum Binärer Suchbaum: Für jeden Knoten v gilt: Anzahl Kinder <= 2 Schlüssel im linken Teilbaum <= Schlüssel(v) <= Schlüssel im rechten Teilbaum 12 34 3 17 52 15 21

Dictionary Implementierung als Splay-Baum: root 25 class node { int zahl; node *father; node *lson, *rson; }; Search(k): v := root; while (v!=NULL && v->zahl!=k) { if (v->zahl>k) v=v->lson; else v=v->rson; return v; 12 34 3 17 52 15 21

Splay-Baum Insert und Delete wie Search Balancierung des Suchbaums pro Search-Operation: momentaner Knoten ist x (1) x ist Kind der Wurzel y x x y C A B C A B Fall x rechts von y analog

Splay-Baum (2) x hat Vater und Großvater rechts (bzw. links) z x y y x Fall x rechts von y und y rechts von z analog

Splay-Baum (3) x hat Vater links und Großvater rechts z x y z x y Fall x hat Vater rechts und Großvater links analog

Priority Queue Operationen: . . . . . 3 7 22 25 74 83 Init(q): erzeugt eine leere Priority Queue q Insert(x,q): fügt x in die Priority Queue q ein Minimum(q): gibt kleinsten Schlüssel zurück ExtractMin(q): gibt kleinsten Schlüssel zurück und löscht ihn Empty(q): testet, ob Priority Queue q leer ist Merge(q, p): verschmelze q und p zu einer Priority Queue

Priority Queue Implementierung als Array: a[1] a[2] a[3] a[4] a[5] Regeln: bei n Einträgen sind Positionen a[0] bis a[n] besetzt für alle i gilt a[i] <= min{a[2i],a[2i+1]} (Heap-Eigenschaft) Dadurch ist minimaler Schlüssel immer an der Wurzel. Minimum(q) ist also einfach.

Priority Queue a[1] a[2] a[3] a[7] a[4] a[5] a[6] neu Insert(x): size=size+1; a[size]=x; i = size; while (i!=0 && a[i/2]>a[i]) { t=a[i]; a[i]=a[i/2]; a[i/2]=I; i=i/2; } ExtractMin(): if (size==0) return -1; x=a[1]; a[1]=a[size]; size--; while (i<size) { if (size==2i && a[2i]<a[i]) {a[2i]<->a[i]; i=2i;} if (size>2i && min(a[2i],a[2i+1])<a[i]) { j = argmin(2i,2i+1); a[j]<->a[i]; i=j; } } return x; a[1] a[2] a[3] a[7] a[4] a[5] a[6] neu size: Anzahl Einträge min(x,y): gibt min{x,y} zurück argmin(i,j): gibt k 2 {i,j} mit a[k]=min{a[i],a[j]} zurück

Priority Queue Merge-Operation teuer bei Heap Bessere DS: Binomial-Queue (wird evtl. in Vorlesung vorgestellt, siehe auch das Skript von „Effiziente Algorithmen und Datenstrukturen I“)

Mengen 7 74 83 3 25 22 Operationen: Member(x,S): testet, ob x ein Mitglied von S ist Union(A,B): gibt die Vereinigung von A und B zurück Intersection(A,B): gibt den Schnitt von A und B zurück Insert/Delete(x,S): füge x in S ein / lösche x aus S

Mengen Implementierung als Array: Implementierung als Hashtabelle: ähnlich zu Dictionary Implementierung als Suchbaum: ähnlich zu Dictionary …………… 1 1 1 in Menge nicht in Menge

Mengen Operationen: - Union(A,B): gibt A [ B zurück - Find(x): liefert Menge A von Element x Implementierung als Baum: Menge identifiziert duch Wurzel des Baums r B A x Find(x): biege Zeiger von x und Vorfahren auf r, gib r aus Union(A,B): füge Zeiger von A nach B hinzu, gib B aus

Knobelaufgabe Crypt Kicker (UVa 843): Eingabe: 6 and dick jane puff spot yertle bjvg xsb hxsn xsb qymm xsb rqat xsb pnetfn Ausgabe: dick and jane and puff and spot and yertle

Knobelaufgabe Yahtzee (UVa 10149): Finde Zuordnung von 13 Würfelrunden auf 13 Optionen im Yahtzee-Spiel, die eine maximale Punktzahl ergibt. Eingabe (zum Beispiel): 13-mal 12345 Ausgabe: 1 2 3 4 5 0 15 0 0 0 25 35 0 0 90