> rice | adaptive | compress <
// Rice 符号化 – 調整可能なパラメータによる適応的な整数圧縮
>> 特長
調整可能なパラメータ
k を調整して、さまざまなデータ分布に対して最適な圧縮を実現します。
幾何分布データ
幾何分布や指数分布を持つデータに最適です。
高速な符号化
単純な除算と余り演算で高速に処理できます。
>> 技術情報
Rice 符号化の仕組み:
Rice 符号化では、各整数 n を 2^k で割って商 q と余り r を得ます。商はユニタリ(q 個の 1 の後に 0)で符号化し、余りは k ビットの 2 進数として表します。これにより、k パラメータを通じてデータ分布に適応する可変長コードが得られます。
Rice 符号化の例 (k=2):
k=2, M=2^2=4 0 → q=0, r=0 → 0|00 → 000 1 → q=0, r=1 → 0|01 → 001 2 → q=0, r=2 → 0|10 → 010 3 → q=0, r=3 → 0|11 → 011 4 → q=1, r=0 → 10|00 → 1000 5 → q=1, r=1 → 10|01 → 1001 6 → q=1, r=2 → 10|10 → 1010 7 → q=1, r=3 → 10|11 → 1011 8 → q=2, r=0 → 110|00 → 11000 k が大きい: ユニタリビットが少なくなり、2 進ビットが多くなる k が小さい: ユニタリビットが多くなり、2 進ビットが少なくなる
Rice 符号化を使う理由:
- ▸データ分布に適応
- ▸実装が簡単
- ▸高速なエンコード/デコード
- ▸センサーデータに適している
- ▸小さな整数に対して効率的
>> よくある質問
Rice 符号化とは何ですか?
Rice 符号化は、幾何分布に対して特に効率的な可変長エントロピー符号化方式です。割る数 M を 2 の冪 (M = 2^k) に制限した Golomb 符号化の特殊なケースであり、ビットシフトを用いることで高速な実装が可能です。
k パラメータはどのように選べばよいですか?
最適な k の値はデータ分布に依存します。平均値 μ を持つデータに対しては、おおよそ k ≈ log₂(μ × ln(2)) と考えられます。小さな k (0–2) はごく小さい値に適しており、大きな k (4–8) はより大きな値をもつデータに向いています。解析機能を使って、データに最適な k を見つけてください。
Rice と Golomb 符号化の違いは?
Rice 符号化は M = 2^k という制約を持つ Golomb 符号化の部分集合です。この制約により、Rice 符号化は(除算ではなく)ビットシフトで高速に実装できますが、圧縮効率はわずかに劣る場合があります。Golomb 符号化では任意の M を選択してより高い圧縮率を得られますが、Rice は速度のために一部の効率を犠牲にします。
Rice 符号化はどこで使われていますか?
Rice 符号化は、ロスレス音声圧縮 (FLAC, ALAC)、画像圧縮 (JPEG-LS)、および幾何分布を持つセンサーデータなどで広く利用されています。特に、指数関数的に減少する確率を持つ小さな非負整数に対して高い効果を発揮します。
// 計算例
| n | q | r | k=2 |
|---|---|---|---|
| 0 | 0 | 00 | 000 |
| 1 | 0 | 01 | 001 |
| 2 | 0 | 10 | 010 |
| 3 | 0 | 11 | 011 |
| 4 | 1 | 00 | 1000 |
| 5 | 1 | 01 | 1001 |
| 6 | 1 | 10 | 1010 |
| 7 | 1 | 11 | 1011 |
| 8 | 2 | 00 | 11000 |
// コード例
Rice code with parameter k (Golomb code with M = 2^k) q = n >> k quotient, written as q ones followed by a zero r = n & (2^k - 1) remainder, written as k plain bits code = unary(q) + r k = 2, n = 9 -> q = 2, r = 01 -> 110 01 Decode: count the leading 1s (q), skip the 0, read k bits (r), n = (q << k) | r Choose k about log2(mean value): small values -> small k
>> その他の質問
Q: RiceコードとGolombコードの違いは?
A: RiceコードはGolombコードのうちパラメータMが2のべき乗(M = 2^k)の特殊な場合です。除算の代わりにビットシフトとマスクが使え、非常に高速です。
Q: パラメータkはどう選びますか?
A: kは値の平均のlog2程度にします。小さすぎるとユナリ部が長くなり、大きすぎると余り部にビットを無駄にします。FLACなどはブロックごとにkを選びます。
Q: Riceコードは何に向いていますか?
A: 小さな値が大きな値よりずっと多い、幾何分布に従う非負整数に向いています。可逆音声圧縮(FLAC)や画像圧縮(JPEG-LS)の予測残差が代表例です。