5. Juli 2012
1 Besprechung Blatt 10 Fragen 2 Hashing Allgemein, Hashtablestruktur Sondierungsverfahren 3 Anonyme und innere Klassen Anonyme Klassen Innere Klassen 4 Zirkuläre Arrays 5 Vorbereitung Blatt 11 Hinweise
Fragen Fragen zu Blatt 10?
Allgemein, Hashtablestruktur Zur Erinnerung: Hashfunktion: Key Wert (bzw. dessen Speicheradresse) im Optimalfall wird jede Speicherzelle nur von einem Key verwendet, dadurch direkter Zugriff (O(1)) da man nicht für alle möglichen Keys eigenen Speicherplatz reservieren kann, muss es Überschneidungen geben Quelle: http://en.wikipedia.org/wiki/file:hash_table_3_1_1_0_1_0_0_sp.svg
Allgemein, Hashtablestruktur Kollisionsauflösung mit Listen Hashtablestruktur: Array vom Typ des Listenelements (jedes Arrayelement entspricht einem Listenkopf) Vorteile: beliebig viele Elemente Kollisionen beeinflussen Plätze anderer Hashwerte nicht Nachteile: zusätzliche Listenstruktur notwendig dadurch zusätzlicher Aufwand Vorsicht: Immer vorne oder immer hinten in die Listen einfügen.
Allgemein, Hashtablestruktur Kollisionsauflösung mit Sondieren (open adressing, probing) Hashtablestruktur: Array, dass die Elemente selbst enthält. Vorteile: keine zusätzliche Listenstruktur notwendig Nachteile: max. so viele Elemente, wie Arrayelemente vorhanden sind die Überprüfung, ob ein Eintrag bereits enthalten ist, wird komplizierter
Sondierungsverfahren Sondierungsverfahren es gibt verschiedenste Sondierungsverfahren (linear, quadratisch, double hashing) schlechte Sondierungsverfahren finden nicht alle freien Plätze Beispiel: Hashtable mit Länge 9, Schrittweite 3 jedes Element kann nur in 1 3 des Arrays platziert werden freie Plätze in den restlichen 2 3 können nicht genutzt werden tritt auf, wenn Schrittweite und Arraylänge nicht teilerfremd Primzahlen als Arraylänge verhindern das (Schrittweite<Länge)
Sondierungsverfahren Beispiel: Quadratisches Sondieren Hashtable der Größe 8 Hashfunktion: Anzahl Chars (ohne Leerzeichen) % 8 Namen: Benjamin, B1, B2, Trick, Donald Duck, Track Ist die Sprungweite von der Anzahl bisheriger Sprünge abhängig, sind die Sprungketten kürzer als bei der linearen Sondierung. Einfügen von B3? Kein Platz, Potenzen von 2 durch 8 teilbar.
Anonyme Klassen Anonyme Klassen Grundidee: Deklaration einer Klasse in einer Methode die Klasse hat keinen Namen, aber ist instanziierbar statischer Typ der Klasse ist wie von Vererbung bekannt eine beliebige Vaterklasse (meist nur ein Interface) nur sinnvoll, wenn nur an einer Stelle Instanzen der Klasse angelegt werden sollen typisches Beispiel: Iteratoren Das heißt, dass (von außen) nur die Methoden des später verwendeten statischen Typs aufgerufen werden können.
Anonyme Klassen public Enumeration enumerate() { return new Enumeration() { // anonymous class MyClass cur; { cur = head; } // "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; } }; // return statement -> semicolon required! }
Innere Klassen Innere Klassen Grundidee: Deklaration und Verwendung einer Klasse in einer anderen ( äußeren ) Klasse alle von Klassen bekannten Möglichkeiten sind für innere Klassen ebenso anwendbar (Vererbung, Konstruktoren, Methoden,...) typ. Beispiel: Listenelement-Klassen / Buckets im Hashtable Verwendung an anderen Stellen im Code nur indirekt über die (die innere Klasse enthaltende) äußere Klasse möglich. Meist will man das nicht und verhindert den Zugriff von außen komplett mit dem private-modifikator.
Innere Klassen public class IntegerArray { private int[] data; private class EvenIterator { // inner class private int next = 0; } } public boolean hasnext() { return (next < data.length); } public int getnext() { int res = data[next]; next += 2; return res; }
Zirkuläre Arrays Queue in einem Array statt den Elementen verschiebt man Start- und Endindex Maximallänge, da arraybasiert Index des Folgeelements = (akt. Index + 1) % Arraylänge damit man in O(1) hinzufügen / entfernen kann, muss man den Index des letzten / ersten Elements wissen der jeweils andere Index lässt sich mit der Länge berechnen
Hinweise 11.3: Puffer wie ein Zirkuläres Array in vollen Puffern wird der älteste Eintrag überschrieben beim Überschreiben auf Größe und Startindex aufpassen 11.4: verketteter Puffer Startindex wird im verketteten Ring zu einem Elementzeiger hinzufügen geht in O(1)! wenn ihr die Liste traversiert, macht ihr es falsch und komplizierter
Hinweise 11.1: Hashes Tabellenformat einhalten! bei mehrfachem Sondieren die Bucketnummern hintereinander auflisten zur b) ist keine mathematische Begründung notwendig 11.2: Hashes put und put2 kann sich im internen Aufbau relativ stark unterscheiden put2 und put3 eher nicht
Hinweise Evaluation Der Evaluationszeitraum endet am 07.07. Danke an alle die teilnehmen!