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-treebut 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.

War es hilfreich?

Lösung

Ich tat etwas Forschung und fand folgende Kleinode online:

  1. trie.h
  2. trie.c

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:

  1. trie.h

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).

verwenden könnte

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.

scroll top