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

【NOIP初赛 】哈夫曼树

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

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

 

相关文章

【已解决】ubuntu16.04和Python3.5里的大坑

因为一些历史原因,几个服务器的系统都一直是ubuntu16.04,ubuntu16.04的python3的默认版本是3.5。而我这次配置python环境需要用到Pymysql配置成功后,然后直接运行,一直报错。我还一直尝试修改pymysql的代码,一度以为镜像站里的pymysql有错误。甚至跑去Gi...

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

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

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

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

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

常见License代码开源要求

  常见许可证类型 典型软件 触发代码开源义务前提要求 开源要求和范围 BSD类 如:Apache/BSD/MIT等 Tomcat;OpenSSL 无 无 MPL类 如:MPL/EPL等 FirFox,Eclips...

解决!!!关于微信小程序中无法正常显示uview-plus的up-tabs组件样式的问题

解决!!!关于微信小程序中无法正常显示uview-plus的up-tabs组件样式的问题

一.问题背景uview-plus3.0是基于uView2.x修改的vue3版本,提供了很多好用的移动端组件。点击访问最近在使用uview-plus的tabs标签组件时,需要对标签的背景颜色等样式进行自定义,查看官方文档发现提供了参数activeStyle、inactiveStyle、itemStyl...

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

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

发表评论

访客

看不清,换一张

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