Datenstrukturen Zusammenfassung der zweiten Hälfte der Vorlesung Sommersemester 2010 Isolde Adler Ankündigung Zusammenfassung 2. Teil Seminar-Ankündigung • WS 2010/11: BSc-Seminar zu aktuellen Themen der theoretischen Informatik: Perlen der theoretischen Informatik“ (ATThI-BS) ” • Für Studierende mit besonderem Interesse an theoretischer Informatik. • in Vorträgen werden Highlights der theoretischen Informatik vorgestellt • Ziele: Kenntnis zentraler und aktueller Methoden und Verfahren der theoretischen Informatik, Einübung von Literatursuche und -analyse, Präsentationstechniken • Anmeldung bis Donnerstag, 15.7.2010 im LSF Isolde Adler Datenstrukturen 2010 2/15 Ankündigung Zusammenfassung 2. Teil Ablauf der Klausur • Bitte tragen Sie sich (falls noch nicht geschehen) in die Listen ein • Seien Sie zur Klausur spätestens um 9:00 da. • Außer einem dokumentenechten Schreibstift sind keine weiteren Hilfsmittel zugelassen. (Insbesondere: Kein Vorlesungsskript, keine mitgebrachten Notizen, kein von Ihnen mitgebrachtes Papier, kein Taschenrechner, kein Handy. Bitte beachten Sie, dass ein während der Klausur eingeschaltetes Handy als Betrugsversuch gewertet wird.) • Schreibpapier wird von uns bereitgestellt. • Die Sitzordnung wird von uns festgelegt und kurz vor Beginn der Klausur bekanntgegeben. Checkliste – zur Klausur müssen Sie mitbringen: • einen dokumentenechten Schreibstift • einen gültigen Lichtbildausweis (z.B. Ihre Goethe-Card oder Ihren Personalausweis) • Ihren Studierendenausweis (... es sei denn, Sie sind als Schülerstudent für die Veranstaltung angemeldet) Isolde Adler Datenstrukturen 2010 3/15 Ankündigung Zusammenfassung 2. Teil Zur Vorbereitung der Klausur • Der Stoff bis einschließlich der Vorlesung am 29.6. ist klausurrelevant. • Wiederholen Sie die einfachen Übungsaufgaben. • Lernen Sie auf jeden Fall die Definitionen der behandelten Datenstrukturen auswendig. • Nutzen Sie auch das Logbuch auf der Webseite für einen Überblick über die Themen • Machen Sie sich einen Spickzettel – bringen sie ihn aber nicht mit in die Klausur. • Lernen Sie auch in kleinen Gruppen: stellen Sie sich gegenseitig Klausuraufgaben! Repititorium vor der Nachklausur: Fr, 24.9.2010 und Mo, 27.9.2010 10:00-12:00 und 13:30-15:30, Magnus-Hörsaal. Isolde Adler Datenstrukturen 2010 4/15 Ankündigung Zusammenfassung 2. Teil Zweiter Teil der Vorlesung Was ist wichtig? Isolde Adler Datenstrukturen 2010 5/15 Ankündigung Zusammenfassung 2. Teil Der abstrakter Datentyp Wörterbuch“ ” Operationen: insert(x), remove(x) und lookup(x). Binäre Suchbäume: • speichern die Schlüssel in den Knoten eines Binärbaums. • Wesentlich: die binäre Suchbaumordnung: alle im linken Teilbaum eines Knoten v gespeicherten Schlüssel sind kleiner als der von v gespeicherte Schlüssel ist. Alle im rechten Teilbaum von v gespeicherten Schlüssel sind größer. • Mit der binären Suchbaumordnung kann ein Schlüssel schnell gefunden werden, indem die namensgebende Binärsuche durchgeführt wird. Die Dauer einer lookup-Operation/remove-Operation im worst-case proportional zur Tiefe. • die Tiefe eines binären Suchbaums mit n Schlüsseln ist blog2 nc im best-case, n − 1 im worst-case und O(log2 n) im Erwartungsfall. Isolde Adler Datenstrukturen 2010 6/15 Ankündigung Zusammenfassung 2. Teil AVL-Bäume Ein AVL-Baum ist ein binärer Suchbaum mit Höhenbalancierung • In der Höhenbalancierung wird verlangt, dass sich, für jeden Knoten v , die Höhe des linken und rechten Teilbaums von v um höchstens eins unterscheiden. • Die lookup-Operation wird wie für binäre Suchbäume mit binärer Suche ausgeführt. • Die remove-Operation wird im Wesentlichen umgangen und durch einen lazy remove“ ersetzt. ” • Links- und Rechtsrotationen sind die wesentlichen Hilfsmittel in der Ausführung der insert-Operation. Während im Zick-Zick und Zack-Zack Fall nur eine Rotation pro Iteration auszuführen ist, müssen im Zick-Zack und Zack-Zick Fall zwei Rotationen ausgeführt werden. • Die Ausführungszeiten von insert, remove und lookup sind für einen AVL-Baum mit n Schlüsseln durch O(log2 n) beschränkt. Isolde Adler Datenstrukturen 2010 7/15 Ankündigung Zusammenfassung 2. Teil Splay-Bäume • Binäre Suchbäume als Grundstruktur. Implementiere lookup, insert und remove durch eine einzige Operation, die Splay-Operation. • Wenn nach einem Schlüssel x gefragt wird, dann wird der Schlüssel durch die Splay-Operation zur Wurzel gebracht, Suchpfad-Eigenschaft: die Knoten auf dem Suchpfad rücken der Wurzel um fast die Hälfte näher. • Nachfolgende Operationen für andere Schlüssel werden Schlüssel x langsam tiefer und tiefer nach unten drücken. Wenn aber nach einiger Zeit Schlüssel x wieder abgefragt wird, wird er sofort wieder zur Wurzel gebracht. • Wenn zwischen sukzessiven Anfragen nach x nicht zuviel Zeit vergeht, ist jede Abfrage schnell, da x nicht tief im Baum sitzt. Wenn n Splay-Operationen (in einem anfänglich leeren Splay-Baum) durchgeführt werden, beträgt die worst-case Laufzeit O(n log2 n). Die Laufzeit einer einzelnen Operation kann allerdings bis zu O(n) Schritte verschlingen. Isolde Adler Datenstrukturen 2010 8/15 Ankündigung Zusammenfassung 2. Teil (a, b)-Bäume . . . implementieren Wörterbücher für externe Speicher: Die Anzahl der Festplattenzugriffe ist durch O(loga n) beschränkt, wenn n Schlüssel gespeichert werden. • Jeder Knoten eines (a, b)-Baums hat höchstens b Kinder. Mit Ausnahme der Wurzel und der Blätter haben alle anderen Knoten mindestens a Kinder. Alle innneren Knoten mit genau c Kindern speichern eine sortierte Folge von genau c − 1 Schlüsseln. Diese Schlüssel erlauben eine gezielte Ansteuerung der c Teilbäume während einer Suche. Alle Blätter speichern mindestens a − 1 und höchstens b − 1 Schlüssel. • Bei insert: ein Knoten mit zu vielen, also b Schlüsseln, wird in zwei Knoten aufgeteilt und ein trennender Schlüssel an den Vater abgegeben. Der Vater hat jetzt möglicherweise zu viele Schlüssel, aber wir haben das Problem nach oben geschoben“. ” Isolde Adler Datenstrukturen 2010 9/15 Ankündigung Zusammenfassung 2. Teil (a, b)-Bäume – remove In der Ausführung einer remove-Operation unterscheidet man die Methoden des Schlüsselklaus bzw. der Fusion. • Hat ein Knoten v zuwenige, also a − 2 Schlüssel, wird zuerst ein Schlüsselklau versucht: Hat ein Geschwisterknoten w von v genügend viele, also a Schlüssel, dann wird der v und w trennende Schlüssel des Vaters vom Kind v “geklaut“. • Ist w ein rechter Geschwisterknoten, dann übergibt w seinen kleinsten Schlüssel an den Vater und seinen linkesten Teilbaum an v . Ist w ein linker Geschwisterknoten, dann übergibt w seinen größten Schlüssel an den Vater und seinen rechtesten Teilbaum an v . • Wenn aber jeder Geschwisterknoten nur a − 1 Kinder hat, dann wird v mit einem Geschwisterknoten w verschmolzen; der v und w trennende Schlüssel des Vaters wird dem neuen Knoten hinzugefügt. Wir haben damit, wie bei AVL-Bäumen, das Problem nach oben verschoben, da der Vater jetzt einen Schlüssel verloren hat. Isolde Adler Datenstrukturen 2010 10/15 Ankündigung Zusammenfassung 2. Teil Hashing Der Auslastungsfaktor λ = mn spielt eine wichtige Größe: n ist die Anzahl der in der Hashtabelle eingefügten Schlüssel und m ist die Größe der Hashtabelle. Hashing mit Verkettung • alle Kollisionen, also alle Schlüssel x mit Hashwert h(x) = i, werden in eine sortierte Liste eingefügt. • Die erwartete Länge einer Liste ist durch 1 + λ beschränkt und damit ist die erwartete Laufzeit einer insert, remove oder lookup-Operation durch O(1) + λ beschränkt. • Eine erfolgreiche Hashfunktion ist h(x) = x mod m. Hier sollte m eine Primzahl sein, die genügend weit von einer Zweierpotenz entfernt ist. Isolde Adler Datenstrukturen 2010 11/15 Ankündigung Zusammenfassung 2. Teil Hashing mit offener Addressierung • Es wird direkt in die Tabelle gehasht. • Benutze dazu eine Folge h0 , h1 , . . . , hm−1 von Hashfunktionen: Ist • • • • der ite Versuch des Einfügens von Schlüssel x an Position hi (x) nicht erfolgreich gewesen, dann wird die Position hi+1 (x) im nächsten Versuch getestet. Insbesondere verwendet man die folgende Daumenregel: Ist der Auslastungsfaktor auf 21 angestiegen, dann lade die Tabelle in eine neue Tabelle doppelter Größe. Im linearen Austesten verwendet man die Folge hi (x) = x + i mod m im doppelten Hashing benutzt man Hashfunktionen f (x) = x mod m und g (x) = x mod m∗ und setzt hi (x) = f (x) + i · (m∗ − g (x)) mod m. 1 Die Zeit für eine erfolglose Suche ist durch O( 1−λ ) beschränkt. Als Konsequenz sollte man zu große Auslastungsfaktoren vermeiden. Im linearen Austesten besteht die Gefahr der Klumpenbildung, allerdings sind die einzelnen Hashfunktionen wesentlicher schneller auswertbar als für das doppelte Hashing. Isolde Adler Datenstrukturen 2010 12/15 Ankündigung Zusammenfassung 2. Teil Cuckoo-Hashing Zwei Hashtabellen T1 und T2 und zwei Hashfunktionen h1 und h2 . • Insert(x): Wiederhole bis zu M mal, • Speichere x in Tabelle T1 und Zelle h1 (x) ab. • Wenn die Zelle h1 (x) in Tabelle T1 durch einen Schlüssel y belegt war, dann füge y in Tabelle T2 und Zelle h2 (y ) ein. • Wenn die Zelle h2 (y ) in Tabelle T2 durch einen Schlüssel z belegt war, dann setze x = z und beginne eine neue Iteration. • Lookup(x): Überprüfe Zelle h1 (x) in Hashtabelle T1 und gegebenenfalls Zelle h2 (x) in Hashtabelle T2 : O(1) • Remove(x): Wenn x vorhanden ist, dann entferne x aus Zelle h1 (x) in Hashtabelle T1 oder aus Zelle h2 (x) in Hashtabelle T2 : O(1). Isolde Adler Datenstrukturen 2010 13/15 Ankündigung Zusammenfassung 2. Teil Universelles Hashing Bei Hashing mit Verkettung/mit offener Adressierung: worst-case Θ(n). Idee: wähle aus einer Menge H von Hashfunktionen zufällig eine Funktion. (Inuition: für eine zufällig gewählte Funktion ist es schwerer, Folgen von Operationen zu konstruieren, die eine schlechte Laufzeit aufweisen.) • Sei H c-universell. Dann gibt es keine zwei Schlüssel, die mit Wahrscheinlichkeit > c m in die gleiche Zelle gehasht werden. • c-universelle Klassen von Hashfunktionen ermöglichen für jede Folge von Operationen mit hoher Wahrscheinlichkeit effizientes Hashing (bei kleinem c): • Jede Folge von n Operationen wird von einer c-universellen Klasse in c n erwarteter Zeit höchstens n 1 + (linear, falls n = O(m)) . 2m bearbeitet • Wir haben eine c-universelle Klasse von Hashfunktionen für kleines c kennengelernt (welche?). Isolde Adler Datenstrukturen 2010 14/15 Ankündigung Zusammenfassung 2. Teil Perfektes Hashing • Eine Hashfunktion h : U → {0, ..., m − 1} heißt perfekt für S ⊆ U, falls h(x) 6= h(y ) ∀x, y ∈ S, x 6= y . • Wenn also alle Operationen nur Operanden aus S verwenden, werden sie jeweils in Zeit O(1) ausgeführt. • Perfekte Hashfunktionen sind dort besonders gut geeignet, wo ein festes S im vorraus bekannt ist (z. B. in einem Interpreter oder Compiler die Menge der Schlüsselworte der Programmiersprache). • . . . mit quadratischem/linearen Speicherplatzbedarf P2P Information Retrieval Isolde Adler Datenstrukturen 2010 15/15