壓縮演算法 lzw演算法實現

2021-08-27 16:07:04 字數 1744 閱讀 9089

壓縮演算法——lzw演算法實現

字典壓縮的基本原理

以色列人lempel與ziv發現在正文流中詞彙和短語很可能會重複出現。當出現乙個重複時,重複的序列可以用乙個短的編碼來代替。

壓縮程式重複掃瞄這樣的重複,同時生成編碼來代替重複序列。隨著時間過去,編碼可以用來捕獲新的序列。演算法必須設計成壓縮程式能夠在編碼和原始資料序列推導出當前的對映。

說實話直接用文本來描述其實聽起來很迷,直接看圖:

然後我們以字串abcbcabcabcd為例,來模擬這個過程

首先我們先建立初始碼表a= 1,b=2,c=3,d=4

steppc

is pc in dic

output p

dictionary

description

1null

a初始化,不處理2a

bno1ab:5

ab不存在dictionary中,擴充3b

cno2bc:64c

bno3cb:75b

cyes

bc在dictionary中,p = pc6bc

ano6bca:87a

byes8ab

cno5abc:99c

ano3ca:1010a

byes

11ab

cyes

12abcdno

913dnull4結束

其實就是每次讀入乙個字元,如果發現和字首加起來在字典中不存在,那麼就建立碼表,並輸出字首的值,如果存在就將字首和字尾一起賦給字首,繼續讀取下乙個字元給字尾,如此往復。直到讀取完整個字串

直接貼上**供參考:

public listencode(string data) 

string prefix = "";// 片語字首

string suffix = "";// 片語字尾

for (char c : data.tochararray()) else

} // 最後一次輸出

if (!prefix.equals(""))

return result;

}

上面我們完成了對字串的壓縮,下面我們對結果進行解壓

解壓的基本思路也是知道乙個基本的碼表,然後一邊讀取一邊解碼,然後擴充碼表

直接解釋很費力,直接上圖:

這裡就不進行分析了,直接貼上**供參考

public string decode(listarray) 

string p = "";

string c = "";

for (int code : array) else if (code == decode) else

if (!p.equals(""))

this.write("lzw解壓.txt", c);

p = c;

} system.out.println("++++");

// system.out.println(result);

return result.tostring();

}

上面我們只是實現了對字串的壓縮和解壓,如果想利用這個原理實現對檔案的壓縮,還需要加入對得到的陣列佇列的儲存以及讀寫的方法

建議使用dataoutputstream.writeint同時使用readint方法對壓縮檔案進行讀取

LZW壓縮演算法

lzw演算法和lz78演算法在編碼方式上的不同 步驟1 開始時的詞典包含所有可能的根 root 當前字首p為空 步驟3 判斷綴 符串p char是否在詞典中 1 如果 是 p p char 用char擴充套件p 2 如果 否 把代表當前字首p的碼字輸出到碼字流 把綴 符串p char新增到詞典 令p...

lzw壓縮演算法 VBScript中的LZW壓縮演算法

lzw壓縮演算法 介紹本文向您展示如何在vbscript中實現lzw無失真壓縮演算法。它也可以按原樣或幾乎按原樣在vba中使用。lzw演算法lzw演算法是一種壓縮技術,不會導致資料丟失。它構建了動態壓縮中使用的 和值的字典。該詞典不與壓縮檔案一起儲存,並且在壓縮後將被丟棄。在解壓縮期間,將從壓縮的資...

LZW資料壓縮演算法

表4 15 詞典 碼字 code word 字首 prefix 1 193 a194b 255 1305 abcdefxyf01234 lzw編碼器 軟體編碼器或硬體編碼器 就是通過管理這個詞典完成輸入與輸出之間的轉換。lzw編碼器的輸入是字元流 charstream 字元流可以是用8位ascii字...