樹的帶權路徑長度(weight path length of tree, wpl)等於它所有葉子結點的帶權路徑長度之後
哈夫曼問題:已知n個數,尋找一棵樹,使得樹的所有葉子結點的權值恰好為著n個數,並且使得這棵樹的帶權路徑長度最小。帶權路徑長度最小的樹被稱為哈夫曼樹(又稱最優二叉樹)。顯然,對同一組葉子結點來說,哈夫曼樹可以是不唯一的,但是最小帶權路徑長度一定是唯一的
構造一棵哈夫曼樹操作:
初始狀態下共有n個結點(結點的權值分別是給定的n個數),將它們視作n棵只有乙個結點的樹。
合併其中根結點權值最小的兩棵樹,生成兩棵樹根結點的父結點,權值為這兩個根結點的權值之和,這樣樹的數量就減少乙個
重複操作2, 直到只剩下一棵樹為止,這棵樹就是哈夫曼樹
哈夫曼樹的構建思想,就是反覆選擇兩個最小的元素,合併,直到只剩下乙個元素。
合併果子問題(codeup 21142)可以直接使用優先佇列來實現。
//輸入51
2236
//輸出
30
實現
#include
#include
using
namespace std;
//代表小頂堆的優先佇列
priority_queue<
long
long
, vector<
long
long
>
, greater<
long
long
>> q;
intmain()
while
(q.size()
>1)
printf
("%lld\n"
, ans)
;//ans即為消耗的最小體力
return0;
}
哈夫曼編碼
哈夫曼編碼是針對確定的字串來講的。只有對確定的字串,才能根據其中各字元的出現次數建立哈夫曼樹,於是有對應的哈夫曼編碼。
其中字首編碼等等和哈夫曼編碼實現在此不細說,其同哈夫曼樹相似。
哈夫曼樹基本操作
結構體定義 typedef struct nodehuffmantree 1 hufmantree的建立 void createhuffmantree huffmantree h,int inarr,int len else else if h j data min2 h i l id1,h i r...
哈夫曼樹和哈夫曼演算法
1 最優二叉樹 具有最小加權路徑長度的二叉樹 2 哈夫曼演算法 由哈夫曼給出,用於構造最優二叉樹的演算法 3 哈夫曼樹 用哈夫曼演算法構造的最優二叉樹 4 哈夫曼演算法 很熟,所以就略了 5 函式createhfmtree的步驟 首先,構造n棵哈夫曼樹的物件,每棵樹只有乙個權值為w i 的根節點,且...
哈夫曼編碼 哈夫曼樹
1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....