資料結構 樹(六) 哈夫曼樹

2021-10-06 06:56:23 字數 1369 閱讀 6033

哈夫曼編碼

葉子結點的路徑長度:從根結點出發到達該結點所經過的邊數。

葉子結點的帶權路徑長度:把葉子結點的權值×其路徑長度

樹的帶權路徑長度(wpl):所有葉子結點的帶權路徑長度之和。

有乙個經典的問題:已知n個數,尋找一棵樹,使樹的所有葉子結點的權值恰好為這n個數,並且使得這棵樹的帶權路徑長度最小。帶權路徑長度最小的樹被稱為哈夫曼樹(最優二叉樹)。

對同一組葉子結點來說,哈夫曼樹可以是不唯一的,單是最小帶權路徑長度一定是唯一的

構造過程:

初始狀態下共有n個結點(結點的權值分別為給定的n個數),將它們視作n課只有乙個結點的樹

合併其中根結點權值最小的兩棵樹,生成兩棵樹根結點的父結點,權值為這兩個根結點的權值之和,這樣樹的個數-1

重複2,直到只剩下一棵樹位置,這棵樹就是哈夫曼樹

對哈夫曼樹來說不存在度為1的結點,並且權值越高的結點距離根結點越近。

通常問題中,只要求得到最終的帶權路徑長度即可,不需要真的去構建一棵樹。所以初始將n個數壓入優先佇列(小根堆),之後每次從優先佇列裡取出最小的兩個數,將它們相加後再次壓入佇列,重複直到優先佇列中只剩乙個數,這是即為最終的帶權路徑長度(消耗的最小體力)ans。

#include

using

namespace std;

//代表小頂堆的優先佇列(greater-數字小的優先順序大)

priority_queue<

long

long

, vector<

long

long

>

,greater<

long

long

>

> q;

intmain()

while

(q.size()

>1)

printf

("%lld"

,ans)

;//ans即為帶權路徑長度(消耗的最小體力

return0;

}

對任何乙個葉子結點,其編號一定不會成為其他任何乙個結點編號的字首。(字首編碼)

字首編碼的存在意義在於不產生混淆,讓解碼能夠正常進行。

字串編碼成01後的長度實際上就是這棵樹的帶權路徑長度

由哈夫曼樹產生的編碼方式被稱為哈弗曼編碼

哈夫曼編碼是針對確定的字串來講的。只有確定的字串,才能根據其中各字元的出現次數來建立哈夫曼樹。

資料結構 樹 哈夫曼樹

下列敘述錯誤的是 b a.一棵哈夫曼樹的帶權路徑長度等於其中所有分支結點的權值之和 b.當一棵具有n 個葉子結點的二叉樹的wpl 值為最小時,稱其樹為哈夫曼 樹,其二叉樹的形狀是唯一的 c.哈夫曼樹是帶權路徑長度最短的樹,路徑上權值較大的結點離根較近 d.哈夫曼樹的結點個數不能是偶數 對n n 2 ...

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

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

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

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