LZW字典壓縮

2021-09-01 18:57:52 字數 2426 閱讀 3960

首先談談我對壓縮這個詞的理解吧。在我看來,壓縮=**+協議。而這二者中,我認為協議比**更重要,協議是整個壓縮的靈魂。就拿哈夫曼壓縮法來說,它的協議簡單來說就是為待壓縮檔案中出現過的每個字元設定乙個編碼,標頭檔案中儲存了每個編碼對應的字元資訊。顯然,哈夫曼壓縮中的標頭檔案就是我們定下的壓縮協議。(今天主要談lzw壓縮法,因此哈夫曼壓縮的具體原理就不做過多的說明了。)

談到lzw字典壓縮,好多同學覺得好高深,這就錯了。舉個簡單的例子,讀一篇英語文章,或者一篇英語巨著,裡邊有好多的單詞和句子是重複的,如果我們用乙個特定的符號來代替整個單詞或句子,那麼,節省的空間是相當可觀的。

這就是字典壓縮的最初構想。

想法有了,現在要做的就是定乙個協議。這個協議要達到的目標很簡單:1)能壓縮檔案。2)能把壓縮檔案翻譯成原檔案。至於壓縮效果,那是後期工作。

先考慮編碼問題,0~255是肯定不能用的,於是選取了256~65535,再大了會使編碼的長度加倍而字典也不需要那麼大。然後要思考怎樣使檔案中的符號跟編碼一一對應,而且字典壓縮是沒有標頭檔案的,這意味著壓縮後的檔案可以自己生成字典進行解壓。

在看壓縮的過程之前先了解幾個名詞。字首:對於每乙個詞,都拆分成兩部分,前邊的乙個完整的個體(單獨的乙個字元或者已經寫進字典的乙個詞的編碼)叫做字首,相應的「字尾」就很明了了。

ok,現在讓我們一起來了解一下建立字典的演算法(以壓縮字串「ababbacb」為例):

第幾步字首字尾詞

查詢輸出編碼1

a(,a)2a

b(a,b)noa

2563ba

(b,a)nob

2574ab

(a,b)

yes5

256b

(256,b)

no256

2586ba

(b,a)

yes7

257c

(257,c)

no257

2598cb

(c,b)noc

260 協議定好了,現在開始**實現。

節點類很簡單,其功能是定義兩個屬性:字首(first),字尾(end)

public class node 

public node(int frist,int end)

}

然後是字典類,先建立乙個鍊錶:

public class dictionary
將鍊錶的0~255的節點按ascii初始化:

public dictionary()

}

向鍊錶中新增節點:

public void add(int frist,int end)
獲取給定資料的結點的索引,若字典中存在,則返回索引,若不存在返回-2:

public int getindex(int frist,int end)

// 如果表裡不存在該片語

else }}

// 將剩餘的輸出

newdos.writechar(frist);

/****** 把後續工作做完 ******/

newdos.writechar(65535);

system.out.println("檔案壓縮完畢!!!");

dis.close();

newdos.close();

} catch (exception e)

}

因為壓縮檔案中是不儲存字典的,所以解壓時要根據壓縮檔案和已經翻譯好的部分重新建立字典。

解壓=建立字典+翻譯+建立字典+翻譯+…… 

具體**實現如下:

從字典中查詢出字串的方法(c為查詢的字串在字典中的位置,bufstr 用來儲存字典中c位置上儲存的字串):

string bufstr = "";

private void getstring(int c) else

}

準備工作完成,開始解壓。。。

1.判斷,如果是0~255直接翻譯

2.如果是前邊建立的字典的內容, 按字典翻譯

3.若不在字典中,則該詞很奇葩,它一定與其字首加字首的第乙個字元相等

個人認為第三點是解壓的精華:string str = bufstr + bufstr.charat(0);

public void releasefile(string path, string newpath)

if (end <= 255) else {

if (endok,解壓到這裡就基本完成了。

這裡只是提供了壓縮的簡單思路,許多細節還未注意到(現在只能壓縮英語,中文的還不能壓縮成功)。

為了提高壓縮效率,我們可以優化壓縮協議,比如說當字典滿時,可以選擇刪除重複使用效率不高的詞,復用率自己制定,這樣壓縮效果會更好,大家一起動手試試吧。

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演算法實現

壓縮演算法 lzw演算法實現 字典壓縮的基本原理 以色列人lempel與ziv發現在正文流中詞彙和短語很可能會重複出現。當出現乙個重複時,重複的序列可以用乙個短的編碼來代替。壓縮程式重複掃瞄這樣的重複,同時生成編碼來代替重複序列。隨著時間過去,編碼可以用來捕獲新的序列。演算法必須設計成壓縮程式能夠在...