Huffuman樹的建立並計算權值

2021-09-24 05:18:36 字數 1431 閱讀 6692

huffuman樹

description

huffman樹在編碼中有著廣泛的應用。在這裡,我們只關心huffman樹的構造過程。

給出一列數 = ,用這列數構造huffman樹的過程如下:

找到中最小的兩個數,設為 pa 和 pb,將 pa 和 pb 從 中刪除掉,然後將它們的和加入到 中。這個過程的費用記為pa + pb。

重複步驟1,直到 中只剩下乙個數。

在上面的操作過程中,把所有的費用相加,就得到了構造huffman樹的總費用。

本題任務:對於給定的乙個數列,現在請你求出用該數列構造huffman樹的總費用。

例如,對於數列 = ,huffman樹的構造過程如下:

找到中最小的兩個數,分別是2和3,從中刪除它們並將和5加入,得到,費用為5。

找到中最小的兩個數,分別是5和5,從中刪除它們並將和10加入,得到,費用為10。

找到中最小的兩個數,分別是8和9,從中刪除它們並將和17加入,得到,費用為17。

找到中最小的兩個數,分別是10和17,從中刪除它們並將和27加入,得到,費用為27。

現在,數列中只剩下乙個數27,構造過程結束,總費用為5+10+17+27=59。

input

多測試用例,每個測試用例的第一行是乙個正整數 n( n ≤ 100000 )。

接下來是n個正整數,表示p0, p1, …, pn-1,每個數不超過1000。

output

每個測試用例輸出一行:用這些數構造huffman樹的總費用。

sample input

553

829

sample output

59
author

john

相信大家看題目都知道怎麼建哈夫曼樹的,如果還不懂也沒關係,點這裡(**詳解不懂都不行,寫的太好了)

現在雙手呈上本題**:

#includeusing namespace std;

priority_queue, greater > q;//小頂堆 公升序

int main(void)

for(int i=1;i<=n;i++)

sum=0;

//建立哈夫曼樹

while(q.size()>1)

//也是計算最優二叉樹的權值

printf("%d\n",sum);

} return 0;

}

**很短,我們使用到了優先佇列(優先佇列可以理解為堆,好像說堆是優先佇列的一種實現方式,就是一種可以很快拿出最小值的資料結構)來建立(說是建立哈夫曼樹,其實個人理解是計算而不是建立,為什麼是「計算」呢,因為最後優先佇列q只剩下乙個點,但這個過程充分體現並利用了哈夫曼樹的建立過程)哈夫曼樹。

計算集合的並

題目 問題描述 給你兩個集合,計算其並集,即 注 中不允許出現重複元素,但是 與 之間可能存在相同元素。輸入格式 輸入資料分為三行,第一行有兩個數字 n,m 0 include include using namespace std intmain bool flag false for set i...

計算集合的並

description 給你兩個集合,計算其並集,即 注 中不允許出現重複元素,但是 與 之間可能存在相同元素。input 輸入資料分為三行,第一行有兩個數字 n,m 0output 輸出一行資料,表示合併後的集合,要求從小到大輸出,每個元素之間用乙個空格隔開。sample input 1 1 21...

計算集合的並

description 給你兩個集合,計算其並集,即 注 中不允許出現重複元素,但是 與 之間可能存在相同元素。input 輸入資料分為三行,第一行有兩個數字 n,m 0output 輸出一行資料,表示合併後的集合,要求從小到大輸出,每個元素之間用乙個空格隔開。sample input 1 1 21...