2009-08-20 17 views
2

Ich versuche, die Datenstruktur zu verwenden, speichern Schlüssel-Wert-Paare zu entscheiden, wann nur benötigten FunktionenWelche Datenstruktur ist für diese Situation geeignet?

  • Insertion
  • Lookup

Insbesondere brauche ich nicht in der Lage sein, um Paare zu löschen oder durch Schlüssel/Werte/Paare zu iterieren.

Die Schlüssel sind Ganzzahl-Tupel, die Werte sind Zeiger (Referenzen, was auch immer). Ich speichere nur ein paar Millionen Paare über (viele) Objekte verteilt.

Ich erwäge derzeit entweder mit

  • eine Hash-Tabelle
  • ein kd-Baum
  • ein B-Baum

Ich bin zu der Hash-Tabelle lehnt (für die O(1) Insertion/Lookup-Zeit), aber ich wollte meine Neigungen bestätigen.

Welche Struktur (von den oben genannten oder anderen) würden Sie empfehlen und warum? Wenn Sie eine Hash-Tabelle empfehlen, sollte ich eine separate Tabelle für jedes Objekt erstellen oder einfach eine einzelne Tabelle erstellen und die ID des Objekts als Teil des Schlüsseltupels verwenden?

+0

Ein kd-Baum ist eine räumliche Datenstruktur - es macht keinen Sinn, sie in dieser Situation zu verwenden. Meinst du einen rot-schwarzen Baum? –

+0

Wie werden Sie diese Datenstruktur verwenden? Machst du alle Inserts im Vordergrund oder mischst du sie mit den Lookups? Wie viele Nachschlagevorgänge erwarten Sie gegenüber Einfügungen? Sind die Schlüssel einzigartig? Wie viele Schlüssel gibt es (2^64?). Wie sind sie verteilt? – Dolphin

Antwort

4

Eine Hashtabelle ist hier die beste Wahl, da alle für Sie wichtigen Operationen O (1) sind (und Sie sollten sich daher keine Gedanken über die Erstellung mehrerer Hashtabellen machen müssen).

+0

O (1) vs O (log n) beiseite - Ich habe (anekdotisch) gelesen, dass Hash-Maps nur oberhalb von einigen N besser funktionieren, da die Konstante hoch genug ist, um ihre Verwendung für einige Fälle zu entmutigen. Ein paar Millionen Paare klingen hoch genug für mich, aber haben Sie einige Zahlen? Oder hängt das so sehr davon ab, dass nur Profiling hilft? – gimpf

1

Ich bin ein großer Fan von Hashtabellen, da sie einfach zu bedienen sind und Implementierungen für fast alle wichtigen Sprachen verfügbar sind. Die O (1) -Einfügung/Suche ist ein besonders gutes Merkmal.

Sie sollten wahrscheinlich eine einzige Tabelle verwenden, um Speicher zu sparen. Hash-Tabellen sind notorisch ineffizient Speicher, und die Verwendung einer einzigen Tabelle würde dazu beitragen, das zu minimieren.

1

Hash Tabellen wären hier nützlich und ich sehe keinen Grund mehr als eine Tabelle zu haben.

+1

Dieser Beitrag hat einen Hintergrund von Hash-Tabellen http://StackOverflow.com/Questions/371136/Binary-Trees-VS-linked-Lists-VS-hash-Tables – Jambobond

0

Die meisten Bäume haben eine Suchzeit von O (n ln), aber Hashtabellen haben eine O (1) Lookup-Zeit, das ist also diejenige, die Sie verwenden möchten. Es ist auch sehr häufig, und oft ist die Implementierung zum Booten hochoptimiert.

+2

Ich dachte, sie hatten O (log n)? – gimpf