哈夫曼树处理这样的一种问题:

给出一棵n个叶子的k叉树,每个叶子有一个权值wi,要求最小化∑wi*di

di表示,第i个叶子节点到根节点的距离。(一般是边数)

处理方法比较固定。

贪心的思路:我们让权值较大的叶子节点 的深度越小越好。

建立一个小根堆。

1.插入n个叶子的权值。

2.每次取出最小的k个,ans+=这些权值和。

3.合并出一个父亲节点,权值就是这k个点的权值和。(通常这一步不用真正实现,只是助于理解)

4.把这个新的父亲节点权值放进小根堆里面。

5.重复2~4操作,直到堆中只有一个节点(就是根节点)

但是这样是有问题的。

发现,我们每取出一次,合并一次,就是相当于把取出来的这些叶子深度+1,

最后一次合并的所有节点,就是根节点的儿子,他们的深度最浅。就是1

而可能出现,最后一次,堆中有2~k-1个节点,不能使最浅的一层放满。

这样肯定是不优的,因为我们可以把较深的一个节点放在根节点的儿子位置上。(因为这一层还没有放满)使得答案更优。

我们这样处理这个问题:

往堆里面不断加入权值为0的及节点。直到满足(tot-1)%(k-1)==0 tot是初始堆中节点个数。

这样,每次都可以恰好取出k个,并且0值的点会先取出来,相当于这里是空位,他们不会影响最后的值。

并且,这样保证了最浅的一层尽可能的放满,就一定是最优解了。

相当于把空位留给了更深的 位置。

例题:

1.合并果子

Description:

n堆果子,合并两堆果子,花费两堆果子的重量之和的力气。问合成一堆最少用多少力气?

Solution:

浅显的解释就是贪心了,因为要合并固定的n-1次,必然每次选择最小的两个合并。

本质上其实是一棵n节点的2叉哈夫曼树。叶子节点的深度米就是这个原始堆被合并的次数。

2.荷马史诗

Description:

荷马史诗

Solution:

我们利用tire树的结构来考虑,为了保证没有前缀包含关系,最后建出的trie必然是有n个叶子节点。

每个叶子节点到根节点的路径长度就是单词长度,并且这个长度要乘上出现的次数wi

恰好就是Huffman的模型!!

一切就很裸了。

但是还要求一个最长的单词最短,,

那么,就在权值相同的节点中,选择之前已经合并过的次数最小的点合并,也就是那些当前深度最浅的点。

这样,把深度“平均”了一下,就是最优的情况了。

另外,新合并出来的点的合并次数,即深度,就是最大的所选点的合并次数。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100000+10;
int n,k,tot;
ll w[N];
ll ans,mx;
struct node{ll val,mer;bool friend operator <(node a,node b){if(a.val==b.val) return a.mer>b.mer;return a.val>b.val;}
};
priority_queue<node>q;int main()
{scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){scanf("%lld",&w[i]);node nn;nn.val=w[i],nn.mer=0;q.push(nn);}tot=n;while((tot-1)%(k-1)){node nn;nn.val=0;nn.mer=0;q.push(nn);tot++;}while(q.size()>1){ll sum=0;ll big=0;for(int i=1;i<=k;i++){node bb=q.top();q.pop();sum+=bb.val;big=max(big,bb.mer);}mx=max(mx,big+1);ans+=sum;node kk;kk.val=sum;kk.mer=big+1;q.push(kk);}printf("%lld\n%lld",ans,mx);return 0;
}

转载于:https://www.cnblogs.com/Miracevin/p/9397423.html

哈夫曼树Huffman相关推荐

  1. 数据结构C#版笔记--啥夫曼树(Huffman Tree)与啥夫曼编码(Huffman Encoding)

    哈夫曼树Huffman tree 又称最优完全二叉树,切入正题之前,先看几个定义 1.路径 Path 简单点讲,路径就是从一个指定节点走到另一个指定节点所经过的分支,比如下图中的红色分支(A-> ...

  2. 哈夫曼树(Huffman Tree)

    定义 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数).树的路 ...

  3. 哈夫曼树(Huffman Tree),与哈夫曼编码

    目录 一.哈夫曼树 1.什么是哈夫曼树? 2.哈夫曼树关键字说明 3.用代码实现哈夫曼树思路分析 4.代码实现 二.哈夫曼编码 1.哈夫曼编码基本介绍 2.原理剖析 3.代码实现 一.哈夫曼树 1.什 ...

  4. 【数据结构与算法】-哈夫曼树(Huffman Tree)与哈夫曼编码

    超详细讲解哈夫曼树(Huffman Tree)以及哈夫曼编码的构造原理.方法,并用代码实现. 1哈夫曼树基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径. 结点的路径长度:两 ...

  5. Python---哈夫曼树---Huffman Tree

    今天要讲的是天才哈夫曼的哈夫曼编码,这是树形数据结构的一个典型应用. !!!敲黑板!!!哈夫曼树的构建以及编码方式将是我们的学习重点. 老方式,代码+解释,手把手教你Python完成哈夫曼编码的全过程 ...

  6. 哈夫曼树(Huffman Tree)的介绍、画法、哈夫曼树的可视化显示(Python代码实现)

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 目录 一.概念 二 ...

  7. java哈夫曼_用 JAVA 实现哈夫曼树(Huffman Tree)

    -1. 什么是树 树是一种 有层次关系的 数据结构.它由结点组成. 图一: 树的结点由 数据域 和 子结点域 组成.数据域 作为数据的容器:子结点域 存放 子结点 的地址.一个结点是它的子结点的父结点 ...

  8. Huffman Coding 哈夫曼树

    一.实验名称:Huffman Coding 二.实验目的: 熟练掌握哈夫曼树的数据结构,结构的特点: 能够实现哈夫曼树的基本操作:如构造,插入等 利用最小堆降低哈夫曼树的时间复杂度. 熟练掌握最小堆的 ...

  9. 数据结构 Huffman树(霍夫曼树、哈夫曼树)

    Huffman树 给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权 ...

  10. 三十、赫夫曼树的设计与代码实现

    一.基本介绍 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为 最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍 ...

最新文章

  1. MYSQL WHERE语句
  2. Screen会话命令 Linux
  3. VTK:循环收缩用法实战
  4. JavaScript实现将位转换为浮点数bitsToFloat算法(附完整源码)
  5. HDU - 5667 Sequence(矩阵快速幂+费马小定理降幂)
  6. jQuery 获取页面元素的属性值
  7. setsockopt函数功能介绍
  8. Leetcode每日一题:649.dota2-senate(Dota2参议院)
  9. 国二MySQL考些啥_国二考试时间 国二考试是什么
  10. c语言二级考试题库及答案,c语言二级考试题库
  11. MP4-M3U8在线P2P加速视频播放器PHP源码
  12. U盘故障恢复--“文件或目录损坏且无法读取”
  13. 包引入中,在包名前使用下划线“_”
  14. Springboot配置suffix指定mvc视图的后缀
  15. 小爱同学上线win10商店
  16. Python:素数求和
  17. excel 中插入文件
  18. 深入理解debuginfo
  19. echart湖南地图
  20. 天线接收功率计算公式_天线增益的计算公式

热门文章

  1. kickstart部分重要参数
  2. 在Fedora 25中更换openjdk为oracle jdk
  3. Linux文件的三种特殊权限SUID、SGID、STICKY
  4. Storm入门之第8章事务性拓扑
  5. 利用 Aliyun OSS Nginx proxy module 实现OSS 图片处理回写功能
  6. Nginx 作为Http代理服务器配置
  7. 我决定把IDEA神器这些你可能不知道的但是又实用的小技巧分享出来,超赞!
  8. 原来这就是Java中的模板设计模式,太easy太实用了!
  9. PTA-1015——Reversible Primes
  10. mysql cluster推荐配置