哈夫曼
哈夫曼編碼是無損壓縮當中最好的方法。它使用預先二進制描述來替換每個符號,長度由特殊符號出現的頻率決定。常見的符號需要很少的位來表示,而不常見的符號需要很多為來表示。
哈夫曼演算法在改變任何符號二進制編碼引起少量密集表現方面是最佳的。然而,它並不處理符號的順序和重復或序號的序列。
2.1 原理
我不打算探究哈夫曼編碼的所有實際的細節,但基本的原理是為每個符號找到新的二進製表示,從而通常符號使用很少的位,不常見的符號使用較多的位。
簡短的說,這個問題的解決方案是為了查找每個符號的通用程度,我們建立一個未壓縮數據的柱狀圖;通過遞歸拆分這個柱狀圖為兩部分來創建一個二叉樹,每個遞歸的一半應該和另一半具有同樣的權(權是 ∑ N K =1 符號數 k , N 是分之中符號的數量,符號數 k 是符號 k出現的次數 )
這棵樹有兩個目的:
1. 編碼器使用這棵樹來找到每個符號最優的表示方法
2. 解碼器使用這棵樹唯一的標識在壓縮流中每個編碼的開始和結束,其通過在讀壓縮數據位的時候自頂向底的遍歷樹,選擇基於數據流中的每個獨立位的分支,一旦一個到達葉子節點,解碼器知道一個完整的編碼已經讀出來了。
壓縮後的數據流是 24 位(三個位元組),原來是 80 位( 10 個位元組)。當然,我應該存儲哈夫曼樹,這樣解碼器就能夠解碼出對應的壓縮流了,這就使得該例子中的真正數據流比輸入的流數據量大。這是相對較短的數據上的副作用。對於大數據量來說,上面的哈夫曼樹就不佔太多比例了。
解碼的時候,從上到下遍歷樹,為壓縮的流選擇從左 / 右分支,每次碰到一個葉子節點的時候,就可以將對應的位元組寫到解壓輸出流中,然後再從根開始遍歷。
2.2 實現
哈夫曼編碼器可以在基本壓縮庫中找到,其是非常直接的實現。
這個實現的基本缺陷是:
1. 慢位流實現
2. 相當慢的解碼(比編碼慢)
3. 最大的樹深度是 32 (編碼器在任何超過 32 位大小的時候退出)。如果我不是搞錯的話,這是不可能的,除非輸出的數據大於 2 32位元組。
另一方面,這個實現有幾個優點:
1. 哈夫曼樹以一個緊密的形式每個符號要求 12 位(對於 8 位的符號)的方式存儲,這意味著最大的頭為 384 。
2. 編碼相當容易理解
哈夫曼編碼在數據有噪音的情況(不是有規律的,例如 RLE )下非常好,這中情況下大多數基於字典方式的編碼器都有問題。
㈡ 壓縮文件是什麼原理
壓縮的原理:計算機處理信息是以二進制數(0和1)的形式標示的,壓縮軟體把二進制信息中相同的字元串以特殊字元標記起來壓縮的,從而實現縮小文件大小的。
文件的壓縮比則根據文件的類型不同有所不同,比如文檔類的文件壓縮比很大(一個字或者一個詞在同一個文件會反復出現),而圖形圖像的壓縮比則比較小(每一個像素點的色素不同是常有的,不同顏色和顏色深淺、對比度的不同、亮度不同等的對應二進制代碼是不同的)。
如果原文件被刪掉了,只要將壓縮文件解壓就可以。
回答者
㈢ 軟體壓縮的原理是什麼
壓縮的原理是把文件的二進制代碼壓縮,把相鄰的0,1代碼減少,比如有000000,可以把它變成6個0 的寫法60,來減少該文件的空間。
由於計算機處理的信息是以二進制數的形式表示的,因此壓縮軟體就是把二進制信息中相同的字元串以特殊字元標記來達到壓縮的目的。
為了有助於理解文件壓縮,請在腦海里想像一幅藍天白雲的圖片。對於成千上萬單調重復的藍色像點而言,與其一個一個定義「藍、藍、藍……」長長的一串顏色,還不如告訴電腦:「從這個位置開始存儲1117個藍色像點」來得簡潔,而且還能大大節約存儲空間。
這是一個非常簡單的圖像壓縮的例子。其實,所有的計算機文件歸根結底都是以「1」和「0」的形式存儲的,和藍色像點一樣,只要通過合理的數學計算公式,文件的體積都能夠被大大壓縮以達到「數據無損稠密」的效果。
(3)數據壓縮原理簡述擴展閱讀
WinRAR能備份數據,減少 E-mail附件的大小,解壓縮從Internet上下載的 RAR、ZIP 和其他格式的壓縮文件,並能創建 RAR 和 ZIP 格式的壓縮文件。在購買之前,你可以下載試用版本。
WINRAR在壓縮率和速度方面都有很好的表現。其壓縮率比高,3.x 採用了更先進的壓縮演算法,是現在壓縮率較大、壓縮速度較快的格式之一。 3.3 增加了掃描壓縮文件內病毒、解壓縮「增強壓縮」 ZIP 壓縮文件的功能, 升級了分卷壓縮的功能等。
參考資料來源:網路-壓縮文件
㈣ 文件的壓縮原理是什麼
電腦里文件都是以二進制儲存的。壓縮原理就是通過特定的演算法,將文件轉化,而轉化以後的文件佔用的空間較小。
舉個簡單得例子(當然這個例子應該有點問題,但是能說明問題):
原始文件:111110000001
演算法:當連續同樣的1或者0的個數超過5個,則將其轉化成XX1或者XX0得形式;如果不超過5個,保持不變。XX是連續的1或者0的個數,如果連續數量較多,XX得位數可以增加。
於是11111可以表示成5個1,寫成二進制就是1011;000000可以表示成6個0,寫成二進制就是1100;而1保持不變。
這樣,轉化以後的文件就變成了101111001
可見,原始文件需要12個存儲位置,而轉化後的文件只需要9個存儲位置。
當然,實際上壓縮得演算法多種多樣,要比這個例子復雜的多。根據文件種類的不同壓縮演算法也經常不同。
㈤ 請大家談談你對數據壓縮原理的認識
數據壓縮技術就是對原始數據進行數據編碼或壓縮編碼。
目前常用的壓縮編碼有:冗餘壓縮法(無損壓縮法、熵編碼)和熵壓縮法(有損壓縮法)兩類。
無損壓縮是可逆的;有損壓縮是不可逆的。
變長編碼
使用長度可變的代碼來對以不同頻率出現的樣本進行編碼。
1·Huffman編碼
Huffman編碼又稱最佳編碼。
Huffman編碼過程是:
*將信源符號按概率遞減順序排列;
*把兩個最小的概率加起來,作為新符號的概率;
*重復上述兩步驟,直到概率的和達到1為止;
*在每次合並消息時,將被合並的消息賦予1和0或賦予0和1;
*尋找從每一信源符號到概率為1的路經,記錄下路經上的1和0;
*對每一符號寫出從碼樹的根到終結點1、0序列。
例:對信源
[X1,X2,X3,X4,X5,X6]=[0.25,0.25,0.20,0.15,0.10,0.05]
進行Huffman編碼。
其中:X1=01;X2=10;X3=11;X4=000;X5=0010;X6=0011。
2·算術編碼
算術編碼是一種二元編碼。
這種編碼方法是在不考慮信源統計的情況下,只要監視一小段時間內碼字出現的頻率,不管統計是平穩的或非平穩的,編碼的碼率總能趨近於信源熵值,每次迭代的編碼演算法只處理一個數據符號,並且只有算術運算。
對二進制編碼來說,信源符號只有兩個。在算術編碼的初級階段,可設一個大概率Pe和小概率Qe,然後對被編碼比特流符號進行判斷。
模型編碼
模型編碼是指採用模型的方法對傳輸的圖像進行參數估測。
模型編碼有:隨機馬爾可夫場和分形圖像編碼。
1·分形的概念
分形的含義是其組成部分以某種方式與整體相似的形(一類無規則、混亂而復雜),其局部與整體有相似性的體系,即:自相似性體系。
2·分形編碼
*基本原理:分形的方法是把一幅數字圖像,通過一些圖像處理技術將原始圖像分成一些子圖像,然後在分形集中查找這樣的子圖像。分形集存儲許多迭代函數,通過迭代函數的反復迭代,可以恢復原來的子圖像。
分形編碼壓縮的步驟:
第一步:把圖像劃分為互不重疊的、任意大小的的D分區;
第二步:劃定一些可以相互重疊的、比D分區大的R分區;
第三步:為每個D分區選定仿射變換表。
分形編碼解壓步驟:
首先從文件中讀取D分區劃分方式的信息和仿射變換系數等數據;
然後劃定兩個同樣大小的緩沖區給D圖像和R圖像,並把R初始化到任一初始階段;
根據仿射變換系數把其相應的R分區做仿射變換,並用變換後的數據取代該D分區的原有數據;
對D中所有的D分區都進行上述操作,全部完成後就形成一個新的D圖像;
再把新D圖像的內容拷貝到R中,把新R當作D,D當作R,重復操作(迭代)。
。分形編碼的特點:
壓縮比高,壓縮後的文件容量與圖像像素數無關,在壓縮時時間長但解壓縮速度快
㈥ 數據壓縮
數據壓縮技術主要研究數據的表示、傳輸和轉換方法,目的是減少數據所佔據的存儲空間和縮短數據傳輸時所需要的時間。
衡量數據壓縮的3個主要指標:一是壓縮前後所需的信息存儲量之比要大;二是實現壓縮的演算法要簡單,壓縮、解壓縮速度快,要盡可能做到實時壓縮和解壓縮;三是恢復效果要好,要盡可能完全恢復原始數據。
數據壓縮主要應用於兩個方面。一是傳輸:通過壓縮發送端的原始數據,並在接收端進行解壓恢復,可以有效地減少傳輸時間和增加信道帶寬。二是存儲:在存儲時壓縮原始數據,在使用時進行解壓,可大大提高存儲介質的存儲量。
數據壓縮按照壓縮的失真度分成兩種類型:一種叫作無損壓縮,另一種叫作有損壓縮。
無損壓縮是指使用壓縮後的數據進行重構(或者叫作還原、解壓縮),重構後的數據與原來的數據完全相同;無損壓縮用於要求重構的信號與原始信號完全一致的場合。一個很常見的例子是磁碟文件的壓縮。根據目前的技術水平,無損壓縮演算法一般可以把普通文件的數據壓縮到原來的1/4~1/2。一些常用的無損壓縮演算法有霍夫曼(Huffman)演算法、算術演算法、遊程演算法和LZW(Lenpel-Ziv & Welch)壓縮演算法。
1)霍夫曼演算法屬於統計式壓縮方法,其原理是根據原始數據符號發生的概率進行編碼。在原始數據中出現概率越高的符合,相應的碼長越短,出現概率越少的符合,其碼長越長。從而達到用盡可能少的符號來表示原始數據,實現對數據的壓縮。
2)算術演算法是基於統計原理,無損壓縮效率最高的演算法。即將整段要壓縮的數據映射到一段實數半封閉的范圍[0,1)內的某一區段。該區段的范圍或寬度等於該段信息概率。即是所有使用在該信息內的符號出現概率全部相乘後的概率值。當要被編碼的信息越來越長時,用來代表該信息的區段就會越來越窄,用來表示這個區段的位就會增加。
3)遊程演算法是針對一些文本數據特點所設計的壓縮方法。主要是去除文本中的冗餘字元或位元組中的冗餘位,從而達到減少數據文件所佔的存儲空間。壓縮處理流程類似於空白壓縮,區別是在壓縮指示字元之後加上一個字元,用於表明壓縮對象,隨後是該字元的重復次數。本演算法具有局限性,很少單獨使用,多與其他演算法配合使用。
4)LZW演算法的原理是用字典詞條的編碼代替在壓縮數據中的字元串。因此字典中的詞條越多,壓縮率越高,加大字典的容量可以提高壓縮率。字典的容量受計算機的內存限制。
有損壓縮是指使用壓縮後的數據進行重構,重構後的數據與原來的數據有所不同,但不影響人對原始資料表達的信息造成誤解。有損壓縮適用於重構信號不一定非要和原始信號完全相同的場合。例如,圖像和聲音的壓縮就可以採用有損壓縮,因為其中包含的數據往往多於我們的視覺系統和聽覺系統所能接收的信息,丟掉一些數據而不至於對聲音或者圖像所表達的意思產生誤解,但可大大提高壓縮比。
㈦ 數據流壓縮原理和數據壓縮Zlib的實現
壓縮的本質就是去冗餘,去除信息冗餘,使用最短的編碼保存最完整的數據信息。所以對於不同的場景,壓縮採用的演算法也因時制宜,比如視頻和圖片可以採用有損壓縮,而文本數據採用無損壓縮。壓縮率又取決於信息的冗餘度,也就是內容中重復的比例。那些均勻分布的隨機字元串,壓縮率會降到最低,即香農限
deflate是zip文件的默認演算法。它更是一種數據流壓縮演算法。
LZ77壓縮演算法採用字典的方式進行壓縮,是一種簡單但是很高效的數據壓縮演算法。其方式就是把數據中一些可以組織成短語的字元加入字典。維護三個概念: 短語字典、滑動窗口、向前緩沖區
壓縮的逆過程,通過解碼標記和保持滑動窗口中的符號來更新解壓數據。當解碼字元被標記:將標記編碼成字元拷貝到滑動窗口中,一步一步直到全部翻譯完成
在流式傳輸中,不定長編碼數據的解碼想要保持唯一性,必須滿足唯一可以碼的條件。而異前綴碼就是一種唯一可解碼的候選,當然這樣會增加編碼的長度,卻可以簡化解碼。
huffman編碼是一種基於概率分布的貪心策略最優前綴碼。huffman編碼可以有效的壓縮數據,壓縮率取決於數據本身的信息冗餘度
計算數據中各符號出現的概率,根據概率從小到大,從下往上反向構建構造碼樹,這樣最終得到的編碼的平均長度是最短的。同時也是唯一可譯的
解讀:在一開始,每一個字元已經按照出現概率的大小排好順序,在後續的步驟中,每一次將概率最低的兩棵樹合並,然後用合並後的結果再次排序(為了找出最小的兩棵樹)。在gzip源碼中並沒有專門去排序,而是使用專門的數據結構(比如最小堆或者紅黑樹)。
使用優先隊列實現huffman樹,最後基於Huffman樹最終實現文件壓縮。
具體步驟:
gzip = gzip 頭 + deflate 編碼的實際內容 + gzip 尾
zlib = zlib 頭 + deflate 編碼的實際內容 + zlib 尾
壓縮之前:初始化各種輸入輸出緩沖區;
壓縮:我們可以不斷往這些緩沖區中填充內容,然後由deflate函數進行壓縮或者indeflate函數進行解壓
總結:在調用deflate函數之前,應用程序必須保證至少一個動作被執行(avail_in或者avail_out被設置),用提供更多數據或者消耗更多的數據的方式。avail_out在函數調用之前千萬不能為零。應用程序可以隨時消耗被壓縮的輸出數據