路徑:從根結點到該結點的分值序列。
路徑長度:根結點到該結點所經過的分支數目。
結點的權:自己給某個結點賦予乙個實數表示權的大小
帶權路徑長度:該結點的權與路徑長度的乘積。
計算方式:
如下二叉樹:
我給a、b、c結點賦權值為5、3、4
因為a、b結點在樹中的深度為2(從根節點往下數第三層,也就是路徑長度為2),c的深度為1
所以該樹的帶權路徑長度計算為:5*2+3*2+4*1=20
——————————————————————
基於以上概念,引申出哈夫曼樹
概念:
有n個帶權葉子結點構成的所有二叉樹中,帶權路徑長度最短的二叉樹就是哈夫曼樹(又稱最優二叉樹)。
構造哈夫曼樹
1️⃣初始化:給定n個權值構造n棵二叉樹並構成的森林f=,其中每一棵二叉樹ti (1<=i<=n) 都只有乙個權值為wi的根結點,其左右子樹都為空。
2️⃣找最小數:在森林f中選擇兩顆根結點權值最小的二叉樹,作為一顆新二叉樹的左右子樹,標記新二叉樹的根結點權值為其左右子樹的根結點權值之和。
3️⃣刪除與加入:從f中刪除被選中的那兩顆二叉樹,同時把新構成的二叉樹加入到森林f中。
4️⃣判斷:重複2️⃣3️⃣操作。直到森林只含有一顆二叉樹為止,此時得到的二叉樹就是哈夫曼樹。
例項:現在有如下5個結點,權值分別是3,8,7,2,5,現在要構造成哈夫曼樹。
1.由第2️⃣步可知,先找出權值最小的兩個結點形成新的二叉樹,該二叉樹的根結點權值是其左右子樹根結點權值之和。
權值最小的兩個結點:2,3
新的二叉樹根結點權值為:2+3=5,所以新二叉樹如圖所示:
那麼接下來還剩這幾個二叉樹:
重複上面的步驟。接下來兩個權值最小的結點是5,7,則新的二叉樹就是
剩餘的二叉樹就是
最終,最小二叉樹(哈夫曼樹)為:
其帶權路徑長度為:5+10+12+25=55(結點權值相加,不加葉子節點的)
或許有人可能構造出這樣的二叉樹:
我們可以發現其帶權路徑長度為:5+10+17+25=57 < 55
所以它不是哈夫曼樹。
根據哈夫曼樹的特點,我們可以構造哈夫曼編碼。哈弗曼編碼是最優字首編碼。
**字首編碼:**任意乙個編碼不能成為其他任意編碼的字首。比如:一組編碼裡面有01,001,010,100,則01是010的字首,不合要求,故不是字首編碼(01則與001沒有問題,因為不是在字首)
例子:
一台模型機共有7中不同指令,其使用頻率如下:
構造p1到p7結點的哈夫曼樹如下:
我們規定該哈夫曼樹左分支標記為1,右分支標記為0(當然反過來應該也沒問題),那麼
所以指令的哈弗曼編碼如下表:
資料結構 哈夫曼樹 哈夫曼編碼
哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...
哈夫曼編碼 哈夫曼樹 (資料結構)
哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...
資料結構 哈夫曼樹
哈夫曼樹是二叉樹的一種。被稱為最優二叉樹。實際應用中最重要的是帶權路徑長度。樹的路徑長度 樹中每個結點的路徑長度之和。權 附加在樹節點上,表示出現的概率。樹的帶權路徑長度 所有葉子結點帶權長度之和。看例項 的結點路徑長度 從d到 a的路徑,共走了兩條邊,所以為2。樹中的葉子結點有 d,e和 f。結點...