たとえば、私は0と52の間で52のシャッフルされた整数を含む配列を持っています - 繰り返し値はありません。52個の整数を少ない量にエンコードするにはどうすればよいでしょうか?
この配列をアルゴリズムに従って符号化して、より少ない数で表すことができ、元の値をデコードして再現するにはどうすればよいでしょうか?
私は、大きなバイナリ文字列を作成し、0または1のグループを文字として一緒にグループ化し、それを拡張できると考えていました。それが行く方法だろうか?あなたの範囲は0〜52の場合のおかげ
たとえば、私は0と52の間で52のシャッフルされた整数を含む配列を持っています - 繰り返し値はありません。52個の整数を少ない量にエンコードするにはどうすればよいでしょうか?
この配列をアルゴリズムに従って符号化して、より少ない数で表すことができ、元の値をデコードして再現するにはどうすればよいでしょうか?
私は、大きなバイナリ文字列を作成し、0または1のグループを文字として一緒にグループ化し、それを拡張できると考えていました。それが行く方法だろうか?あなたの範囲は0〜52の場合のおかげ
52があります。 (それは50の2階乗である)異なる配列を記述するようなものです。ところで、彼らは順列と呼ばれています。 0と52の間の単一の数値!そのような順列を一意的に表す。このような数値を格納するには226ビットが必要です。 8つの32ビット整数も同じように機能します。
番号を順列にマッピングして、hereに戻すことができます。
良い答えですが、この質問は実際にあなたがリンクしているものと重複しています。 –
あなたは64 連合よりも低い値を格納するために6ビットのVARを必要とするが、キー
union DATAPACK
{
unsigned int code1 : 6;
unsigned int code2 : 6;
unsigned int code3 : 6;
unsigned int code4 : 6;
....
} array1;
である、あなたは、各番号を格納するための6ビットを必要とします - 52バイトの代わりに(1バイトあたり1バイトを使用していると仮定して)、52 x 6/8または39バイトしか必要としません。
保存する必要が何兆もない限り、保存する価値はほとんどないようです。
カードデッキの状態を送信するので、最大39バイトになります。それはまったく問題ではありませんが、データを実際に隠している行に沿ってもっと考えていましたか? – rtheunissen
四分木または空間インデックスで配列を分割し、次に複雑さを減らすためにスペースフィルカーブを使用しますか?多分、zカーブはそれを行うことができますか、またはヒルベルト曲線ですか? 2 2dアレイのパワーが必要ですか?これはあなたの要件ですか?
あなたdownvote?それは離散数学です! – Bytemain
最後の整数を削除すると、前の51から計算できます。 – blaze
[高速順列 - >数 - >順列マッピングアルゴリズム](http://stackoverflow.com/questions/1506078/fast-permutation-number) -permutation-mapping-algorithms) –