使用取巧的方式计算Huffman树的带权路径长度WPL

计算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后直接上交作业
  • 一起学习,一起交流,一起进步!(当然应该是我进步的更多~)
  • 欢迎大家指出我的不足!【作揖】
发布了13 篇原创文章 · 获赞 2 · 访问量 284

猜你喜欢

转载自blog.csdn.net/AuthurWhywat/article/details/104953329