題目:lzw編譯碼原理和實現演算法
part1. lzw編碼原理和實現演算法
lzw的編碼思想是不斷地從字元流中提取新的字串,通俗地理解為新「詞條」,然後用「代號」也就是碼字表示這個「詞條」。這樣一來,對字元流的編碼就變成了用碼字去替換字元流,生成碼字流,從而達到壓縮資料的目的。lzw編碼是圍繞稱為詞典的轉換表來完成的。lzw編碼器通過管理這個詞典完成輸入與輸出之間的轉換。lzw編碼器的輸入是字元流,字元流可以是用8位ascii字元組成的字串,而輸出是用n位(例如12位)表示的碼字流。lzw編碼演算法的步驟如下:
步驟1:將詞典初始化為包含所有可能的單字元,當前字首p初始化為空。
步驟2:當前字元c=字元流中的下乙個字元。
步驟3:判斷p+c是否在詞典中
(1)如果「是」,則用c擴充套件p,即讓p=p+c,返回到步驟2。
(2)如果「否」,則
輸出與當前字首p相對應的碼字w;
將p+c新增到詞典中;
令p=c,並返回到步驟2
lzw編碼演算法可用下述函式實現。首先初始化詞典,然後順序從待壓縮檔案中讀入字元並按照上述演算法執行編碼。最後將編得的碼字流輸出至檔案中。
實現**:
void
lzwencode
( file *fp, bitfile *bf)
else
string_code = character;}}
output
( bf, string_code)
;}
part2. lzw解碼原理和實現演算法
lzw解碼演算法開始時,解碼詞典和編碼詞典相同,包含所有可能的字首根。具體解碼演算法如下:
步驟1:在開始解碼時詞典包含所有可能的字首根。
步驟2:令cw:=碼字流中的第乙個碼字。
步驟3:輸出當字首-符串string.cw到碼字流。
步驟4:先前碼字pw:=當前碼字cw。
步驟5:當前碼字cw:=碼字流的下乙個碼字。
步驟6:判斷當字首-符串string.cw 是否在詞典中。
(1)如果」是」,則把當字首-符串string.cw輸出到字元流。
當前字首p:=先字首-符串string.pw。
當前字元c:=當前字首-符串string.cw的第乙個字元。
把綴-符串p+c新增到詞典。
(2)如果」否」,則當前字首p:=先字首-符串string.pw。
當前字元c:=當字首-符串string.cw的第乙個字元。
輸出綴-符串p+c到字元流,然後把它新增到詞典中。
步驟7:判斷碼字流中是否還有碼字要譯。
(1)如果」是」,就返回步驟4。
(2)如果」否」,結束。
lzw解碼演算法可用下述函式實現。首先初始化詞典,然後順序從壓縮檔案中讀入碼字並按照上述演算法執行解碼。最後將解得的字串輸出至檔案中。
實現**:
void
lzwdecode
( bitfile *bf, file *fp)
else
character = d_stack[phrase_length-1]
;while(0
if( max_code>next_code)
last_code = new_code;
}}
LZW解碼的原理及cpp實現
lzw的思想通過一系列編號來代替短語,再次遇到此短語是用編號來替代,以此來達到壓縮的目的。由於詞典的構建過程固定故不需要傳詞典,解決了碼表傳輸的問題。解碼時在解碼端重建詞典即可進行解碼。lzw編碼演算法的步驟如下 步驟1 將詞典初始化為包含所有可能的單字元,當前字首p初始化為空。步驟2 當前字元c ...
壓縮演算法 lzw演算法實現
壓縮演算法 lzw演算法實現 字典壓縮的基本原理 以色列人lempel與ziv發現在正文流中詞彙和短語很可能會重複出現。當出現乙個重複時,重複的序列可以用乙個短的編碼來代替。壓縮程式重複掃瞄這樣的重複,同時生成編碼來代替重複序列。隨著時間過去,編碼可以用來捕獲新的序列。演算法必須設計成壓縮程式能夠在...
貪心演算法實現霍夫曼編譯碼
霍夫曼編碼是一種被廣泛應用而且非常有效的資料壓縮技術,根據待壓縮資料的特徵,乙個可壓縮掉20 90 這裡考慮的資料指的是字串序列。要理解霍夫曼編碼,先要理解霍夫曼樹,即最優二叉樹,是一類帶權路徑長度最短的樹。路徑是指從樹中乙個結點到另乙個結點之間的通路,路徑上的分支數目稱為路徑長度。樹的路徑長度是從...