哈夫曼樹(佇列實現)

2022-06-06 04:27:08 字數 742 閱讀 3095

題意:

分析:

哈夫曼樹

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

對於一顆哈夫曼樹,我們把所有節點排序,權值大的必定層數較低,f[i][j]代表已經放了i-1個葉子節點,正準備放置ai,該層還有j個空節點,我們可以選擇在空節點上放乙個葉子節點,從而轉移到狀態f[i+1][j-1],或者選擇移動到下一層,即轉移到f[i][j*2],該樹權值增大量剩下節點的總權值。

各位有沒有發現這個和該題的相似之處?我們可以發現上述過程正是把該題反過來進行的操作

因此f(n,1)就是該操作的最終結果——一棵最小權值樹的各點權值和減去所有葉子節點權值和。

#include

#include

#include

#include

#include

#include

using

namespace

std;

int main()

while (q.size() > 1)

printf("%lld\n", ans);

}return

0;}

優先佇列 哈夫曼樹

哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和的最小值。輸入有多組資料。每組第一行輸入乙個數n,接著輸入n個葉節點 葉節點權值不超過100,2 n 1000 輸出權值。示例1 ...

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....

哈夫曼樹 哈夫曼編碼

定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...