問題 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組成的...