藍橋杯 哈夫曼樹

2021-10-09 16:19:33 字數 1530 閱讀 9952

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

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

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

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

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

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

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

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

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

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

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

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

輸入格式  輸入的第一行包含乙個正整數n(n<=100)。  接下來是n個正整數,表示p0, p1, …, pn-1,每個數不超過1000。

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

樣例輸入5

5 3 8 2 9

樣例輸出59

解題

要解答這道題,就不得不提到哈夫曼樹的原理:

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

所以,本題的解法也是類似。從題目的內容上就可以看明白。

那麼,解題的實質方法就是:

對於輸入的陣列進行排序,選取其中最小的兩個數,將其刪掉,並將其和放入陣列中。再次進行排序,選取其中最小的兩個數,將其從陣列中刪去,並將其和放入陣列中。依次類推,直至最後,某次刪除時,所有的陣列元素都被刪掉。

其中,依據題目要求應該再定義乙個變數,用於記錄刪掉的陣列元素的總和,作為最後程式的輸出值。

具體**如下:

#include

int n;

int a[

101]

;int sum=0;

inthuffman

(int n)

if(min!=i)

//i不是最小的數,交換

}// for(i=k;i<=n;i++)

// printf("%d ",a[i]);

// printf("\n");

sum=sum+a[k]

+a[k+1]

; a[k+1]

=a[k]

+a[k+1]

;}return sum;

}int

main()

藍橋杯python Huffman樹 哈夫曼樹

基礎訓練basic 28 huffman樹 問題描述 huffman樹在編碼中有著廣泛的應用。在這裡,我們只關心huffman樹的構造過程。給出一列數 用這列數構造huffman樹的過程如下 1.找到中最小的兩個數,設為pa和pb,將pa和pb從中刪除掉,然後將它們的和加入到中。這個過程的費用記為p...

哈夫曼編碼 哈夫曼樹

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

哈夫曼樹 哈夫曼編碼

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