Einführung Elementare Datenstrukturen. Der Konstruktor muß den Listenkopf head erzeugen. Der Vorgänger und Nachfolger von head ist head selbst.



Ähnliche Dokumente
Einführung Elementare Datenstrukturen. Der Konstruktor muß den Listenkopf head erzeugen. Der Vorgänger und Nachfolger von head ist head selbst.

Java. Wir verwenden oft Java für Datenstrukturen und Algorithmen. Die Vorlesung ist aber von der Programmiersprache unabhängig.

Java. public D find(k k) { Listnode K, D n = findnode(k); if(n == null) return null; return n.data; Java

Übung Algorithmen und Datenstrukturen

Übersicht. Einfache Suche. Hashing Skip-Lists Mengen Sortieren Order-Statistics. 2 Suchen und Sortieren

13. Dynamische Datenstrukturen

9. Natürliche Suchbäume

Datenstrukturen sind neben Algorithmen weitere wichtige Bausteine in der Informatik

18. Natürliche Suchbäume

Suchen und Sortieren Sortieren. Mergesort

18. Natürliche Suchbäume

12. Dynamische Datenstrukturen

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2014 / Vorlesung 10, Donnerstag 8.

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (07 - Skiplisten) Prof. Dr. Susanne Albers

Übung Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2013 / Vorlesung 10, Donnerstag 9.

16. Dynamische Datenstrukturen

Anwendungsbeispiel MinHeap

Stacks, Queues & Bags. Datenstrukturen. Pushdown/Popup Stack. Ferd van Odenhoven. 19. September 2012

Graphalgorithmen Minimale Spannbäume. Kruskal: Minimaler Spannbaum

5.3 Doppelt verkettete Listen

Übung Algorithmen und Datenstrukturen

In vergleichsbasierten Suchbäumen wird nicht in Schlüssel hineingeschaut.

Vorlesung Datenstrukturen

Übung Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Algorithmen und Programmierung III

9. Rekursion. 1 falls n 1 n (n 1)!, andernfalls. Experiment: Die Türme von Hanoi. Links Mitte Rechts. Mathematische Rekursion

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2)

Umstrukturierung durch Rotationen

Einführung in die Objektorientierte Programmierung Vorlesung 18: Lineare Datenstrukturen. Sebastian Küpper

elementare Datenstrukturen

Geordnete Binärbäume

Informatik II Prüfungsvorbereitungskurs

Suchen und Sortieren Sortieren. Heaps

Übersicht. Datenstrukturen und Algorithmen Vorlesung 5: Rekursionsgleichungen (K4) Übersicht. Binäre Suche. Joost-Pieter Katoen. 20.

ALP II Dynamische Datenmengen Datenabstraktion

7. Verkettete Strukturen: Listen

Übersicht. Einfache Suche Binäre Suchbäume Hashing Skip-Lists Mengen Sortieren Order-Statistics. 2 Suchen und Sortieren

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

AVL-Bäume Analyse. Theorem Ein AVL-Baum der Höhe h besitzt zwischen F h und 2 h 1 viele Knoten. Definition Wir definieren die nte Fibonaccizahl:

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Suchen und Sortieren

Schnittstellen, Stack und Queue

Algorithmen und Datenstrukturen

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Überblick. Rekursive Methoden. Backtracking. Memorization. Einfache rekursive Datenstrukturen. Aufzählen, Untermengen, Permutationen, Bitmengen

Vereinfachen wir diese Rekursionsgleichung zunächst: E ˆT n = 1 n. = 1 n

Abgabe: (vor der Vorlesung) Aufgabe 3.1 (P) Master-Theorem

1 of :17:14

Kapitel 10. Komplexität von Algorithmen und Sortieralgorithmen

Abstrakter Datentyp (ADT): Besteht aus einer Menge von Objekten, sowie Operationen, die auf diesen Objekten wirken.

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Verkettete Datenstrukturen: Listen

13. Bäume: effektives Suchen und Sortieren

Ordnung im Materiallager: Datenstrukturen II. Suchen und Sortieren im Array Verkettete Listen Rekursion

Bipartites Matching. Gegeben: Ein bipartiter, ungerichteter Graph (V 1, V 2, E). Gesucht: Ein Matching (Paarung) maximaler Kardinalität.

13. Bäume: effektives Suchen und Sortieren

Beispiellösung zur Klausur AI2 im Sommersemester 2007

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Informatik II, SS 2014

Einführung in die Programmierung Vorlesungsprüfung

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Kapitel 12: Induktive

Bäume. Text. Prof. Dr. Margarita Esponda SS 2012 O4 O5 O6 O ALP2-Vorlesung, M. Esponda

Teil 6: Algorithmen und Datenstrukturen 6.3 Suchalgorithmen Prof. Dr. Max Mühlhäuser FG Telekooperation TU-Darmstadt

1 Abstrakte Datentypen

Tutoraufgabe 1 (Implementierung eines ADTs):

Abstract Data Structures

Range-Search. Operationen: Welche Datenstrukturen sind geeignet? Arrays? Listen? AVL-Bäume? Splay-Bäume?

Kapitel 5: Iterierbare Container

Informatik II Vorlesung am D-BAUG der ETH Zürich

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

3. Übungsbesprechung Programmkonstruktion

Grundlagen der Informatik / Algorithmen und Datenstrukturen. Aufgabe 132

(06 - Anwendungen von Stapeln und Schlangen)

Informatik II, SS 2018

11. Elementare Datenstrukturen

Spezielle Datenstrukturen

Abstract Data Structures

Technische Universität München WiSe 2018/19 Fakultät für Informatik Übungsblatt 6 Dr. Ch. Herzog 26. November 2018

Algorithmen und Datenstrukturen 2. Stefan Florian Palkovits, BSc Juni 2016

ALP II Dynamische Datenmengen

Suchen und Sortieren Binäre Suchbäume

4.4.1 Implementierung vollständiger Bäume mit Feldern. Reguläre Struktur: Nachfolger des Knoten i sind die Knoten 2*i und 2*i+1.

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Rechtsbelehrung. Java und OOP Das Buch Christian Silberbauer 144

3 Dynamische Datenstrukturen

Bäume. Prof. Dr. Christian Böhm. in Zusammenarbeit mit Gefei Zhang. WS 07/08

Informatik II - Tutorium 12

Transkript:

Einführung Elementare Datenstrukturen (Folie 38, Seite 23 im Skript) Der Konstruktor muß den Listenkopf head erzeugen. Der Vorgänger und Nachfolger von head ist head selbst.

Einführung Elementare Datenstrukturen (Folie 38, Seite 23 im Skript) Der Konstruktor muß den Listenkopf head erzeugen. Der Vorgänger und Nachfolger von head ist head selbst. Java public class ADList K, D extends AbstractMap K, D { private Listnode K, D head; public ADList() { head = new Listnode K, D (null, null); head.pred = head; head.succ = head; }

Einführung Elementare Datenstrukturen (Folie 39, Seite 23 im Skript) Java public class Listnode K, D { K key; D data; Listnode K, D pred, succ; Listnode(K k, D d) { key = k; data = d; pred = null; succ = null; } void delete() { pred.succ = succ; succ.pred = pred; } void copy(listnode K, D n) { key = n.key; data = n.data; } void append(listnode K, D newnode) { newnode.succ = succ; newnode.pred = this; succ.pred = newnode; succ = newnode; }

Einführung Elementare Datenstrukturen (Folie 40, Seite 23 im Skript) Java Java Java public void append(k k, D d) { head.pred.append(new Listnode K, D (k, d)); } public void prepend(k k, D d) { head.append(new Listnode K, D (k, d)); } public void delete(k k) { Listnode K, D n = findnode(k); if(n null) n.delete(); }

Einführung Elementare Datenstrukturen (Folie 41, Seite 23 im Skript) Java Java public D find(k k) { Listnode K, D n = findnode(k); if(n == null) return null; return n.data; } protected Listnode K, D findnode(k k) { Listnode K, D n; head.key = k; for(n = head.succ;!n.key.equals(k); n = n.succ) { } head.key = null; if(n == head) return null; return n; }

Einführung Elementare Datenstrukturen Einfach verkettete Listen (Folie 42, Seite 24 im Skript) Kein Zeiger auf Vorgänger Einfachere Datenstruktur Operationen können komplizierter sein Frage: Wie kann ein Element vor einen gegebenen Knoten eingefügt werden? Ersetzen und alten Knoten anfügen! Vorsicht: Eine gefährliche Technik.

Einführung Elementare Datenstrukturen Einfach verkettete Listen (Folie 42, Seite 24 im Skript) Kein Zeiger auf Vorgänger Einfachere Datenstruktur Operationen können komplizierter sein Frage: Wie kann ein Element vor einen gegebenen Knoten eingefügt werden? Ersetzen und alten Knoten anfügen! Vorsicht: Eine gefährliche Technik.

Einführung Elementare Datenstrukturen Listen Laufzeit (Folie 43, Seite 25 im Skript) Manche Operation sind schnell, manche langsam... Operation Laufzeit append() Θ(1) delete() Θ(1) delete() Θ(n) find() Θ(n) insert() Θ(n) direktes Löschen eines Knotens, nicht über Schlüssel

Einführung Elementare Datenstrukturen (Folie 44, Seite 27 im Skript) Java public class Stack D { private ADList Object, D stack; private int size; public Stack() { stack = new ADList Object, D (); size = 0; } public boolean isempty() { return size == 0; } public D pop() { D x = stack.firstnode().getdata(); stack.firstnode().delete(); size ; return x; } public void push(d x) { stack.prepend(null, x); size++; } public int size() { return size; } }

Einführung Elementare Datenstrukturen (Folie 45, Seite 27 im Skript) Java public class Queue D { private ADList Object, D queue; private int size; public Queue() { queue = new ADList Object, D (); size = 0; } public D dequeue() { D x = queue.lastnode().getdata(); queue.lastnode().delete(); size ; return x; } public void enqueue(d x) { queue.prepend(null, x); size++; } public int size() { return size; } }

Übersicht 1 Einführung 2 3 Graphalgorithmen 4 Algorithmische Geometrie 5 Textalgorithmen 6 Paradigmen

Übersicht 2 Binäre Suchbäume Hashing Skip-Lists Mengen Sortieren Order-Statistics

Lineare Suche (Folie 46, Seite 30 im Skript) Wir suchen x im Array a[0,..., n 1] Algorithmus function find1(int x) boolean : for i = 0 to n 1 do if x = a[i] then return true fi od; return false Die innere Schleife ist langsam.

Lineare Suche verbessert (Folie 47, Seite 31 im Skript) Wir verwenden ein Sentinel-Element am Ende. Das Element a[n] muß existieren und unbenutzt sein. Algorithmus function find2(int x) boolean : i := 0; a[n] := x; while a[i] x do i := i + 1 od; return i < n Die innere Schleife ist sehr schnell.

Lineare Suche ohne zusätzlichen Platz (Folie 48, Seite 31 im Skript) Algorithmus function find3(int x) boolean : if x = a[n 1] then return true fi; temp := a[n 1]; a[n 1] := x; i := 0; while a[i] x do i := i + 1 od; a[n 1] := temp; return i < n 1 Erheblicher Zusatzaufwand. Innere Schleife immer noch sehr schnell.

Lineare Suche Analyse (Folie 49, Seite 32 im Skript) Wieviele Vergleiche benötigt eine erfolgreiche Suche nach x im Mittel? Wir nehmen an, daß jedes der n Elemente mit gleicher Wahrscheinlichkeit gesucht wird. Es gilt Pr[x = a[i]] = 1/n für i {0,..., n 1}. Sei C die Anzahl der Vergleiche: C = i + 1 gdw. x = a[i]

Lineare Suche Analyse (Folie 49, Seite 32 im Skript) Wieviele Vergleiche benötigt eine erfolgreiche Suche nach x im Mittel? Wir nehmen an, daß jedes der n Elemente mit gleicher Wahrscheinlichkeit gesucht wird. Es gilt Pr[x = a[i]] = 1/n für i {0,..., n 1}. Sei C die Anzahl der Vergleiche: C = i + 1 gdw. x = a[i]

Lineare Suche Analyse (Folie 50, Seite 32 im Skript) Wir suchen den Erwartungswert von C. Pr[C = i] = 1/n für i = 1,..., n E(C) = n k Pr[C = k] = k=1 Es sind im Mittel (n + 1)/2 Vergleiche. n k=1 k n = n + 1 2

Lineare Suche Analyse (Folie 50, Seite 32 im Skript) Wir suchen den Erwartungswert von C. Pr[C = i] = 1/n für i = 1,..., n E(C) = n k Pr[C = k] = k=1 Es sind im Mittel (n + 1)/2 Vergleiche. n k=1 k n = n + 1 2

Lineare Suche Analyse (Folie 51, Seite 32 im Skript) Unser Ergebnis: Es sind im Mittel (n + 1)/2 Vergleiche. Ist das Ergebnis richtig? Wir überprüfen das Ergebnis für kleine n. n = 1? n = 2?

Lineare Suche Analyse (Folie 51, Seite 32 im Skript) Unser Ergebnis: Es sind im Mittel (n + 1)/2 Vergleiche. Ist das Ergebnis richtig? Wir überprüfen das Ergebnis für kleine n. n = 1? n = 2?

Binäre Suche (Folie 52, Seite 33 im Skript) Wir suchen wieder x in a[0,..., n 1]. Algorithmus function binsearch(int x) boolean : l := 0; r := n 1; while l r do m := (l + r)/2 ; if a[m] < x then l := m + 1 fi; if a[m] > x then r := m 1 fi; if a[m] = x then return true fi od; return false Wir halbieren den Suchraum in jedem Durchlauf.

Binäre Suche (Folie 53, Seite 33 im Skript) Java static public boolean binsearch(int x, int[ ] a) { int l = 0, r = a.length 1, m, c; while(l r) { m = (l + r)/2; if(x == a[m]) return true; if(x < a[m]) r = m 1; else l = m + 1; } return false; }

Binäre Suche Analyse (Folie 54, Seite 33 im Skript) Java function binsearch(int x) boolean : l := 0; r := n 1; while l r do m := (l + r)/2 ; if a[m] > x then l := m + 1 fi; if a[m] < x then r := m 1 fi; if a[m] = x then return true fi od; return false Es sei n = r l + 1 die Größe des aktuellen Unterarrays. Im nächsten Durchgang ist die Größe m l oder r m.

Binäre Suche Analyse (Folie 55, Seite 34 im Skript) Lemma Es sei a R und n N. Dann gilt 1 a + n = a + n 2 a + n = a + n 3 a = a

Binäre Suche Analyse (Folie 56, Seite 34 im Skript) Im nächsten Durchlauf ist die Größe des Arrays m l oder r m. Hierbei ist m = (l + r)/2. Die neue Größe ist also m l = (l + r)/2 l = (r l)/2 = (n 1)/2 oder r m = r (l + r)/2 = (r l)/2 = (n 1)/2. Im schlimmsten Fall ist die neue Größe des Arrays (n 1)/2.

Rekursionsgleichung für binäre Suche (Folie 57, Seite 34 im Skript) Sei S n die Anzahl der Schleifendurchläufe im schlimmsten Fall bei einer erfolglosen Suche. Wir erhalten die Rekursionsgleichung { 0 falls n < 1, S n = 1 + S (n 1)/2 falls n 1. Die ersten Werte sind: n 0 1 2 3 4 5 6 7 8 S n 0 1 2 2 3 3 3 3 4 Wir suchen eine geschlossene Formel für S n.

Rekursionsgleichung für binäre Suche (Folie 57, Seite 34 im Skript) Sei S n die Anzahl der Schleifendurchläufe im schlimmsten Fall bei einer erfolglosen Suche. Wir erhalten die Rekursionsgleichung { 0 falls n < 1, S n = 1 + S (n 1)/2 falls n 1. Die ersten Werte sind: n 0 1 2 3 4 5 6 7 8 S n 0 1 2 2 3 3 3 3 4 Wir suchen eine geschlossene Formel für S n.

Lösen der Rekursionsgleichung (Folie 58, Seite 34 im Skript) Wir betrachten den Spezialfall n = 2 k 1: (2 k 1) 1 2 k 2 = = 2 k 1 1 = 2 k 1 1. 2 2 Daher: S 2 k 1 = 1 + S 2 k 1 1 für k 1 S 2 k 1 = k + S 2 0 1 = k

Lösen der Rekursionsgleichung (Folie 58, Seite 34 im Skript) Wir betrachten den Spezialfall n = 2 k 1: (2 k 1) 1 2 k 2 = = 2 k 1 1 = 2 k 1 1. 2 2 Daher: S 2 k 1 = 1 + S 2 k 1 1 für k 1 S 2 k 1 = k + S 2 0 1 = k

Lösen der Rekursionsgleichung (Folie 58, Seite 34 im Skript) Wir betrachten den Spezialfall n = 2 k 1: (2 k 1) 1 2 k 2 = = 2 k 1 1 = 2 k 1 1. 2 2 Daher: S 2 k 1 = 1 + S 2 k 1 1 für k 1 S 2 k 1 = k + S 2 0 1 = k

Binäre Suche Analyse (Folie 59, Seite 35 im Skript) n 0 1 2 3 4 5 6 7 8 S n 0 1 2 2 3 3 3 3 4 Vermutung: S 2 k = S 2 k 1 + 1 S n steigt monoton S n = k, falls 2 k 1 n < 2 k. Oder falls k 1 log n < k. Dann wäre S n = log n + 1.

Binäre Suche Analyse (Folie 59, Seite 35 im Skript) n 0 1 2 3 4 5 6 7 8 S n 0 1 2 2 3 3 3 3 4 Vermutung: S 2 k = S 2 k 1 + 1 S n steigt monoton S n = k, falls 2 k 1 n < 2 k. Oder falls k 1 log n < k. Dann wäre S n = log n + 1.

Binäre Suche Analyse (Folie 59, Seite 35 im Skript) n 0 1 2 3 4 5 6 7 8 S n 0 1 2 2 3 3 3 3 4 Vermutung: S 2 k = S 2 k 1 + 1 S n steigt monoton S n = k, falls 2 k 1 n < 2 k. Oder falls k 1 log n < k. Dann wäre S n = log n + 1.

Binäre Suche Analyse (Folie 60, Seite 35 im Skript) Wir vermuten S n = log n + 1 für n 1. Induktion über n: S 1 = 1 = log 1 + 1 n > 1: Noch zu zeigen: S n = 1 + S (n 1)/2 I.V. = 1 + log (n 1)/2 + 1. log n = log (n 1)/2 + 1 Übungsaufgabe.

Binäre Suche Analyse (Folie 60, Seite 35 im Skript) Wir vermuten S n = log n + 1 für n 1. Induktion über n: S 1 = 1 = log 1 + 1 n > 1: Noch zu zeigen: S n = 1 + S (n 1)/2 I.V. = 1 + log (n 1)/2 + 1. log n = log (n 1)/2 + 1 Übungsaufgabe.

Binäre Suche Analyse (Folie 60, Seite 35 im Skript) Wir vermuten S n = log n + 1 für n 1. Induktion über n: S 1 = 1 = log 1 + 1 n > 1: Noch zu zeigen: S n = 1 + S (n 1)/2 I.V. = 1 + log (n 1)/2 + 1. log n = log (n 1)/2 + 1 Übungsaufgabe.

Binäre Suche Analyse (Folie 60, Seite 35 im Skript) Wir vermuten S n = log n + 1 für n 1. Induktion über n: S 1 = 1 = log 1 + 1 n > 1: Noch zu zeigen: S n = 1 + S (n 1)/2 I.V. = 1 + log (n 1)/2 + 1. log n = log (n 1)/2 + 1 Übungsaufgabe.

Binäre Suche Analyse (Folie 60, Seite 35 im Skript) Wir vermuten S n = log n + 1 für n 1. Induktion über n: S 1 = 1 = log 1 + 1 n > 1: Noch zu zeigen: S n = 1 + S (n 1)/2 I.V. = 1 + log (n 1)/2 + 1. log n = log (n 1)/2 + 1 Übungsaufgabe.

Binäre Suche Analyse (Folie 61, Seite 35 im Skript) Theorem Binäre Suche benötigt im schlimmsten Fall genau viele Vergleiche. Die Laufzeit ist O(log n). log n + 1 = log(n) + O(1)