格倫布編碼

格倫布編碼（英語：Golomb coding）是一種無失真資料壓縮方法，由數學家所羅門·格倫布在1960年代提出。其優點為易於編碼與解碼，另外對於擁有機率分布為幾何分佈 G ( p ) , p = 0.5 , {\displaystyle G(p),p=0.5,} 的資料，格倫布編碼是最佳的前綴碼，且能無限逼近該資料的熵，目前廣泛用於無損影像壓縮。 令輸入值為正整數 n {\displaystyle n} ，參數值為正整數 M {\displaystyle M} ，輸出值格倫布碼為 c {\displaystyle c} ，其中 c {\displaystyle c} 由兩種編碼組合而成， c = ( u , b ) {\displaystyle c=(u,b)} ， u {\displaystyle u} ：一进制編碼， b {\displaystyle b} ：截斷二進制編碼。 計算 u {\displaystyle u} 與 b {\displaystyle b} 。 q = ⌊ n m ⌋ , {\displaystyle q=\left\lfloor {\frac {n}{m}}\right\rfloor ,} r = n − q {\displaystyle r=n-q} 。 將 q {\displaystyle q} 做一进制編碼， r {\displaystyle r} 做截斷二進制編碼即可得到 ( u , b ) {\displaystyle (u,b)} 。 格倫布-萊斯編碼中的商數 q {\displaystyle q} 指示了所在區塊，而 r {\displaystyle r} 指示所在區塊內部的位置。如上圖，對整數 N {\displaystyle N} 做格倫布-萊斯編碼， q {\displaystyle q} 代表區塊、 r {\displaystyle r} 表示區塊內部位置、 M {\displaystyle M} 為參數，每個區塊的大小皆相等且長度為 M {\displaystyle M} ，特別注意當編碼方式為格倫布-萊斯編碼時，即 M {\displaystyle M} 為 2 {\displaystyle 2} 的整數次方，所有 r {\displaystyle r} 的編碼長度相等。 參數 M {\displaystyle M} 是伯努利過程的函數，其中伯努利過程的參數 p {\displaystyle p} 定義為 p = P ( X = 0 ) {\displaystyle p=P(X=0)} ，則 M {\displaystyle M} 的所在區間為此伯努利過程的中位數-1到中位數+1之間。如下式： ( 1 − p ) M + ( 1 − p ) M + 1 ≤ 1 < ( 1 − p ) M − 1 + ( 1 − p ) M . {\displaystyle (1-p)^{M}+(1-p)^{M+1}\leq 1<(1-p)^{M-1}+(1-p)^{M}.} 當 M {\displaystyle M} 足夠大時，我們可以將其表示成， M = ⌊ − 1 log 2 ⁡ ( 1 − p ) ⌋ {\displaystyle M=\left\lfloor {\frac {-1}{\log _{2}(1-p)}}\right\rfloor } 。 格倫布編碼主要是針對非負整數進行編碼，但也可以使用重疊(Overlap)與交錯(Interleave)擴展至對所有整數進行編碼。令一串用於編號的數列，(0,1,2,...)，給予非負整數偶數編號，給予負整數奇數編號，使得排列方式如下，(0,-1,1,-2,2,...)，即非負整數 x {\displaystyle x} 映射至 { x ′ | x ′ = 2 | x | , x ≥ 0 } {\displaystyle \{x^{\prime }|x^{\prime }=2|x|,x\geq 0\}} ，負整數 y {\displaystyle y} 映射至 { y ′ | y ′ = 2 | y | − 1 , y < 0 } {\displaystyle \{y^{\prime }|y^{\prime }=2|y|-1,y<0\}} 。 萊斯編碼（Rice coding，由Robert F. Rice所提出），為一種前綴碼，歸屬於格倫布編碼的子集合，參數 M {\displaystyle M} 為 2 {\displaystyle 2} 的整數次方，即 M = 2 R , R ∈ N {\displaystyle M=2^{R},R\in N} 。此種特例未必是所有格倫布編碼中的最佳編碼方式，但由於目前電腦為二進位運算，萊斯編碼能快速且有效地以二進位運算實現。 格倫布編碼為一種范氏霍夫曼編碼。 選擇參數 M {\displaystyle M} 待編碼數值為 n {\displaystyle n} ，計算： 商數： q = ⌊ n m ⌋ , {\displaystyle q=\left\lfloor {\frac {n}{m}}\right\rfloor ,} 餘數： r = n − q {\displaystyle r=n-q} 。 編碼 商數編碼，對 q {\displaystyle q} 進行一进制編碼，得到 u {\displaystyle u} 。 餘數編碼，對 r {\displaystyle r} 進行截斷二進制編碼，得到 b {\displaystyle b} 。 合併， c = ( u , b ) {\displaystyle c=(u,b)} 。 輸出 c = ( u , b ) {\displaystyle c=(u,b)} 設 M = 10。則 b = ⌈ log 2 ⁡ ( 10 ) ⌉ = 4 {\displaystyle b=\lceil \log _{2}(10)\rceil =4} . 2 b − M = 16 − 10 = 6 {\displaystyle 2^{b}-M=16-10=6} 選擇42作為編碼時，42會被拆成 q = 4 {\displaystyle q=4} 及 r = 2 {\displaystyle r=2} ，編碼為11110010，而商數編碼尾數必為0，能標示商數編碼位元的結束。 Golomb, S.W. (1966). , Run-length encodings. IEEE Transactions on Information Theory, IT--12(3):399--401 （页面存档备份，存于互联网档案馆） R. F. Rice (1971) and R. Plaunt, , "Adaptive Variable-Length Coding for Efficient Compression of Spacecraft Television Data, " IEEE Transactions on Communications, vol. 16(9), pp. 889–897, Dec. 1971. （页面存档备份，存于互联网档案馆） R. F. Rice (1979), "Some Practical Universal Noiseless Coding Techniques, " Jet Propulsion Laboratory, Pasadena, California, JPL Publication 79—22, Mar. 1979. Witten, Ian Moffat, Alistair Bell, Timothy. "Managing Gigabytes: Compressing and Indexing Documents and Images." Second Edition. Morgan Kaufmann Publishers, San Francisco CA. 1999 ISBN 1-55860-570-3 David Salomon. "Data Compression",ISBN 0-387-95045-1. S. Büttcher, C. L. A. Clarke, and G. V. Cormack. Information Retrieval: Implementing and Evaluating Search Engines （页面存档备份，存于互联网档案馆）. MIT Press, Cambridge MA, 2010. https://en.wikipedia.org/wiki/Golomb_coding （页面存档备份，存于互联网档案馆）