私のquestion regarding efficient way of storing huffman tree'sに関連するフォローアップの質問として、(ハフマン符号化出力に基づいて)バイナリツリーを検索し、特定のノードに送信する。効率的なハフマンツリー検索で、取得したパスを記憶している
これは私が現在持っているものです。
- キューが空でない間、それは我々が を探しているものであれば、キュー、
- をキューに
- チェックをポップアイテムをルートノードをオフに追加
- yes: ルートノードに戻るヘッドポインタに従います。各ノードでは、左または右であるかどうかを確認し、それのノート。
- 検索
- 左エンキュー、および右ノード
- チェックをポップアイテムをルートノードをオフに追加
のうち休憩これはハフマン木ですので、私が探していますすべてのエントリが存在します。上記のものは幅広い最初の検索で、ハフマンの木に最も適していると考えられています。なぜなら、ソース内のアイテムがツリー内でより高い圧縮率を得るために高くなっているからです。しかし、追跡する良い方法はわかりません私がノードに置いたヘッドポインタを使ってバックトラックせずに特定のノードに到達した方法。
この場合、左右のパスのすべてを逆の順序で取得しています。たとえば、ルートにヘッドを追いかけると、ルートから右、左、左に移動する、左、左、右になります。私が探しているのは効率的な方法で100を得ることです。
ノード内に別の値としてルートからノードへのパスを格納することも提案されていましたが、その目的で作成した変数が保持できる多くのビットその時点でデータを格納すると膨大な量のメモリを占有することになります。
ビットストリングの格納については、ビットストリングを格納するためにベクトルを使用できませんか?ビットをコンパクトに格納し、任意の数を格納することができます。 –
newacct
"その時点でデータを保存すると、膨大な量のメモリを占有することになります。通常、ハフマン符号化は、バイトを符号化するために使用されます(技術的には、アルファベットの記号)。だから、どうすれば大きなものになるの?可能なバイト数は256です。 – newacct
@newacct:確かに、ベクトルはブールごとに1バイトを占めますが、std :: bitsetはより良いでしょう。 バイトを使用する場合は256しかありません。ディスクからintを読み込み、2^32の可能なオプションが残っているため、メモリ要件が実際に大きくなるので、すでに存在するバイナリツリーからパスを取得する最速の方法です。 –