So erstellen Sie eine Hash-Tabelle

8

Ich möchte erwähnen, bevor ich fortfahre, dass ich mir andere Fragen angeschaut habe, die dasselbe auf dieser Seite und auf anderen Seiten fragen. Ich hoffe, dass ich eine gute Antwort bekomme, denn mein Ziel ist ein zweifaches:

  1. Zunächst möchte ich lernen, wie man eine Hash-Tabelle erstellt.
  2. Zweitens finde ich, dass viele Antworten auf Stack Overflow dazu neigen, ein gewisses Maß an Wissen über ein Thema anzunehmen, das oft nicht da ist, besonders für die neueren Typen. Davon abgesehen hoffe ich, meine Hauptbotschaft bearbeiten zu können, um eine Erklärung des Prozesses ein wenig mehr in die Tiefe zu bringen, sobald ich es selbst herausgefunden habe.

Auf den Hauptgang:

Wie ich sie bisher verstanden habe, ist eine Hash-Tabelle ein Array von Listen (oder einer ähnlichen Datenstruktur), die hoffentlich möglichst wenige Kollisionen haben, um die gelobte O (1) -Komplexität beizubehalten. Das Folgende ist mein aktueller Prozess:

Also ist mein erster Schritt, ein Array von Zeigern zu erstellen:

%Vor%

Mein zweiter Schritt besteht darin, eine Hash-Funktion zu erstellen (eine sehr einfache).

%Vor%

Mein dritter Schritt wäre, etwas zu erstellen, um Kollisionen zu erkennen. Dies ist der Teil, in dem ich mich gerade befinde.

Hier ist ein Pseudocode:

%Vor%

Es ist relativ unelegant, aber ich bin immer noch auf der "was ist das" Bühne. Trage mit mir.

Gibt es noch etwas? Habe ich etwas vermisst oder etwas falsch gemacht?

Danke

    
Joshua 20.11.2011, 23:39
quelle

3 Antworten

3

Sie können keine leeren Slots finden und die Größe der Tabelle ändern.

    
Martin Beckett 20.11.2011, 23:42
quelle
1

Sie verpassen eine Definition für Elem . Das ist nicht trivial, denn es hängt davon ab, ob Sie eine Verkettung oder eine Hash-Tabelle mit Suchfunktionen wünschen.

    
Fred Foo 20.11.2011 23:44
quelle
0

Eine Hash-Funktion erzeugt den gleichen Wert für die gleichen Daten. Ihre Kollisionsprüfung ändert jedoch diesen Wert, was bedeutet, dass der Hash-Wert nicht nur von der Eingabe, sondern auch von anderen Elementen in der Hash-Map abhängt. Das ist schlecht, da Sie fast nie in der Lage sein werden, auf das Element zuzugreifen, das Sie zuvor durch seinen Namen eingegeben haben, sondern nur über die Karte zu iterieren.

Zweitens ist Ihre Kollisionsprüfung anfällig für Überlauf- / Bereichsfehler, da Sie einfach den Hashwert erhöhen, ohne die Größe der Karte zu überprüfen (obwohl, wie ich bereits sagte, Sie dies nicht einmal tun sollten) / p>     

Xeo 21.11.2011 00:44
quelle

Tags und Links