private Comparable[] inhalt; // Array von Comparables
private byte[] zustand; // Array von Zustaenden
// LEER, BELEGT und GELOESCHT
Falls
|
|
lineares Sondieren |
|
|
quadratisches Sondieren |
|
|
Double Hashing (Schrittweite wird durch 2. Hashfunktion bestimmt) |
Alle Berechnungen werden jeweils
durchgeführt.
Insgesamt werden höchstens
Sondierschritte verursacht.
Beim quadratischen Sondieren werden ggf. nicht alle Buckets besucht, aber mindestens
.
Implementation des geschlossenen Hashings
Beispiel:
Die beiden Abbildungen ergeben sich durch sukzessives Einfügen der Worte
Perfekte Hashfunktion
Gesucht wird eine Hashfunktion
, die auf den Elementen keine Kollision verursacht, z.B.:
gesucht: : {braun, rot, blau, violett, türkis} Länge = 5 3 4 7 6 Länge = 2 0 1 4 3
Länge
ist perfekte Hashfunktion.
/***************************** OfHashing.java *******************************/
/** Implementation des Interface Menge durch Array von Listen */
public class OfHashing implements Menge {
private Liste[] b ; // Array fuer Listen
public OfHashing(int N) { // Konstruktor fuer Hashtabelle
b = new Liste[N]; // besorge Platz fuer N Listen
for (int i=0; i<N; i++) // konstruiere pro Index
b[i]=new VerweisListe(); // eine leere Liste
}
...
public boolean empty() { // testet, ob Tabelle leer
...
}
public Comparable lookup(Comparable x) { // versucht x nachzuschlagen
...
}
public boolean insert(Comparable x) { // versucht x einzufuegen
...
}
public boolean delete(Comparable x) { // versucht x zu loeschen
...
}
}
/***************************** GeHashing.java *******************************/
/** Implementation des Interface Menge mit einem Array von Objekten */
public class GeHashing implements Menge {
private final static byte LEER = 0; // noch nie belegt, jetzt frei
private final static byte BELEGT = 1; // zur Zeit belegt
private final static byte GELOESCHT = 2; // war schon mal belegt, jetzt frei
private Comparable[] inhalt; // Array fuer Elemente
private byte[] zustand; // Array fuer Zustaende
public GeHashing(int N) { // Konstruktor fuer Hashtabelle
inhalt = new Comparable[N]; // besorge Platz fuer N Objekte
zustand = new byte[N]; // besorge Platz fuer N Zustaende
for (int i=0; i<N; i++) // setze alle Zustaende
zustand[i]=LEER; // auf LEER
}
...
public boolean empty() { // testet, Ob Tabelle leer
...
}
public Comparable lookup(Comparable x) { // versucht, x nachzuschlagen
...
}
public boolean insert(Comparable x) { // versucht, x einzufuegen
...
}
public boolean delete(Comparable x) { // versucht, x zu loeschen
...
}
}
Laufzeit bei geschlossenem Hashing
Sei
die Anzahl der in der Hashtabelle zur Zeit gespeicherten Objekte,
sei
die Anzahl der möglichen Speicherpositionen.
Sei
der Auslastungsfaktor.
Dann ergibt sich für die Anzahl der Schritte mit Double-Hashing als Kollisionsstrategie bei
Vergleich mit AVL-Baum
| AVL-Baum | Geschlossenes Hashing | |
| Laufzeit | logarithmisch | konstant |
| Speicherbedarf | dynamisch wachsend | in Sprüngen wachsend |
| Sortierung | möglich durch Traversierung | nicht möglich |