RLE 行程長度壓縮算法
RLE(Run Length Encoding)行程長度壓縮算法(也稱遊程長度壓縮算法),是最早出現、也是最簡單的無損數據壓縮算法。
RLE算法的基本思路是把數據按照線性序列分成兩種情況:
一種是連續的重複數據塊,另一種是連續的不重複數據塊。
對於第一種情況,對連續的重複數據塊進行壓縮,壓縮方法就是用一個表示塊數的屬性加上一個數據塊代表原來連續的若干塊數據。對於字符串“AAABBBBBCD”,用這種RLE算法Rle_Encode_N()函數壓縮後的數據就是:0x03,0x41,0x05,0x42,0x01,0x43,0x01,0x44共8個字節,比原始長度10個字節少了2個字節,實現了數據長度的壓縮。
對於第二種情況,RLE算法有兩種處理方法,一種處理方法是用和第一種情況一樣的方法處理連續的不重複數據塊,僅僅是表示塊數的屬性總是1;另一種處理方法是不對數據進行任何處理,直接將原始數據作爲壓縮後的數據。
是Zero suppression消零的一般化,假定了一個符號一直出現。
Shannon-Fano Algorithm香農-範諾算法
Shannon-Fano的樹是根據旨在定義一個有效的代碼表的規範而建立的。實際的算法很簡單:
對於一個給定的符號列表,制定了概率相應的列表或頻率計數,使每個符號的相對發生頻率是已知。
排序根據頻率的符號列表,最常出現的符號在左邊,最少出現的符號在右邊。
清單分爲兩部分,使左邊部分的總頻率和儘可能接近右邊部分的總頻率和。
該列表的左半邊分配二進制數字0,右半邊是分配的數字1。這意味着,在第一半符號代都是將所有從0開始,第二半的代碼都從1開始。
對左、右半部分遞歸應用步驟3和4,細分羣體,並添加位的代碼,直到每個符號已成爲一個相應的代碼樹的葉。
這個例子展示了一組字母的香濃編碼結構(如圖a所示)這五個可被編碼的字母有如下出現次數:
item | |||||
---|---|---|---|---|---|
Symbol | A | B | C | D | E |
Count | 15 | 7 | 6 | 6 | 5 |
Probabilities | 0.38461538 | 0.17948718 | 0.15384615 | 0.15384615 | 0.12820513 |
從左到右,所有的符號以它們出現的次數劃分。在字母B與C之間劃定分割線,得到了左右兩組,總次數分別爲22,17。 這樣就把兩組的差別降到最小。通過這樣的分割, A與B同時擁有了一個以0爲開頭的碼字, C,D,E的碼子則爲1,如圖b所示。 隨後, 在樹的左半邊,於A,B間建立新的分割線,這樣A就成爲了碼字爲00的葉子節點,B的碼子01。經過四次分割, 得到了一個樹形編碼。 如下表所示,在最終得到的樹中, 擁有最大頻率的符號被兩位編碼, 其他兩個頻率較低的符號被三位編碼。
result | |||||
---|---|---|---|---|---|
符號 | A | B | C | D | E |
編碼 | 00 | 01 | 10 | 110 | 111 |
Entropy(熵,平均碼字長度):
Huffman Coding霍夫曼編碼
先按照出現的概率或者頻率大小排隊,把兩個最小的挑出倆來,把這兩個概率或頻率相加,再重新排隊,直到最後變成一或者變成總頻率。最後形成的樹左邊0右邊1。
Adaptive Huffman Coding
在靜態霍夫曼編碼中,要構造編碼樹必須提前統計被編碼對象中的符號出現頻率,因此必須對輸入符號流進行兩遍掃描,第一遍統計符號出現頻率並構造編碼樹,第二遍進行編碼,這在很多實際應用的場合中是不能被接受的。
其次,在存儲和傳輸霍夫曼編碼時,必須先存儲和傳送霍夫曼編碼樹。
再次,靜態編碼樹構造方案不能對輸入符號流的局部統計規律變化做出反應。
這些問題使靜態霍夫曼編碼在實際中並沒有得到廣泛的應用。
由此,提出了自適應霍夫曼編碼,這種方案不需要提前進行掃描輸入符號流,而是隨着編碼進行的同時構造Huffman樹,因此只需要進行一次掃描。在接收端伴隨解碼過程的同時進行着編碼樹的構造。解決了靜態編碼樹所面臨的主要問題,得到了廣泛應用。
此方案不需要事先構造霍夫曼樹,而是隨着編碼的進行,逐步構造霍夫曼樹,同時對符號的統計也動態進行, 隨着編碼的進行,同一個符號的編碼也可能發生改變(更長或更短)。
原理:
- 權重值大的節點,節點編號也較大。
- 父節點的節點編號總是大於子節點的節點編號。
這兩點稱爲兄弟屬性。
樣例:
以abcddbb爲待編碼的原始數據串爲例,自適應Huffman編碼過程如下:
- 初始狀態只有NYT節點,權重爲0;
- 輸入符號:a,輸出編碼:1
- 輸入符號:b,輸出編碼:01;包含新NYT結點和字符b結點的子樹替換舊的NYT結點。對51號結點(根節點)權重值加一
輸入符號:c,輸出編碼:001。包含新NYT節點和字符c的子樹,替換舊的NYT結點,49號結點權重加一,但49號結點不具有所在塊中最大結點編號,需要先與50號結點進行位置交換。
所以