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

【NOIP初赛 】哈夫曼树

virtualman8年前 (2017-10-07)默认分类1128

根据我已刷的初赛题中基本每套的倒数第五或第六个不定项选择题就有一个关于哈夫曼树及其各种应用的题,占: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是最小的。具体比较如下图:

 

相关文章

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

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

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

大佬推荐用的两个git指令:git rebase 和 git commit --amend

git rebase git rebase 命令用于将本地的提交重新应用到另一个基础分支上。它可以帮助你保持线性的项目历史记录,避免大量的合并提交(merge commits)。当你从一个分支拉取最新的更改并希望将你的工作基于这些更改之上时,可以使用 git rebase。 使用场景: 当...

【随笔】关于开发一个既能日常记账,又能拥有资产管理功能的APP的Idea

随便写了,想到哪里写哪里。最近一直在市面找一款记账APP,但是感觉都不满足我的需求。我的想法是,在普通账本程序的基础上,再加上多人管理。资产管理。资产管理一定要把价格接口对接好。我举个例子,比如有虚拟货币资产ETH 1个,那么就应该在统计的时候,按实时市值进行统计。又或者按照当天的市值统计。关于资产...

\r \n \r\n三者作为换行符的区别?

在计算机领域,\r、\n、\r\n 是表示文本行结束的转义字符,主要区别如下: ˂a name="1. \r(回车符,Carriage Return)" class="reference-link" href="#"˃1. \r(回车符,Carriage Return) ASCII码:13(十进...

GIT文件名大小写修改后,提交不上去?

可执行以下命令更改 git 设置,使其区分文件名的大小写。但如果你已经提交了有问题的,会造成仓库上有大写、小写两份,一定要先回退提交后,重新提交。 git config core.ignorecase false...

量化交易策略随笔

1、请先掉用jin10接口,获取截止到当前时间的资讯,资讯条数:flashNumber;2、每个flash LLM生成score作为单条资讯的影响因子。3、总资讯情绪影响因子 = ∑score^3 / flashNumber4、查询多空比,多空比大于1,代表投资情绪积极。小于1则代码投资情绪消极。5...

发表评论

访客

看不清,换一张

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