private Comparable[] inhalt; // Array von Comparables private byte[] zustand; // Array von Zustaenden // LEER, BELEGT und GELOESCHTFalls schon belegt ist, so suche für einen Alternativplatz.
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 } ... // Hilfsmethoden 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 } ... // Hilfsmethoden 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 |