2016-04-08 9 views
0

Von Mark Weiss Datenstrukturen und Algorithmen-Analyse in C++:Was ist der schnellste Weg, um zu rehasen?

/** 
* Rehashing for quadratic probing hash table. 
*/ 
void rehash() 
{ 
    vector<HashEntry> oldArray = array; 

    // Create new double-sized, empty table 
    array.resize(nextPrime(2 * oldArray.size())); 
    for(auto & entry : array) 
     entry.info = EMPTY; 

    // Copy table over 
    currentSize = 0; 
    for(auto & entry : oldArray) 
     if(entry.info == ACTIVE) 
      insert(std::move(entry.element)); 
} 

Es scheint wie eine wirklich schmerzhafte Operation der durch jedes Element in der Tabelle zu gehen, und wenn das Element zu sehen, die Überprüfung aktiv ist oder nicht. Gibt es eine Implementierung, bei der nur die Anzahl der Elemente (im Gegensatz zur gesamten Tabelle) durchlaufen wird?

+1

Eine verknüpfte Hash-Struktur (bei der Einträge auch als doppelt verknüpfte Liste verknüpft sind) ermöglicht Ihnen, die Elemente und nicht die gesamte Tabelle direkt zu durchlaufen (und die Tabelle in Einfügereihenfolge anstelle einer beliebigen Reihenfolge zu durchlaufen)). Funktioniert das? – ShadowRanger

+0

Würde dies in einem geschlossenen Hash-Szenario funktionieren (mein Ziel)? Als Referenz: Open Hashing (Separate Verkettung): Beim offenen Hashing werden Schlüssel in verknüpften Listen gespeichert, die an Zellen einer Hash-Tabelle angehängt sind. Closed Hashing (Open Addressing): In geschlossenem Hashing werden alle Schlüssel in der Hash-Tabelle selbst ohne die Verwendung von verketteten Listen gespeichert. – blueman

+2

Sie müssen nur dann erneut anzeigen, wenn die Anzahl der eingefügten Elemente mindestens die Hälfte der Größe der Tabelle beträgt. Daher ist es nicht kostspielig, alle Tabellenzellen zu überprüfen. –

Antwort

0

Siehe Per-Ake Larson, Dynamisches Hashing, CACM April 1988, S. 446-457. Er beschreibt ein Hashing-System, bei dem Buckets aufgeteilt werden können und nur die Hashcodes für den Splt-Bucket neu berechnet werden müssen.

Sie finden eine 'C' version of it coded as an hsearch(3) replacement, in Usenet comp.sources.misc Archive für Juli 1998, beigetragen von [email protected] (me). Dieser Code hat später seinen Weg in die Berkeley DB und verschiedene andere Orte einschließlich OpenLDAP gefunden. Entschuldigung, ich habe den ursprünglichen Quellcode noch nicht, aber ich habe eine Java-Implementierung.

+0

Verwenden Sie nicht Open Hashing (z. B. 'p = & q-> Next;')? Die Frage bezieht sich auf Closed Hashing (* "Rehashing for Quadratic Probing Hash Tabelle" *) - also sind die Techniken ziemlich unterschiedlich. –