2

問題:

ほとんどが 0、いくつかの 1、いくつかの 2 を含む、非固定長 (ただし、300 から 400 である必要があります) の負でない整数の配列を圧縮したいと考えています。可能性は低いですが、より大きな数を持つことも可能です。

たとえば、360 要素の配列は次のとおりです。

0,0,0, 1 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1 , 0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 1 ,0,0,0,0,0,0, 2 ,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 1,1 ,0,0,0,0,0,0, 0,0, 4 ,0,0, 0,0,0,0, 3 ,0,0,0,0,0,0,0,0,0, 1 ,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0, 2 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0, 1 ,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0, 1 ,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0, 1 ,0,0,0,0,0,0,0, 5,2 ,0,0,0, 0,0,0,0,1 ,0,0,0,0,0,0,0, 1 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0 , 1,2,1,0,0,0,0,0,0, 0,0, 1 ,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.

ゴール:

目標は、このような配列を、文字と数字を使用して可能な限り短いエンコーディングに圧縮することです。理想的には、次のようなものです: sd58x7y

私が試したこと:

「デルタ エンコーディング」を使用しようとしました。ゼロを使用して 1 より大きい値を示します。たとえば、{0,0,1,0,0,0, 2 ,0,1} は次のように示されます: 2,3 、0、1。それをデコードするには、左から右に読み取り、「2 つのゼロ、1 つ、3 つのゼロ、1 つ、0 つのゼロ、1 つ (これは前のものに追加されるため、2 になります)、1 つのゼロ、1 つを書き留めます。 "。

区切り文字 (コンマ) の必要性をなくしてより多くのスペースを節約するために、文字 z を「35 PLUS 次の文字」として残しながら、1 つの英数字のみを使用して 0 から 35 のデルタ値を示すようにしました (0 から y を使用)。 . これは「可変ビット」などと呼ばれるものだと思います。たとえば、40 個のゼロが連続している場合、「z5」としてエンコードします。

それは私が得た限りです...結果の文字列はまだ非常に長いです(上記の例では約20文字になります)。理想的には、8 文字またはそれより短い文字が必要です。御時間ありがとうございます; どんな助けやインスピレーションも大歓迎です!

4

2 に答える 2

2

あなたのデータには次のものがあります。

14 1s (3.89% of data)
4 2s (1.11%)
1 3s, 4s and 5s (0.28%)
339 0s (94.17%)

数値が互いに独立しておらず、他の情報がないと仮定すると、データの合計エントロピーは数値あたり 0.407 ビット、つまり全体で 146.4212 ビット (18.3 バイト) になります。したがって、8 バイトでエンコードすることはできません。

于 2013-11-06T20:02:47.330 に答える