1. 簡介
一種通用的無損的資料壓縮算法。
2. 術語
1)'Character': 字元,一種基礎資料元素,在普通文本檔案中,它占用1個單獨的byte,而在圖像中,它卻是 一種代表給定像素顔色的索引值。
2)'CharStream':資料檔案中的字元流。
3)'Prefix':字首。如這個單詞的含義一樣,代表着在一個字元最直接的前一個字元。一個字首字元長度可以為0,一個prefix和一個character可以組成一個字元串(string),
4)'Suffix': 字尾,是一個字元,一個字元串可以由(A,B)來組成,A是字首,B是字尾,當A長度為0的時候,代表Root,根
5)'Code:碼,用于代表一個字元串的位置編碼
6)'Entry',一個Code和它所代表的字元串(string)
3. 執行個體分析
輸入流,也就是原始的資料為:255,24,54,255,24,255,255,24,5,123,45,255,24,5,24,54..................
這個正好可以看到是gif檔案中像素數組的一部分,如何對它進行壓縮
因為原始資料可以用8bit來表示,故清除标志Clear=255+1 =256,結束标志為End=256+1=257,目前标号集為
0 1 2 3 .................................................................................255 CLEAR END
第一步,讀取第一個字元為255,在标記表裡面查找,255已經存在,我們已經認識255了,不做處理
第二步,取第二個字元,此時字首為A,形成目前的Entry為(255,24),在标記集合不存在,我們并不認識255,24好,這次你小子來了,我就記住你,把它在标記集合中标記為258,然後輸出字首A,保留字尾24,并作為下一次的字首(字尾變字首)
第三步,取第三個字元為54,目前Entry(24,54),不認識,記錄(24,54)為标号259,并輸出24,字尾變字首
第四部:取第四個字元255,Entry=(54,255),不認識,記錄(54,255)為标号260,輸出54,字尾變字首
第五步 取第5個字元24,entry=(255,24),啊,認識你,這不是老258麼,于是把字元串規約為258,并作為字首
第六步 取第六個字元255,entry=(258,255),不認識,記錄(258,255)為261,輸出258,字尾變字首
.......
一直處理到最後一個字元,
用一個表記錄處理過程
CLEAR=256,END=257
第幾步 | 字首 | 字尾 | Entry | 認識(Y/N) | 輸出 | 标号 |
1 | 255 | (,255) | ||||
2 | 255 | 24 | (255,24) | N | 255 | 258 |
3 | 24 | 54 | (24,54) | N | 24 | 259 |
4 | 54 | 255 | (54,255) | N | 54 | 260 |
5 | 255 | 24 | (255,24) | Y | ||
6 | 258 | 255 | (258,255) | N | 258 | 261 |
7 | 255 | 255 | (255,255) | N | 255 | 262 |
.....
上面這個示例有些不能完整展現,另外一個例子是
原輸入資料為: A B A B A B A B B B A B A B A A C D A C D A D C A B A A A B A B .....
采用LZW算法對其進行壓縮,壓縮過程用一個表來表述為:
注意原資料中隻包含4個character,A,B,C,D
用兩bit即可表述,根據lzw算法,首先擴充一位變為3為,Clear=2的2次方+1=4; End=4+1=5;
初始标号集因該為
1 | 2 | 3 | 4 | 5 | |
A | B | C | D | Clear | End |
而壓縮過程為:
第幾步 | 字首 | 字尾 | Entry | 認識(Y/N) | 輸出 | 标号 |
1 | A | (,A) | ||||
2 | A | B | (A,B) | N | A | 6 |
3 | B | A | (B,A) | N | B | 7 |
4 | A | B | (A,B) | Y | ||
5 | 6 | A | (6,A) | N | 6 | 8 |
6 | A | B | (A,B) | Y | ||
7 | 6 | A | (6,A) | Y | ||
8 | 8 | B | (8,B) | N | 8 | 9 |
9 | B | B | (B,B) | N | B | 10 |
10 | B | B | (B,B) | Y | ||
11 | 10 | A | (10,A) | N | 10 | 11 |
12 | A | B | (A,B) | Y |
.....
當進行到第12步的時候,标号集應該為
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
A | B | C | D | Clear | End | AB | BA | 6A | 8B | BB | 10A |
4. 僞代碼實作
STRING = get input character
WHILE there are still input characters DO
CHARACTER = get input character
IF STRING+CHARACTER is in the string table then
STRING = STRING+character
ELSE
output the code for STRING
add STRING+CHARACTER to the string table
STRING = CHARACTER
END of IF
END of WHILE
output the code for STRING
5. 來源