/***************************** GeFpHashing.java *****************************/ /* Autor: Joachim Wagner * Datum: 08. Februar 1998 */ import AlgoTools.IO; // fuer Fehlermeldungen IO.error(...); /** Erweiterung der Klasse GeHashing um eine Sondierfunktion, die * die Existenz eines generierenden Element ausnutzt, wenn die Groesse * des Hash-Arrays eine Primzahl ist. */ public class GeFpHashing implements Hashing { private final static int LEER = 0; // noch nie belegt, jetzt frei private final static int BELEGT = 1; // zur Zeit belegt private final static int GELOESCHT = 2; // war schon mal belegt, jetzt frei private Compare comp; // Vergleichsobjekt private Object[] inhalt; // Array fuer Elemente private int[] zustand; // Array fuer Zustaende private int generator; // fuer die Sondierung public GeFpHashing(Compare comp, int N) { // Konstruktor fuer Hashtabelle int groesse = (N>2)?N:3; // vorsichtshalber mindestens 3 Liste s1 = null; // fuer die Primfaktorzerlegung Liste s2; // von groesse und groesse-1 s2=primfaktoren(groesse); while (!s2.empty()) { // groesse nicht prim s1=s2; // Ergebnis merken groesse++; // naechste Zahl testen s2=primfaktoren(groesse); } if (s1==null) // Zerlegung von groesse-1 noch s1=primfaktoren(groesse-1); // unbekannt -> berechnen // this.comp = comp; // uebernimm Vergleichsobjekt inhalt = new Object[groesse]; // Platz fuer groesse Objekte zustand = new int[groesse]; // Platz fuer groesse Zustaende for (int i=0; i1) produkt=(produkt*generator)%groesse;// generator hoch exponent if (produkt==1) { // generator ist gefunden=false; // kein Generator break; // Test abbrechen } } */ // ein einfacherer Test gefunden=true; // Annahme produkt=generator; zustand[0]=BELEGT; // 0 wird nicht generiert for (int i=1; i= 0) return inhalt[pos]; // falls gefunden: liefere Objekt, else return null; // sonst melde Misserfolg } public boolean insert(Object x) { // versucht, x einzufuegen int pos = find(x); // versuche, x zu finden if ((pos < 0) && // falls x nicht gefunden (zustand[~pos]!=BELEGT)) { // und falls Platz vorhanden: inhalt[~pos] = x; // fuege x ein zustand[~pos]= BELEGT; // setze Zustand auf BELEGT return true; // melde Erfolg } else return false; // melde Misserfolg } public boolean delete(Object x) { // versucht, x zu loeschen int pos = find(x); // versuche, x zu finden if (pos >= 0) { // falls x gefunden: zustand[pos] = GELOESCHT; // setze Zustand auf GELOESCHT inhalt[pos] = null; // gib Verweis auf Objekt frei return true; // melde Erfolg } else return false; // melde Misserfolg } }