2011-08-02 11 views
0

たとえば、私は0と52の間で52のシャッフルされた整数を含む配列を持っています - 繰り返し値はありません。52個の整数を少ない量にエンコードするにはどうすればよいでしょうか?

この配列をアルゴリズムに従って符号化して、より少ない数で表すことができ、元の値をデコードして再現するにはどうすればよいでしょうか?

私は、大きなバイナリ文字列を作成し、0または1のグループを文字として一緒にグループ化し、それを拡張できると考えていました。それが行く方法だろうか?あなたの範囲は0〜52の場合のおかげ

+0

最後の整数を削除すると、前の51から計算できます。 – blaze

+0

[高速順列 - >数 - >順列マッピングアルゴリズム](http://stackoverflow.com/questions/1506078/fast-permutation-number) -permutation-mapping-algorithms) –

答えて

8

52があります。 (それは50の2階乗である)異なる配列を記述するようなものです。ところで、彼らは順列と呼ばれています。 0と52の間の単一の数値!そのような順列を一意的に表す。このような数値を格納するには226ビットが必要です。 8つの32ビット整数も同じように機能します。

番号を順列にマッピングして、hereに戻すことができます。

+0

良い答えですが、この質問は実際にあなたがリンクしているものと重複しています。 –

0

あなたは64 連合よりも低い値を格納するために6ビットのVARを必要とするが、キー

union DATAPACK 
{ 
    unsigned int code1 : 6; 
    unsigned int code2 : 6; 
    unsigned int code3 : 6; 
    unsigned int code4 : 6; 
    .... 
} array1; 
0

である、あなたは、各番号を格納するための6ビットを必要とします - 52バイトの代わりに(1バイトあたり1バイトを使用していると仮定して)、52 x 6/8または39バイトしか必要としません。

保存する必要が何兆もない限り、保存する価値はほとんどないようです。

+0

カードデッキの状態を送信するので、最大39バイトになります。それはまったく問題ではありませんが、データを実際に隠している行に沿ってもっと考えていましたか? – rtheunissen

0

四分木または空間インデックスで配列を分割し、次に複雑さを減らすためにスペースフィルカーブを使用しますか?多分、zカーブはそれを行うことができますか、またはヒルベルト曲線ですか? 2 2dアレイのパワーが必要ですか?これはあなたの要件ですか?

+0

あなたdownvote?それは離散数学です! – Bytemain

関連する問題