整理一下下信息論中的幾種編碼。
一、不等長編碼定理
若一離散無記憶信源的熵為H(U),每個信源符號用D進制碼元進行不等長編碼,則一定存在一種無失真編碼方法,構成唯一可譯碼,其平均碼長滿足:
對於平均符號熵為\(H_L(U)\)的離散平穩無記憶信源,必存在一種無失真編碼方法,使平均碼長滿足不等式:
二、Shannon編碼
編碼步驟
- 對信源符號按概率從大到小排序;
- 計算碼長;
- 計算累加概率;
- 寫出概率對應的二進制數;
- 獲得碼字(取前k位);
編碼示例
三、Fano編碼
編碼步驟
- 對信源符號按概率從大到小排序;
- 從這個概率集合中的某個位置將其分為兩個子集合,並盡量使兩個子集合的概率和近似相等,給前面一個子集合賦值為0,后面一個子集合賦值為1;
- 重復步驟(2),直到各個子集合中只有一個元素為止;
- 將每個元素所屬的子集合的值依次串起來即可得到碼字;
編碼示例
四、Huffman編碼
編碼步驟:
- 對信源符號按概率大到小排序,權重為概率;
- 取概率最小的字符作為左節點,其次小的符號為右節點,然后這兩個(最小)元素相加作為新的元素,權重為概率和,將新元素和剩余元素重新排序;
- 重復步驟(2),直到排列的元素只剩一個;
- 最后產生的樹狀圖就是Huffman樹;
- 左節點為0,右節點為1,從根節點到子節點的一條路徑即是符號的碼字;
編碼示例
五、算術編碼
編碼步驟
- 對信源符號按概率大到小排序;
- 將[0,1]區間划分為多個子區間,每個子區間代表一個字符,可得每個字符的位置[L,H];
- 編碼從一個[0,1]區間開始,設置low = 0,high =1;
- 不斷讀入原始數據字符,計算並更新;
- 最后得到的區間[low,high]中任意一個小數以二進制形式輸出即可得到碼字;
編碼示例
注意:將符號序列的累積概率寫成二進位小數,取小數點 后L位,若后面有尾數,就進位到第L位。進位!!!
累積概率遞推公式: P(S,ar) = P(S) + p(s)Pr
二元序列:S = 011
P(S0->0110) = P(S)
P(S1->0111) = P(S) + p(S)P1
例1:設二元無記憶信源S={0,1},p(0)=1/4,p(1)=3/4。S=11111100,對其做算術編碼。
解析:
P0 = 0,P1 = 1/4;P(S0) = P(S) + p(S)P0 = P(S); P(S1) = P(S) + p(S)P1
(此處P1=p(0),補充:二元信源P0 = 0,P1=p(0))
例2:設無記憶信源U={a1,a2,a3,a4},其概率分布依次為0.5,0.25,0.125,0.125,對信源序列做算術編碼。
解析:
P1 = 0,P2 = 1/2,P3 = 3/4,P4 = 7/8;P(S,ar) = P(S) + p(s)Pr
六、LZ編碼(LZ78碼)
設信源符號集A={a1,a2,…,aK}共K個符號,設輸入信源符號序列為u=(u1,u2,…,uL)
編碼步驟
- 取第一個符號作為第一段;
- 若下一個符號與已有的分段都不重復,則取其為下一個分段;
- 若下一個符號與已有的分段都重復,則再取其下一位符號組成一個分段,直到同前面的所有分段不同;
- 重復(2)(3),直至信源序列結束;
編碼示例
設U={a1,a2,a3,a4},信源序列為a1,a3,a2,a3,a2,a4,a3,a2,a1,a4,a3,a2,a1,共13位,字典如表所示:
參考鏈接:
https://baike.baidu.com/item/香農編碼/22353186
https://zh.wikipedia.org/wiki/香農-范諾編碼
https://blog.csdn.net/FX677588/article/details/70767446
https://zh.wikipedia.org/wiki/霍夫曼編碼
https://segmentfault.com/a/1190000011561822
https://bkso.baidu.com/item/LZ編碼