基礎練習 huffman

2022-08-04 20:51:12 字數 1521 閱讀 8748

問題描述

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樹的總費用。

樣例輸入55

3829

樣例輸出

59

這個**超時  超時的點應該是每一次就只是簡單的加乙個元素,迴圈時候還要

迴圈他

改進的辦法是進行刪除的操作

1 #include 2

using

namespace

std;

3intn;4

struct

node;

8struct node a[200];9

intmin()

1020

}21 a[k].flag=1;22

return

k;23}24

void add(int

l)25

*/35}36

intis

()37 44}

45if(t==1)46

49if(t>1)50

53}

54int

main()

5566

while(1)79

} 80 cout<81return0;

82 }

#include #include #include using namespace std;

int n;

int a[200];

bool complare(int a,int b)

void min()

while(n>1)

cout

}

貪心演算法 藍橋杯基礎練習Huffman樹

貪心演算法 所謂 貪心演算法 是指在對問題求解時,總是做出在當前看來是最好的選擇。也就是說。不從整體上加以考慮,它所做出的僅僅是在某種意義上的區域性最優解 是否是全域性最優,需要證明 例如 藍橋杯 基礎練習huffman樹 問題描述 huffman樹在編碼中有著廣泛的應用。在這裡,我們只關心huff...

Huffman樹與Huffman編碼

一.哈夫曼樹概念 路徑 祖先到節點之間的分支構成一條通往節點的路徑 路徑長度 路徑上分支的數目稱為路徑長度 節點的權 給樹中節點所設的物理意義的值 節點帶權路徑長度 從根到該點路徑長度與該點權值的乘機 huffman樹就是所有樹中每點帶權路徑加和最短的樹。二.huffman樹構造步驟 1.根據每個點...

Huffman樹與Huffman編碼

huffman tree簡介 赫夫曼樹 huffman tree 又稱最優二叉樹,是一類帶權路徑長度最短的樹。假設有n個權值,如果構造一棵有n個葉子節點的二叉樹,而這n個葉子節點的權值是,則所構造出的帶權路徑長度最小的二叉樹就被稱為赫夫曼樹。這裡補充下樹的帶權路徑長度的概念。樹的帶權路徑長度指樹中所...