質問

私は持っています trie これを文字列処理に使用しています。以下を生成する単純なコンパイラがあります。 trie あるデータから。生成されると、私の trie 実行時には変わりません。

トライをファイルに保存し、効果的にロードできるアプローチを探しています。見てきました sqllite 彼らがどのように持続しているかを理解する b-treeただし、ファイル形式は少し高度なようで、すべてが必要なわけではないかもしれません。

誰かが持続して読むためのアイデアを提供してくれると助かります。 trie. 。Cを使ってプログラミングをしています。

役に立ちましたか?

解決

いくつかの調査を行ったところ、次のような小さな宝石をオンラインで見つけました。

  1. trie.h
  2. trie.c

シリアル化と逆シリアル化を使用した動作トライ。元々は Python で使用するために書かれました (対応する triemodule.c Python に結び付けるため)、しかしそれは純粋な C です。アイデアを得るためにそれを採掘することも、必要に応じて使用することもできます。

アップデート:

リンクはもう機能していないようです。オリジナルはそのままにしておきますが、ウェイバックマシン内のリンクは次のとおりです。

  1. trie.h
  2. trie.c

他のヒント

は、メモリにあなたの全体のデータ構造の適合を想定すると、再帰的なシリアル化のアプローチが最も簡単です。それは彼らの方法をコピーしようとする行き過ぎおそらくあるので、メモリ内に収まらないデータ構造と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)
あなたのすべてのノードが同じサイズである場合は、

そして、あなたは自分のノード(root = 0)を列挙し、そのインデックスのファイルにそれらのそれぞれを書き込むことができます。それらを書いている間、あなたはしかし、それらのノードのインデックスに他のノードへの参照を変更する必要があります。あなたは、おそらくもNULL値が必要になります。あなたは-1を使用することができます。また、(root = 1)とを使用することができます(NULL = 0).

あなたはおそらくも小さいタイプであることを彼らのポインタフィールドを変更することで多少これらのノードを圧縮することができるようになります。

あなたのノードのサイズが異なる場合は、

は、それはより複雑だ。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top