哈夫曼樹,最優二叉樹,最優多叉樹

2021-10-07 19:40:02 字數 1298 閱讀 6193

最優樹適用:當多個物體各自帶有權值(不同的出現頻率),要對每個物體進行編碼,以使得每個物體的權值 * 該物體編碼長度最小(即最多出現的物體編碼最短),且每個物體的編碼不能是其他物體編碼的字首。這時可使用哈夫曼樹(最優二叉樹)求解。

最優多叉樹:一般的哈夫曼樹為二進位制,當需要k進製時,每次選取最小的k個節點合併為乙個節點即可,但此時可能出現最頂層反而沒有填充滿(不是最優解)的情況。可用新增k-1-(n-1)%(k-1)個空節點(權值為0)來占取最底層,把其他節點擠到更優的位置上去。(n為節點數,k為進製數)

時間複雜度:可能是 o(nlogn)

參考:哈夫曼樹原理

過載如何使用指標作為引數

例題:p2168 [noi2015]荷馬史詩 (k進製最優多叉樹)

可以查詢路徑的模板:

#include

#define maxn 100005

using

namespace std;

struct node};

struct cmp

return a-

>w > b-

>w;}}

;long

long n,k,w,tot=

0,maxdeep;

node* root;

priority_queue,vector>

,cmp>q;

intmain()

long

long temp=

(n-1)%

(k-1);

if(temp!=

0)temp=k-

1-temp;

for(

int i=

1;i<=temp;i++

)while

(!q.

empty()

)if(q.size()

==0) q.

push

(newnode);}

queue>q2;

root-

>deep=0;

q2.push

(root)

;while

(!q2.

empty()

) q2.

push

(i);}}

cout

}

哈夫曼樹(最優二叉樹)

給定n個權值作為n的 葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小 所謂樹的帶權路徑長度,就是樹中所有的葉結點 的權值乘上其到根結點的路徑長度 稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的...

哈夫曼樹(最優二叉樹)

最優二叉樹 哈夫曼樹 給定n個權值,試構造一棵有n個葉子結點的二叉樹,每個葉子結點帶權為wi。構造出來的二叉樹的形態可以有多個,我們把其中帶權路徑長度wpl最小的二叉樹稱作最優二叉樹或者哈夫曼樹。語言描述 根據給定的n個權值構成n棵二叉樹的集合f 其中每棵二叉樹ti中只有乙個帶權為wi的根結點,其左...

哈夫曼樹 最優二叉樹

差點忘記寫部落格了.哈夫曼樹 其實就是只利用葉子結點來儲存要用資訊的樹,只不過它在構造的時候就擁有了乙個迷人的特性.就是wpl 帶權路徑長度 是最小的.而且還能用這個樹的來為葉子結點中的資訊進行編碼,得出來的各個編碼一定不會相同,並且不會產生混淆的情況.通過哈夫曼樹的特點.實現了根據乙個佇列來建立一...