ハフマンコーディングのバイト周波数テーブル
-
29-09-2019 - |
質問
任意のバイナリファイルで作業する必要があるハフマンコンプレッサーと減圧装置(C ++)を書いています。データ構造のアドバイスが少し必要です。現在、私の圧縮プロセスは次のとおりです。
- ファイルのバイトをバイナリ形式でchar*バッファーに読み取る
- STD ::マップを使用して、ファイル内の各バイトパターンの周波数をカウントします。 (これは私がトラブルを求めていると思うところです。)
- 周波数ヒストグラムに基づいてバイナリツリーを構築します。各内部ノードには、子供の周波数の合計があり、各リーフノードには実際のバイトを表すchar*があります。
これは私がこれまでのところにいるところです。
私の質問は、char*からintまでのマップを使用する場合に正確に測定していることです。私が正しければ、これは実際に私が必要とするものではありません。私が本当にやっていると思うのは、char*を使用して実際の4バイトのポインター値を追跡することです。
したがって、私がやろうとしているのは、ヒストグラムにはマップを使用し、葉のノードに保存されているデータにCharを使用することです。私の論理はここに音ですか?私の推論は私にはいと言っていますが、これはバイナリデータを扱うのは初めてなので、奇妙な方法でしか現れない落とし穴に注意したいと思います。
ありがとう。
解決
マップは必要ありません。可能な値は256しかありません。ただ持っている int freq[256] = {0}
そしてそれに追加します freq[data[idx]]++
入力内の各バイトに対して。
本当にマップが必要な場合は、使用してください map<unsigned char, int>
;からマップを使用することに対するあなたの疑い char*
正しい。
所属していません StackOverflow