2016-03-26 15 views
-2

Wie ich richtig verstanden habe, berechnet das Implementieren der Hashtabelle den Index basierend auf der eingegebenen Zeichenfolge und gibt ihn direkt zurück, was es zu einem einfachen Schlüsselwertspeicher macht.Einfache Hashtabelle mit Vektor

So einfach Hash-Funktion so etwas wie

int hash(string name){ 

    int index = 0; 
    int hash = 0; 
    for (int i = 0; i < name.length() ;i++){ 
     hash += (int)name[i]; 
    } 
    index = sizeOfArray % hash; 
} 

SizeOfArray ist Array von Zeigern mit vordefinierten Größe aussehen könnte. Wenn dieser Index nicht existiert, wird er erstellt. Aber wie implementiere ich es mit Vektoren?

Vektor hat keine vordefinierte Größe. An sie wachsen automatisch. Wenn also sizeOfArray% hash aufgerufen wird, ändert sich jeder Vektor.

Was ist Logik dahinter hat Tabellen? Was ist die beste Methode, um den Index selbst mit wachsendem Vektor/Array zu berechnen?

+1

Warum nicht einfach ein Array von String * verwenden? Und da es Kollisionen geben kann, ist es besser, ein Array von verknüpften Listen (oder Vektoren) von string zu verwenden, da mehrere Strings an einen Hash-Schlüssel anfügbar sein müssen. Übrigens, vielleicht machst du das nur um daraus zu lernen, was sehr nützlich ist. Hash-Schlüssel sind jedoch die Grundlage vieler STL-Datenstrukturen, die mit Ihrem Compiler geliefert werden. –

+1

Es ist eine gute Idee, über Hashtabellen zu lernen, aber implementieren Sie Ihre eigenen nicht für andere als Lernzwecke, nicht wenn es ['std :: unordered_map'] gibt (http://en.cppreference.com/w/cpp/ container/ungeordnete_map). –

+0

Ich erstelle Thins, um zu lernen, ich möchte eine Struktur im Index speichern, die mehrere Daten enthält. – Darlyn

Antwort

1

Sie können eine vector<list<string>> als zugrunde liegende Datenstruktur für die Hash-Tabelle verwenden.
Auch die Indexberechnung ist falsch. anstelle von sizeOfArray % hash sollte es umgekehrt sein.

vector<list<string>> hash_table; 
const size_t hash_table_size = 100; 
hash_table.resize(hash_table_size); 

int hash(string name){ 
    int index = 0; 
    int hash = 0; 
    for (int i = 0; i < name.length() ;i++){ 
     hash += (int)name[i]; 
    } 

    index = hash % hash_table.size(); 
    hash_table[index].push_back(name); 
} 
+1

Das OP sollte dies hilfreich finden, aber - pingelig - es sollte nicht die Hash-Funktion sein, die tatsächlich Daten in die Tabelle einfügt: eine separate Einfügefunktion, die 'Hash' aufruft, sollte das tun (und wahrscheinlich auch die% hash_table.size() '). Außerdem sollten Sie nicht in den Bucket "push_back" drücken, ohne zu überprüfen, ob der 'name' bereits darin erscheint. Aber das OP kann diese Dinge aussortieren, da bin ich mir sicher .... –

Verwandte Themen