Rice編碼是一種壓縮編碼,它的基本思想類似於哈夫曼編碼,即儘可能的用較少的位來存儲多個字。
基本介紹
- 中文名:Rice 編碼
- 外文名:Ricecoding
- 分類:計算機/壓縮編碼
簡介,實現,
簡介
Rice編碼背後的基本思想是儘可能的用較少的位來存儲多個字(正像使用哈夫曼編碼一樣)。實際上,有人可能想到Rice是靜態的哈夫曼編碼(例如,編碼不是由實際數據內容的統計信息決定,而是由小的值比高的值常見的假定決定)。
編碼非常簡單:將值X用X個‘1’位之後跟一個0位來表示。
對於由大word(例如:16或32位)組成的數據和教低的數據值,Rice編碼能夠獲得較好的壓縮比。音頻和高動態變化的圖像都是這種類型的數據,它們被某種語言預處理過(例如delta相鄰的採樣)。
儘管哈夫曼編碼處理這種數據是最優的,卻由於幾個原因而不適合處理這種數據(例如:32位大小要求16GB的柱狀圖緩衝區來進行哈夫曼樹編碼)。因此一個比較動態的方式更適合由大word組成的數據。
實現
在基本壓縮庫針對Rice做了許多最佳化:
1.每個字最沒有意義的位被存儲為k和最有意義的N-k位用Rice編碼。K作為先前流中少許採樣的位平均數。這是通常最好使用Rice編碼的方法,隱藏噪音且對於動態變化的範圍並不導致非常長的Rice編碼。
2.如果rice編碼比固定的開端長,T,一個可選的編碼:輸出T個‘1’位,緊跟(log2(X-T))個‘1’和一個‘0’位,接著是X-T(最沒有意義的(log2(X-T))-1位)。這對於大值來說都是比較高效的代碼並且阻止可笑的長Rice編碼(最壞的情況,對於一個32位word單個Rice編碼可能變成232位或512MB)。
如果開端是4,下面是結果編碼表:
X | bin | Rice | Thresholded | Rice |
0 | 00000 | 0 | 0 | |
1 | 00001 | 10 | 10 | |
2 | 00010 | 110 | 110 | |
3 | 00011 | 1110 | 1110 | |
4 | 00100 | 11110 | 11110 | |
5 | 00101 | 111110 | 111110 | |
6 | 00110 | 1111110 | 11111100 | +1 |
7 | 00111 | 11111110 | 11111101 | |
8 | 01000 | 111111110 | 1111111000 | +1 |
9 | 01001 | 1111111110 | 1111111001 | |
10 | 01010 | 11111111110 | 1111111010 | -1 |
11 | 01011 | 111111111110 | 1111111011 | -2 |
12 | 01100 | 1111111111110 | 111111110000 | |
13 | 01101 | 11111111111110 | 111111110001 | -1 |
14 | 01110 | 111111111111110 | 111111110010 | -2 |
15 | 01111 | 1111111111111110 | 111111110011 | -3 |
16 | 10000 | 11111111111111110 | 111111110100 | -4 |
17 | 10001 | 111111111111111110 | 111111110101 | -5 |
18 | 10010 | 1111111111111111110 | 111111110110 | -6 |
19 | 10011 | 11111111111111111110 | 111111110111 | -7 |
20 | 10100 | 111111111111111111110 | 11111111100000 | -5 |
就像你看到的一樣,在這個實現中使用threshold方法僅僅兩個編碼導致一個最壞的情況;剩下的編碼產生比標準Rice編碼還要短的編碼。