Persistierende eine Trie in eine Datei - C
-
24-09-2019 - |
Frage
habe ich ein trie
, die ich einig String-Verarbeitung zu tun, verwenden. Ich habe einen einfachen Compiler, den trie
von einigen Daten erzeugt. Einmal erzeugt, wird mein trie
zur Laufzeit nicht ändern.
Ich bin für einen Ansatz, bei dem ich die Trie in einer Datei bestehen bleiben kann und es effektiv laden. Ich habe bei sqllite
sah zu verstehen, wie sie persistierenden b-tree
but Aussehen ihres Dateiformates Bit fortgeschritten und ich kann nicht alle diese benötigen.
Es wäre hilfreich, wenn jemand ein paar Ideen zur Verfügung stellen kann bestehen bleiben und die trie
zu lesen. Ich programmiere C verwendet wird.
Lösung
Ich tat etwas Forschung und fand folgende Kleinode online:
Eine Arbeits Trie mit Serialisierung und Deserialisierung. Es wurde ursprünglich in Python für die Verwendung geschrieben (es gibt eine entsprechende triemodule.c
dafür zu Python zu binden), aber es ist reine C; Sie könnte es für Ideen Mine oder verwenden Sie es, wie Sie wollen.
Aktualisieren :
Es scheint, sind die Links nicht mehr funktionieren. Ich werde die Originale halten, aber hier sind die Links in der Wayback Maschine:
Andere Tipps
Unter der Annahme, Ihre gesamte Datenstruktur passt im Speicher, eine rekursive Serialisierung Ansatz ist am einfachsten. SQLLite Arbeiten mit Datenstrukturen, die in den Speicher passen nicht, so ist es wahrscheinlich übertrieben ist, ihre Methoden, um zu versuchen zu kopieren.
Hier ist beispielsweise Pseudo-Code zum Lesen / Schreiben eines Knotens. Es funktioniert, indem rekursiv Lesen / Schreiben der untergeordneten Knoten. Es hat nichts Trie-spezifisch und sollte für andere Baumdatenstrukturen wie gut funktionieren.
void writeNode(Node *node)
write node data to file
write node.numOfChildren to file
for each child:
writeNode(child)
Node *readNode()
Node *node = allocateNewNode()
read node data from file
read node.numOfChildren from file
for (i=0; i<node.numOfChildren; i++)
Node *child = readNode()
node.addChild(child)
Wenn alle Ihre Knoten die gleiche Größe haben, dann können Sie einfach Ihre Knoten (root = 0)
aufzählen und jeder von ihnen in einer Datei auf ihrem Index schreiben. Während sie zu schreiben müssen Sie ihre Referenzen zu anderen Knoten zu diesen Knoten Indizes ändern, though. Sie werden wahrscheinlich brauchen auch einen NULL
Wert. Sie könnten -1
verwenden, oder Sie (root = 1)
und (NULL = 0).
Sie werden wahrscheinlich auch in der Lage sein, diese Knoten etwas zu komprimieren durch ihre Zeiger Felder ändern kleineren Typen sein.
Wenn die Knoten verschiedene Größen sind dann ist es komplizierter.