基础练习--huffman
问题描述
Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。
给出一列数{pi}={p0, p1, …, pn-},用这列数构造Huffman树的过程如下:
. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。
. 重复步骤1,直到{pi}中只剩下一个数。
在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。
本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。 例如,对于数列{pi}={, , , , },Huffman树的构造过程如下:
. 找到{, , , , }中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{, , , },费用为5。
. 找到{, , , }中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{, , },费用为10。
. 找到{, , }中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{, },费用为17。
. 找到{, }中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{},费用为27。
. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+++=。
输入格式
输入的第一行包含一个正整数n(n<=)。
接下来是n个正整数,表示p0, p1, …, pn-,每个数不超过1000。
输出格式
输出用这些数构造Huffman树的总费用。
样例输入 样例输出
这个代码超时 超时的点应该是每一次就只是简单的加一个元素,循环时候还要
循环他
改进的办法是进行删除的操作 1 #include <iostream>
using namespace std;
int n;
struct node{
int date;
int flag;
};
struct node a[];
int min()
{
int m=;
int k;
for(int i=;i<n;i++)
{
if(a[i].date<m&&a[i].flag==)
{
m=a[i].date;
k=i;
}
}
a[k].flag=;
return k;
}
void add(int l)
{
a[n].flag =;
a[n].date=l;
n++;
/* for(int x=0;x<n;x++)
{
cout<<"date"<<a[x].date<<" ";
cout<<"flag"<<a[x].flag<<endl; }*/
}
int is()
{ int t=;
for(int k=;k<n;k++)
{
if(a[k].flag==)
{
t++;
}
}
if(t==)
{
return t;
}
if(t>)
{
return ;
}
}
int main()
{
int sum=;
int s=;
int fron;
int after;
int o;
cin>>n;
for(int i=;i<n;i++)
{
cin>>a[i].date;
}
while(){
fron=a[min()].date;//找一个最小的
after=a[min()].date;//再找一个 最小的
s=fron+after;
//cout<<sum<<endl;
add(s);
sum=sum+s;
int t=is();//如果还剩下一个数 返回一个1
if(t)
{
break;
sum=sum+t;
}
}
cout<<sum;
return ;
}
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int n;
int a[200];
bool complare(int a,int b)
{
return a>b;
}
void min()
{
sort(a,a+n,complare);
/* for(int x=0;x<n;x++)
{
cout<<"date"<<a[x]<<" ";
}*/
}
/*void add(int l)
{
a[n].flag =0;
a[n].date=l;
n++;
/**/ int main()
{
int sum=0;
int s=0;
int fron;
int after;
int o;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
while(n>1){
min(); a[n-2]=a[n-1]+a[n-2];
//cout<<"a[n-2]"<<a[n-2] <<endl;
sum=sum+a[n-2];
n--;
}
cout<<sum;
return 0;
}
基础练习--huffman的更多相关文章
- [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Huffman
huffman是非常基础的压缩算法. 实现霍夫曼树的方式有很多种,可以使用优先队列(Priority Queue)简单达成这个过程,给与权重较低的符号较高的优先级(Priority),算法如下: ⒈把 ...
- Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序
前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的re ...
- huffman压缩解压文件【代码】
距离上次写完哈夫曼编码已经过去一周了,这一周都在写huffman压缩解压,哎,在很多小错误上浪费了很多时间调bug.其实这个程序的最关键部分不是我自己想的,而是借鉴了某位园友的代码,但是,无论如何,自 ...
- 编程语言的基础——搞定JavaIO
关键字:IO基础,JUnit生命周期,字节流,字符流,字符编码,对象流,序列化,反序列化 Java I/O 流是一组有顺序的,有起点和终点的字节集合.是对设备文件间数据传输的总称和抽象. 在IO中涉及 ...
- Huffman 哈夫曼编码与译码的原理剖析及C++实现
原理 我们在信息存储时,希望以最少的空间去存储最大的数据,方便数据的传输,那么该怎样做呢? 我们想到将源信息转化为01序列存储,但是这样以来又有一个问题,就是子串匹配问题,我们为了解决这个方法,想到了 ...
- 深度学习word2vec笔记之基础篇
作者为falao_beiliu. 作者:杨超链接:http://www.zhihu.com/question/21661274/answer/19331979来源:知乎著作权归作者所有.商业转载请联系 ...
- huffman树即Huffma编码的实现
自己写的Huffman树生成与Huffman编码实现 (实现了核心功能 ,打出了每个字符的huffman编码 其他的懒得实现了,有兴趣的朋友可以自己在我的基础增加功能 ) /* 原创文章 转载请附上原 ...
- 基础练习 Huffuman树
基础练习 Huffuman树 时间限制:1.0s 内存限制:512.0MB 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给 ...
随机推荐
- idea开发springboot 的mysql数据库连接问题
今天在家用idea进行springboot开发,前面一些坑相对避免了,但是到数据库这块总是连接不上,报错主要是: Access denied for user 'root'@'localhost' ( ...
- SQL语句--分组统计
一.教师号 星期号 是否有课1 2 有1 3 有2 1 有3 2 有`1 2 有写一条sql语句让你变为这样的表教师号 星期一 星期二 星期三1 2 12 13 1各星期下的数字表示:对应的教师在星期 ...
- Spring Boot2(007):关于Spring beans、依赖注入 和 @SpringBootApplication 注解
一.关于Spring beans 和 依赖注入(Dependency Injection) spring boot 和 Spring 全家桶无缝衔接,开发过程中可以很轻松地使用 Spring 全家桶的 ...
- lz-cms
去年这个时候也是8月份,离开了生活9年的福州来到厦门,已整整一年的时间.离开福州的原因,就是不想让自己在安逸中沉沦下去,需要重新寻找技术的激情.来到新公司后,也开始投入老板梦想中的那个伟大CMS的研发 ...
- 代码化UI设计
最近在阅读Qt 5.9 C++开发指南,为了加深对书本上内容的理解,参照书上的讲解尝试写了一些demo,用于以后工作中查阅,如果涉及侵权请告知,实例程序samp2_3 mydialog.h #ifnd ...
- 对DataFrame的再理解
1.构造需要从字典构造 cds={'code':["002372.XSHE","002415.XSHE","002304.XSHE",&qu ...
- EL&JSTL简单介绍
EL表达式 是为了简化咱们的jsp代码,具体一点就是为了简化在jsp里面写的那些java代码. 写法格式 ${表达式 } 如果从作用域中取值,会先从小的作用域开始取,如果没有,就往下一个作用域取. 一 ...
- Assignment写作需要掌握的两种表达方式
在正式开始写Assignment之前都会进行文献检索和整理,选择适合Assignment选题的文献资料进行阅读和引用.对于文献中与自己的观点高度相关的参考资料要如何具体引用,而不造成抄袭或者增加文章的 ...
- python学习---format、当前时间
1.数字格式化 format < :左对齐 > :右对齐 a = “随机数是{:>4d}”.format(1) 结果是0001 2.当前时间 import dat ...
- Java四类八种
四类: 整数类型,浮点类型,字符型,布尔型 八种: byte,short,int,long,float,double,char,boolean