0

ハフマン圧縮でファイルを圧縮するプログラムを作成しています。もともと、ファイルからバイトを格納するために uint8_t のベクトルを使用していましたが、パフォーマンスはひどいものでした (74 MB のファイルを解凍するのに 2 時間)。ファイルの値を表すために 16 ビット チャンクを使用することにしました。

もともと、私はこれを持っていました(入力ビットセットには5億2000万ビットが含まれています)

std::vector<uint8_t> bytes;
boost::dynamic_bitset<unsigned char> input;

boost::to_block_range(input, std::back_inserter(bytes));

これはうまく機能し、ファイルの各バイトを表す 8 ビット整数でいっぱいのベクトルを埋めました。各ビットの頻度は、サイズ 256 の整数のベクトルに記録されます。これは恐ろしく実行されています。私のファイル内のこれらの整数の頻度は巨大であるため、文字列をデコードするには絶対に永遠にかかります. 16 ビット整数を使用し、周波数をサイズ 65536 のベクトルに格納した方がよいと考えました。「バイト」のベクトルを埋める試みは次のとおりです。

std::vector<uint16_t> bytes;
boost::dynamic_bitset<unsigned char> input;

boost::to_block_range(input, std::back_inserter(bytes));

ここでの問題は、 to_block_range() 関数が一度に 16 バイトを取り出すのではなく、ビットセットから 8 ビットを取り出して 8 つのゼロで埋めていることです。

この方法で動的ビットセットから uint16_t のベクトルを埋める方法はありますか?

4

1 に答える 1