问题与解答

问题描述:

假设用于通信的电文由 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);
}

题后反思:非必要实现

一开始想要直接实现哈夫曼树,直接模拟题目过程。后来转念一想发现没有必要直接实现哈夫曼树,只要用数组排序就可以模拟实现求解带权路径长度的过程。

哈夫曼树

定义

  1. 带权路径和最小的树(最优二叉树)
  2. 带权路径和的两种计算方法
    • 定义计算
    • 构造的结点求和

算法实现

  1. 基本算法: 把结点按权值排序,选权值较小的两个结点合成一个新结点,然后重复上述操作,最终得到的树就是哈夫曼树。
  2. 核心问题:如何找到权值最小的两个结点---利用最小堆!!!
  3. 伪码实现
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;
}
  1. 时间复杂度O(lgN)

<数据结构>XDOJ261.理解哈夫曼树的更多相关文章

  1. 【数据结构】赫夫曼树的实现和模拟压缩(C++)

    赫夫曼(Huffman)树,由发明它的人物命名,又称最优树,是一类带权路径最短的二叉树,主要用于数据压缩传输. 赫夫曼树的构造过程相对比较简单,要理解赫夫曼数,要先了解赫夫曼编码. 对一组出现频率不同 ...

  2. 洛谷P2168 [NOI2015] 荷马史诗 [哈夫曼树]

    题目传送门 荷马史诗 Description 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马 ...

  3. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  4. Android版数据结构与算法(七):赫夫曼树

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 近期忙着新版本的开发,此外正在回顾C语言,大部分时间没放在数据结构与算法的整理上,所以更新有点慢了,不过既然写了就肯定尽力将这部分完全整理好分享出 ...

  5. 6-9-哈夫曼树(HuffmanTree)-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第6章  树和二叉树 - 哈夫曼树(HuffmanTree) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版> ...

  6. Java数据结构和算法(四)赫夫曼树

    Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...

  7. 20172332 2017-2018-2 《程序设计与数据结构》Java哈夫曼编码实验--哈夫曼树的建立,编码与解码

    20172332 2017-2018-2 <程序设计与数据结构>Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 哈夫曼树 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子 ...

  8. hdu 2527:Safe Or Unsafe(数据结构,哈夫曼树,求WPL)

    Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  9. 数据结构之C语言实现哈夫曼树

    1.基本概念 a.路径和路径长度 若在一棵树中存在着一个结点序列 k1,k2,……,kj, 使得 ki是ki+1 的双亲(1<=i<j),则称此结点序列是从 k1 到 kj 的路径. 从 ...

随机推荐

  1. CORS 如果需要指定多个域名怎么办

    CORS 通过控制 Access-Control-Allow-Origin 控制哪些域名可以共享资源,取值如下 Access-Control-Allow-Origin: <origin> ...

  2. 【STM8】添加头文件、加入库函数

    下面顺便放上STM8L15x-16x-05x的固件库,以及固件库里没有的<stm8l15x_conf.h> 链接打开后,还会发现另外两个文件夹,<src><inc> ...

  3. 转 onSaveInstanceState()和onRestoreInstanceState()使用详解

    转 https://www.jianshu.com/p/27181e2e32d2 背景 如果系统由于系统约束(而不是正常的应用程序行为)而破坏了Activity,那么尽管实际 Activity实例已经 ...

  4. node环境变量配置

    1.Node.js 官方网站下载:https://nodejs.org/en/ 2.打开安装,傻瓜式下一步即可,然后配置环境变量 3.因为在执行例如npm install webpack -g等命令全 ...

  5. [学习总结]9、Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)

    这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影. 可是有的人并不知道如何去使用这库如何进行配置,网上查到的信息对于刚 ...

  6. 开源低代码开发平台entfrm2.1.0更新

    开源低代码开发平台entfrm2.1.0更新 新功能 代码生成支持主子表,支持预览: 新增多应用顶部菜单与左侧菜单联动: element-ui升级到2.15.1: 新增表单管理,集成avue-from ...

  7. 【Keras】神经网络的搭建

    Dense层的使用方法 参考:https://blog.csdn.net/qq_34840129/article/details/86319446 keras.layers.core.Dense( u ...

  8. CPU中的上下文

    目录 一.简介 二.进程切换 三.线程切换 四.中断切换 五.中断检测和查看 六.模拟 一.简介 Linux是多任务操作系统,cpu划分固定时间片,分给每个进程,当前进程时间片执行完毕,将挂起,运行下 ...

  9. Simple iPhone Keychain Access

    Simple iPhone Keychain Access Mar 29th, 2010 9:14 pm The keychain is about the only place that an iP ...

  10. Python3的数据类型

    不可变类型:Number(数值,包含Bool类型).String(字符串).Tuple(元组) 可变类型:List(列表).Dict(字典).Set(集合) Bool不再单独存在,属于Number数值 ...