資料結構 哈夫曼樹

2021-09-26 14:19:28 字數 2467 閱讀 7657

給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(huffman tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。

樹節點間的邊相關的數叫做權。

從樹中的乙個節點到另乙個節點之間的分支構成兩個點之間的路徑,路徑上的分支數目稱作路徑長度。

圖中二叉樹a中,跟節點到d的路徑長度就是4,b中根節點到d的路徑長度為2。

樹的路徑長度就是從樹根到每乙個節點的路徑長度之和。二叉樹a的路徑長度就為1+1+2+2+3+3+4+4=20。二叉樹b的樹路徑長度就為1+2+3+3+2+1+2+2=16。

如果考慮帶權的節點,節點的帶權的路徑長度就是從該節點到樹根之間的路徑長度乘該節點的權。

數的帶權路徑長度就是所有葉子節點的帶權路徑長度之和。

帶權路徑長度(wpl)最小的二叉樹稱作哈夫曼樹。

下面我們以【5、8、4、11、9、13】為例來畫出哈夫曼樹(數字大小代表權重大小,越大的權重越大)

第一步:按從小到大排序。

【5、8、4、11、9、13】→【4、5、8、9、11、13】

第二步:選最小兩個數畫出乙個樹,最小數為4和5。

給定的4、5、8、9、11、13為白色, 紅色的9為4+5,與給定的白9無關,新序列為:【紅9(含子節點4、5)、8、9、11、13】

之後一直重複第

一、第二步:排序然後取兩個最小值。實際就是乙個遞迴過程

排序:

取兩個最小數8和9:

排序:

取兩個最小數9和11:

排序,然後取兩個最小數13和17:

取兩個最小數20和30:

哈夫曼研究這種最優樹的目的是為了解決當年遠距離通訊(主要是電報)的資料傳輸的最優化問題。

比如我們有一段文字「badcadfeed」,顯然用二進位制數字(0和1)表示是很自然的想法。

這樣真正傳輸的資料就是「001000011010000011101100100011」,對方接收時同樣按照3位一組解碼。如果一篇文章很長,這樣的二進位制串也非常的可怕。而且事實上,每個字母或者漢子的出現頻率是不同的。

假設六個字母的頻率為a 27,b 8, c 15, d 15 , e 30, f 5,合起來正好是100%,那就意味著我們完全可以用哈夫曼樹來規劃它們。

左圖為構造哈夫曼樹的過程的權值顯示。右圖為將權值左分支改為0,右分支改為1後的哈夫曼樹。

我們對這六個字母用其從樹根到葉子所經過的路徑的0或1來編碼,可以得到下表:

也就是說我們的資料被壓縮了,節約了大概17%的儲存或傳輸成本。隨著字元的增加和多字元權重的不同,這種壓縮會更顯出優勢來。

仔細觀察上面的赫夫曼編碼表中各個字母的編碼會發現,不存在容易與1001、1000混淆的10、100等編碼。這就說明若要設計長短不等的編碼,則必須是任一字元的編碼都不是另乙個字元的編碼的字首,這種編碼稱作字首編碼

可僅僅是這樣不足以讓我們去方便的解碼,因此解碼時,還是要用到哈夫曼樹,即傳送方和接收方必須約定好同樣的哈夫曼編碼規則。

下面是赫夫曼編碼的定義:

一般的,設需要編碼的字符集為,各個字元在電文**現的次數或頻率集合為,以d1,d2,…dn作為葉子結點,以w1,w2,…wn作為相應葉子結點的權值來構造一棵赫夫曼樹。規定赫夫曼樹的左分支代表0,右分支代表1,則從根節點到葉子節點所經過的路徑分支組成的0和1的序列便為該結點對應字元的編碼,這就是赫夫曼編碼

其實赫夫曼樹使用場景還真不少,例如apache負載均衡的按權重請求策略的底層演算法、咱們生活中的路由器的路由演算法、利用哈夫曼樹實現漢字點陣字形的壓縮儲存

資料結構 哈夫曼樹 哈夫曼編碼

哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...

哈夫曼編碼 哈夫曼樹 (資料結構)

哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...

資料結構 哈夫曼樹

哈夫曼樹是二叉樹的一種。被稱為最優二叉樹。實際應用中最重要的是帶權路徑長度。樹的路徑長度 樹中每個結點的路徑長度之和。權 附加在樹節點上,表示出現的概率。樹的帶權路徑長度 所有葉子結點帶權長度之和。看例項 的結點路徑長度 從d到 a的路徑,共走了兩條邊,所以為2。樹中的葉子結點有 d,e和 f。結點...