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

计算Huffman树的带权路径长度WPL

编程背景

Huffman编码是通信系统中常用的一种不等长编码,它的特点是:能够使编码之后的电文长度最短。

  • 输入:第一行为要编码的符号数量n,第二行~第n+1行为每个符号出现的频率
  • 输出:对应哈夫曼树的带权路径长度WPL
  • 测试用例举例:
    使用取巧的方式计算Huffman树的带权路径长度WPL_第1张图片

思路

因为要完成对应的输入输出,我首先想到的就是通过最简单的一维数组的方式。因为本题只要求计算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上记录自己的学习到的一些零碎。
  • 前人栽树,后人乘凉。我也要努力成为一个前人!不做一个只会伸手的懒虫!
  • 欢迎大家指出我的不足!【作揖】

你可能感兴趣的:(数据结构,二叉树,编程语言,c语言)