计算Huffman树的带权路径长度WPL
编程背景
Huffman编码是通信系统中常用的一种不等长编码,它的特点是:能够使编码之后的电文长度最短。
- 输入:第一行为要编码的符号数量n,第二行~第n+1行为每个符号出现的频率
- 输出:对应哈夫曼树的带权路径长度WPL
- 测试用例举例:
思路
因为要完成对应的输入输出,我首先想到的就是通过最简单的一维数组的方式。因为本题只要求计算WPL,观察其输入输出,故我并没有考虑使用链表。
借鉴
通过网站上浏览资料,发现一个好技巧:
WPL 为所有叶节点的带权路径长度之和,同时也是所有非叶子结点的权值之和。
详细解释见:哈夫曼树的WPL值的计算
程序实现
m函数:返回一维数组S中最小的数,并将其从数组中剔出
int m(){
int min, position=0;
min = S[0];
int i=0;
for(i=0; i<len; i++){
if(min > S[i]){
min = S[i];
position = i;
}
}
for(i=position; i<len-1;i++) S[i] = S[i+1];
S[(len--)-1]=0;
return min;
}
main函数
int main(){
int n; int i, temp;
scanf("%d", &n);
len = n;
for(i=0; i<n; i++) scanf("\n%d", &S[i]);
while(len>1){
temp = m() + m();
WPL += temp;
S[len++] = temp;
}
printf("WPL=%d\n",WPL);
return 0;
}
后记
- 作为一个步入C殿堂不久的小白,如今开始在CSDN上记录自己的学习到的一些零碎。
- 前人栽树,后人乘凉。我也要努力成为一个前人!不做一个只会伸手的懒虫!
- 此片文章仅供学习交流之用,不希望有人copy后直接上交作业!
- 一起学习,一起交流,一起进步!(当然应该是我进步的更多~)
- 欢迎大家指出我的不足!【作揖】