Java Huffmanのコーディングの実装( http://en.wikipedia.org/wiki/Huffman_coding )を使用してファイルを圧縮/解凍するための私の探求はまだです割り当て。
ウィキペディアのページから、私は引用します:
- シンボルごとにリーフノードを作成し、優先度キューに追加します。
- キューに複数のノードがある間:
- 優先度が最も高い(確率が最も低い)2つのノードをキューから削除する
- これらの2つのノードを子として、2つのノードの確率の合計に等しい確率で新しい内部ノードを作成します。
- 新しいノードをキューに追加します。
- 残りのノードはルートノードであり、ツリーは完全です。
ここで、強調します。
- 優先度が最も高い(確率が最も低い)2つのノードをキューから削除します
- これら2つのノードを子として、2つのノードの確率の合計に等しい確率で新しい内部ノードを作成します。
だから私は最低の周波数で2つのノードを取る必要があります。 same低頻度の複数のノードがある場合はどうなりますか?どれを使用するかをどのように区別しますか?
私がこれを尋ねる理由は、ウィキペディアに次の画像があるためです。
そして、ハフマンの木が同じかどうかを確認したかったのです。次の内容のファイルを作成しました。
aaaaeeee nnttmmiihhssfffouxprl
そしてこれが結果でした:
悪くないです。ただし、複数のノードが同じ頻度である場合、明らかにいくつかの違いがあります。
私の質問は次のとおりです。
私たちの学校の課題では、私のプログラムで圧縮されたファイル他のクラスメートのプログラムで圧縮解除できるはずです-ので、これを行うには1つの具体的かつ厳密な方法があると思いますそれを行う「標準」または「独自の」方法。しかし、私はそれで少し迷っています。
私のコードはかなり単純です。それは文字通りウィキペディアのリストされたステップに従います。私のコードがキューから頻度が最も低い2つのノードを抽出する方法は、すべてのノードを反復処理することであり、現在のノードが2つの「最小」の既知のノードのいずれよりも頻度が低い場合、最も高いノードを置き換えます。そのように。
割り当てが同一の周波数を区別する方法を指定していない場合、圧縮形式は十分に指定されておらず、独立した実装が相互運用することは期待できません。
これは教師側の見落としである可能性があります-または彼/彼女はこれらすべての記憶に残るポイントを作成しようとしている可能性があります。
最初に説明を求めますが、それ以上の入力がない場合は、実装と文書化が簡単な方法を選択し、次に標準を作成選択を明確に文書化します(クラスメートができるように)すぐにそれを使用して、それらの実装があなたの実装と互換性があることを確認し、割り当てでそれを提出してください。
独自のエンコードおよびデコードアルゴリズムを作成するだけの場合は、操作の各半分が同じ方法を使用している限り、等しい値のノードをどのように区別するかは問題ではありません。
答えは、優先度キューの実装からきています。キューに既に存在する値が再度追加された場合、新しいアイテムは同じ優先度の値を持つ既存のアイテムよりも低いまたは高いと見なされます。これは、アルゴリズムがクラスメートのアルゴリズムと互換性があることを確認するために確認する必要があることです。
いずれかのノードを選択するだけです。とにかく圧縮ファイルにツリーを再構築する方法に関する情報を含める必要があります。
ウィキペディアは言う(解凍について):
ただし、これを行う前に、ハフマンツリーを何らかの方法で再構築する必要があります。文字頻度がかなり予測可能な最も単純なケースでは、ツリーは事前に構築でき(さらに、各圧縮サイクルで統計的に調整されます)、毎回再利用できますが、少なくとも圧縮効率の測定値は多少犠牲になります。それ以外の場合は、ツリーを再構築するための情報を事前に送信する必要があります。
ハフマンコーディングの場合、2つのノードが同じ頻度である場合、圧縮の目的でそれらは同一であるため、どちらか一方を選択すると、等しい圧縮が得られます。
試してみてください-プログラムをセットアップして、どちらかを選択するように構成できるようにします。次に、テストデータを実行して、圧縮後のデータのサイズが変化するかどうかを確認します。