当前位置:首页 > 默认分类 > 正文内容

【NOIP初赛 】哈夫曼树

virtualman7年前 (2017-10-07)默认分类43

根据我已刷的初赛题中基本每套的倒数第五或第六个不定项选择题就有一个关于哈夫曼树及其各种应用的题,占:0—1.5分;然而我针对这个类型的题也多次不会做,so,今晚好好研究下哈夫曼树;

 概念:

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

                                                              ————维基百科

自己结合维基百科和dalao的博客大致理解了下概念:就是一颗最优的二叉树,从根节点到需要到达的节点的权值之和最小,即为最优,举个例子:

一个很简单的程序,根据输入的分数判断等级,一共有五个等级,其主要的判断算法是这样的:

if(score<60)  
    cout<<"E"<<endl;  
else if(score<70)  
    cout<<"D"<<endl  
else if(score<80)  
    cout<<"C"<<endl;  
else if(score<90)  
    cout<<"B"<<endl;  
else  
    cout<<"A!"<<endl;

用一个二叉树来表示是这样的:

【原谅我;灵魂画师】

可以很明显得看出,这种方式的效力是非常低下的,N的最差情况要比较四次,如果等级划分更严密的话【比如划分100000000000个等级】,这种方式明显TLE;

因此,我们可以采用哈夫曼树的思想:

 

这两种方式,显然后者的判定过程的效率要比前者高。在也没有别地判定过程比第二种方式的效率更高。

 

我们称判定过程最优的二叉树为哈夫曼树,又称最优二叉树

 哈夫曼树的几个概念:【来自于百度百科】
1、路径和路径长度【PL】
在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长
 度为L-1。
2、结点的权及带权路径长度
若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。
3、树的带权路径长度【WPL】
树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。

注:哈夫曼算法采用的是贪心的思想; 问题求解题也有可能会让你求PL或WPL,如下图例:

 

 

                               

 例如例1,构造哈夫曼树的WPL为35是最小的。具体比较如下图:

 

相关文章

【动态规划】基础背包问题

  1159. 背包问题一 (Standard IO) 时间限制: 1000 ms  空间限制: 262144 KB  具体限制   题目描述 有个背包可承受重量N,现有T件物品每件物品重量为...

【疑难杂症】记录一次定位并修复涉及支付、转账的系统性BUG

【疑难杂症】记录一次定位并修复涉及支付、转账的系统性BUG

在某个线上的项目上,突然收到用户反馈,存在转账连续转两次的情况。一开始接到反款后并没有太在意,因为这个项目已经在线上稳定运行了近两年的时间,期间也并没有对订单或者支付系统进行修改。支付的接口也没有发生变化,因此,第一次反馈认为是一次用户的误报。但是,今天下午,有个开发者用户给我再一次反馈了这个BUG...

记录一次如何自己使用国外服务器搭建梯子

记录一次如何自己使用国外服务器搭建梯子

机缘巧合之下,租了一台亚马逊的美国服务器,想着这么大的服务器不能就跑一个业务吧,得利用起来,于是,就开始了搭建梯子之旅。 第一步:使用root账号登上ssh服务器。 第二步:执行一键搭建脚本: bash <(wget -qO- -o- https://git.io/v2ray.sh)...

【已解决】Window命令行报错:无法加载文件,因为在此系统上禁止运行脚本。

错误:无法加载文件 D:\Program Files\nodejs\tsc.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。 解决方法:...

【PHP】大量 HTTP 请求调第三方接口,接口堵塞引起的 FD 耗尽(too many file open)问题

“FD耗尽”中的“FD”指的是“文件描述符”(File Descriptor)。在Unix和类Unix系统(如Linux)中,文件描述符是一个非负整数,用于标识一个进程打开的文件或其他输入/输出资源,比如网络套接字(socket...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。