Manipulation von Mengen

Ähnliche Dokumente
Suchen und Sortieren Sortieren. Heaps

Programmiertechnik II

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v)

1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert

Datenstrukturen & Algorithmen

Informatik II, SS 2014

Was bisher geschah ADT Menge mit Operationen: Suche nach einem Element Einfügen eines Elementes Löschen eines Elementes Realisierung durch

Algorithmen und Datenstrukturen Suchbaum

Programmiertechnik II

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

- k Maximalwerte aus Menge mit n >> k Elementen (Rangfolgebestimmung von Suchmaschinen!) Die typische Operationen:

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

13. Binäre Suchbäume

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

9.4 Binäre Suchbäume. Xiaoyi Jiang Informatik II Datenstrukturen und Algorithmen

Algorithmen & Datenstrukturen 1. Klausur

1. Motivation / Grundlagen 2. Sortierverfahren 3. Elementare Datenstrukturen / Anwendungen 4. Bäume / Graphen 5. Hashing 6. Algorithmische Geometrie

4 Greedy-Algorithmen (gierige Algorithmen)

Bäume, Suchbäume und Hash-Tabellen

Geordnete Binärbäume

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume

Kap. 4.4: B-Bäume Kap. 4.5: Dictionaries in der Praxis

Algorithmen und Datenstrukturen Balancierte Suchbäume

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 14

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Datenstrukturen und Algorithmen

14. Rot-Schwarz-Bäume

Effiziente Algorithmen und Datenstrukturen I. Kapitel 9: Minimale Spannbäume

Algorithmik II. a) Fügen Sie in einen anfangs leeren binären Baum die Schlüsselfolge 20, 28, 35, 31, 9, 4, 13, 17, 37, 25 ein.

Balancierte Bäume. Martin Wirsing. in Zusammenarbeit mit Moritz Hammer und Axel Rauschmayer. SS 06

Suchen und Sortieren

Teil II: Prioritätslisten (Priority Queues)

Kap. 4.2: Binäre Suchbäume

Kapiteltests zum Leitprogramm Binäre Suchbäume

Übung zur Vorlesung Algorithmische Geometrie

Idee: Wenn wir beim Kopfknoten zwei Referenzen verfolgen können, sind die Teillisten kürzer. kopf Eine Datenstruktur mit Schlüsselwerten 1 bis 10

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:

Grundlegende Sortieralgorithmen

Suchbäume mit inneren Knoten verschiedener Knotengrade.

Tutorium Algorithmen & Datenstrukturen

Suchen und Sortieren (Die klassischen Algorithmen)

10. Kapitel (Teil1) BÄUME GRUNDLAGEN. Algorithmen & Datenstrukturen Prof. Dr. Wolfgang Schramm

Informatik II. PVK Part1 Severin Wischmann n.ethz.ch/~wiseveri

11.1 Grundlagen - Denitionen

Datenstruktur, die viele Operationen dynamischer Mengen unterstützt

Graphen: Datenstrukturen und Algorithmen

Vorlesung : Binäre Entscheidungsdiagramme (BDDs) Dr. Carsten Sinz

Datenstrukturen. Mariano Zelke. Sommersemester 2012

2 Java: Bäume. 2.1 Implementierung von Bäumen. 2.2 Implementierung eines binären Suchbaums. 2.3 Traversierung von Bäumen

Übungen zu Programmierung I - Blatt 8

Informatik II Bäume. Beispiele. G. Zachmann Clausthal University, Germany Stammbaum. Stammbaum. Stammbaum

Copyright, Page 1 of 8 AVL-Baum

Binärbäume. Prof. Dr. E. Ehses,

3.1 Konstruktion von minimalen Spannbäumen Es gibt zwei Prinzipien für die Konstruktion von minimalen Spannbäumen (Tarjan): blaue Regel rote Regel

Algorithmen und Datenstrukturen

Übung 13: Priority Queues (Vorrangwarteschlangen 1 )

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2013 / 2014 Vorlesung 11, Donnerstag, 16.

Ein Graph ist ein Paar (V,E), wobei V eine Menge von Knoten und E eine Menge von Kanten (v,w) mit v,w in V ist.

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

368 4 Algorithmen und Datenstrukturen

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

Programmieren I. Kapitel 7. Sortieren und Suchen

Klausur Datenstrukturen und Algorithmen SoSe 2012

Übrigens: um den Algorithmus im Unterricht einzuführen, sind keine Formeln notwendig! Warum reicht die normale ASCII-Codierung nicht aus?

Übersicht. Rot-schwarz Bäume. Rot-schwarz Bäume. Beispiel. Eigenschaften. Datenstrukturen & Algorithmen. Rot-schwarz Bäume Eigenschaften Einfügen

Grundlagen der Programmierung 2. Bäume

Grundlagen: Algorithmen und Datenstrukturen

Vorlesung 09: Mengen. Peter Thiemann SS 2010

JAVA - Suchen - Sortieren

Name: Seite 2. Beantworten Sie die Fragen in den Aufgaben 1 und 2 mit einer kurzen, prägnanten Antwort.

Sortieralgorithmen. Inhalt: InsertionSort BubbleSort QuickSort. Marco Block

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Divide-and-Conquer. Vorlesung 9: Quicksort (K7)

Sortierverfahren für Felder (Listen)

Tutoraufgabe 1 (2 3 4 Bäume):

Binäre Bäume Darstellung und Traversierung

Kapitel 9 Suchalgorithmen

Datenstrukturen und Algorithmen

15 Optimales Kodieren

Beispiellösungen zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 6

Name:... Vorname:... Matrikel-Nr.:... Unterschrift:...

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

Programmierung und Modellierung

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

Präfx Trie zur Stringverarbeitung. Cheng Ying Sabine Laubichler Vasker Pokhrel

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

Übung 6. Rot-Schwarz-Bäume

Bäume Jiri Spale, Algorithmen und Datenstrukturen - Bäume 1

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

KONSTRUKTION VON ROT-SCHWARZ-BÄUMEN

Übung Grundlagen der Programmierung. Übung 05: Arrays. Abgabetermin: xx.xx.xxxx. Java-Programm Testplan Testergebnisse

6-1 A. Schwill Grundlagen der Programmierung II SS 2005

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

Transkript:

Manipulation von Mengen Thomas Röfer Vorrangwarteschlange Linksbaum Heap HeapSort Union-Find-Strukturen Allgemeiner Rahmen für Mengenmanipulationen

Rückblick Hashing Streuspeicherverfahren Hashfunktion Hashen mit Verkettung 1 2 Doris Bach 3 4 Friedrich Dörig 5 6 7 8 9 10 11 12 13 Doris May Offenes Hashing Doppeltes Hashing Dynamische Hash-Tabellen 5 19 5 19 m = 4 m = 8 m = 16 m = 32 2

Vorrangwarteschlange Definition Als Vorrangwarteschlange (priority queue) bezeichnet man eine Datenstruktur zur Speicherung einer Menge von Elementen, für die eine Ordnung definiert ist, so dass die folgenden Operationen ausführbar sind: Initialisieren einer leeren Struktur Einfügen eines Elements (insert) Minimum suchen (accessmin) Minimum entfernen (deletemin) Anmerkung Vorrangwarteschlangen können z.b. durch Listen oder balancierte Bäume implementiert werden. Allerdings sind die Anforderungen geringer, daher können sie durch geeignete Strukturen effizienter implementiert werden. 3

Vorrangwarteschlange Motivation Balancierte Bäume haben die Eigenschaft, dass jeder Pfad von der Wurzel zu einem Blatt des Baumes mit n+1 Blättern und n inneren Knoten eine Länge der Größenordnung O(log n) hat Für eine Vorrangwarteschlange reicht eine wesentlich schwächere Forderung aus, um zu sichern, dass accessmin in O(1) und insert, deletemin sowie das Verschmelzen zweier Schlangen in O(log n) ausführbar ist Anforderungen Die Schlüsselwerte von Kindern müssen stets größer (oder gleich) sein als der ihres Elternknotens Es muss mindestens einen Pfad von der Wurzel zu einem Blatt mit O(log n) Länge geben Wenn Einfüge- und Verschmelzeoperationen entlang des kurzen Pfades durchgeführt werden, sind sie genauso effizient wie bei balancierten Bäumen 4

Linksbaum Ein binärer Baum heißt Linksbaum, wenn gilt: Jeder innere Knoten enthält neben dem Schlüssel und den zwei Zeigern auf seine Kinder noch einen Distanzwert, der die Entfernung zum nächstgelegenen Blatt enthält Blätter haben die Distanz 0 Der Schlüssel eines Knotens ist immer kleiner oder gleich den Schlüsseln seiner Kinder Die Distanz eines Knotens ist um 1 größer als das Minimum der Distanzen seiner beiden Kinder p.dist = 1 + min(p.left.dist, p.right.dist) Die Distanz des linken Nachfolgers ist immer größer oder gleich der Distanz des rechten Nachfolgers p.left.dist p.right.dist 5

Linksbaum Basisoperation Verschmelzen zweier Linksbäume insert(x) Erzeuge einen neuen Linksbaum aus x Verschmelze den bisherigen Linksbaum mit dem neuen deletemin() Entferne die Wurzel Verschmelze die beiden Teilbäume class LeftTree { Comparable data; int distance; LeftTree left, right; static LeftTree melt(lefttree a, LeftTree b) { if(a == null) return b; else if(b == null) return a; else { if(a.data.compareto(b.data) > 0) // b ist kleiner -> vertausche a und b a.right = melt(a.right, b); if(getdistance(a.right) > getdistance(a.left)) // Vertausche a.left und a.right a.distance = getdistance(a.right) + 1; return a; } } } 6

Linksbaum Beispiel melt(a, b) a b 3 1 2 1 a.data > b.data 2 1 3 1 melt(a.right, b) melt(null, b) 2 1 3 1 a.right.dist > a.left.dist 2 1 3 1 a.dist = a.right.dist + 1 2 1 3 1 7

Heap Definition Eine Folge F = k 1, k 2,, k N von Schlüsseln nennen wir einen Heap (die Halde), wenn k i k i / 2 für 2 i N gilt Anders ausgedrückt: k i k 2i und k i k 2i+1, sofern 2i N bzw. 2i + 1 N Hat nichts mit dem Java-Heap zu tun Beispiel F = 8, 6, 7, 3, 4, 5, 2, 1 genügt der Heap-Bedingung, weil 8 6, 8 7, 6 3, 6 4, 7 5, 7 2, 3 1 Ausgabe in absteigender Reihenfolge Solange Heap nicht leer ist gib k 1 aus entferne k 1 aus dem Heap stelle Heap-Bedingung für restliche Schlüssel wieder her, so dass die neue Wurzel an Position 1 steht 8

Wiederherstellen der Heap-Bedingung Heap-Bedingung wieder herstellen Nach Entfernen der Wurzel sind zwei Teil- Heaps übrig Vereinige beide, indem der Schlüssel mit dem höchsten Index als Wurzel eingesetzt wird Dann lassen wir k 1 versickern (sift down), indem er so lange mit dem jeweils größeren Nachfolger vertauscht wird, bis beide Nachfolger kleiner sind oder der Schlüssel unten angekommen ist 9

Implementierung des Versickerns Vorteile Heap kann in einem Array implementiert werden Aufwand für das Versickern ist O(log N) static void siftdown(comparable a[], int i, int m) { while(2 * i < m) { int j = 2 * i + 1; if(j < m && a[j].compareto(a[j + 1]) < 0) ++j; if(a[i].compareto(a[j]) < 0) { swap(a, i, j); i = j; } else break; } } 10

HeapSort Ansatz Zuerst wird ein Heap aufgebaut, indem der Reihe nach vorne ein Element vorangestellt wird und dieses dann versickert Dann wird der Heap schrittweise geleert, wodurch jeweils das größte Element entnommen wird Anmerkungen Das Voranstellen passiert nicht wirklich, stattdessen wächst der Heap einfach vom Ende des Arrays her static void heapsort(comparable a[]) { for(int i = a.length / 2-1; i >= 0; --i) siftdown(a, i, a.length - 1); for(int i = a.length - 1; i > 0; --i) { swap(a, 0, i); siftdown(a, 0, i - 1); } } Nachdem Entfernen des jeweils größten Elements ist der Heap am Ende um ein Element kürzer. Dort kann das soeben entnommene Element eingetragen werden Aufwand N/2 mal Versickern für das Aufbauen des Heaps: O(N/2 log N) N mal Versickern für das Auslesen des Heaps: O(N log N) Insgesamt: O(N log N) Vorteil: Speicherkomplexität ist O(N) 11

HeapSort Beispiel 3 1 7 5 8 2 swap(a, 0, 5) 2 5 7 3 1 8 siftdown(a, 2, 5) 3 1 7 5 8 2 siftdown(a, 0, 4) 7 5 2 3 1 8 siftdown(a, 1, 5) 3 8 7 5 1 2 swap(a, 0, 4) 1 5 2 3 7 8 siftdown(a, 0, 5) 8 5 7 3 1 2 siftdown(a, 0, 3) 5 3 2 1 7 8 swap(a, 0, 3) 1 3 2 5 7 8 siftdown(a, 0, 2) 3 1 2 5 7 8 : 12

Union-Find-Strukturen Motivation In vielen Problemstellungen möchte man Objekte (z.b. Knoten oder Kanten eines Graphen) in Äquivalenzklassen einteilen Dabei beginnt man mit einer sehr feinen Einteilung, die durch sukzessive Vereinigung von Mengen vergröbert wird Basisoperationen makeset(e, i) Erzeuge eine neue Menge mit Namen i mit einzigem Element e e ist neu, kommt also in keiner anderen Menge vor find(x) Liefert den Namen der Menge, die x enthält union(i, j, k) Vereinigt zwei Mengen mit Namen i und j zu einer neuen Menge mit Namen k Die Mengen mit Namen i und j werden gelöscht 13

Kanonisches Element Ansatz Verschiedene Mengen enthalten auch nur verschiedene Elemente Daher kann jede Menge auch eindeutig durch eines ihrer Elemente repräsentiert werden, d.h. die Namen der Mengen werden nicht benötigt Dieses kanonische Element kann in einer Menge frei gewählt werden Verzicht auf Namen Das kanonische Element einer mit makeset(e, i) erzeugten Menge ist e, also reicht makeset(e) find(x) liefert das kanonische Element einer Menge Vereinigt man zwei Mengen, kann das Ergebnis wieder durch das kanonische Element einer der beiden Mengen repräsentiert werden, also reicht union(e, f) Union-Find-Problem Finden einer Datenstruktur zu Repräsentation einer Kollektion von paarweise disjunkten Mengen sowie Algorithmen für die Ausführung von makeset, find und union 14

Regionen vereinigen r 1 r 2 r 3 r 4 r 5 r 6 r 7 r 8 r 1? r 9 r 10 r 11 r 12 r 12 r 13 r 14 r 15 r 16 r 1 r 1 r 13 15

Vereinigung von Mengen Implementierung Jede Menge der Kollektion wird durch einen unsortierten Baum repräsentiert Die Knoten des Baums sind die Elemente der Menge Die Wurzel des Baums enthält das kanonische Element Jeder Knoten enthält einen Zeiger auf seinen Elternknoten, die Wurzel zeigt auf sich selbst Vereinigung Hänge die Wurzel (kanonisches Element) des einen Baums an die Wurzel des anderen Vereinigung nach Größe bzw. Höhe Motivation: Vermeidung von degenerierten Bäumen Hänge den Baum mit weniger Knoten bzw. geringerer Höhe an die Wurzel des größeren bzw. höheren 16

Pfadverkürzung (Pfadkompression) Ziel Während der Suche wird der Pfad durch Umhängen von Kanten verkürzt, so dass bei der nächsten Suche weniger Kanten durchlaufen werden müssen Aufteilungsmethode (Splitting) Während der Suche werden Verweise so umgehängt, dass sie statt auf den Elternknoten auf den Großelternknoten zeigen Halbierungsmethode Während der Suche werden die Verweise jedes zweiten Knoten so umgehängt, dass sie statt auf den Elternknoten auf den Großelternknoten zeigen 17

Pfadverkürzung (Pfadkompression) Aufteilungsmethode Halbierungsmethode 18

Allgemeiner Rahmen Motivation Wörterbücher, Vorrangwarteschlangen und Union-Find-Strukturen kann man als Spezialfälle eines Mengenmanipulationsproblems auffassen Gegeben Kollektion K von paarweise disjunkten Mengen Elemente der Mengen gehören zu einem Universum U Die Namen der Mengen gehören zu einer Menge N 19

Mengenoperationen makeset(x, n) Bilde eine Menge mit einzigem Element x und gebe ihr den Namen n Vorraussetzung: x und n sind neu search(x, n) Suche x in der Menge mit Namen n insert(x, n) Füge x in die Menge mit Namen n ein Vorraussetzung: x ist neu delete(x, n) Entferne x aus der Menge mit Namen n find(x) Bestimme den Namen der Menge, die x enthält union(i, j, k) Vereinige die Mengen mit Namen i und j zu einer Menge mit Namen k 20

Mengenoperationen accessmin(n) Bestimme das Minimum in der Menge mit Namen n deletemin(n) Entferne das Minimum aus der Menge mit Namen n successor(x, n) Bestimme das zu x nächstgrößere Element in der Menge mit Namen n predecessor(x, n) Bestimme das zu x nächstkleinere Element in der Menge mit Namen n kthelement(k) Bestimme das k-größte Element in UK 21

Modellierung U-Baum Repräsentiere UK U durch einen balancierten, sortierten Binärbaum Soll die Operation k-tes Element unterstützt werden, enthält jeder Knoten p im Baum einen Zähler z(p) darüber, wie viele Schlüssel im Teilbaum mit Wurzel p enthalten sind Mengenbäume Stelle jede Menge S i der Kollektion K durch einen nicht-sortierten Mengenbaum dar (oder heap-geordnet, falls accessmin unterstützt wird). Der Knoten x im U-Baum ist durch einen Zeiger mit dem Knoten x im Mengenbaum S i verbunden, wenn x S i 22

Modellierung N-Baum Die Menge aller Namen von Mengenbäumen ist in einem balancierten, sortierten Baum gespeichert Die Wurzel jedes Mengenbaums ist durch einen Verweis in beide Richtungen mit seinem Namen im N- Baum verbunden 23

Umsetzung der Operationen find(x) Jeder Knoten eines Mengenbaums zeigt auf seinen Elternknoten x im U-Baum finden, von dort in den Mengenbaum, der x enthält, wechseln, dann hoch zur Wurzel accessmin(n), deletemin(n) Mengenbäume sind heap-geordnet union(i, j, k) Falls Vereinigung nach Größe oder Höhe, dann muss diese Größe in der Wurzel der Mengenbäume mitgeführt werden insert(x, i) Füge x in U-Baum ein Suche i im N-Baum Folge Zeiger zur Wurzel des S i -Baums Füge x in S i -Baum ein 24

Umsetzung der Operationen delete(x, i) find(x) Wenn der gefundene Mengenbaum tatsächlich i heißt, dann entferne x aus S i und dem U-Baum kthelement(k) Beginne bei Wurzel p des U-Baums Falls z(p) < k, dann gibt es kein k-tes Element im U-Baum Falls k = z(left(p)) + 1, dann enthält p das k-te Element Falls k z(left(p)), dann suche in links(p) weiter Ansonsten suche das (k - z(left(p)) 1)- te Element in right(p) 25