すべてのファイルをハフマン符号でエンコードしたい。シンボルあたりのビット長 (そのハフマン コード) を見つけました。
Java で文字をファイルにエンコードすることは可能ですか: 文字の最小次元ではなく、ビットごとにファイルを読み書きする既存のクラスはありますか?
すべてのファイルをハフマン符号でエンコードしたい。シンボルあたりのビット長 (そのハフマン コード) を見つけました。
Java で文字をファイルにエンコードすることは可能ですか: 文字の最小次元ではなく、ビットごとにファイルを読み書きする既存のクラスはありますか?
BitSetを作成して、作成時にエンコーディングを保存し、完了したら文字列表現をファイルに書き込むことができます。
ファイルに単一のビットを書き込むことは本当にしたくありません、私を信じてください。通常、バイトバッファを定義し、メモリ内に「ファイル」を構築し、すべての作業が完了したら、完全なバッファを書き込みます。そうしないと、永遠に(ほぼ)時間がかかります。
高速なビット ベクトルが必要な場合は、colt ライブラリを参照してください。これは、単一のビットを書き込みたい場合や、このビット シフト操作をすべて自分で実行したくない場合に非常に便利です。
ハフマン クラスが存在することは確かですが、それらがどこにあるのかすぐにはわかりません。自分で巻きたいと思ったら、この春すぐに思いつく2つの方法。
1 つ目は、マスク演算子とシフト演算子を使用してメモリ内でビット文字列を組み立て、ビットをより大きなデータ オブジェクト (つまり、int または long) に蓄積してから、それらを標準ストリーミングでファイルに書き出すことです。
2 つ目の、より野心的で自己完結型のアイデアは、1 ビットを書き込むメソッドを持つ OutputStream の実装を作成することです。次に、この OutputStream クラスが前述のバッファリング/シフト/累積を実行し、おそらく結果を2 つ目は、ラップされた OutputStream です。
ビット表現を行うには、Java でビット ベクトルを記述してみてください。ビット ストリーム内の個々のビットを設定/リセットできるはずです。
したがって、ビットストリームはハフマンエンコーディングを保持できます。これは最良のアプローチであり、非常に高速です。
ここで動作する (そして高速な) 実装を見つけることができます: http://code.google.com/p/kanzi/source/browse/src/kanzi/entropy/HuffmanTree.java