當前位置:首頁 » 操作系統 » lz77演算法例題

lz77演算法例題

發布時間: 2023-01-06 12:05:01

Ⅰ 呵呵,今天咋不見電腦高手呢

winrar的rar文件和winzip的zip文件壓縮演算法基本相同

zip 的壓縮原理與實現
作者: NCS 時間: 2005-01-05 文檔類型: 轉載 來自: 藍色理想
瀏覽統計: total: 563 year: 563 quarter: 329 month: 141 week: 23 today: 5
第 1 頁 zip 的壓縮原理與實現
第 2 頁 編碼式壓縮的要求及方法
第 3 頁 霍夫曼演算法
第 4 頁 lz77 演算法壓縮

無損數據壓縮是一件奇妙的事情,想一想,一串任意的數據能夠根據一定的規則轉換成只有原來 1/2 - 1/5 長度的數據,並且能夠按照相應的規則還原到原來的樣子,聽起來真是很酷。
半年前,苦熬過初學 vc 時那段艱難的學習曲線的我,對 MFC、SDK 開始失望和不滿,這些雖然不算易學,但和 DHTML 沒有實質上的區別,都是調用微軟提供的各種各樣的函數,不需要你自己去創建一個窗口,多線程編程時,也不需要你自己去分配 CPU 時間。我也做過驅動,同樣,有DDK(微軟碟機動開發包),當然,也有 DDK 的「參考手冊」,連一個最簡單的數據結構都不需要你自己做,一切都是函數、函數……
微軟的高級程序員編寫了函數讓我們這些搞應用的去調用,我不想在這里貶低搞應用的人,正是這些應用工程師連接起了科學和社會之間的橋梁,將來可以做銷售,做管理,用自己逐漸積累起來的智慧和經驗在社會上打拚。

但是,在技術上來說,誠實地說,這並不高深,不是嗎?第一流的公司如微軟、Sybase、Oracle 等總是面向社會大眾的,這樣才能有巨大的市場。但是他們往往也是站在社會的最頂層的:操作系統、編譯器、資料庫都值得一代代的專家去不斷研究。這些帝國般的企業之所以偉大,恐怕不是「有經驗」、「能吃苦」這些中國特色的概念所能涵蓋的,艱深的技術體系、現代的管理哲學、強大的市場能力都是缺一不可的吧。我們既然有志於技術,並且正在起步階段,何必急不可耐地要轉去做「管理」,做「青年才俊」,那些所謂的「成功人士」的根底能有幾何,這樣子浮躁,胸中的規模和格局能有多大?

在我發現vc只是一個用途廣泛的編程工具,並不能代表「知識」、「技術」的時候,我有些失落,無所不能的不是我,而是 MFC、SDK、DDK,是微軟的工程師,他們做的,正是我想做的,或者說,我也想成為那種層次的人,現在我知道了,他們是專家,但這不會是一個夢,有一天我會做到的,為什麼不能說出我的想法呢。那時公司做的系統里有一個壓縮模塊,領導找了一個 zlib 庫,不讓我自己做壓縮演算法,站在公司的立場上,我很理解,真的很理解,自己做演算法要多久啊。但那時自己心中隱藏的一份倔強驅使我去尋找壓縮原理的資料,我完全沒有意識到,我即將打開一扇大門,進入一個神奇的「數據結構」的世界。「計算機藝術」的第一線陽光,居然也照到了我這樣一個平凡的人的身上。

上面說到「計算機藝術」,或者進一步細化說「計算機編程藝術」,聽起來很深奧,很高雅,但是在將要進入專業的壓縮演算法的研究時,我要請大家做的第一件事情是:忘掉自己的年齡、學歷,忘掉自己的社會身份,忘掉編程語言,忘掉「面向對象」、「三層架構」等一切術語。把自己當作一個小孩,有一雙求知的眼睛,對世界充滿不倦的、單純的好奇,唯一的前提是一個正常的具有人類理性思維能力的大腦。
下面就讓我們開始一段神奇的壓縮演算法之旅吧:

1. 原理部分:
有兩種形式的重復存在於計算機數據中,zip 就是對這兩種重復進行了壓縮。
一種是短語形式的重復,即三個位元組以上的重復,對於這種重復,zip用兩個數字:1.重復位置距當前壓縮位置的距離;2.重復的長度,來表示這個重復,假設這兩個數字各佔一個位元組,於是數據便得到了壓縮,這很容易理解。
一個位元組有 0 - 255 共 256 種可能的取值,三個位元組有 256 * 256 * 256 共一千六百多萬種可能的情況,更長的短語取值的可能情況以指數方式增長,出現重復的概率似乎極低,實則不然,各種類型的數據都有出現重復的傾向,一篇論文中,為數不多的術語傾向於重復出現;一篇小說,人名和地名會重復出現;一張上下漸變的背景圖片,水平方向上的像素會重復出現;程序的源文件中,語法關鍵字會重復出現(我們寫程序時,多少次前後、paste?),以幾十 K 為單位的非壓縮格式的數據中,傾向於大量出現短語式的重復。經過上面提到的方式進行壓縮後,短語式重復的傾向被完全破壞,所以在壓縮的結果上進行第二次短語式壓縮一般是沒有效果的。
第二種重復為單位元組的重復,一個位元組只有256種可能的取值,所以這種重復是必然的。其中,某些位元組出現次數可能較多,另一些則較少,在統計上有分布不均勻的傾向,這是容易理解的,比如一個 ASCII 文本文件中,某些符號可能很少用到,而字母和數字則使用較多,各字母的使用頻率也是不一樣的,據說字母 e 的使用概率最高;許多圖片呈現深色調或淺色調,深色(或淺色)的像素使用較多(這里順便提一下:png 圖片格式是一種無損壓縮,其核心演算法就是 zip 演算法,它和 zip 格式的文件的主要區別在於:作為一種圖片格式,它在文件頭處存放了圖片的大小、使用的顏色數等信息);上面提到的短語式壓縮的結果也有這種傾向:重復傾向於出現在離當前壓縮位置較近的地方,重復長度傾向於比較短(20位元組以內)。這樣,就有了壓縮的可能:給 256 種位元組取值重新編碼,使出現較多的位元組使用較短的編碼,出現較少的位元組使用較長的編碼,這樣一來,變短的位元組相對於變長的位元組更多,文件的總長度就會減少,並且,位元組使用比例越不均勻,壓縮比例就越大。
在進一步討論編碼的要求以及辦法前,先提一下:編碼式壓縮必須在短語式壓縮之後進行,因為編碼式壓縮後,原先八位二進制值的位元組就被破壞了,這樣文件中短語式重復的傾向也會被破壞(除非先進行解碼)。另外,短語式壓縮後的結果:那些剩下的未被匹配的單、雙位元組和得到匹配的距離、長度值仍然具有取值分布不均勻性,因此,兩種壓縮方式的順序不能變。
在編碼式壓縮後,以連續的八位作為一個位元組,原先未壓縮文件中所具有的位元組取值不均勻的傾向被徹底破壞,成為隨機性取值,根據統計學知識,隨機性取值具有均勻性的傾向(比如拋硬幣試驗,拋一千次,正反面朝上的次數都接近於 500 次)。因此,編碼式壓縮後的結果無法再進行編碼式壓縮。
短語式壓縮和編碼式壓縮是目前計算機科學界研究出的僅有的兩種無損壓縮方法,它們都無法重復進行,所以,壓縮文件無法再次壓縮(實際上,能反復進行的壓縮演算法是不可想像的,因為最終會壓縮到 0 位元組)。
短語式重復的傾向和位元組取值分布不均勻的傾向是可以壓縮的基礎,兩種壓縮的順序不能互換的原因也說了,下面我們來看編碼式壓縮的要求及方法:
首先,為了使用不定長的編碼表示單個字元,編碼必須符合「前綴編碼」的要求,即較短的編碼決不能是較長編碼的前綴,反過來說就是,任何一個字元的編碼,都不是由另一個字元的編碼加上若干位 0 或 1 組成,否則解壓縮程序將無法解碼。
看一下前綴編碼的一個最簡單的例子:

符號 編碼
A 0
B 10
C 110
D 1110
E 11110

有了上面的碼表,你一定可以輕松地從下面這串二進制流中分辨出真正的信息內容了:

1110010101110110111100010 - DABBDCEAAB

要構造符合這一要求的二進制編碼體系,二叉樹是最理想的選擇。考察下面這棵二叉樹:

根(root)
0| 1
+-------+--------+
0 |1 0 | 1
+-----+------++----+----+
||| |
a |d e
0|1
+-----+-----+
| |
b c

要編碼的字元總是出現在樹葉上,假定從根向樹葉行走的過程中,左轉為0,右轉為1,則一個字元的編碼就是從根走到該字元所在樹葉的路徑。正因為字元只能出現在樹葉上,任何一個字元的路徑都不會是另一字元路徑的前綴路徑,符合要求的前綴編碼也就構造成功了:

a - 00 b - 010 c - 011 d - 10 e - 11

接下來來看編碼式壓縮的過程:
為了簡化問題,假定一個文件中只出現了 a,b,c,d ,e四種字元,它們的出現次數分別是
a : 6次
b : 15次
c : 2次
d : 9次
e : 1次
如果用定長的編碼方式為這四種字元編碼: a : 000 b : 001 c : 010 d : 011 e : 100
那麼整個文件的長度是 3*6 + 3*15 + 3*2 + 3*9 + 3*1 = 99

用二叉樹表示這四種編碼(其中葉子節點上的數字是其使用次數,非葉子節點上的數字是其左右孩子使用次數之和):


|
+---------33---------+
| |
+----32---+ +----1---+
|| | |
+-21-+ +-11-+ +--1--+
| | | | | |
6 15 29 1

(如果某個節點只有一個子節點,可以去掉這個子節點。)


|
+------33------+
||
+-----32----+ 1
| |
+--21--+ +--11--+
|| ||
6 152 9

現在的編碼是: a : 000 b : 001 c : 010 d : 011 e : 1 仍然符合「前綴編碼」的要求。

第一步:如果發現下層節點的數字大於上層節點的數字,就交換它們的位置,並重新計算非葉子節點的值。
先交換11和1,由於11個位元組縮短了一位,1個位元組增長了一位,總文件縮短了10位。


|
+----------33---------+
||
+-----22----++----11----+
| || |
+--21--+ 1 2 9
| |
6 15

再交換15和1、6和2,最終得到這樣的樹:


|
+----------33---------+
||
+-----18----+ +----15----+
| | | |
+--3--+ 156 9
| |
2 1

這時所有上層節點的數值都大於下層節點的數值,似乎無法再進一步壓縮了。但是我們把每一層的最小的兩個節點結合起來,常會發現仍有壓縮餘地。

第二步:把每一層的最小的兩個節點結合起來,重新計算相關節點的值。

在上面的樹中,第一、二、四三層都只有一或二個節點,無法重新組合,但第三層上有四個節點,我們把最小的3和6結合起來,並重新計算相關節點的值,成為下面這棵樹。


|
+----------33---------+
| |
+------9-----+ +----24----+
| | | |
+--3--+ 6159
| |
21

然後,再重復做第一步。
這時第二層的9小於第三層的15,於是可以互換,有9個位元組增長了一位,15個位元組縮短了一位,文件總長度又縮短了6位。然後重新計算相關節點的值。


|
+----------33---------+
||
15 +----18----+
||
+------9-----+ 9
| |
+--3--+6
| |
21

這時發現所有的上層節點都大於下層節點,每一層上最小的兩個節點被並在了一起,也不可能再產生比同層其他節點更小的父節點了。

這時整個文件的長度是 3*6 + 1*15 + 4*2 + 2*9 + 4*1 = 63

這時可以看出編碼式壓縮的一個基本前提:各節點之間的值要相差比較懸殊,以使某兩個節點的和小於同層或下層的另一個節點,這樣,交換節點才有利益。
所以歸根結底,原始文件中的位元組使用頻率必須相差較大,否則將沒有兩個節點的頻率之和小於同層或下層其他節點的頻率,也就無法壓縮。反之,相差得越懸殊,兩個節點的頻率之和比同層或下層節點的頻率小得越多,交換節點之後的利益也越大。

在這個例子中,經過上面兩步不斷重復,得到了最優的二叉樹,但不能保證在所有情況下,都能通過這兩步的重復得到最優二叉樹,下面來看另一個例子:



+---------19--------+
||
+------12------+7
||
+---5---++---7---+
||||
+-2-++-3-++-3-++-4-+
||||||||
11121222

這個例子中,所有上層節點都大於等於下層節點,每一層最小的兩個節點結合在了一起,但仍然可以進一步優化:



+---------19--------+
||
+------12------+7
||
+---4---++---8---+
||||
+-2-++-2-++-4-++-4-+
||||||||
11112222

通過最低一層的第4第5個節點對換,第3層的8大於第2層的7。
到這里,我們得出這樣一個結論:一棵最優二叉編碼樹(所有上層節點都無法和下層節點交換),必須符合這樣兩個條件:
1.所有上層節點都大於等於下層節點。
2.某節點,設其較大的子節點為m,較小的子節點為n,m下的任一層的所有節點都應大於等於n下的該層的所有節點。

當符合這兩個條件時,任一層都無法產生更小的節點去和下層節點交換,也無法產生更大的節點去和上層節點交換。

上面的兩個例子是比較簡單的,實際的文件中,一個位元組有256種可能的取值,所以二叉樹的葉子節點多達256個,需要不斷的調整樹形,最終的樹形可能非常復雜,有一種非常精巧的演算法可以快速地建起一棵最優二叉樹,這種演算法由D.Huffman(戴·霍夫曼)提出,下面我們先來介紹霍夫曼演算法的步驟,然後再來證明通過這么簡單的步驟得出的樹形確實是一棵最優二叉樹。
霍夫曼演算法的步驟是這樣的:

·從各個節點中找出最小的兩個節點,給它們建一個父節點,值為這兩個節點之和。
·然後從節點序列中去除這兩個節點,加入它們的父節點到序列中。

重復上面兩個步驟,直到節點序列中只剩下唯一一個節點。這時一棵最優二叉樹就已經建成了,它的根就是剩下的這個節點。

仍以上面的例子來看霍夫曼樹的建立過程。
最初的節點序列是這樣的:
a(6) b(15) c(2) d(9) e(1)

把最小的c和e結合起來
| (3)
a(6) b(15) d(9)+------+------+
| |
ce

不斷重復,最終得到的樹是這樣的:


|
+-----33-----+
||
15 +----18----+
| |
9 +------9-----+
| |
6 +--3--+
| |
21

這時各個字元的編碼長度和前面我們說過的方法得到的編碼長度是相同的,因而文件的總長度也是相同的: 3*6 + 1*15 + 4*2 + 2*9 + 4*1 = 63

考察霍夫曼樹的建立過程中的每一步的節點序列的變化:

6 15291
6 1593
159 9
1518
33

下面我們用逆推法來證明對於各種不同的節點序列,用霍夫曼演算法建立起來的樹總是一棵最優二叉樹:

對霍夫曼樹的建立過程運用逆推法:
當這個過程中的節點序列只有兩個節點時(比如前例中的15和18),肯定是一棵最優二叉樹,一個編碼為0,另一個編碼為1,無法再進一步優化。
然後往前步進,節點序列中不斷地減少一個節點,增加兩個節點,在步進過程中將始終保持是一棵最優二叉樹,這是因為:
1.按照霍夫曼樹的建立過程,新增的兩個節點是當前節點序列中最小的兩個,其他的任何兩個節點的父節點都大於(或等於)這兩個節點的父節點,只要前一步是最優二叉樹,其他的任何兩個節點的父節點就一定都處在它們的父節點的上層或同層,所以這兩個節點一定處在當前二叉樹的最低一層。
2.這兩個新增的節點是最小的,所以無法和其他上層節點對換。符合我們前面說的最優二叉樹的第一個條件。
3.只要前一步是最優二叉樹,由於這兩個新增的節點是最小的,即使同層有其他節點,也無法和同層其他節點重新結合,產生比它們的父節點更小的上層節點來和同層的其他節點對換。它們的父節點小於其他節點的父節點,它們又小於其他所有節點,只要前一步符合最優二叉樹的第二個條件,到這一步仍將符合。

這樣一步步逆推下去,在這個過程中霍夫曼樹每一步都始終保持著是一棵最優二叉樹。

由於每一步都從節點序列中刪除兩個節點,新增一個節點,霍夫曼樹的建立過程共需 (原始節點數 - 1) 步,所以霍夫曼演算法不失為一種精巧的編碼式壓縮演算法。

附:對於 huffman 樹,《計算機程序設計藝術》中有完全不同的證明,大意是這樣的:
1.二叉編碼樹的內部節點(非葉子節點)數等於外部節點(葉子節點)數減1。
2.二叉編碼樹的外部節點的加權路徑長度(值乘以路徑長度)之和,等於所有內部節點值之和。(這兩條都可以通過對節點數運用數學歸納法來證明,留給大家做練習。)
3.對 huffman 樹的建立過程運用逆推,當只有一個內部節點時,肯定是一棵最優二叉樹。
4.往前步進,新增兩個最小的外部節點,它們結合在一起產生一個新的內部節點,當且僅當原先的內部節點集合是極小化的,加入這個新的內部節點後仍是極小化的。(因為最小的兩個節點結合在一起,並處於最低層,相對於它們分別和其他同層或上層節點結合在一起,至少不會增加加權路徑長度。)
5.隨著內部節點數逐個增加,內部節點集合總維持極小化。

2.實現部分
如果世界上從沒有一個壓縮程序,我們看了前面的壓縮原理,將有信心一定能作出一個可以壓縮大多數格式、內容的數據的程序,當我們著手要做這樣一個程序的時候,會發現有很多的難題需要我們去一個個解決,下面將逐個描述這些難題,並詳細分析 zip 演算法是如何解決這些難題的,其中很多問題帶有普遍意義,比如查找匹配,比如數組排序等等,這些都是說不盡的話題,讓我們深入其中,做一番思考。
我們前面說過,對於短語式重復,我們用「重復距當前位置的距離」和「重復的長度」這兩個數字來表示這一段重復,以實現壓縮,現在問題來了,一個位元組能表示的數字大小為 0 -255,然而重復出現的位置和重復的長度都可能超過 255,事實上,二進制數的位數確定下來後,所能表示的數字大小的范圍是有限的,n位的二進制數能表示的最大值是2的n次方減1,如果位數取得太大,對於大量的短匹配,可能不但起不到壓縮作用,反而增大了最終的結果。針對這種情況,有兩種不同的演算法來解決這個問題,它們是兩種不同的思路。一種稱為 lz77 演算法,這是一種很自然的思路:限制這兩個數字的大小,以取得折衷的壓縮效果。例如距離取 15 位,長度取 8 位,這樣,距離的最大取值為 32 k - 1,長度的最大取值為 255,這兩個數字占 23 位,比三個位元組少一位,是符合壓縮的要求的。讓我們在頭腦中想像一下 lz77 演算法壓縮進行時的情況,會出現有意思的模型:

最遠匹配位置->當前處理位置->
———┸—————————————————╂—————————————>壓縮進行方向
已壓縮部分┃未壓縮部分

在最遠匹配位置和當前處理位置之間是可以用來查找匹配的「字典」區域,隨著壓縮的進行,「字典」區域從待壓縮文件的頭部不斷地向後滑動,直到達到文件的尾部,短語式壓縮也就結束了。
解壓縮也非常簡單:

┎————————拷貝————————┒
匹配位置┃當前處理位置┃
┃<——匹配長度——>┃┠—————∨————┨
———┸——————————┸———————╂——————————┸—>解壓進行方向
已解壓部分┃未解壓部分

不斷地從壓縮文件中讀出匹配位置值和匹配長度值,把已解壓部分的匹配內容拷貝到解壓文件尾部,遇到壓縮文件中那些壓縮時未能得到匹配,而是直接保存的單、雙位元組,解壓時只要依次直接拷貝到文件尾部即可,直到整個壓縮文件處理完畢。
lz77演算法模型也被稱為「滑動字典」模型或「滑動窗口」模型,由於它限制匹配的最大長度,對於某些存在大量的極長匹配的文件來說,這種折衷演算法顯出了缺陷。另有一種lzw演算法對待壓縮文件中存在大量極長匹配的情況進行了完全不同的演算法設計,並且只用一個數字來表示一段短語,下面來描述一下lzw的壓縮解壓過程,然後來綜合比較兩者的適用情況。
lzw的壓縮過程:
1) 初始化一個指定大小的字典,把 256 種位元組取值加入字典。
2) 在待壓縮文件的當前處理位置尋找在字典中出現的最長匹配,輸出該匹配在字典中的序號。
3) 如果字典沒有達到最大容量,把該匹配加上它在待壓縮文件中的下一個位元組加入字典。
4) 把當前處理位置移到該匹配後。
5) 重復 2、3、4 直到文件輸出完畢。

lzw 的解壓過程:
1) 初始化一個指定大小的字典,把 256 種位元組取值加入字典。
2) 從壓縮文件中順序讀出一個字典序號,根據該序號,把字典中相應的數據拷貝到解壓文件尾部。
3) 如果字典沒有達到最大容量,把前一個匹配內容加上當前匹配的第一個位元組加入字典。
4) 重復 2、3 兩步直到壓縮文件處理完畢。

從 lzw 的壓縮過程,我們可以歸納出它不同於 lz77 演算法的一些主要特點:
1) 對於一段短語,它只輸出一個數字,即字典中的序號。(這個數字的位數決定了字典的最大容量,當它的位數取得太大時,比如 24 位以上,對於短匹配佔多數的情況,壓縮率可能很低。取得太小時,比如 8 位,字典的容量受到限制。所以同樣需要取捨。)
2) 對於一個短語,比如 abcd ,當它在待壓縮文件中第一次出現時,ab 被加入字典,第二次出現時,abc 被加入字典,第三次出現時,abcd 才會被加入字典,對於一些長匹配,它必須高頻率地出現,並且字典有較大的容量,才會被最終完整地加入字典。相應地,lz77 只要匹配在「字典區域」中存在,馬上就可以直接使用。
3) 一個長匹配被加入字典的過程,是從兩個位元組開始,逐次增長一個位元組,確定了字典的最大容量,也就間接確定了匹配的可能的最大長度。相對於 lz77 用兩個數字來表示一個短語,lzw 只用一個數字來表示一個短語,因此,「字典序號」的位數可以取得多一點(二進制數多一位,意味著數值大一倍),也就是說最長匹配可以比 lz77 更長,當某些超長匹配高頻率地出現,直到被完整地加入字典後,lzw將開始彌補初期的低效,逐漸顯出自己的優勢。
可以看出,在多數情況下,lz77 擁有更高的壓縮率,而在待壓縮文件中占絕大多數的是些超長匹配,並且相同的超長匹配高頻率地反復出現時,lzw 更具優勢,GIF 就是採用了 lzw 演算法來壓縮背景單一、圖形簡單的圖片。zip 是用來壓縮通用文件的,這就是它採用對大多數文件有更高壓縮率的 lz77 演算法的原因。

接下來 zip 演算法將要解決在「字典區域」中如何高速查找最長匹配的問題。

Ⅱ 7Z的壓縮演算法

7z 已公開了結構編輯功能,所以它可以支持任何一種新的壓縮演算法。
到目前為止,下列壓縮演算法已被整合到了 7z 中: 7z壓縮格式的演算法壓縮演算法 備注 LZMA 改良與優化後的 LZ77 演算法 LZMA2 改良的 LZMA 演算法 PPMD 基於 Dmitry Shkarin 的 PPMdH 演算法 BCJ 32 位 x86 可執行文件轉換程序 BCJ2 32 位 x86 可執行文件轉換程序 BZip2 標准 BWT 演算法 Deflate 標准 LZ77-based 演算法

Ⅲ 哈嘍,去年你在知道上求助的lz77演算法 java實現,能給我發一份嗎非常感謝啊!

DIB設備無關點陣圖文件,這是一種文件格式,

是為了保證用某個應用程序創建的點陣圖圖形可以被其它應用程序裝載或顯示一樣。

DIB的與設備無關性主要體現在以下兩個方面:DIB的顏色模式與設備無關。
例如,一個256色的DIB即可以在真彩色顯示模式下使用,也可以在16色模式下使用。
256色以下(包括256色)的DIB擁有自己的顏色表,像素的顏色獨立於系統調色板。
由於DIB不依賴於具體設備,因此可以用來永久性地保存圖象。
DIB一般是以*.BMP文件的形式保存在磁碟中的,有時也會保存在*.DIB文件中。

運行在不同輸出設備下的應用程序可以通過DIB來交換圖象。

Ⅳ LZ77和LZW編碼是同一個東西嗎

不是,但它們有關系。
Ziv和Lempel於1977年發表的演算法被後人稱為LZ77演算法。
1978年,二人又發表了續篇,被命名為LZ78的壓縮演算法。
1984年,Welch這個人研究了LZ78演算法的變種,因為是W在Z和L兩人之後研究出來的,因此叫LZW演算法。

LZW申請了專利,但專利在2003年過期了。
現在的幾乎所有壓縮演算法,都是從LZ77發展而來的。
而所謂LZ77編碼和LZW編碼,就是利用各自的壓縮演算法,對原字元序列壓縮後產生的新的編碼。

Ⅳ 求7z演算法的原理,詳細

7z演算法的原理:

簡單地說也就是把文件中的重復數據用更簡潔的方法表示,例如一個文件中有1000個字母A,那麼這將佔用1KB的數據空間,如果用壓縮演算法就可以用1000A來表示,那麼它只需要5個位元組的數據空間,壓縮比達到了200倍。

7z簡介:

7z 是一種主流高效的壓縮格式,它擁有極高的壓縮比。在計算機科學中,7z是一種可以使用多種壓縮演算法進行數據壓縮的檔案格式。該格式最初被7-Zip實現並採用,但是這種檔案格式是公有的,並且7-Zip軟體本身亦在GNU寬通用公共許可證 (GNU LGPL)協議下開放源代碼。目前LZMA軟體開發工具包的最新版本為V9.34。7z格式的MIME類型為application/x-7z-compressed。

Ⅵ 壓縮演算法進行字元串壓縮

Deflater 是同時使用了LZ77演算法與哈夫曼編碼的一個無損數據壓縮演算法。

我們可以使用 java 提供的 Deflater 和 Inflater 類對 json 進行壓縮和解壓縮,下面是工具類

壓縮前的位元組長度為:1825
壓縮後的位元組長度為:284
壓縮率為63.73%,壓縮後體積為原來的36.27%

壓縮前的位元組長度為:1825
壓縮後的位元組長度為:307
壓縮率為62.04%,壓縮後體積為原來的37.95%,也是不錯的!

Ⅶ 我們同學之間傳文件常常將文件壓縮,我不太明白這中的道例,誰能告訴我這個真能提高傳輸速度嗎

計算機處理的信息是以二進制數的形式表示的,因此壓縮軟體就是把二進制信息中相同的字元串以特殊字元標記來達到壓縮的目的。為了有助於理解文件壓縮,請您在腦海里想像一幅藍天白雲的圖片。對於成千上萬單調重復的藍色像點而言,與其一個一個定義「藍、藍、藍……」長長的一串顏色,還不如告訴電腦:「從這個位置開始存儲1117個藍色像點」來得簡潔,而且還能大大節約存儲空間。這是一個非常簡單的圖像壓縮的例子。其實,所有的計算機文件歸根結底都是以「1」和「0」的形式存儲的,和藍色像點一樣,只要通過合理的數學計算公式,文件的體積都能夠被大大壓縮以達到「數據無損稠密」的效果。總的來說,壓縮可以分為有損和無損壓縮兩種。如果丟失個別的數據不會造成太大的影響,這時忽略它們是個好主意,這就是有損壓縮。有損壓縮廣泛應用於動畫、聲音和圖像文件中,典型的代表就是影碟文件格式MPEG、音樂文件格式MP3和圖像文件格式JPG。

壓縮原理
很多人都驚異於壓縮技術的神奇,一個文件被壓縮成一半大小,何以能無損還原呢?

早期使用的壓縮技術都基於統計模型,到20世紀80年代初基於字典壓縮的新技術才慢慢推廣開來。

數據壓縮包含了非常多的軟體和硬體技術,這些技術各不相同,但是大多數壓縮軟體都是基於LZ77、LZ88演算法並加以修正而成,而LZ77是字典壓縮的起源。大家都知道一個文本文件是由一些單片語成,而且必定有重復現象發生,例如我們這里經常出現的「壓縮軟體」一詞,壓縮的原理就是在文件的頭部做一個類似字典的東西,把「壓縮軟體」這個詞放在「字典」中,並為這個詞指定一個占較少位元組數的編碼,而文章中的「壓縮軟體」 一詞均用此編碼代替,以達到壓縮的目的。當然壓縮軟體在實際運作中並非如此簡單,還要使用一些看了就頭痛的演算方法,在此就不一一細述。也許有人會問,文本文件可用字典技術,那其它文件怎麼辦呢。這就無須操心了,因為對於壓縮軟體來說,一個文件中的「數據壓縮」一詞和「@#¥%^」 是一樣的,關鍵在於冗餘碼(重復部分)的多少。

壓縮常識
按壓縮方式分:有所謂的「透明壓縮」和「打包壓縮」。

「透明壓縮」一般針對.exe和.com文件,直接壓縮。成功的話,文件體積變小,功能不變,運行速度還可能更快。但是,這種壓縮方法的對象面很窄。如果壓縮失敗,還會造成文件不可用。所以,這一類程序總是強烈要求用戶在壓縮前將文件備份。

「打包壓縮」就是現在常提到的壓縮軟體使用的壓縮法。它把一個或多個文件壓縮成一個文件——壓縮包。要使用壓縮後的文件,必須先解壓將文件復原。它的特點是風險小,適用於減小不常用的文件所佔空間和傳輸數據。當然,按照壓縮演算法,我們還可以將壓縮分成很多種。

一般我們在談到壓縮時,會提到許多相關術語,下面我們就提出一些常見的術語進行解釋。

壓縮格式:壓縮文件時使用的壓縮編碼方法不同,壓縮生成的文件結構就不同,這種壓縮文件結構就稱壓縮格式。

壓縮比率:文件壓縮後佔用的磁碟空間與原文件的比率稱壓縮比率。在常用的壓縮格式中,RAR格式壓縮比率較高,ZIP格式較低。但ZIP格式的文件操作速度較快。

解壓:將壓縮文件還原為本來的文件格式,也稱釋放、擴展。

壓縮包:一般將通用壓縮格式的文件稱為壓縮包,如ZIP格式壓縮文件。這種文件可以在壓縮工具的管理下對包中壓縮的文件進行管理,如查看、刪除、添加等。

打包:將文件壓縮成通用壓縮格式的壓縮包文件稱為打包,也指將文件壓縮添加到壓縮包。

多卷壓縮:將壓縮的文件包分成幾個壓縮文件稱為多卷壓縮,一般是為了將壓縮文件儲存在多個軟磁碟上或方便網上傳輸。

自解壓文件:將文件壓縮生成可執行的文件,然後在沒有壓縮工具的幫助下,通過執行壓縮的文件,就可將自己的源文件解壓還原出來。

壓縮文件格式
目前流行著多種壓縮文件格式,下面我們就來看看到底有哪些吧!

ZIP:目前最流行的壓縮文件格式(在Internet上,ZIP文件已經取得了絕對勝利。在日常操作中,除專門的壓縮軟體之外,許多文件管理程序,如Windows Commander等也都支持ZIP格式)。我們可利用WinZip對ZIP文件進行解壓、釋放等操作,還可以用它來處理ARJ、ARC、CAB、LZH等多種不同格式的壓縮文件,從而大大地方便了用戶的操作。

RAR:是一種高效快速的文件壓縮格式,但不被大多數文件壓縮程序支持,WinRAR是在Windows下處理RAR格式文件的最好工具。

ARJ:由DOS下曾經紅極一時的壓縮軟體ARJ壓縮而成的文件格式,它具有功能強大、壓縮率高等優點。到了現在的Windows時代,它已經沒有了往日的輝煌。

CAB:是Windows 98新增的一種特殊壓縮文件格式,主要用於對有關軟體安裝盤中的文件進行壓縮,其特點是壓縮率非常高(可能是目前最高的),但一經壓縮就不能再進行任何增加、刪除、替換等修改,也就是說它的壓縮包具有「只讀」屬性。我們也可使用WinZip對CAB壓縮包進行操作。

??_:軟體安裝盤所採用的一種壓縮文件方式,如*.ex_、*.dl_、*.d3_等,它們一般由系統直接解壓並完成安裝工作,無須用戶操心。當然,我們也可使用DOS的EXPAND命令對*.??_文件進行釋放操作。

UU/UUE:漢字編碼方式,它們原本是Unix系統中使用的一種編碼方式,後來被改寫到DOS中,我們在傳送中文郵件時只須事先使用該方式進行編碼,此後就能順利通過只能處理7位編碼的郵件伺服器,從而解決了漢字的傳輸問題。

ACE:一種新式的壓縮程序,壓縮比很高。

另外,MP3、MPEG、JPG等音頻、視頻、圖像格式的文件也都採用了壓縮技術,從理論上來說它們也應該算壓縮文件,不過它們所採用的壓縮方式並不相同,這里簡單地介紹一下:

JPEG:JPEG 全名為 Joint Photographic Experts Group,它是一個在國際標准組織(ISO)下從事靜態影像壓縮標准制定的委員會。它制定出了第一套國標靜態影像壓縮標准:ISO 10918-1 就是我們俗稱的JPEG了。由於JPEG優良的品質,使得它在短短的幾年內就獲得極大的成功,目前網站上80%的影像都是採用JPEG的壓縮標准。

JPEG 2000:正式名稱為「ISO 15444」,同樣是由JPEG 組織負責制定。JPEG 2000與傳統 JPEG 最大的不同,在於它放棄了JPEG所採用的以離散餘弦轉換為主的區塊編碼方式,而改以小波轉換為主的多解析編碼方式。其壓縮率比 JPEG高約30%左右,同時支持有損和無損壓縮,無損壓縮對保存一些重要圖片十分有用。

MP3:這個大家應該都認識它了,MP3全稱是MPEG 1 Layer 3,是一種高性能的聲音壓縮編碼方案,它可以做出超小「體積」的音樂文件,大小隻是原始音頻數據的1/10到1/12。但人耳聽起來,效果卻沒有太大差異。它一出世就幾乎佔領了電腦音樂領域,由於MP3的出現,過去在網際網路上半小時才能下載完的一首歌曲,現在以MP3格式僅需短短的幾分鍾就可以「搞定」。

MPEG:MPEG是Moving Pictures Experts Group(動態圖像專家組)的縮寫。
現在使用的有4個版本:MPEG-1、MPEG-2、MPEG-3、MPEG-4。

Ⅷ zip 的壓縮原理與實現

文件壓縮原理

我們使用計算機所做的事情大多都是對文件進行處理。每個文件都會佔用一定的磁碟空間,我們希望一些文件,尤其是暫時不用但又比較重要不能刪除的文件(如備份文件,有點像雞肋呀),盡可能少的佔用磁碟空間。但是,許多文件的存儲格式是比較鬆散的,這樣就浪費了一些寶貴的計算機存儲資源。這時,我們可以藉助壓縮工具解決這個問題,通過對原來的文件進行壓縮處理,使之用更少的磁碟空間保存起來,當需要使用時再進行解壓縮操作,這樣就大大節省了磁碟空間。當你要拷貝許多小文件時,通過壓縮處理可以提高執行效率。如果小文件很多,操作系統要執行頻繁的文件定位操作,需要花費很多的時間。如果先把這些小文件壓縮,變成一個壓縮文件後,再拷貝時就很方便了。由於計算機處理的信息是以二進制數的形式表示的,因此壓縮軟體就是把二進制信息中相同的字元串以特殊字元標記來達到壓縮的目的。為了有助於理解文件壓縮,請您在腦海里想像一幅藍天白雲的圖片。對於成千上萬單調重復的藍色像點而言,與其一個一個定義「藍、藍、藍……」長長的一串顏色,還不如告訴電腦:「從這個位置開始存儲1117個藍色像點」來得簡潔,而且還能大大節約存儲空間。這是一個非常簡單的圖像壓縮的例子。其實,所有的計算機文件歸根結底都是以「1」和「0」的形式存儲的,和藍色像點一樣,只要通過合理的數學計算公式,文件的體積都能夠被大大壓縮以達到「數據無損稠密」的效果。總的來說,壓縮可以分為有損和無損壓縮兩種。如果丟失個別的數據不會造成太大的影響,這時忽略它們是個好主意,這就是有損壓縮。有損壓縮廣泛應用於動畫、聲音和圖像文件中,典型的代表就是影碟文件格式mpeg、音樂文件格式mp3和圖像文件格式jpg。但是更多情況下壓縮數據必須准確無誤,人們便設計出了無損壓縮格式,比如常見的zip、rar等。壓縮軟體(compression software)自然就是利用壓縮原理壓縮數據的工具,壓縮後所生成的文件稱為壓縮包(archive),體積只有原來的幾分之一甚至更小。當然,壓縮包已經是另一種文件格式了,如果你想使用其中的數據,首先得用壓縮軟體把數據還原,這個過程稱作解壓縮。常見的壓縮軟體有winzip、winrar等

熱點內容
為什麼打開的三菱程序不能編譯 發布:2025-05-11 12:16:40 瀏覽:21
ftp定價是怎麼回事 發布:2025-05-11 12:09:18 瀏覽:334
android敏捷開發 發布:2025-05-11 11:56:49 瀏覽:80
腳本pon 發布:2025-05-11 11:52:27 瀏覽:826
ct5推薦哪個配置 發布:2025-05-11 11:47:45 瀏覽:742
領購未上傳發票 發布:2025-05-11 11:43:27 瀏覽:717
查看華為雲伺服器的ip地址 發布:2025-05-11 11:24:44 瀏覽:236
長沙銀行密碼多少 發布:2025-05-11 11:24:38 瀏覽:672
緩存手機視頻合並軟體哪個好 發布:2025-05-11 11:22:30 瀏覽:699
伺服器c盤怎麼清除 發布:2025-05-11 11:16:33 瀏覽:40