LZW編譯碼演算法實現與分析

2021-10-05 17:36:56 字數 1731 閱讀 7885

題目: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 這裡考慮的資料指的是字串序列。要理解霍夫曼編碼,先要理解霍夫曼樹,即最優二叉樹,是一類帶權路徑長度最短的樹。路徑是指從樹中乙個結點到另乙個結點之間的通路,路徑上的分支數目稱為路徑長度。樹的路徑長度是從...