Ich habe nach einer effizienten String-Trie-Implementierung gesucht. Meistens habe ich folgenden Code gefunden:
Referenzielle Implementierung in Java (per Wikipedia)
Ich mag diese Implementierungen aus zwei Gründen nicht:
- Sie unterstützen nur 256 ASCII-Zeichen. Ich muss Dinge wie Kyrillisch behandeln.
- Sie sind extrem speichereffizient.
Jeder Knoten enthält ein Array mit 256 Referenzen, dh 4096 Byte auf einem 64-Bit-Computer in Java. Jeder dieser Knoten kann bis zu 256 Unterknoten mit jeweils 4096 Byte Referenzen haben. Ein vollständiger Trie für jede ASCII 2-Zeichenfolge würde also etwas mehr als 1 MB erfordern. Drei Zeichenketten? 256 MB nur für Arrays in Knoten. Und so weiter.
Natürlich habe ich nicht vor, alle 16 Millionen drei Zeichenfolgen in meinem Trie zu haben, also wird viel Platz nur verschwendet. Die meisten dieser Arrays sind nur Nullreferenzen, da ihre Kapazität die tatsächliche Anzahl der eingefügten Schlüssel bei weitem überschreitet. Und wenn ich Unicode hinzufüge, werden die Arrays noch größer (char hat 64k-Werte anstelle von 256 in Java).
Gibt es Hoffnung, einen effizienten Versuch für Saiten zu machen? Ich habe einige Verbesserungen gegenüber diesen Arten von Implementierungen in Betracht gezogen:
- Anstatt ein Array von Referenzen zu verwenden, könnte ich ein Array vom primitiven Integer-Typ verwenden, das in ein Array von Referenzen auf Knoten indiziert, deren Größe nahe an der Anzahl der tatsächlichen Knoten liegt.
- Ich könnte Strings in 4-Bit-Teile aufteilen, was Knoten-Arrays der Größe 16 auf Kosten eines tieferen Baums ermöglichen würde.
Wenn Sie die Zeichenfolgen in UTF8 codieren, können Sie den Standard-256-Verzweigungsversuch verwenden und trotzdem Unicode-kompatibel sein
Außerdem sollten Sie beachten, dass nur etwa 70 Zeichen von den möglichen 128 ASCII-Zeichen (die alle in UTF8 auf 1 Byte codiert sind) am stärksten gefunden werden, die Sie dafür optimieren können (z. B. die allgemeinen Digraphen anstelle der nicht verwendeten Steuerzeichen )
quelle
byte*
, um einen beliebigen Typ in einem bitweisen Versuch zu codieren.