So erstellen Sie eine hash-Tabelle
Möchte ich erwähnen, bevor Sie fortfahren, dass ich mich bei anderen Fragen zu Fragen, die gleiche Sache auf dieser Website sowie auf anderen Websites. Ich hoffe, dass bekomme ich eine gute Antwort, denn mein Ziel ist ein zweifaches:
- Linie, würde ich mag, um zu lernen, wie zum erstellen einer hash-Tabelle.
- Zweitens finde ich, dass eine Menge an Antworten auf Stack Overflow, neigen dazu, selbst ein gewisses Maß an wissen über ein Thema, das oft nicht da, vor allem für die neueren Typen. That being said, ich hoffe die Bearbeiten meine wichtigste Botschaft an eine Erklärung des Prozesses etwas mehr in die Tiefe, sobald ich es herausfinden ich.
Auf den Hauptgang:
Wie ich Sie verstehe, so weit, eine hash-Tabelle ist ein array von Listen oder eine ähnliche Datenstruktur), hofft, optimal, haben so wenig Kollisionen wie möglich, um ihn zu schützen lobte O(1) Komplexität. Das folgende ist mein Aktueller Prozess:
So meinen ersten Schritt erstellen Sie ein array von Zeigern:
Elem ** table;
table = new Elem*[size];//size is the desired size of the array
Mein zweiter Schritt ist die Erstellung einer Hash-Funktion( eine sehr einfache ).
int hashed = 0;
hashed = ( atoi( name.c_str() ) + id ) % size;
//name is a std string, and id is a large integer. Size is the size of the array.
Meine Dritte Schritt wäre, um etwas zu schaffen, um Kollisionen festzustellen, das ist der Teil, den ich derzeit bin.
Hier einige pseudo-code:
while( table[hashedValue] != empty )
hashedValue++
else
put in the list at that index.
Es ist relativ unelegant, aber ich bin immer noch an den "was ist das" - Phase. Haben Sie Geduld mit mir.
Gibt es sonst noch etwas? Habe ich irgendwas übersehen oder mache etwas falsch?
Dank
- Sieht OK aus, irgendwie. Der hash-Wert-Indizes in einen festen array und jedes array-element ist eine Liste der tatsächlichen Werte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Griff finden, keine leeren slots und ändern der Größe der Tabelle.
Ihnen fehlt eine definition für
Elem
. Das ist nicht trivial, da es davon abhängt, ob Sie möchten, dass ein Verkettung oder ein Sondieren hash-Tabelle.Einer hash-Funktion liefert den gleichen Wert für dieselben Daten. Ihre Kollisionsprüfung, jedoch ändert das Wert, was bedeutet, dass der hash-Wert hängt nicht nur von der Eingabe, sondern auch auf die Anwesenheit von anderen Elementen in der hash-map. Dies ist schlecht, da Sie fast nie wird in der Lage sein, um tatsächlich Zugriff auf das element, das Sie vor durch seinen Namen, nur durch Iteration über der Karte.
Zweite, Ihre Kollisionsprüfung ist anfällig für überlauf - /range-Fehler, wie Sie erhöhen nur den hash-Wert, ohne zu überprüfen, gegen die Größe der Karte (obwohl, wie ich bereits sagte, Sie sollten nicht Sie selbst sein, dies zu tun).