HDOJ 1053 哈夫曼樹長度

2021-08-15 15:59:53 字數 1809 閱讀 4481

題目:

題意:每個編碼都有哈夫曼和ascall兩種。問該序列的哈夫曼長度和ascall長度以及比。

因為只需要長度,可以用優秀佇列模仿建樹過程,不需要建樹。

還有就是注意cout表達小數點後一位的方法。

#include

#define inf 1e18

#define inf 1e9

#define min(a,b) a#define max(a,b) a>b?a:b

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define ios ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0)

using

namespace

std ;

typedef

long

long ll;

typedef

unsigned

long

long ull;

const

int _max = 256;

int main()

else

rate = double(cnt*8.0)/double(sum);

}cout

<8

<<' '

<' '

<1)0;}

建樹方法:(不是自己打的。因為覺得很詳細就直接copy了。)

#include 

#include

#include

using

namespace

std;

#define maxvalue 0x7fff

struct haffnode

; int haffman(const

int weight,int n) //構造哈夫曼樹

for(i=n;i//n-1個非葉子節點

int min1,min2; //兩個最小權重值

int index1,index2;//兩個最小權重值的下標

//構造n-1個非葉子節點

for(i=0;i1;++i)

else

if(root[j].weight < min2 && root[j].flag==0)

} //將兩個權值最小的樹合併

root[index1].parent = n+i;

root[index2].parent = n+i;

root[index1].flag = 1;

root[index2].flag = 1;

root[n+i].weight = root[index1].weight + root[index2].weight;

root[n+i].left = index1;

root[n+i].right = index2;

sumweight += root[n+i].weight; //只需要累加非葉子節點的權值

} delete root;

return sumweight;

} int main()

//注意只有乙個字母的情況

else i = haffman(data,j);

rate = size*8.0/i;

cout

<8

<<' '

<' '

<1)0;

}

HDU 1053 Entropy 哈夫曼樹

題意 根據哈夫曼編碼原則壓縮乙個字串,問壓縮後的大小和壓縮比。思路 就是寫一棵哈夫曼樹。ps 第一次寫哈夫曼樹,寫得好醜 problem hdu 1053 author nmfloat include include include include include include include i...

HDU1053 Entropy 哈夫曼樹

認真讀題,別怕題長,此題考查的就是哈夫曼樹並求出最小編碼值,注意每一次要將陣列清0,否則會出錯!ac include include using namespace std define m 1000000 struct node ha 100 int main int k 0 for i 0 i ...

哈夫曼編碼 哈夫曼樹

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