国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

哈夫曼編碼(Huffman Coding)原理詳解

這篇具有很好參考價(jià)值的文章主要介紹了哈夫曼編碼(Huffman Coding)原理詳解。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

哈夫曼編碼

哈夫曼編碼,又稱為哈夫曼編碼(Huffman Coding)

是一種可變長編碼( VLC, variable length coding))方式,比起定長編碼的 ASCII 編碼來說,哈夫曼編碼能節(jié)省很多的空間,因?yàn)槊恳粋€(gè)字符出現(xiàn)的頻率不是一致的;

是一種用于無損數(shù)據(jù)壓縮的熵編碼算法,通常用于壓縮重復(fù)率比較高的字符數(shù)據(jù)。

如果我們通過轉(zhuǎn)換成ASCII碼對應(yīng)的二進(jìn)制數(shù)據(jù)將字符串 BCAADDDCCACACAC 通過二進(jìn)制編碼進(jìn)行傳輸,那么一個(gè)字符傳輸?shù)亩M(jìn)制位數(shù)為 8bits,那么總共需要 120 個(gè)二進(jìn)制位;而如果使用哈夫曼編碼,該串字符可壓縮至 28位。
哈夫曼編碼,數(shù)據(jù)結(jié)構(gòu)與算法,霍夫曼樹,數(shù)據(jù)結(jié)構(gòu),算法

哈夫曼編碼方法

哈夫曼編碼首先會使用字符的頻率創(chuàng)建一棵,然后通過這個(gè)樹的結(jié)構(gòu)為每個(gè)字符生成一個(gè)特定的編碼,出現(xiàn)頻率高的字符使用較短的編碼,出現(xiàn)頻率低的則使用較長的編碼,這樣就會使編碼之后的字符串平均長度降低,從而達(dá)到數(shù)據(jù)無損壓縮的目的。

1. 計(jì)算字符串中每個(gè)字符的頻率:

哈夫曼編碼,數(shù)據(jù)結(jié)構(gòu)與算法,霍夫曼樹,數(shù)據(jù)結(jié)構(gòu),算法

2. 按照字符出現(xiàn)的頻率進(jìn)行排序,組成一個(gè)隊(duì)列 Q

出現(xiàn)頻率最低的在前面,出現(xiàn)頻率高的在后面。

哈夫曼編碼,數(shù)據(jù)結(jié)構(gòu)與算法,霍夫曼樹,數(shù)據(jù)結(jié)構(gòu),算法

3. 把這些字符作為葉子節(jié)點(diǎn)開始構(gòu)建一顆哈夫曼樹

哈夫曼樹又稱為最優(yōu)二叉樹,是一種帶權(quán)路徑長度最短的二叉樹。

(1)首先創(chuàng)建一個(gè)空節(jié)點(diǎn) z,將最小頻率的字符分配給 z 的左側(cè),并將頻率排在第二位的分配給 z 的右側(cè),然后將 z 賦值為兩個(gè)字符頻率的和;然后從隊(duì)列 Q 中刪除 B 和 D,并將它們的和添加到隊(duì)列中,上圖中 * 表示的位置。

哈夫曼編碼,數(shù)據(jù)結(jié)構(gòu)與算法,霍夫曼樹,數(shù)據(jù)結(jié)構(gòu),算法

(2)緊接著,重新創(chuàng)建一個(gè)空的節(jié)點(diǎn) z,并將 4 作為左側(cè)的節(jié)點(diǎn),頻率為 5 的 A 作為右側(cè)的節(jié)點(diǎn),4 與 5 的和作為父節(jié)點(diǎn),并把這個(gè)和按序加入到隊(duì)列中,再根據(jù)頻率從小到大構(gòu)建樹結(jié)構(gòu)(小的在左)。

哈夫曼編碼,數(shù)據(jù)結(jié)構(gòu)與算法,霍夫曼樹,數(shù)據(jù)結(jié)構(gòu),算法

(3)繼續(xù)按照之前的思路構(gòu)建樹,直到所有的字符都出現(xiàn)在樹的節(jié)點(diǎn)中,哈弗曼樹構(gòu)建完成。

節(jié)點(diǎn)的帶權(quán)路徑長度為從根節(jié)點(diǎn)到該節(jié)點(diǎn)的路徑長度與節(jié)點(diǎn)權(quán)值的乘積。

該二叉樹的帶權(quán)路徑長度 WPL = 6 * 1 + 5 * 2 + 3 * 3 + 1 * 3 = 28。

哈夫曼編碼,數(shù)據(jù)結(jié)構(gòu)與算法,霍夫曼樹,數(shù)據(jù)結(jié)構(gòu),算法

4. 對字符進(jìn)行編碼:

哈夫曼樹構(gòu)建完成,下面我們要對各個(gè)字母進(jìn)行編碼,編碼原則是:對于每個(gè)非葉子節(jié)點(diǎn),將 0 分配給連接線的左側(cè),1 分配給連接線的右側(cè),最終得到字符的編碼就是從根節(jié)點(diǎn)開始,到該節(jié)點(diǎn)的路徑上的 0 1 序列組合。

哈夫曼編碼,數(shù)據(jù)結(jié)構(gòu)與算法,霍夫曼樹,數(shù)據(jù)結(jié)構(gòu),算法

因此各個(gè)字母的編碼分別為:

A B C D
11 100 0 101

在沒有經(jīng)過哈夫曼編碼之前,字符串“BCAADDDCCACACAC”的二進(jìn)制為:

10000100100001101000001010000010100010001000100010001000100001101000011010000010100001101000001010000110100000101000011

也就是占了 120 比特;

編碼之后為:

1000111110110110100110110110

占了 28 比特。

5. 確定發(fā)送的數(shù)據(jù)

哈夫曼編碼將發(fā)送字符串的數(shù)據(jù)長度極大壓縮,考慮到接收方的編碼,還需要把哈夫曼樹的結(jié)構(gòu)也傳遞過去。

字符占用的 32 比特和 頻率占用的 15 比特也需要傳遞過去。

總體上,編碼后比特?cái)?shù)為32 + 15 + 28 = 75,比 120 比特少了 45 個(gè),效率還是非常高的。

哈夫曼編碼,數(shù)據(jù)結(jié)構(gòu)與算法,霍夫曼樹,數(shù)據(jù)結(jié)構(gòu),算法

從本質(zhì)上講,哈夫曼編碼是將最寶貴的資源(最短的編碼)給出現(xiàn)概率最多的數(shù)據(jù)。

在上面的例子中,C 出現(xiàn)的頻率最高,它的編碼為 0,就省下了不少空間。

特點(diǎn)

哈夫曼樹和編碼都不唯一!只有樹的WPL(帶權(quán)路徑長度)才是唯一的!

Huffman編碼效果的唯一性
判斷是否為哈夫曼編碼(編程題)

哈夫曼編碼有兩個(gè)特點(diǎn):

  1. 帶權(quán)路徑長度WPL最短且唯一
  2. 編碼互不為前綴(一個(gè)編碼不是另一個(gè)編碼的開頭)。
  • 為什么通過哈夫曼編碼后得到的二進(jìn)制碼不會有前綴的問題呢?

這是因?yàn)樵诠蚵鼧渲?,每個(gè)字母對應(yīng)的節(jié)點(diǎn)都是葉子節(jié)點(diǎn),而他們對應(yīng)的二進(jìn)制碼是由根節(jié)點(diǎn)到各自節(jié)點(diǎn)的路徑所決定的,正因?yàn)槭侨~子節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)的路徑不可能和其他節(jié)點(diǎn)有前綴的關(guān)系。

  • 為什么通過哈夫曼編碼獲得的二進(jìn)制碼短呢?

因?yàn)楣蚵鼧涫?strong>帶權(quán)路徑長度最短的樹,權(quán)值較大的節(jié)點(diǎn)離根節(jié)點(diǎn)較近。而帶權(quán)路徑長度是指:樹中所有的葉子節(jié)點(diǎn)的權(quán)值乘上其到根節(jié)點(diǎn)的路徑長度,這與最終的哈夫曼編碼總長度成正比關(guān)系的。

參考資料:
圖解霍夫曼編碼
哈夫曼編碼(Huffman Coding)多圖詳細(xì)解析文章來源地址http://www.zghlxwxcb.cn/news/detail-780422.html

到了這里,關(guān)于哈夫曼編碼(Huffman Coding)原理詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 哈夫曼樹(Huffman Tree)

    哈夫曼樹(Huffman Tree)

    哈夫曼樹又稱最優(yōu)二叉樹,是一種帶權(quán)路徑長度最短的二叉樹。所謂樹的帶權(quán)路徑長度,就是樹中所有的葉結(jié)點(diǎn)的權(quán)值乘上其到根結(jié)點(diǎn)的路徑長度(若根結(jié)點(diǎn)為0層,葉結(jié)點(diǎn)到根結(jié)點(diǎn)的路徑長度為葉結(jié)點(diǎn)的層數(shù))。樹的路徑長度是從樹根到每一結(jié)點(diǎn)的路徑長度之和,記為WPL=(

    2024年02月08日
    瀏覽(13)
  • 【貪心法】最優(yōu)前綴碼(Huffman哈夫曼算法)

    【貪心法】最優(yōu)前綴碼(Huffman哈夫曼算法)

    在計(jì)算機(jī)中需要用0-1字符串作為代碼來表示信息,為了正確解碼,必須要求任何字符的代碼不能作為其他字符代碼的前綴,這樣的碼稱為 二元前綴碼。 二元前綴碼的存儲通常采用二叉樹結(jié)構(gòu),令每個(gè)字符作為樹葉,對應(yīng)這個(gè)字符的前綴碼看作根到這片樹葉的一條路徑,規(guī)定

    2024年02月03日
    瀏覽(16)
  • 哈夫曼樹與哈夫曼編碼及等長編碼

    哈夫曼樹與哈夫曼編碼及等長編碼

    哈夫曼樹的構(gòu)造:就是將給定的數(shù)據(jù)中選擇最小的兩個(gè)權(quán)值進(jìn)行合并,然后重復(fù)該操作,構(gòu)造出一個(gè) 二叉樹。使其帶權(quán)路徑長度WPL最小的二叉樹稱為哈夫曼樹或最優(yōu)二叉樹。 例如:給定幾個(gè)數(shù)值:0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.01 可以將其擴(kuò)大一百倍,以方便計(jì)

    2024年02月06日
    瀏覽(18)
  • 哈夫曼樹、哈夫曼編碼/解碼

    哈夫曼樹、哈夫曼編碼/解碼

    哈夫曼樹的基本介紹 哈夫曼樹構(gòu)建步驟圖解 創(chuàng)建哈夫曼樹代碼實(shí)現(xiàn) 基本介紹 哈夫曼編碼原理剖析 哈夫曼編碼的實(shí)例 思路分析 代碼實(shí)現(xiàn) 使用哈夫曼編碼壓縮文件的注意事項(xiàng)(代碼勝省略)

    2024年02月08日
    瀏覽(21)
  • 15哈夫曼樹/哈夫曼編碼

    15哈夫曼樹/哈夫曼編碼

    哈夫曼樹又稱為 最優(yōu)樹 ,作用是找到一種效率最高的判斷樹。 路徑 :從樹中一個(gè)結(jié)點(diǎn)到另一個(gè)結(jié)點(diǎn)之間的 分支 構(gòu)成這兩個(gè)結(jié)點(diǎn)之間的路徑。 結(jié)點(diǎn)的路徑長度 :兩結(jié)點(diǎn)間路徑上的分支樹 如圖 a :從 A - D 的路徑長度就是是 2。從 A 到 B C D E F G F I 的路徑長度分別為 1 1 2 2 3

    2024年02月05日
    瀏覽(17)
  • 哈夫曼樹與哈夫曼編碼

    哈夫曼樹與哈夫曼編碼

    哈夫曼樹:結(jié)點(diǎn)中賦予一個(gè)某種意義的值,稱為結(jié)點(diǎn)的權(quán)值,從根結(jié)點(diǎn)開始,到目標(biāo)結(jié)點(diǎn)經(jīng)過的邊數(shù),稱為路徑長度,路徑長度乘以權(quán)值,稱為帶權(quán)路徑長度; 例如:根結(jié)點(diǎn)代表著快遞集散點(diǎn),一個(gè)葉子結(jié)點(diǎn)權(quán)值是5,在業(yè)務(wù)邏輯中代表著重量是5斤的貨物??,路徑長度是3,

    2024年02月05日
    瀏覽(26)
  • 哈夫曼樹、哈夫曼編碼和字典樹

    哈夫曼樹、哈夫曼編碼和字典樹

    目錄 哈夫曼樹 樹的帶權(quán)路徑長度(wpl) 哈夫曼編碼 代碼實(shí)現(xiàn)哈夫曼樹 封裝哈夫曼樹的節(jié)點(diǎn) 構(gòu)建哈夫曼樹 字典樹 執(zhí)行流程 代碼實(shí)現(xiàn)字典樹 封裝字典樹的節(jié)點(diǎn) 構(gòu)建字典樹 ??????? 哈夫曼樹(Huffman Tree)是一種帶權(quán)路徑長度最短的二叉樹。哈夫曼樹常常用于數(shù)據(jù)壓縮,其壓

    2023年04月09日
    瀏覽(20)
  • 數(shù)據(jù)結(jié)構(gòu)——哈夫曼樹與哈夫曼編碼

    數(shù)據(jù)結(jié)構(gòu)——哈夫曼樹與哈夫曼編碼

    1.1 基本概念 路徑 :指從根結(jié)點(diǎn)到該結(jié)點(diǎn)的分支序列。 路徑長度 :指根結(jié)點(diǎn)到該結(jié)點(diǎn)所經(jīng)過的分支數(shù)目。 結(jié)點(diǎn)的帶權(quán)路徑長度 :從樹根到某一結(jié)點(diǎn)的路徑長度與該結(jié)點(diǎn)的權(quán)的乘積。 樹的帶權(quán)路徑長度(WPL) :樹中從根到所有葉子結(jié)點(diǎn)的各個(gè)帶權(quán)路徑長度之和。 哈夫曼樹 是由

    2024年02月05日
    瀏覽(16)
  • 數(shù)據(jù)結(jié)構(gòu)之哈夫曼樹與哈夫曼編碼

    數(shù)據(jù)結(jié)構(gòu)之哈夫曼樹與哈夫曼編碼

    編碼是信息處理的基礎(chǔ)(重新表示信息)。 普通的編碼是等長編碼,例如7位的ASCIL編碼,對出現(xiàn)頻率不同的字符都使用相同的編碼長度。 但其在傳輸和存儲等情況下編碼效率不高 。 可使用不等長編碼,來壓縮編碼:高頻字符編碼長度更短,低頻字符編碼長度更長。 ? [例

    2023年04月15日
    瀏覽(41)
  • 哈夫曼樹及哈夫曼編碼(考試??及?

    哈夫曼樹及哈夫曼編碼(考試??及?

    哈夫曼樹的基本概念 哈夫曼樹的定義是對一組具有確定權(quán)值的葉子節(jié)點(diǎn),選出最小帶權(quán)路徑長度的二叉樹為哈夫曼樹(WPL最小),也稱最優(yōu)二叉樹 哈夫曼算法的實(shí)現(xiàn) 注意:哈夫曼樹在構(gòu)造時(shí)選擇兩個(gè)最小的權(quán)值點(diǎn),默認(rèn)小的在左邊大的在右邊,但實(shí)際上并沒有硬性規(guī)定,可以

    2024年02月11日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包