<数据结构>XDOJ261.理解哈夫曼树
问题与解答
问题描述:
假设用于通信的电文由 n(2≤n≤30)个字符组成,字符在电文中出现的频度(权值)为 w1 w2… wn,根据该权值集合构造哈夫曼树,并计算该树的带权路径长度。
输入说明:
输入分为两行。第 1 行为 n 的值,第 2 行为 n 个整数(数值不超过 100),表示每个字符在电文中的频度。
整数之间以空格或换行符间隔。
输出说明:
输出一个整数,表示所构造哈夫曼树的带权路径长度,换行。
测试样例:
输入样例 1
5
4 5 2 10 8
输出样例 1
64
/*哈夫曼树的理解*/
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int n, A[30],i,sum=0;
scanf("%d", &n);
for(i = 0; i < n; i++)
scanf("%d", &A[i]);
sort(A, A+n); //从小到大排序找出最小的两个结点
for(i=1; i <= n-1; i++)
{
A[i] = A[i]+A[i-1]; //构造结点
sum += A[i]; //构造的结点求和即可得出最短带权路径
sort(A+i-1, A+n); //将构造的结点重新加入数组等待下次比较
}
printf("%d",sum);
}
题后反思:非必要实现
一开始想要直接实现哈夫曼树,直接模拟题目过程。后来转念一想发现没有必要直接实现哈夫曼树,只要用数组排序就可以模拟实现求解带权路径长度的过程。
哈夫曼树
定义
- 带权路径和最小的树(最优二叉树)
- 带权路径和的两种计算方法
- 定义计算
- 构造的结点求和
算法实现
- 基本算法: 把结点按权值排序,选权值较小的两个结点合成一个新结点,然后重复上述操作,最终得到的树就是哈夫曼树。
- 核心问题:如何找到权值最小的两个结点---利用最小堆!!!
- 伪码实现
typedef struct TreeNode *HuffmanTree;
struct TreeNode
{
int Weight;
HuffumanTree Left, Right;
};
HuffumanTree Huffuman(MinHeap H)
{
/* 假设H->Size个权值已经按照最小堆的顺序存放在 MInHeap里 */
int i; HuffumanTree T;
/* 做H->Size - 1 次合并 */
for(i = 0; i < H->Size-1; i++)
{
T = malloc(sizeof(struct HuffumanTree));
T->Left = Delete(H);
/* 从最小堆中删除一个结点,作为新T的左子节点 */
T->Right = Delete(H);
/* 从最小堆中删除一个结点,作为新T的右子节点 */
T->Weight = T->Left->Weight + T->Right->Weight;
/* 重新计算权值 */
Insert(T, H);
/* 将新T插入最小堆 */
}
T = Delete(H);
return T;
}
- 时间复杂度O(lgN)
<数据结构>XDOJ261.理解哈夫曼树的更多相关文章
- 【数据结构】赫夫曼树的实现和模拟压缩(C++)
赫夫曼(Huffman)树,由发明它的人物命名,又称最优树,是一类带权路径最短的二叉树,主要用于数据压缩传输. 赫夫曼树的构造过程相对比较简单,要理解赫夫曼数,要先了解赫夫曼编码. 对一组出现频率不同 ...
- 洛谷P2168 [NOI2015] 荷马史诗 [哈夫曼树]
题目传送门 荷马史诗 Description 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马 ...
- 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- Android版数据结构与算法(七):赫夫曼树
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 近期忙着新版本的开发,此外正在回顾C语言,大部分时间没放在数据结构与算法的整理上,所以更新有点慢了,不过既然写了就肯定尽力将这部分完全整理好分享出 ...
- 6-9-哈夫曼树(HuffmanTree)-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第6章 树和二叉树 - 哈夫曼树(HuffmanTree) ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版> ...
- Java数据结构和算法(四)赫夫曼树
Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...
- 20172332 2017-2018-2 《程序设计与数据结构》Java哈夫曼编码实验--哈夫曼树的建立,编码与解码
20172332 2017-2018-2 <程序设计与数据结构>Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 哈夫曼树 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子 ...
- hdu 2527:Safe Or Unsafe(数据结构,哈夫曼树,求WPL)
Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 数据结构之C语言实现哈夫曼树
1.基本概念 a.路径和路径长度 若在一棵树中存在着一个结点序列 k1,k2,……,kj, 使得 ki是ki+1 的双亲(1<=i<j),则称此结点序列是从 k1 到 kj 的路径. 从 ...
随机推荐
- HUD总结
HUD 指示器/HUD/遮盖/蒙板 半透明的指示器如何实现 指示器的alpha = 1.0; 指示器的背景色是半透明的 1. 创建颜色 直接创建对应的颜色 + (UIColor *)blackColo ...
- canal安装与使用
安装 alpha的版本不是稳定的版本 wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deploye ...
- Win10 Chrome 在DPI缩放下导致界面放大问题 解决方案
支持:54.0.2840.59 m (64-bit) 以下大多数版本,具体未测试.如有问题可以反馈一下. 方法1:为程序设置"高DPI设置时禁用显示缩放. 方法2:为程序添加启动参数: /h ...
- Flutter 中如何优雅的实现多渠道打包(埋点统计系列)
我是 Zero,脑图先奉上 先赞后看,更新永不断 只要你关注 Flutter,这篇文章你绝对用得着,==> 强烈建议收藏 多渠道打包介绍 多渠道打包的主要作用是满足产品的运营需求,统计渠道和活动 ...
- 密码学之Hash散列
一.简介 hash(散列.杂凑)函数,是将任意长度的数据映射到有限长度的域上. 直观解释起来,就是对一串数据m进行杂糅,输出另一段固定长度的数据h,作为这段数据的特征(指纹).也就是说,无论数据块m有 ...
- 转:builder模式分析
建造者模式 11.1 变化是永恒的 又是一个周三,快要下班了,老大突然拉住我,喜滋滋地告诉我:"牛叉公司很满意我们做的模型,又签订了一个合同,把奔驰.宝马的车辆模型都交给我们公司制 作了,不 ...
- Win7远程连接问题:凭据不工作 & 没有授权此用户账户
一 您的凭据不工作 1.问题描述 win7系统远程桌面到某个电脑的一个账户名为admin 的用户,但提示"您的凭据不工作,之前连到 *.*.*.*的凭据无法使用,请输入新凭据",即 ...
- CF699A Launch of Collider 题解
Content 有 \(n\) 辆车在一条数轴上,第 \(i\) 辆车在 \(a_i\) 上,每辆车要么向左,要么向右.开始,它们以 \(1\) 个单位每秒的速度在行驶.问你第一次撞车发生在第几秒的时 ...
- java 8 启动脚本优化 3
#!/bin/bash #链接文件 source /etc/profile #java虚拟机启动参数 #通过http://xxfox.perfma.com/jvm/check来检查参数的合理性 #各参 ...
- mongodb 64位操作系统下载地址
下载地址:https://www.mongodb.org/dl/win32/x86_64