霍夫曼树为何物

霍夫曼树为何物

引子:荒废的空间

    自从盘古开天辟地、仓颉创造文字以来,美帝国的程序猿们在长期实践中就发现了这么一个问题:那些组成文字的26个字母在实际应用中的频率是有差别的。

霍夫曼树为何物

    这就意味着有的字母用到的多,而有的用到的会少一点。so,他们认为凡是字母都用7个比特存储这对于那些常用的字母来说并不公平,实际上造成了大量存储空间的荒废。那么怎样让那些最常用的字母在存储过程中占用较少的字节、又较能方便查找呢?


  • 霍夫曼树简介

        于是,以霍夫曼为代表的机智的程序猿和算分师(算法分析师)们经过一番折腾和探索,为解决这个问题,联想到了堆的应用。因为最大堆(maxium heap)中越大的数字距离根节点越近。因此,如果改进最大堆,使得出现频率越高的字母距离根节点越近,那么搜索出现频率较高的字母的路径不是就变短了吗?他们提出如下图示的解决方案:

霍夫曼树为何物

    根据此图,寻找任何一个树中的元素,都是从根节点开始,0表示向左子树搜索,1表示向右子树搜索,至含有该元素的叶子节点结束,或者返回找不到。比如在一段给定文本中寻找使用频率为120次的字母E,从根节点306开始,搜索左子树即得E,可记为0。再如,搜索使用频率仅为7次的字母K,搜索过程可记为111101.这样,我们就发现查找高频字母的速度比查找低频字母快了很多。同时,我们发现如果就用一个数字0代表E,比用E的Ascii码代表E明显省了6比特。即使是位于树的深处的字母Z和K,我们也仅仅用了6个位。(然而字母多了以后随着层数的增加这种优势可能丧失)这就为节省这段文本的空间找到了一种可能。在当时不少计算机还是通过插卡才能运行的情况下,这样对于部分字母既省时又省空间的解决方案的发现还是能称得上是一件破天荒的事情的。

  • 论霍夫曼树的栽培方法

    俗话说“前人栽树后人乘凉”。那么这么好的一棵树是怎么栽起来以备日后使用的呢?我们还是以简介中那棵树的构造过程为例。首先,对出现的字母以频率为关键字进行堆排序(此时先选择最小堆),会得到一个数组如下:

霍夫曼树为何物

把这个堆最小的两个元素推出,作为霍夫曼树的叶子节点,它们的和作为暂时的根并推入刚才的最小堆,得到以下结果:

霍夫曼树为何物接下来的事情依次类推,推出两个元素9和24:M,在已有树的基础上构造新树,推入它们的和33,形成以下结果:

霍夫曼树为何物

有时会出现一种特殊情况,由于上一步推入堆的和太大,连续推出的两个或多个元素都是带有数字和字母的节点,如下图所示,后两个推出的元素是37:U以及42:L:

霍夫曼树为何物

 

那么此时,我们就先把推出的两个节点形成另一颗树,根即为它们的和79,再将79推入堆。后面的事情则继续照常进行。因此,每次这样推出2个元素,推入一个元素,这个堆就总有身子被掏空的时候,那个时候只要把这个堆交给各大编程语言的垃圾回收机制,霍夫曼树就算种好了。本例的结果参见简介部分那棵树即可。

  • 后记:由霍夫曼树想到什么

     我们的中文字符比英语那26个字母复杂得多,这就意味着对于中文字符查找、存储的需求就会更多样化。那么霍夫曼树能否用于中文字符的压缩、存储和查找呢?其二,文本统计得越多,关于字符出现频率的规律就掌握得越准确。那么,是否可以设计一种方法让程序自动统计文本中字符的个数、自动去维护已经种好的树呢?其三,文本可以这么搞,那么数字呢?音频呢?MV呢?甚至计算机病毒的特征存储与分析呢?……笔者认为,这种树引进中国,在对于我国日常工作中用到的数据用它进行处理,可能会带来软件行业的枝繁叶茂,体现在存储和查找的效率可能会被大大提高。因此学习栽种霍夫曼树这个品种的树前景还是比较看好的。上述具体过程,参见笔者分享的代码:简版霍夫曼树,链接:

http://www.oschina.net/code/snippet_2626980_58384

 

参考资料:

《数据结构与算法分析(C++版)》第三版

转载于:https://my.oschina.net/Samyan/blog/726772

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108923.html原文链接:https://javaforall.net

(0)
上一篇 2021年9月16日 下午7:00
下一篇 2021年9月16日 下午8:00


相关推荐

  • 陕西勉县旅游策划方案——打造三国之都!

    陕西勉县旅游策划方案——打造三国之都!陕西勉县旅游策划方案————打造三国之都熊大寻旅游策划公司/文陕西勉县——三国文化的集散地,以其包容与大气,为三国文化的爱好者铺排了强健的精神底色,给予了所有三国迷体验历史的自信和豪情。2009年8月,受陕西勉县县政府的邀请,熊大寻旅游策划公司和旅游规划公司来到勉县,为其城市旅游进行整体策划。熊大寻旅游策划公司和旅游规划公司在考察走访完勉县所有旅游景点,并消话完项目资料后,对勉县做出了系统…

    2022年6月6日
    144
  • java线程池面试题有哪些?java线程池常见面试题「建议收藏」

    java线程池面试题有哪些?java线程池常见面试题「建议收藏」进行java面试的过程中,java线程池是必问的面试题目,因为这是java的重点知识,也是在java工作中经常会遇到的,那java线程池面试题有哪些?下面来我们就来给大家讲解一下java线程池常见面试题。1.了解过线程池的工作原理吗?当线程池中有任务需要执行时,线程池会判断如果线程数量没有超过核心数量就会新建线程池进行任务执行,如果线程池中的线程数量已经超过核心线程数,这时候任务就会被放入任务队列中排队等待执行;如果任务队列超过最大队列数,并且线程池没有达到最大线程数,就会新建线程来执行任务;如果超过了

    2022年5月26日
    40
  • 时钟模块ds1302的使用软件_ds1302时钟程序详解

    时钟模块ds1302的使用软件_ds1302时钟程序详解  刚刚学习了如何使用ds1302这个时钟芯片的使用,现在我把学习的过程分享出来,虽然整体的过程感觉不算难,但是仍然有难解之处至今未明,因为没有去实际验证,所以也不能确定到底是什么原因。  1.首先,查找ds1302手册,可以在21ic这个网站上下载。如果嫌英文版的自己翻译的很难受(这里还是建议大家硬着头皮看英文版的,毕竟是有好处的,你说呢?),可以在网上找中文版的。  2.通过手册…

    2025年7月1日
    4
  • wangeditor富文本编辑器_vue使用富文本编辑器

    wangeditor富文本编辑器_vue使用富文本编辑器一、导入kindeditor文件,并删除不用的服务器版本,这里选用jsp修改文件修改第16行代码uploadJson=K.undef(self.uploadJson,self.basePath+’jsp/upload_json.jsp’),修改图片上传路径//文件保存目录路径StringsavePath=pageContext.getServletContext().g

    2022年10月12日
    5
  • ORM学员管理系统单表查询示例

    前期准备工作首先创建好一个项目一:必须使用MySQL创建一个库因为ORM只能对表和数据进行处理,所以库必须自己创建二:进行相关的配置一:二:三:四:五:三创建表必须注意一下俩点

    2022年3月29日
    39
  • 实战电子邮件营销与推广

    实战电子邮件营销与推广nbsp nbsp nbsp 电子邮件营销现在网上已经有了很多的相关文章了 但是都只是蜻蜓点水 没有深入 至少我是这么感觉的 所以今天我将用我对电子邮件营销实战再谈谈电子邮件营销 首先 我们来看看电子邮件营销的优势 优势一 成本低 发一封邮件的成本可以约等于零 因为我们主要找到了用户的邮箱 我们便可花很少的时间将我们的邮件发送出去 优势二 邮件只要投放精准 客户转化率是非常高的 远比其他营销方式要高出很多

    2026年3月19日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号