您的位置:首页 > 其它

20200225之Huffuman树(递归+内含一个sort小知识)

2020-04-07 12:23 1131 查看

Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。

给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:

  1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。

  2. 重复步骤1,直到{pi}中只剩下一个数。

在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。

本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。

例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下:

  1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。

  2. 找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10。

  3. 找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17。

  4. 找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。

  5. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。
    输入
    输入的第一行包含一个正整数n(n< =100)。

接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。
输出
输出用这些数构造Huffman树的总费用。
样例输入
5

5 3 8 2 9
样例输出
59
这个题在昨晚的训练上没有时间做了,其实昨晚的心态也不太好了,母牛没看懂,没找到递归关系,有把握的素数筛也没做好,心态一下有点爆炸。但其实今天静下来经过昨天的讲解稍微一做就做出素数筛,心态还是占很大部分吧。静下心来认真做慢慢做会好的。
这题不难,Huffuman树数据结构学过所以理解也很容易。设了一个无穷大这样不删数组元素也对排序没有影响了。今天刚学了递归所以用起来感觉较好。
下面是AC代码:

#include <bits/stdc++.h>
using namespace std;
const int Inf=0x3ffffff;
int a[100];
int sum=0;
int huffuman(int n){
if(n==1){
return 0;
}
else{
sort(a,a+n);    //从小到大排序
sum+=a[0]+a[1];
a[0]=a[0]+a[1];
for(int i=2;i<n;i++)
a[i-1]=a[i];
a[n-1]=Inf;
huffuman(n-1);
}
}

int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
huffuman(n);
cout<<sum<<endl;
return 0;
}

//sort如果要从小到大  sort(开始地址,结束地址,cmp)  cmp函数
//bool cmp(int a,int b){
//	return a>b;
//}

另外查了一下删除数组元素要么动态分配,但一般C语言数组定义了就不会改变大小,可以复制给一个新开数组,去掉不想要的值。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
是IMI呀 发布了38 篇原创文章 · 获赞 0 · 访问量 734 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: