2016-05-17 6 views
1

1と0の数が同じである1と0の文字列があります。私はそれを格納するために必要なビット数の点でより小さい数にこれを圧縮したいと思います。また、圧縮形式と非圧縮形式との間の変換は、多くの作業を必要としない必要がある。0と同じ数の1を含む1と0の文字列を圧縮する

たとえば、すべての可能な文字列を順序付けし、番号を付けて圧縮したデータにすると、あまりにも多くの作業が必要になります。

簡単な解決策は、圧縮されたデータを、文字列が長さnの文字列の最初のn-1文字だけにすることです。圧縮されたデータと解凍されたデータの間の変換は簡単ですが、圧縮はほとんどなく、文字列ごとに1ビットしかありません。

偶数の長さの文字列に一般化できるこのプロパティ(1と同じ数)を持つ文字列を圧縮するアルゴリズムが必要です。私はまた、上記の方法以上に圧縮したいと思います。

ありがとうございました。

+0

"たとえば、すべての可能な文字列を順序付けし、それらの番号を付けて、この番号を圧縮されたデータにすることは、あまりにも多くの作業になります。バイナリ文字列を整数に変換するのは大変ですか? – Blorgbeard

+0

[Java one-liner](http://stackoverflow.com/questions/17833463/how-do-you-convert-a-binary-number-to-a-biginteger-in-java) – Blorgbeard

+0

いいえ、発注するすべての可能な文字列はあまりにも多くの作業です。たとえば、文字列の長さが10であるとすると、0000011111を最初の文字列にすると、0に圧縮され、2番目の文字列は0000101111になります。これらの間を変換するには多くの作業が必要です。あなたが提案したようにバイナリ文字列を整数に変換すると、データは圧縮されませんが、それでも同じ量のビットを占有します。 – mathew

答えて

0

これは組み合わせ問題であり、N個のアイテムは一度にk個使用されます。

コメントは長さ10の例として、一度に5を取ったもので、252のユニークなパターンしかないことを意味します。これは10ビットの値ではなく、8ビットの値に適合します。 SEE:WIKI: Combinations

は0から251のインデックス付きの値を拡大、例がここにあります

SEE:Algorithm to return all combinations of k elements from n

抽出している間、あなたが再構築されたのビット位置を設定するために抽出された値を使用することができます値は、展開ごとにO(1)時間です。リストが数百万以上でない場合は、ルックアップテーブルを事前に計算することができます。これは、インデックス値をデコードされた値に変換する方がはるかに高速です。 IE:可能なすべてのリストを作成し、翻訳を参照します。

関連する問題