Glorfindelが指摘したように、このような少数のビットの場合、多くのビットを保存することは実行不可能です。ただし、使用しているドメインにもう少しビットがある場合、開始値とデルタを使用して範囲をエンコードすることにより、平均的なケースで大幅な節約を実現できます。
ドメインは整数なので、32ビットと仮定します。単純なアプローチでは、範囲を格納するために64ビット(開始、終了)が必要です。
(start、delta)のエンコーディングに切り替えると、そこから範囲の終わりを構築できます。最悪の場合、開始は0であり、デルタは32ビットであることがわかります。
2 ^ 5は32なので、デルタの長さを5ビットでエンコードし(長さゼロではなく、常に1を追加)、エンコードは(開始、長さ、デルタ)になります。最悪の場合、これには32 * 2 + 5ビット、したがって69ビットのコストがかかります。そのため、最悪の場合、すべての範囲が長い場合、これは単純なエンコードよりも悪化します。
最良の場合、32 + 5 + 1 = 38ビットのコストがかかります。
つまり、多くの範囲をエンコードする必要があり、それらの範囲がそれぞれドメインのごく一部しかカバーしていない場合、このエンコードを使用すると平均して使用するスペースが少なくなります。開始は常に32ビットかかるため、開始がどのように分散されるかは関係ありませんが、範囲の長さがどのように分散されるかは重要です。長さが短いほど圧縮率が高くなり、ドメイン全体をカバーする範囲が増えると、このエンコードは悪化します。
ただし、同様の開始点の周りにグループ化された多くの範囲がある場合(たとえば、センサーから値を取得するため)、さらに大きな節約を達成できます。同じ手法を開始値に適用し、バイアスを使用して開始値をオフセットできます。
10000の範囲があるとします。範囲は特定の値を中心にグループ化されます。バイアスを32ビットでエンコードします。
素朴なアプローチを使用すると、これらすべての範囲を格納するには32 * 2 * 10000 = 640 000ビットが必要になります。
バイアスのエンコードには32ビットが必要で、各範囲のエンコードには5 + 1 + 5 + 1 = 12ビットのベストケースがかかり、合計で120 000 + 32 = 120 032ビットになります。最悪の場合、5 + 32 + 5 + 32ビット、したがって74ビット、合計740 032ビットが必要です。
これは、エンコードに32ビットを要するドメインの10000個の値に対して、
- 最良の場合のスマートデルタエンコーディングを使用した120 032ビット
- ナイーブスタート、エンドエンコーディング、常に64 000ビット(ベストまたはワーストケースなし)
- 最悪の場合のスマートデルタエンコーディングを使用した740 032ビット
単純なエンコーディングをベースラインとして使用する場合、最大81.25%のコスト削減、または最大15.625%のコスト削減が可能です。
あなたの価値がどのように分配されるかによって、これらの節約は重要です。あなたのビジネスドメインを知ってください!エンコードする内容を把握します。
拡張機能として、バイアスを変更することもできます。データを分析し、値のグループを識別する場合、データをバケットにソートし、それらの各バケットを独自のバイアスで個別にエンコードできます。つまり、この手法は、単一の開始値の周りにグループ化された範囲だけでなく、複数の値の周りにグループ化された範囲にも適用できます。
開始点が均等に分散されている場合、このエンコードは実際にはうまく機能しません。
このエンコードは、明らかにインデックス付けが非常に悪いです。x番目の値を単に読み取ることはできません。ほとんど順番にしか読み取れません。これは、ネットワークまたは大容量記憶装置(テープまたはHDDなど)を介したストリーミングなど、状況によっては適切です。
データを評価し、グループ化し、正しいバイアスを選択することはかなりの作業であり、最適な結果を得るために微調整が必要になる場合があります。