next up previous
Nächste Seite: Bastelstunde: Hashing (7./9. 1. Aufwärts: Compilerbau Vorlesung, Wintersemester 2003 Vorherige Seite: Autotool-Lösungen

Symboltabellen/Hashing (5. 1.)

Die (sogenannte) Symboltabelle

$ $Id: symtab.tex,v 1.1 2004/01/05 14:12:41 joe Exp $ $

(eigentlich ist es die Tabelle für Bezeichner)

(Wdhlg.) Tokenklassen:

(Was ist mit Operatoren?)

Inhalt der Symboltabelle

wichtige Attribute der Bezeicher aufbewahren:

Symboltabellen als Abbildungen

$ $Id: map.tex,v 1.1 2004/01/05 14:12:41 joe Exp $ $

Abstrakter Datentyp Map (Abbildung)

interface Map(A, B) {
    void clear ();
    void put (A key, B value);
    B get (A key);
    void remove (A key);
}
(anderer Name: Wörterbuch (Dictionary) -- warum ist das inzwischen ``deprecated''?)

Abbildungen in Java

Map ist ein Typkonstruktor

($ =$ Typ höherer Ordnung, wenn $A$ und $B$ Typen sind, dann ist $ \verb*\vert Map(A,B)\vert$ ein Typ),

aber man darf das in Java nicht hinschreiben. Deswegen (http://java.sun.com/j2se/1.4.2/docs/api/java/util/Map.html):

interface Map {
    void clear ();
    void put (Object key, Object value);
    Object get (Object key);
    void remove (Object key);
}
und man muß fleißig casten:
Entry e = (Entry) table.get ("foo");

Das Fehlen von Typen höherer Ordnung

...ist eine schwerwiegende Lücke in vielen gängigen Sprachen (die besonders beim Umgang mit Collections, Containern usw. schmerzt).

Mehr oder wenig zaghafte Versuche, um diese Lücke herumzuturnen, heißen dann Casts, Templates (C++, Java 1.5), Design Patterns usw.

und erfordern dann eigene Vorlesungen, Lehrbücher, Hilfsprogramme (sog. CASE-Tools), Zaubersprüche und Gurus $ \dots$

($ \dots$ und schaffen auf diese Weise immerhin Umsatz und Arbeitsplätze).

Abbildungen: mögliche Implementierungen

Aufgabe (Wdhlg 1. Semester, hoffe ich): diskutiere (für alle 6 Varianten) die Laufzeiten für die o. g. Operationen.

Beispiel: ungeordnete Liste:

Hashing

benutze schnelle Hashfunktion $ h : \Sigma^* \to \{0 \dots m-1\}$

Idee: Speichere $ x$ in $ t [h(x)]$.

Parameter (Tabellengröße, Hashfunktion) geeignet wählen, dann ``praktisch konstante'' Laufzeit für alle Operationen.


Hash-Kollision: $ x \neq y$ und $ h(x)=h(y)$.

$ x$ ist schon in $ t [h(x)]$, wo soll $ y$ hin?

Kollisionen behandeln:

Aufgabe: Pseudocode für Einfügen und Suchen bei doppeltem Hashing. was ist mit Löschen?

Re-Hashing

$ $Id: rehash.tex,v 1.1 2004/01/05 14:12:41 joe Exp $ $

Problem:

Lösung: falls Tabelle gewissen Füllstand erreicht, dann zu neuer, größerer Tabelle wechseln ($ =$ re-Hashing).

am einfachsten: Tabellengröße ist immer Potenz von 2; dann: vergrößern $ =$ verdoppeln.

Beim re-Hashing müssen alle Einträge betrachtet werden, das findet aber nur selten statt, so daß die amortisierte Laufzeit trotzdem konstant ist (Aufgabe: nachrechnen).


next up previous
Nächste Seite: Bastelstunde: Hashing (7./9. 1. Aufwärts: Compilerbau Vorlesung, Wintersemester 2003 Vorherige Seite: Autotool-Lösungen
Johannes Waldmann 2004-01-28