すべての整数の頻度が同じである場合、最適な圧縮の公正な近似ceil(log2(k))
値は整数あたりのビット数になります。これらのビット配列に一定時間でアクセスできます。
k
が非常に小さい場合(3 のように)、上記の方法はかなりの量のスペースを浪費する可能性があります。ただし、固定数の小さい整数を基数に結合することで、k
より効率的に固定数のビットに収まるようにすることができます (結果を標準サイズのワードにうまく収めることもできます)。いずれにせよ、一定時間でこのコーディングにアクセスすることもできます。
整数の周波数が同じでない場合、最適な圧縮によって入力のさまざまな部分から可変ビット レートが生成される可能性があるため、単純な配列アクセスは機能しません。その場合、良好なランダム アクセス パフォーマンスにはインデックス構造が必要です。圧縮データを便利なサイズのチャンクに分割し、それぞれを順次解凍できますが、この時間はチャンク サイズによって制限されます。
各数値の頻度がまったく同じである場合、これを利用してスペースを節約できる可能性がありますが、それだけでは十分ではない可能性があります。
n
範囲内の乱数のエントロピーは[0,k)
ですn log2(k)
。これはlog2(k)
数値あたりのビット数です。これは、正確な周波数を利用せずに数値をエンコードするのに必要なビット数です。
各要素のf
コピーの区別可能な順列のエントロピー(ここで) は次のとおりです。k
n=f*k
log2( n!/(f!)^k ) = log2(n!) - k * log2(f!)
スターリングの近似 (ここではn
とf
が大きい場合にのみ有効) を適用すると、次の結果が得られます。
~ n log2(n) - n log2(e) - k ( f log2(f) - f log2(e) )
= n log2(n) - n log2(e) - n log2(f) + n log2(e)
= n ( log2(n) - log2(f) )
= n log2(n/f)
= n log2(k)
これが意味することは、n
が大きくk
が小さい場合、入力の正確な周波数を利用しても大きなスペースを獲得できないということです。
上記のスターリング近似からの総誤差はO(log2(n) + k log2(f))
で、これはO(log2(n)/n + log2(f)/f)
エンコードされた数値ごとです。これは、 your が小さすぎk
て yourf
が小さい場合 (つまり、それぞれの個別の数値のコピー数が少ない場合)、巧妙なエンコーディングでスペースを節約できる可能性があることを意味します。ただし、質問k
は、それが実際には小さいことを示しています。