2008-12-11 11 views
6

Gibt es etwas Besseres als eine Trie für diese Situation?Platzsparende Datenstruktur zum Speichern einer Wortliste?

  • Speichern einer Liste von ~ 100k englischen Wörter
  • Needs minimale Speicher
  • Lookups angemessen sein müssen, verwenden, sondern müssen Blitz nicht schnell sein

Ich arbeite mit Java, so war mein erster Versuch, nur ein Set <String> zu verwenden. Ich ziele jedoch auf ein mobiles Gerät ab, auf dem bereits wenig Speicher verfügbar ist. Da viele englische Wörter gemeinsame Präfixe haben, scheint ein Trie wie eine gute Wette zu sein, um etwas Speicher zu sparen - weiß jemand andere gute Optionen?

EDIT - Mehr Infos - Die Datenstruktur wird für zwei Operationen

  • Answering verwendet werden: Ist einige Wort XYZ in der Liste?
  • Generieren der Nachbarschaft von Wörtern um XYZ mit einem Buchstaben verschiedenen

Danke für die guten Anregungen

+0

werden Sie keine Netzwerkverbindung vorausgesetzt? – Milhous

+1

@Milhous, jetzt bin ich interessiert zu wissen, was Sie vorschlagen, ist möglich MIT einer Netzwerkverbindung ... – paxdiablo

Antwort

3

Was machst du? Wenn es Rechtschreibprüfung ist, könnten Sie einen Bloom-Filter verwenden - siehe code kata.

+0

Ich wollte einen Bloom-Filter vorschlagen, aber angesichts seiner Ziele, denke ich nicht Bloom-Filter würde funktionieren. Bloom-Filter antworten nicht mit einem definitiven Ja/Nein, wenn ein Wort in der Liste ist, und es wird nicht die Erzeugung einer Nachbarschaft erlauben. – mipadi

+0

Ein Bloom-Filter * antwortet * definitiv, wenn das Wort * nicht * in der Liste ist. Ja, die Nachbarschaft Anforderung wurde später hinzugefügt :) –

1

Sie noch die Baumstruktur selbst mit Trie halten müssen. Huffman encoding Das Alphabet oder N-Buchstaben (für gängige Formen wie "tion", "un", "ing") können die Häufigkeit des Auftretens in Ihrem Wörterbuch nutzen und den Eintrag in Bits komprimieren.

8

Eine Struktur I zur Minimierung des Raumes in einem Rechtschreibwörterbuch sah, war jedes Wort so zu kodieren:

  • die Anzahl der Zeichen (ein Byte) gemeinsam mit dem letzten; und
  • das neue Ende.

So die Wortliste

HERE   would encode as THIS 
sanctimonious      0,sanctimonious 
sanction       6,on 
sanguine       3,guine 
trivial       0,trivial 

Sie Speichern 7 Byte gerade dort oben (19%), vermute ich, die Einsparung für ein 20.000 Wort Wörterbuch ähnlich wäre nur aufgrund der Mindestabstände zwischen (gemeinsame Präfixe) benachbarter Wörter.

Um die Suche zu beschleunigen, gab es eine Tabelle mit 26 Einträgen im Speicher, die die Anfangsversätze für Wörter enthielt, die mit a, b, c, ..., z begannen. Die Wörter an diesen Offsets hatten immer 0 als erstes Byte, da sie keine Buchstaben mit dem vorherigen Wort hatten.

Dies scheint eine Art Trie, aber ohne die Zeiger zu sein, die sicherlich platzintensiv würden, wenn jedem Zeichen im Baum ein 4-Byte-Zeiger zugeordnet wäre.

Wohlgemerkt, das war von meinen CP/M Tagen, wo die Erinnerung viel knapper war als jetzt.

+0

+1 - Danke für die gemeinsame Nutzung eines cleveren Algorithmus. BTW: Damals hat die Zuverlässigkeit meines Gedächtnisses die Knappheit mehr als kompensiert .... :-) –

6

A Patricia Trie besser geeignet sein können:

http://en.wikipedia.org/wiki/Patricia_tree

My (fuzzy) Speicher mir sagt, es in einigen der frühen Volltext-Suchmaschinen ...

Paul verwendet wurden.

+0

Ich habe gerade daran gedacht ... – Rich

+0

Java-Implementierung hier http://code.google.com/p/radixtree/ – Peter

1

Völlig wilde Idee ... (das heißt höchstwahrscheinlich sehr falsch)

Wie wäre es, die Worte wie ein Baum aller möglichen Buchstabenkombinationen zu speichern?

Dann kostet jedes "Wort" nur ein einziges Zeichen und zwei Zeiger (eins zum Zeichen und eins zu einem Terminator). Auf diese Weise, je mehr Buchstaben sie gemeinsam haben, desto weniger kostet jedes Wort.

 . . 
    // 
    r-p-s-. 
    /\\ 
    a \s-. 
/ t-. 
c  \ 
     s-. 

Auto Karpfen Autos Wagen Karren

Also für 9 Zeichen und 14 Zeiger Karpfen bekommen wir 6 "Wörter" in Höhe von insgesamt 25 Buchstaben.

Suchvorgänge wären schnell (Zeiger-Lookups statt Char-Vergleiche) und Sie könnten einige Stemming-Optimierungen vornehmen, um noch mehr Speicherplatz zu sparen ...?

EDIT: Sieht aus wie ich das Rad neu erfunden habe. ;-)

1

Verwandte zu Paul Beitrag:

Gibt es Gründe, warum Sie ein Trie in Ihrem Fall nicht berücksichtigen können? Wenn es nur ein implementaiton Problem, hier ist eine enge Implementierung von Patricia Trie-Einsatz und in C Suche (von NIST):

Patricia Insert in C

Patricia Search in C

Verwandte Themen