演算法筆記 哈夫曼樹基本操作

2021-10-04 06:58:25 字數 1158 閱讀 7043

樹的帶權路徑長度(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....