优先队列优化的 Huffman树 建立
如果用vector实现,在运行时遍历寻找最小的两个节点,时间复杂度为O(N^2)
但是我们可以用priority_queue优化,达到O(N logN)的时间复杂度
需要注意的是priority_queue的模板type不能存指针。因为指针是64位整数,存的是数据在内存中的地址。但如果直接存Node
(Node={data;*lChild;*rChild;})的话,因为每次堆调整内存地址都会发生改变,并且因为变量的生命周期,这也无法实现。
所以最好还是用一个Node数组静态实现,左右子树地址保存数组中的索引,这和数据结构中的“静态链表”很相似,这种处理方法在编程中经常用到。
代码:
#include<cstdio>
#include<queue>
#include<algorithm> using namespace std; int arr[];
typedef struct Node{
int d,l,r,p;
Node(int d=):d(d){
l=-;
r=-;
}
bool operator < (const Node& obj) const
{
return d>obj.d;
}
}Node; Node nodes[]; priority_queue<Node> pq; int main(){
freopen("huffman.txt","r",stdin);
int i,n=;
while(~scanf("%d",&i)){
nodes[n]=Node(i);
nodes[n].p=n;
pq.push(nodes[n]);
n++;
}
while(pq.size()>){
if(pq.empty()) break;
Node a=pq.top();
pq.pop();
if(pq.empty()) break;
Node b=pq.top();
pq.pop();
Node c(a.d+b.d);
c.l=a.p;
c.r=b.p;
nodes[n]=c;
c.p=n++;
pq.push(c);
}
queue<int> q;
q.push(pq.top().p);
while(!q.empty()){
int sz=q.size();
while(sz--) {
int t=q.front();
q.pop();
printf("%d ",nodes[t].d);
if(nodes[t].l>=)
q.push(nodes[t].l);
if(nodes[t].r>=)
q.push(nodes[t].r);
}
puts("") ;
}
}
测试数据(huffman.txt):
效果:

优先队列优化的 Huffman树 建立的更多相关文章
- [ACM] POJ 3253 Fence Repair (Huffman树思想,优先队列)
Fence Repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25274 Accepted: 8131 Des ...
- poj 3253 Fence Repair(优先队列+huffman树)
一个很长的英文背景,其他不说了,就是告诉你锯一个长度为多少的木板就要花多少的零钱,把一块足够长(不是无限长)的木板锯成n段,每段长度都告诉你了,让你求最小花费. 明显的huffman树,优先队列是个很 ...
- poj 3253 Fence Repair(模拟huffman树 + 优先队列)
题意:如果要切断一个长度为a的木条需要花费代价a, 问要切出要求的n个木条所需的最小代价. 思路:模拟huffman树,每次选取最小的两个数加入结果,再将这两个数的和加入队列. 注意priority_ ...
- Huffman树的构造及编码与译码的实现
哈夫曼树介绍 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数) ...
- NOI 2015 荷马史诗【BZOJ 4198】k叉Huffman树
抱歉因为NOIP集训,好长时间没再写题解了. NOI 2015也就只有这道题一看就能懂了-- 4198: [Noi2015]荷马史诗 Time Limit: 10 Sec Memory Limit: ...
- [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Huffman树的编码译码
上个学期做的课程设计,关于Huffman树的编码译码. 要求: 输入Huffman树各个叶结点的字符和权值,建立Huffman树并执行编码操作 输入一行仅由01组成的电文字符串,根据建立的Huffma ...
- HUFFMAN 树
在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN) 树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如 JPEG中就应用了哈夫曼编码. 首先介绍什么 ...
- Huffman树及其应用
哈夫曼树又称为最优二叉树,哈夫曼树的一个最主要的应用就是哈夫曼编码,本文通过简单的问题举例阐释哈夫曼编码的由来,并用哈夫曼树的方法构造哈夫曼编码,最终解决问题来更好的认识哈夫曼树的应用--哈夫曼编码. ...
随机推荐
- 高通msm8909打开debug串口
1.修改板级文件 $ cd AOSP $ vim device/qcom/msm8909/BoardConfig.mk 如下所示: 2.修改defconfig文件 $ cd kernel/arch/a ...
- 常用mysql系统表及命令
常用系统表查看当前数据库连接ip信息– select * from information_schema.PROCESSLIST 当前mysql实例中所有数据库的信息– select * from i ...
- WPF ResourceDictionary XAML资源 c#代码 获取与遍历
使用C#代码来获取XAML资源,除去正常的FindResource.而且是能查询到资源的对象. 说实话还是很麻烦的. 比如说我现在有一堆静态资源放在xaml的资源中,我想通过绑定的方式来获取. 好比是 ...
- kvm虚拟机的克隆
kvm虚拟机的克隆分为两种情况 (1) KVM主机本机虚拟机直接克隆. (2) 通过复制配置文件与磁盘文件的虚拟机复制克隆(适用于异机的静态迁移). 1. 本机虚拟机直接克隆 (1) 查看虚拟机配置 ...
- C#通过字符串分割字符串Split
string[] strArr = str.Split(new[] {"****==="},StringSplitOptions.None); 更多内容关注公众号 洛水梅家
- C#与C++与互操作
一.C#调用C++库 1.创建C++库 打开VisualStudio,创建一个C++工程,输入项目名称HelloWorldLib 确定,然后下一步.选择应用程序类型为DLL 单击完成,我们就创建好了一 ...
- wcf序列化嵌套类(如TreeNode)异常原因
循环引用类在WCF中的传递 循环引用类在WCF中的传递问题,例如: [DataContract] public class AB { public string name { ...
- java包装类和值类型的关系
java包装类总是让人疑惑 它与值类型到底是怎么样一种关系? 本文将以int和Integer为例来探讨它们的关系 java值类型有int short char boolean byte long fl ...
- codeforces #578(Div.2)
codeforces #578(Div.2) A. Hotelier Amugae has a hotel consisting of 1010 rooms. The rooms are number ...
- docker启动,重启,关闭命令
docker启动命令,docker重启命令,docker关闭命令 启动 systemctl start docker守护进程重启 sudo systemctl daemon-relo ...