Algorithmen und Datenstrukturen 11
Stefan Ploner
17. Januar 2012
Besprechung Blatt 10 Binary Search Hashing Vorbereitung Blatt 11
1 Besprechung Blatt 10 Fragen
2 Binary Search
Bin¨are Suche in Arrays
Bin¨are Suchb¨aume (Binary Search Tree) 3 Hashing
Kollisionsaufl¨osung 4 Vorbereitung Blatt 11
Hinweise Zirkul¨are Arrays
Anonyme und innere Klassen
Fragen zu Blatt 10?
Besprechung Blatt 10 Binary Search Hashing Vorbereitung Blatt 11 Bin¨are Suche in Arrays
Zur Erinnerung: Binary Search sucht nach einem Element in einer sortierten Datenstruktur nach dem Divide and Conquer Prinzip.
Vorraussetzungen
• Sortiert
• Zugriff ¨uber Index in O(1)
• ⇒ Arrays
Algorithmus
• Array leer→ Element nicht enthalten
• sonst: gesuchten Wert mit mittlerem Element vergleichen
• Element gleich→gefunden
• Element zu groß→gesuchtes Element liegt links
• Element zu klein→gesuchtes Element liegt rechts
• beginne die Suche im eingegrenzten Array von Neuem
Besprechung Blatt 10 Binary Search Hashing Vorbereitung Blatt 11 Bin¨are Suche in Arrays
Bei der bin¨aren Suche ist es egal, ob man Zahlen oder irgendwelche anderen Elemente durchsucht, f¨ur die eine feste Ordnung definiert ist. (→Comparable-Interface)
Problem
• die Suche ist damit in logarithmischem Aufwand
• aber: Einf¨ugen in sortiertes Array hat Aufwand O(n)!
Bin¨ are Suchb¨ aume - Aufbau
Baumstruktur, das heißt:
• ein Wurzelelement (vgl. mit Head in Listen)
• mehrere Kinder erlaubt (hier Bin¨arbaum →max. 2!)
• wie bei Listen ist der Speicherverbrauch dynamisch von der momentanen Anzahl der Elemente abh¨angig.
Anordnung (¨uber Wert selbst oder “Key”):
• “kleinere” Kinder links
• “gr¨oßere” (und wenn erlaubt gleiche) Kinder rechts
Im folgenden sind keine doppelten Keys (bzw. Werte, wenn nach diesen sortiert wird) erlaubt.
Besprechung Blatt 10 Binary Search Hashing Vorbereitung Blatt 11 Bin¨are Suchb¨aume (Binary Search Tree)
Suchen
• Baum leer→ Element nicht enthalten
• sonst: gesuchtes Element mit Wurzel vergleichen
• Element gleich→gefunden
• Element zu groß→ges. Element liegt in linkem Unterbaum
• Element zu klein→ges. Element liegt in rechtem Unterbaum
• beginne die Suche im Unterbaum von Neuem
Im Prinzip eine bin¨are Suche auf einer verzeigerten Datenstruktur.
Einf¨ ugen
• beginne mit einer Suche nach dem Element diese bricht an 2 Stellen ab:
• Abbruch bei leerem Restbaum→ Element an diese Stelle einf¨ugen
• Element gefunden - je nach Wunsch
• Element verwerfen, da bereits enthalten
• bei Sortierung ¨uber Keys k¨onnte ein Ersetzen sinnvoll sein
Besprechung Blatt 10 Binary Search Hashing Vorbereitung Blatt 11 Bin¨are Suchb¨aume (Binary Search Tree)
L¨ oschen
(In der Hausaufgabe nicht ben¨otigt.)
• beginne mit einer Suche nach dem Element
• diese bricht an 2 Stellen ab:
• Abbruch bei leerem Restbaum→ Element ist nicht enthalten
• Element gefunden→ Element l¨oschen
Beim L¨oschen gibt es 3 M¨oglichkeiten, es darf kein Loch entstehen
• Element ist ein Blatt → beim L¨oschen entsteht kein Loch, ok
• Element hat ein Kind → Kind an Stelle des Elements h¨angen
• Element hat zwei Kinder → Element durch ein innerstes Kind ersetzen (siehe n¨achste Folie)
L¨ oschen
Beispiel: L¨oschen eines Elements mit 2 Kindern
Die 6 und die 9 sind die “innersten” Kinder - alle anderen
Unterelemente sind sowohl von der Zahlenordnung als auch von der horizontalen Position gesehen weiter von der 7 (Mitte) entfernt.
Quelle: http://en.wikipedia.org/wiki/File:Binary search tree delete.svg
Daher bleibt die Suchbaumeigenschaft beim Ersetzen erhalten.
Besprechung Blatt 10 Binary Search Hashing Vorbereitung Blatt 11 Kollisionsaufl¨osung
Zur Erinnerung:
• eine Hashfunktion bildet Keys auf ihre Werte ab (bzw. auf deren Speicheradressen)
• im Optimalfall wird jede Speicherzelle nur von einem verwendeten Key getroffen, dadurch direkter Zugriff
• da man nicht f¨ur alle m¨oglichen Keys Speicherplatz anlegen kann, muss es ¨Uberschneidungen geben
Kollisionsaufl¨ osung mit verketteten Listen
Hashtablestruktur: Array aus Listen, erst in diese wird eingef¨ugt Vorteile:
• beliebig viele Elemente
• Kollisionen st¨oren andere Pl¨atze nicht Nachteile:
• Zus¨atzliche Listenstruktur notwendig
• Dadurch entsteht zus¨atzlicher Aufwand
Vorsicht: Entweder immer vorne oder immer hinten in die Listen einf¨ugen.
Besprechung Blatt 10 Binary Search Hashing Vorbereitung Blatt 11 Kollisionsaufl¨osung
Kollisionsaufl¨ osung mit Sondieren (open adressing, probing)
Hashtablestruktur: Array, dass die Elemente direkt enth¨alt.
Vorteile:
• keine zus¨atzliche Listenstruktur notwendig Nachteile:
• max. so viele Elemente, wie Arrayelemente vorhanden sind
• die ¨Uberpr¨ufung, ob ein Eintrag bereits enthalten ist, wird komplizierter
Sondierungsverfahren
• es gibt verschiedenste Sondierungsverfahren (linear, quadratisch, double hashing)
• am ¨uberschaubarsten ist lineares Sondieren
Bei schlechten Sondierungsverfahren kann es passieren, dass Elemente nicht eingef¨ugt werden k¨onnen, obwohl der Hashtable nicht voll ist.
Beispiel: Hashtable mit L¨ange 9, Schrittweite 3
• 2
3 der (m¨oglicherweise freien) Elemente werden nicht erreicht
• bei linearem Sondieren tritt das Problem auf, wenn Schrittweite und Arrayl¨ange gemeinsame Teiler haben
• mit Primzahlen als Arrayl¨ange kann das nicht passieren
Besprechung Blatt 10 Binary Search Hashing Vorbereitung Blatt 11 Hinweise
11.1: Telefonbuch
Zum Rumspielen mit bin¨aren Suchb¨aumen Link auf dem Ubungsblatt oder Java-Applet hier¨
http://www.site.uottawa.ca/ stan/csi2514/applets/avl/BT.html (Haken bei AVL rausnehmen!) verwenden
11.2: Modifizierte Bin¨ arsuche
• hier muss man die Idee verstehen, die Implementierung ist sehr einfach
• Uberschrift beachten!¨
• kann man durch Betrachten eines Elements eine komplette H¨alfte ausschließen?
• Aufzeichnen von ein paar Sortierten Reihungen sehr hilfreich
Besprechung Blatt 10 Binary Search Hashing Vorbereitung Blatt 11 Hinweise
11.3: RingQueue
• die zugrunde liegende Datenstruktur muss ein Array sein
• verzeigerte Datenstrukturen sind nicht erlaubt
• vlt. hilft das Generic-Beispiel des letzten Foliensatzes
Zirkul¨ are Arrays
• Index des Folgeelements = (akt. Index + 1) % Arrayl¨ange
• damit man in O(1) hinzuf¨ugen / entfernen kann, muss man sich den Index des letzten / ersten Queueelements merken
• Preisfrage: Wie merkt man, ob das Array voll ist?
• wof¨ur die “voll”-Variable der Vorlesungsfolie gedacht ist, bleibt mir verborgen
Besprechung Blatt 10 Binary Search Hashing Vorbereitung Blatt 11 Anonyme und innere Klassen
Anonyme Klassen
• Grundidee: Deklaration und direkte Verwendung einer Klasse in einer Methode
• die Klasse hat keinen Namen, aber eine Instanz
• statischer Typ der Klasse ist wie von Vererbung bekannt eine beliebige Vaterklasse
• das normalerweise in der Kindklasse durchgef¨uhrte Uberschreiben von Methoden wird hier direkt bei der¨ Verwendung durchgef¨uhrt
• nur sinnvoll wenn nur an dieser einen Stelle Instanzen dieser Klasse angelegt werden sollen
Verwendung an anderen Stellen im Code nur ¨uber Methoden des statischen Typs der Instanz m¨oglich, wenn sie z.B. von einer
public Enumeration enumerate() {
return new Enumeration() { // anonymous class MyClass cur;
{ cur = head; } // replace constructor public boolean hasMoreElements() {
return (current != null);
}
public Object nextElement() { if (cur == null)
throw new NoSuchElementException();
Object res = cur;
cur = cur.getNext(); // declared in MyClass return res;
}
}; // semicolon required!
}
Besprechung Blatt 10 Binary Search Hashing Vorbereitung Blatt 11 Anonyme und innere Klassen
Innere Klassen
• Grundidee: Deklaration und Verwendung einer Klasse in einer anderen (“¨außeren”) Klasse
• die innere Klasse ist nur in dieser Klasse bekannt (private!)
• alle von Klassen bekannte M¨oglichkeiten sind f¨ur innere Klassen ebenso anwendbar (Vererbung, Konstruktoren, Methoden, ...)
Verwendung an anderen Stellen im Code nur indirekt ¨uber die (die innere Klasse enthaltende) ¨außere Klasse m¨oglich!
public class IntegerArray { private int[] data;
private class EvenIterator { // inner class private int next = 0;
public boolean hasNext() {
return (next <= data.length - 1);
}
public int getNext() { int res = data[next];
next += 2;
return res;
} } }
Besprechung Blatt 10 Binary Search Hashing Vorbereitung Blatt 11 Anonyme und innere Klassen
Evaluation
Der Evaluationszeitraum endet am 31.01.
Danke im vorraus.