2009-04-30 10 views
2

私のquestion regarding efficient way of storing huffman tree'sに関連するフォローアップの質問として、(ハフマン符号化出力に基づいて)バイナリツリーを検索し、特定のノードに送信する。効率的なハフマンツリー検索で、取得したパスを記憶している

これは私が現在持っているものです。

  • キューが空でない間、それは我々が を探しているものであれば、キュー、
  • をキューに
    • チェックをポップアイテムをルートノードをオフに追加
      • yes: ルートノードに戻るヘッドポインタに従います。各ノードでは、左または右であるかどうかを確認し、それのノート。
      • 検索
    • 左エンキュー、および右ノード

のうち休憩これはハフマン木ですので、私が探していますすべてのエントリが存在します。上記のものは幅広い最初の検索で、ハフマンの木に最も適していると考えられています。なぜなら、ソース内のアイテムがツリー内でより高い圧縮率を得るために高くなっているからです。しかし、追跡する良い方法はわかりません私がノードに置いたヘッドポインタを使ってバックトラックせずに特定のノードに到達した方法。

この場合、左右のパスのすべてを逆の順序で取得しています。たとえば、ルートにヘッドを追いかけると、ルートから右、左、左に移動する、左、左、右になります。私が探しているのは効率的な方法で100を得ることです。

ノード内に別の値としてルートからノードへのパスを格納することも提案されていましたが、その目的で作成した変数が保持できる多くのビットその時点でデータを格納すると膨大な量のメモリを占有することになります。

+0

ビットストリングの格納については、ビットストリングを格納するためにベクトルを使用できませんか?ビットをコンパクトに格納し、任意の数を格納することができます。 – newacct

+0

"その時点でデータを保存すると、膨大な量のメモリを占有することになります。通常、ハフマン符号化は、バイトを符号化するために使用されます(技術的には、アルファベットの記号)。だから、どうすれば大きなものになるの?可能なバイト数は256です。 – newacct

+0

@newacct:確かに、ベクトルはブールごとに1バイトを占めますが、std :: bitsetはより良いでしょう。 バイトを使用する場合は256しかありません。ディスクからintを読み込み、2^32の可能なオプションが残っているため、メモリ要件が実際に大きくなるので、すでに存在するバイナリツリーからパスを取得する最速の方法です。 –

答えて

2

最速の検索を可能にする値 - >ビット列の辞書を作成します。

値が既知のサイズの場合、おそらくビットストリングの配列だけで取得し、そのインデックスで値をルックアップすることができます。

+0

ビット・ストリングを格納しなければならないという問題があります。今度は、リーフ・ノードに格納されたビット列をディクショナリに移動して、基本的に同じメモリー・トレードオフを使用します。 –

+0

しかし、あなたは最速の方法を求めたのですか? –

+0

確かに、私は絶対にしましたが、私は具体的にバイナリツリーを求めました。私は質問の最後の段落でそれを除外したので、結果を事前に計算することはできませんでした。 –

0

ハフマンエンコードされたデータを一度に1ビットずつデコードすると、パフォーマンスが低下します。ルックアップテーブルの使用を避けたいのと同じくらい、パフォーマンスを気にするなら、これは唯一の方法です。ハフマンコードが作成される方法は、左から右に固有のものであり、高速なテーブル検索に完全に役立ちます。

関連する問題