问题与解答

问题描述:

假设用于通信的电文由 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. IntentFilter,PendingIntent

    1.当Intent在组件间传递时,组件如果想告知Android系统自己能够响应那些Intent,那么就需要用到IntentFilter对象. IntentFilter对象负责过滤掉组件无法响应和处理的 ...

  2. Java虚拟机(JVM)以及跨平台原理

    相信大家已经了解到Java具有跨平台的特性,可以"一次编译,到处运行",在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台 ...

  3. 删除数据库时报错 ERROR 1010 (HY000): Error dropping database (can't rmdir './cart', errno: 39)

    这是因为在数据目录下有表相关的数据(不是表),此时应该进入存放表的目录下删除与表相关的数据,一般数据存放目录默认为/var/lib/mysql,cd到目录下 执行命令:cd /var/lib/mysq ...

  4. linux基础-TCP/IP协议篇

    一.网络TCP/IP层次模型 1.网络层次模型概念介绍:TCP/IP协议就是用于简化OSI层次,以及相关的标准.传输控制协议(tcp/ip)族是相关国防部(DoD)所创建的,主要用来确保数据的完整性及 ...

  5. IM即时通讯设计 高并发聊天服务:服务器 + qt客户端(附源码)

    来源:微信公众号「编程学习基地」 目录 IM即时通信程序设计 IM即时通讯 设计一款高并发聊天服务需要注意什么 如何设计可靠的消息处理服务 什么是粘包 什么是半包 解决粘包和半包 IM通信协议 应用层 ...

  6. 什么是API?

    一.简介 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序,与开发人员基于某软件或硬件得以访问一组例程的能力,而又 ...

  7. java多线程8:阻塞队列与Fork/Join框架

    队列(Queue),是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的. BlockingQueue 而阻塞队列BlockingQueue除了继承 ...

  8. 【二进制】CTF-Wiki PWN里面的一些练习题(Basic-ROP篇)

    sniperoj-pwn100-shellcode-x86-64 23 字节 shellcode "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\ ...

  9. Table.PromoteHeaders升降标题Table…Headers(Power Query 之 M 语言)

    数据源: 任意数据源 目标: 将第一行提升为标题 操作过程: [主页](或[转换])>[将第一行用作标题] M公式: = Table.PromoteHeaders( 表, [PromoteAll ...

  10. CF108A Palindromic Times 题解

    Content 现在是 \(h\) 时 \(m\) 分,请求出在此之后(不包含此时)的第一个回文时间. 数据范围:\(0\leqslant h\leqslant 23,0\leqslant m\leq ...