暑假訓練8附 huffuman編碼(堆實現)

2021-10-07 08:56:21 字數 1827 閱讀 1275

題目描述

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。

輸入輸入的第一行包含乙個正整數n(n< =100)。

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

輸出輸出用這些數構造huffman樹的總費用。

樣例輸入

55 3 8 2 9

樣例輸出

59想自己動手寫寫堆排序。

總結:插入元素是下濾,刪除元素是上濾。

公升序陣列的話用大根堆,降序用小根堆

//huffuman樹構造,優先佇列的想法 

#include

#include

#include

#include

using

namespace std;

//priority_queue,greater> q;

int n;

int a[

1005];

int sum =0;

//堆排序核心模板訓練

// inset操作

void

minheapfixup

(int a,

int i)

//小頂堆的插入操作,插入第i個節點,上濾

a[i]

= temp;

}void

minheadaddnumber

(int a,

int n,

int nnum)

// delete操作

void

minheapfixdown

(int a,

int i,

int n)

//第i個節點,下濾

a[i]

= temp;

}void

minheapdelete

(int a,

int n)

//刪除堆頂元素

void

minheapsort

(int a,

int n)

//小頂堆排 比較重要的一點是公升序用大根堆,降序用小根堆

for(

int i = n-

1;i>

0;i--

)//再進行使他變成小頂堆

}void

print()

intmain()

int num = n;

if(num==1)

while

(num!=1)

cout

}

暑假假期訓練總結 8

今天的話,畢竟大多都是複習了,感覺看的還是比較快的,回顧之前的知識,有沒總結完的,今天也在總結了一下,還有之前沒有接觸過的比如畢達哥拉斯三元組,這個東西之前就沒接觸過,還包括幾類不定方程,還有就是改了改之前的模板把,發現那些大神們有的問題的 實現比之前的好多了,好理解,好實現,就把之前的改了,比如之...

暑假訓練8月6日總結

今天看了關於整除 同餘 擴充套件歐幾里得 中國剩餘定理 素數及尤拉函式的部落格,真的是發現隨著學習數論的時間的增加,對它的認識和用法及模板才越來越清楚。研究了大部分部落格裡面的題目,發現有些東西大多是模板的變式,能熟練掌握該知識 並對模板 很熟練才能舉一反三把變式題看透。最大的感受是今天很充實吧,時...

暑假訓練8月23日總結

隨著校園裡人越來越多,於是我知道快要開學了。對於開學,有種複雜的心情,不知道該怎麼說,課業繁忙,各種各樣的事,好的壞的,都會和自己打個照面。看演算法也是一件單純的事,不喜歡太過麻煩的事情。今天還是看的數字dp,看一編有一遍的收穫吧,從最初的看不太懂,到現在逐漸明白,也算是一種進步,但還是要繼續看,抽...