1

私は、任意のバイナリファイルで動作する必要があるハフマンコンプレッサーとデコンプレッサー(C ++)を書いています。データ構造に関するアドバイスが少し必要です。現在、私の圧縮プロセスは次のとおりです。

  • ファイルのバイトをバイナリ形式でchar*バッファに読み込みます
  • std :: mapを使用して、ファイル内の各バイトパターンの頻度をカウントします。(これは私がトラブルを求めていると思うところです。)
  • 頻度ヒストグラムに基づいて二分木を構築します。各内部ノードにはその子の頻度の合計があり、各リーフノードには実際のバイトを表すchar*があります。

これは私が今のところいるところです。

私の質問は、char *からintへのマップを使用した場合、正確に何を測定しているのかということです。私が正しければ、これは実際に私が必要としているものではありません。私が実際に行っているのは、char*を使用して実際の4バイトのポインター値を追跡することです。

したがって、私が計画しているのは、ヒストグラムにマップを使用し、リーフノードに格納されているデータに文字を使用することです。私の論理はここに聞こえますか?私の推論はそうですが、バイナリデータを扱うのはこれが初めてなので、奇妙な方法でしか現れない落とし穴に注意したいと思います。

ありがとう。

4

1 に答える 1

3

地図は必要ありません。可能な値は 256 のみです。入力の各バイトに対して、int freq[256] = {0}それを持って追加するだけです。freq[data[idx]]++

本当にマップが必要な場合は、map<unsigned char, int>;を使用します。map from の使用に対するあなたの疑いchar*は正しいです。

于 2010-08-18T18:13:41.700 に答える