導航:首頁 > 文件處理 > 哈夫曼無損壓縮

哈夫曼無損壓縮

發布時間:2023-03-06 00:39:08

① 無損壓縮演算法是什麼樣的

WinRAR是採用它自己的獨創的壓縮演算法。
【希望你能看看最優二叉樹(哈夫曼樹),理解哈夫曼編碼的原理,對你的這個壓縮演算法會有很明晰的指導和解惑作用】WinRAR是採用它自己的獨創的壓縮演算法。

壓縮處理都是以二進制的方式進行的。這和你的編碼有關。只要是處理後的結果比原文檔文件小,而且是可逆的還原,就是無壓縮。
壓縮率的大小和你的編碼方式有關。

無損壓縮是指重構壓縮數據(還原,解壓縮),而重構數據與原來數據完全相同。該方法用於那些要求重構信號與原始信號完全一致的場合,如文本數據、程序和特殊應用場合的圖像數據(如指紋圖像、醫學圖像等)的壓縮。這類演算法壓縮率較低,一般為1/2~1/5。典型的無損壓縮演算法有:Shanno-Fano編碼、Huffman(哈夫曼)編碼、算術編碼、遊程編碼、LZW編碼等。

基於哈夫曼編碼原理的壓縮演算法:
哈夫曼演算法的過程為:統計原始數據中各字元出現的頻率;所有字元按頻率降序排列;
比如有一個字元串:aaaaaaaaaabbbbbbcccd
原文件大小存儲需要20個位元組。如果按頻率出現的次數高低,給予字元串中的每個字元不同的編碼長度,就可以達到壓縮的目的。

a編碼為01(佔用2個bit)
b編碼為00(佔用2個bit)
c編碼為000,(佔用3個bit)
c編碼為001,(佔用3個bit)
那就壓縮後的總長為(2*10+2*6+3*3+1*3)/8 =5.5個位元組。

另外在解碼的時候,要告之對方你的編碼方式,需要把編碼的規則傳遞過去。

如果對於以上字元串,你也可以按aaaaaaaaaa編碼成一個1,bbbbbb為2,ccc為3,d為4。這樣壓縮後的內容為最小,但是要注意一點,這時你的編碼規則為最大,你要把你的編碼規則發給對方的時候,有可能編編解碼規則文件可能會比壓縮後的內容還要大。最終結果為造成壓縮後的文件比原文件還要大。

② C語言都有哪些經典的無損壓縮演算法

C語言經典的無損壓縮演算法有:哈夫曼演算法、LZ。

哈夫曼演算法:
哈夫曼編碼是David A. Huffman於1952年發明的一種滿足對編碼演算法要求的一種編碼演算法。
哈夫曼演算法是利用頻率信息構造一棵二叉樹,頻率高的離根節點近(編碼長度短),頻率低的離根節點遠(編碼長度長),手動構造方法是先將字母按照頻率從小到大排序,然後不斷選擇當前還沒有父節點的節點中權值最小的兩個,構造新的父節點,父節點的值為這兩個節點值的和,直到構造成一棵二叉樹。

LZ演算法:
LZ演算法及其衍生變形演算法是壓縮演算法的一個系列。LZ77和LZ78演算法分別在1977年和1978年被創造出來。雖然他們名字差不多,但是演算法方法完全不同。這一系列演算法主要適用於字母數量有限的信息,比如文字、源碼等。流行的GIF和PNG格式的圖像,使用顏色數量有限的顏色空間,其壓縮就採用了兩種演算法的靈活變形應用。

③ 利用huffman編碼對文件進行壓縮,不同文件類型壓縮率有差別的原因

怎麼沒人回答呢 我來回答吧 我想從壓縮文件的原理能得到你這個問題的答案(有點長,請耐心看,絕對長知識): 壓縮文件的運行原理 如果您從互聯網上下載了許多程序和文件,可能會遇到很多ZIP文件。這種壓縮機制是一種很方便的發明,尤其是對網路用戶,因為它可以減小文件中的比特和位元組總數,使文件能夠通過較慢的互聯網連接實現更快傳輸,此外還可以減少文件的磁碟佔用空間。在下載了文件後,計算機可使用WinZip或Stuffit這樣的程序來展開文件,將其復原到原始大小。如果一切正常,展開的文件與壓縮前的原始文件將完全相同。
乍一聽好像很神秘:您是怎樣減少比特和位元組的數量並將它們原封不動地還原回去的呢?等一切水落石出之後,您會發現這個過程背後的基本理念其實非常簡單明了。在本文中,我們將討論這種通過簡單壓縮來明顯減小文件的方法。
大多數計算機文件類型都包含相當多的冗餘內容——它們會反復列出一些相同的信息。文件壓縮程序就是要消除這種冗餘現象。與反復列出某一塊信息不同,文件壓縮程序只列出該信息一次,然後當它在原始程序中出現時再重新引用它。
以我們熟悉的信息類型——單詞——為例子。
肯尼迪(John F. Kennedy)在1961年的就職演說中曾說過下面這段著名的話:
Ask not what your country can do for you——ask what you can do for your country.(不要問國家能為你做些什麼,而應該問自己能為國家做些什麼。)
這段話有17個單詞,包含61個字母、16個空格、1個破折號和1個句點。如果每個字母、空格或標點都佔用1個內存單元,那麼文件的總大小為79個單元。為了減小文件的大小,我們需要找出冗餘的部分。
我們立刻發現:
如果忽略大小寫字母間的區別,這個句子幾乎有一半是冗餘的。九個單詞(ask、not、what、your、country、can、do、for、you)幾乎提供了組成整句話所需的所有東西。為了構造出另一半句子,我們只需要拿出前半段句子中的單詞,然後加上空格和標點就行了。
大多數壓縮程序使用基於自適應字典的LZ演算法來縮小文件。「LZ」指的是此演算法的發明者Lempel和Ziv,「字典」指的是對數據塊進行歸類的方法。
排列字典的機制有很多種,它也可以像編號列表那樣簡單。在我們檢查肯尼迪這句著名講話時,可以挑出重復的單詞,並將它們放到編號索引中。然後,我們直接寫入編號而不是寫入整個單詞。
因此,如果我們的字典是:
ask
what
your
country
can
do
for
you
我們的句子現在就應該是這樣的:
1 not 2 3 4 5 6 7 8-- 1 2 8 5 6 7 3 4
如果您了解這種機制,那麼只需使用該字典和編號模式即可輕松重新構造出原始句子。這就是在展開某個下載文件時,計算機中的解壓縮程序所做的工作。你可能還遇到過能夠自行解壓縮的壓縮文件。若要創建這種文件,編程人員需要在被壓縮的文件中設置一個簡單的解壓縮程序。在下載完畢後,它可以自動重新構造出原始文件。
但是使用這種機制究竟能夠節省多少空間呢?「1 not 2 3 4 5 6 7 8——1 2 8 5 6 7 3 4」當然短於「Ask not what your country can do for you-- ask what you can do for your country.」,但應注意的是,我們需要隨文件一起保存這個字典。
在實際壓縮方案中,計算出各種文件需求是一個相當復雜的過程。讓我們回過頭考慮一下上面的例子。每個字元和空格都佔用1個內存單元,整個原句要佔用79個單元。壓縮後的句子(包括空格)佔用了37個單元,而字典(單詞和編號)也佔用了37個單元。也就是說,文件的大小為74個單元,因此我們並沒有把文件大小減少很多。
但這只是一個句子的情況!可以想像的是,如果用該壓縮程序處理完肯尼迪講話的其餘部分,我們會發現這些單詞以及其他單詞重復了更多次。而且,正如下一節所言,為了得到盡可能高的組織效率,可以對字典進行重寫。
在上一個的例子中,我們挑出了所有重復的單詞並將它們放在一個字典中。對於我們來說,這是最顯而易見的字典編寫方法。但是壓縮程序卻不這樣認為:它對單詞沒有概念——它只會尋找各個模式。為了盡可能減小文件的大小,它會仔細挑選出最優模式。
如果從這個角度處理該句子,我們最終會得到一個完全不同的字典。
如果壓縮程序掃描肯尼迪的這句話,它遇到的第一個冗餘部分只有幾個字母長。在ask not what your中,出現了一個重復的模式,即字母t後面跟一個空格——在not和what中。如果壓縮程序將此模式寫入字典,則每次出現「t」後面跟一個空格的情況時,它會寫入一個「1」。但是在這個短句中,此模式的出現次數不夠多,不足以將其保留為字典中的一個條目,因此程序最終會覆蓋它。
程序接下來注意到的內容是ou,在your和country中都出現了它。如果這是一篇較長的文檔,將此模式寫入字典會節省大量空間——在英語中ou是一個十分常見的字母組合。但是在壓縮程序看完整個句子後,它立即發現了一個更好的字典條目選擇:不僅ou發生了重復,而且your和country整個單詞都發生了重復,並且它們實際上是作為一個短語your country一起發生重復的。在本例中,程序會用your country條目覆蓋掉字典中的ou條目。
短語can do for也發生了重復,一次後面跟著your,另一次跟著you,因此我們又發現can do for you也是一種重復模式。這樣,我們可以用一個數字來代替15個字元(包含空格),而your country只允許我們用一個數字代替13個字元(包含空格),所以程序會用r country條目覆蓋your country條目,然後再寫入一個單獨的can do for you條目。程序通過這種方式繼續工作,挑出所有重復的信息,然後計算應該將哪一種模式寫入字典。基於自適應字典的LZ演算法中的「自適應」部分指的就是這種重寫字典的能力。程序執行此工作的過程實際上非常復雜。
無論使用什麼方法,這種深入搜索機制都能比僅僅挑出單詞這種方法更有效率地對文件進行壓縮。如果使用我們上面提取出的模式,然後用「__」代替空格,最終將得到下面這個更大的字典:
ask__
what__­
you
r__country
__can__do__for__you
而句子則較短:
「1not__2345__--__12354」
句子現在佔用18個內存單元,字典佔用41個單元。所以,我們將文件總大小從79個單元壓縮到了59個單元!這僅僅是壓縮句子的一種方法,而且不一定是最高效的方法。(看看您能找到更好的方法嗎!)
那麼這種機制到底有多好呢?文件壓縮率取決於多種因素,包括文件類型、文件大小和壓縮方案。
在世界上的大多數語言中,某些字母和單詞經常以相同的模式一起出現。正是由於這種高冗餘性,而導致文本文件的壓縮率會很高。通常大小合適的文本文件的壓縮率可以達到50%或更高。大多數編程語言的冗餘度也很高,因為它們的命令相對較少,並且命令經常採用一種設定的模式。對於包含大量不重復信息的文件(例如圖像或MP3文件),則不能使用這種機制來獲得很高的壓縮率,因為它們不包含重復多次的模式。
如果文件有大量重復模式,那麼壓縮率通常會隨著文件大小的增加而增加。從我們的例子中就可以看出這一點——如果我們摘錄的肯尼迪講話再長一些,您會發現又多次出現了我們字典中的模式,因此能夠通過每個字典條目節省更多的文件空間。此外,對於更大的文件,還可能出現具有更大普遍性的模式,從而能夠創建出效率更高的字典。
此外,文件壓縮效率還取決於壓縮程序使用的具體演算法。有些程序能夠在某些類型的文件中更好地尋找到模式,因此能更有效地壓縮這些類型的文件。其他一些壓縮程序在字典中又使用了字典,這使它們在壓縮大文件時表現很好,但是在壓縮較小的文件時效率不高。盡管這一類的所有壓縮程序都基於同一個基本理念,但是它們的執行方式卻各不相同。程序開發人員始終在嘗試建立更好的壓縮機制。
有損壓縮和無損壓縮
我們在上文中討論的壓縮類型稱為無損壓縮,因為您重新創建的文件與原始文件完全相同。所有無損壓縮都基於這樣一種理念:將文件變為「較小」的形式以利於傳輸或存儲,並在另一方收到它後復原以便重新使用它。
有損壓縮則與此大不相同。這些程序直接去除「不必要」的信息,對文件進行剪裁以使它變得更小。這種類型的壓縮大量應用於減小點陣圖圖像的文件大小,因為點陣圖圖像的體積通常非常龐大。為了了解有損壓縮的工作原理,讓我們看看你的計算機如何對一張掃描的照片進行壓縮。
對於此類文件,無損壓縮程序的壓縮率通常不高。盡管圖片的大部分看起來都是相同的——例如,整個天空都是藍色的——但是大部分像素之間都存在微小的差異。為了使圖片變得更小同時不降低其解析度,您必須更改某些像素的顏色值。如果圖片中包含大量的藍色天空,程序會挑選一種能夠用於所有像素的藍色。然後,程序重寫該文件,所有天空像素的值都使用此信息。如果壓縮方案選擇得當,您不會注意到任何變化,但是文件大小會顯著減小。
當然,對於有損壓縮,在文件壓縮後您無法將其復原成原始文件的樣子。您必須接受壓縮程序對原始文件的重新解釋。因此,如果需要完全重現原來的內容(例如軟體應用程序、資料庫和總統就職演說),則不應該使用這種壓縮形式。

④ 壓縮演算法原理

哈夫曼
哈夫曼編碼是無損壓縮當中最好的方法。它使用預先二進制描述來替換每個符號,長度由特殊符號出現的頻率決定。常見的符號需要很少的位來表示,而不常見的符號需要很多為來表示。

哈夫曼演算法在改變任何符號二進制編碼引起少量密集表現方面是最佳的。然而,它並不處理符號的順序和重復或序號的序列。

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 )下非常好,這中情況下大多數基於字典方式的編碼器都有問題。

⑤ 利用哈夫曼編碼進行壓縮壓縮率一般達到多少

哈夫曼編碼進行壓縮的壓縮率是根據平均碼長來計算的,壓縮率比較低。

例如:用三位二進行數進行的等長編碼平均長度為3,而根據哈夫曼樹編碼的平均碼長為:

4*0.07+2*0.19+5*0.02+4*0.06+2*0.32+5*0.03+2*0.21+4*0.10=2.61

2.61/3=0.87=87%

其平均碼長是等長碼的87%,所以平均壓縮率為13%。

哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼(VLC)的一種。

Huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做Huffman編碼(有時也稱為霍夫曼編碼)。

壓縮率,描述壓縮文件的效果名,是文件壓縮後的大小與壓縮前的大小之比,例如:把100m的文件壓縮後是90m,壓縮率為90/100*100%=90%,壓縮率一般是越小越好,但是壓得越小,解壓時間越長。

(5)哈夫曼無損壓縮擴展閱讀

哈夫曼編碼的具體方法:先按出現的概率大小排隊,把兩個最小的概率相加,作為新的概率 和剩餘的概率重新排隊,再把最小的兩個概率相加,再重新排隊,直到最後變成1。

每次相 加時都將「0」和「1」賦與相加的兩個概率,讀出時由該符號開始一直走到最後的「1」, 將路線上所遇到的「0」和「1」按最低位到最高位的順序排好,就是該符號的哈夫曼編碼。

⑥ 如何寫壓縮軟體,運用哈夫曼演算法實現

到文件壓縮大家很容易想到的就是rar,zip等我們常見的壓縮格式。然而,還有一種就是大家在學習數據結構最常見到的哈夫曼樹的數據結構,以前還不知道他又什麼用,其實他最大的用途就是用來做壓縮,也是一些rar,zip壓縮的祖先,稱為哈弗曼壓縮(什麼你不知道誰是哈弗曼,也不知道哈弗曼壓縮,不急等下介紹)。

隨著網路與多媒體技術的興起,人們需要存儲和傳輸的數據越來越多,數據量越來越大,以前帶寬有限的傳輸網路和容量有限的存儲介質難以滿足用戶的需求。

特別是聲音、圖像和視頻等媒體在人們的日常生活和工作中的地位日益突出,這個問題越發顯得嚴重和迫切。如今,數據壓縮技術早已是多媒體領域中的關鍵技術之一。

一、什麼是哈弗曼壓縮

Huffman(哈夫曼)演算法在上世紀五十年代初提出來了,它是一種無損壓縮方法,在壓縮過程中不會丟失信息熵,而且可以證明Huffman演算法在無損壓縮演算法中是最優的。Huffman原理簡單,實現起來也不困難,在現在的主流壓縮軟體得到了廣泛的應用。對應用程序、重要資料等絕對不允許信息丟失的壓縮場合,Huffman演算法是非常好的選擇。

二、怎麼實現哈弗曼壓縮

哈夫曼壓縮是個無損的壓縮演算法,一般用來壓縮文本和程序文件。哈夫曼壓縮屬於可變代碼長度演算法一族。意思是個體符號(例如,文本文件中的字元)用一個特定長度的位序列替代。因此,在文件中出現頻率高的符號,使用短的位序列,而那些很少出現的符號,則用較長的位序列。

故我們得了解幾個概念:

1、二叉樹:在計算機科學中,二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。2、哈夫曼編碼(Huffman Coding):是一種編碼方式,哈夫曼編碼是可變字長編碼(VLC)的一種。uffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長 度最短的碼字,有時稱之為最佳編碼,一般就叫作Huffman編碼。三、哈夫曼編碼生成步驟:

①掃描要壓縮的文件,對字元出現的頻率進行計算。

②把字元按出現的頻率進行排序,組成一個隊列。

③把出現頻率最低(權值)的兩個字元作為葉子節點,它們的權值之和為根節點組成一棵樹。

④把上面葉子節點的兩個字元從隊列中移除,並把它們組成的根節點加入到隊列。

⑤把隊列重新進行排序。重復步驟③④⑤直到隊列中只有一個節點為止。

⑥把這棵樹上的根節點定義為0(可自行定義0或1)左邊為0,右邊為1。這樣就可以得到每個葉子節點的哈夫曼編碼了。

既如 (a)、(b)、(c)、(d)幾個圖,就可以將離散型的數據轉化為樹型的了。

如果假設樹的左邊用0表示右邊用1表示,則每一個數可以用一個01串表示出來。

則可以得到對應的編碼如下:
1-->110
2-->111
3-->10
4-->0
每一個01串,既為每一個數字的哈弗曼編碼。
為什麼能壓縮:
壓縮的時候當我們遇到了文本中的1、2、3、4幾個字元的時候,我們不用原來的存儲,而是轉化為用它們的01串來存儲不久是能減小了空間佔用了嗎。(什麼01串不是比原來的字元還多了嗎?怎麼減少?)大家應該知道的,計算機中我們存儲一個int型數據的時候一般式佔用了2^32-1個01位,因為計算機中所有的數據都是最後轉化為二進制位去存儲的。所以,想想我們的編碼不就是只含有0和1嘛,因此我們就直接將編碼按照計算機的存儲規則用位的方法寫入進去就能實現壓縮了。
比如:
1這個數字,用整數寫進計算機硬碟去存儲,佔用了2^32-1個二進制位
而如果用它的哈弗曼編碼去存儲,只有110三個二進制位。
效果顯而易見。

⑦ 如何用哈夫曼編碼實現英文文本的壓縮和解壓縮

哈夫曼壓縮是個無損的壓縮演算法,一般用來壓縮文本和程序文件。哈夫曼壓縮屬於可變代碼長度演算法一族。意思是個體符號(例如,文本文件中的字元)用一個特定長度的位序列替代。因此,在文件中出現頻率高的符號,使用短的位序列,而那些很少出現的符號,則用較長的位序列。有人用C函數寫了這個編碼,見下面鏈接

http://ke..com/view/189694.htm

閱讀全文

與哈夫曼無損壓縮相關的資料

熱點內容
鴻蒙系統怎麼換為安卓系統 瀏覽:846
pdf已加密如何轉為ppt 瀏覽:4
文件或文件夾怎樣命名 瀏覽:926
悅跑圈演算法 瀏覽:705
騎砍2霸主作戰命令 瀏覽:980
嵌入式常用演算法 瀏覽:548
csgo不輸入命令如何切換伺服器 瀏覽:3
安卓手機怎麼開啟分身微信 瀏覽:306
蘇格拉底的申辯pdf 瀏覽:80
php手冊怎麼下載 瀏覽:758
哪個app可以看全運會男籃直播 瀏覽:968
excel中圖片怎麼壓縮 瀏覽:192
電腦上java編譯器 瀏覽:560
中聯壓縮式垃圾車報價 瀏覽:778
我的世界hmcl啟動器如何開伺服器 瀏覽:127
安卓7如何開啟導航鍵 瀏覽:395
無法連接科雷伺服器怎麼解決飢荒 瀏覽:192
伺服器滅火用什麼滅火器 瀏覽:863
壓縮機噴出來的油 瀏覽:89
fpgadsparm單片機 瀏覽:761