将trie保留到文件中 - C.

时间:2010-04-03 17:37:52

标签: c serialization persistence trie

我有trie我正在使用它来进行字符串处理。我有一个简单的编译器,它从一些数据生成trie。生成后,我的trie在运行时不会更改。

我正在寻找一种方法,我可以将trie保存在文件中并有效加载它。我查看了sqllite以了解它们是如何持久化b-tree但是它们的文件格式看起来有点先进,我可能不需要所有这些。

如果有人可以提供一些想法来坚持并阅读trie,那将会很有帮助。我正在使用C编程。

3 个答案:

答案 0 :(得分:11)

我做了一些研究,并在网上发现了以下小宝石:

  1. trie.h
  2. trie.c
  3. 带有序列化和反序列化的工作三元组。它最初编写用于Python(有一个相应的triemodule.c用于将它绑定到Python),但它是纯C;你可以挖掘它的想法或按你的意愿使用它。

    更新

    链接似乎不再有效。我会保持原件,但这里是回路机器中的链接:

    1. trie.h
    2. trie.c

答案 1 :(得分:4)

假设您的整个数据结构适合内存,则递归序列化方法最简单。 Sqllite适用于不适合内存的数据结构,因此尝试复制方法可能有点过分。

以下是用于读取/写入节点的示例伪代码。它通过递归地读/写子节点来工作。它没有特定于特定的,也适用于其他树数据结构。

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)

答案 2 :(得分:1)

如果所有节点的大小相同,那么您只需枚举节点(root = 0)并将其中的每个节点写入其索引处的文件中。在编写它们时,您必须将对其他节点的引用更改为这些节点的索引。您可能还需要NULL值。您可以使用-1,也可以使用(root = 1)和(NULL = 0).

您可能还可以通过将其指针字段更改为较小的类型来稍微压缩这些节点。

如果您的节点大小不同,则会更复杂。