淺談Huffman樹

學習ing


二叉哈夫曼樹

一、定義

給定N個權值作爲N個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹爲最優二叉樹,也稱爲哈夫曼樹(Huffman Tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。(摘自百度百科)

帶權路徑:到達該葉子節點經過的邊數×葉子節點當前代表的數

二、實現

貪心

每次從所給序列中找到兩個權值最小的點合併,將合併後的新權值放回序列中,然後反覆操作,直到序列中只剩下一個元素。(用堆實現)

三、正確性

因爲每次都選擇的是權值最小的點先合併,最後構成的一個樹中這些點一定是位於樹中深度最大的地方。

四、性質

按照這個方法構造出來的哈夫曼樹滿足每個編碼都不會是其他編碼的左起子串(可以理解爲前綴)
因爲從根到該葉子結點構成一個編碼,中途不會存在其他編碼

例題:NOIP 2004 合併果子


k叉哈夫曼樹

一、定義

和二叉哈夫曼樹沒什麼區別。

二、實現

1.將二叉哈夫曼樹中每次選兩個值最小的,改爲每次選前k個最小的即可
2.只有滿的k叉哈夫曼樹構造出來纔是最優的。不滿足的,就補充0構造爲滿的k叉哈夫曼樹。若序列中有n個數,現在要求構造k叉哈夫曼樹,如果滿足(n1)%(k1)==0(n-1)\%(k-1)==0則爲滿的(因爲每取k個出來,就會放回一個,相當於取走(k-1)個,而最後我們還需要剩一個(n-1的來源))
e.g三叉哈夫曼樹:1 2 3 4,先取最小的三個數1 2 3 就合併成6,然後再合併6 4,得到答案16。但是先合併1 2,成3,再合併3 3 4這樣代價最小

例題 NOI 2015 荷馬史詩

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章