哈弗曼數的應用

2021-07-24 18:56:30 字數 2236 閱讀 4877

問題 a: ds_6.13 給定權值,哈弗曼編碼、解碼(by yan)

時間限制: 20 sec 記憶體限制: 256 mb

提交: 4 解決: 4

[提交][狀態][討論版]

題目描述

假設某通訊報文的字符集由a,b,c,d,e,f這6個字元組成,它們在報文中出現的頻度(頻度均為整數值)。

(1)構造一棵哈弗曼樹,依次給出各字元編碼結果。

(2)給字串進行編碼。

(3)給編碼串進行解碼。

規定:

構建哈弗曼樹時:左子樹根結點權值小於等於右子樹根結點權值。

生成編碼時:左分支標0,右分支標1。

輸入 第一行:依次輸入6個整數,依次代表a,b,c,d,e,f的頻度,用空格隔開。

第二行:待編碼的字串

第三行:待解碼的編碼串

輸出 前6行依次輸出各個字元及其對應編碼,格式為【字元:編碼】(冒號均為英文符號)

第7行:編碼串

第8行:解碼串

樣例輸入

3 4 10 8 6 5

bee

0010000100111101

樣例輸出

a:000

b:001

c:10

d:01

e:111

f:110

001111111

badbed

#include

#include

#include

#define n 6

#define m 2*n-1

#define maxint 32767

#define ch 30

#define num 100

typedef char numcode[num];

typedef char charcode[ch];

typedef char* huffmancode[n] ;

typedef structhtnode,huffmantree[m];

void select(huffmantree ht,int

pos,int

*s1,int

*s2);

void crthuffmantree(huffmantree ht,int w,int n)

for(i=n;i/*選擇 合併*/

for(i=n;i}void select(huffmantree ht,int

pos,int

*s1,int

*s2)

else

if(ht[j].weight1)

}/*if(*s1>*s2)*/

}void crthuffmancode(huffmantree ht,huffmancode hc,int n)

hc[i]=(char*)malloc((n-start)*sizeof(char));

//printf("%s\n",&cd[start]);

strcpy(hc[i],&cd[start]);

}free(cd);

}void printcode(char s,huffmancode hc)

}void chartocode(charcode c,char s,huffmancode hc)

p++;

}printf("\n");

}void numtochar(numcode ns,huffmantree ht,char s)

p++;

//printf("p++=%c\n",*p);

}printf("%c",s[key]);

}}int main();

int w[n];

for(int i=0;i"%d",&w[i]) ;

} scanf("%s",&c);

scanf("%s",&ns);

//printf("\n") ;

//for(int i=0;i//

printf("%d",w[i]) ;

// }

// printf("\n") ;

crthuffmantree(ht,w,6);

crthuffmancode(ht,hc,6);

printcode(s,hc);

chartocode(c,s,hc);

numtochar(ns,ht,s);

}

哈弗曼編碼 哈弗曼樹

哈弗曼編碼是依賴於字元使用頻率來建立的一種編碼,通過把使用頻率低的字元分配相對較多的01編碼,而使用頻率高的分配相對較低的01編碼,來建立最小的帶權路徑長度的樹,來最大化的獲得編碼儲存空間的一種編碼規則。這個樹稱為哈弗曼樹,也稱為最優二叉樹。這樣可以確定每乙個字元的編碼不可能成為其他字元編碼的坐子串...

哈弗曼樹與哈弗曼編碼(實現)

歷史背景 1951年,霍夫曼在mit攻讀博士學位,他和修讀資訊理論課程的同學得選擇是完成學期報告還是期末考試。導師robert fano出的學期報告題目是 查詢最有效的二進位制編碼。由於無法證明哪個已有編碼是最有效的,霍夫曼放棄對已有編碼的研究,轉向新的探索,最終發現了基於有序頻率二叉樹編碼的想法,...

哈弗曼 筆試

哈弗曼編碼幾乎是所有壓縮演算法的基礎,其實這個演算法並不複雜,簡單的理解就是,如何用更短的bit來編碼資料。我們知道普通的編碼都是定長的,比如常用的ascii編碼,每個字元都是8個bit 字元 編碼 a00101001 b00101010 c00101011 這樣,計算機就能很方便的把由0和1組成的...