当前位置: 首页 > news >正文

【数据结构】哈夫曼编码与最优二叉树(哈夫曼树)

一.为什么要用哈夫曼编码

        在进行大容量存储、图像压缩等数据交换的时候,如果文件过大,恰好WIFI又不怎么快,你是不是会觉得十分暴躁呀?比如有这样一串数据需要传输:

         上面就有100位二进制数,这还只是数字,如果要传输英文字母、中文等需要更多的二进制位数:

        这种完完整整原原本本地传输数据的方法叫固定长度压缩算法

        但是如果通过哈夫曼编码之后,就会变成数据+转换表(也就是非固定可变长度压缩算法):

        只需要10+8+32= 50位!!节省了将近50位的数据!!

二.哈夫曼树

        那么哈夫曼编码是怎么进行数据存储的呢?建立一个二叉树!!名字就叫哈夫曼树!!比如下面这个例子:

        请将数据HELLO进行哈夫曼编码,第一步统计各个字母出现的频率

​​​​​​​   

       然后再按照出现频率低往高进行编树,首先是出现频率最低的“H” 和 “E”和“O”(随便挑两个) ,因为是概率最低,所以作为最低的叶子节点:

        ​​​​​​​ 

        两个权值(也就是频率)相加后,放入到频率中:

         

        紧接着最低的是“0” 出现频率为“ 1”,和另外两个同样权值的,那就随便选择其中一个 :

        ​​​​​​​

        最后只剩下两个权值:

        

        将两个子树接在一起:

         

         随后,将左子树的路径都赋值为“0”,右子树为“1”

        

         如此,一颗哈夫曼树就这样被构造出来了!!可以观察到,我们的叶子节点全部都是需要传输的数据。所以HELLO通过哈夫曼编码后就会变成:

        一共占据50位。

        综合以上内容,可以总结以下知识点:

  • 需要传输的数据都是作为叶子节点存在的
  • 按照频率从低到高进行排序
  • 再满足哈夫曼树的基础上,尽量让二叉树满足平衡二叉树的结构,使得数据更加简洁地进行排序,相关平衡二叉树可以查看:【数据结构】十分钟透彻了解各种二叉树的基础概念​​​​​​​

相关文章:

  • C++获取系统毫秒级时间(自1970年1月1日至今的毫秒数)
  • redis的详解和项目应用之PHP操作总结
  • 阿里、滴滴、华为等一线互联网分布式消息中间件:RocketMQ核心笔记
  • PostgreSQL的学习心得和知识总结(六十四)|关于PostgreSQL数据库 图式搜索(graph search)及递归查询 的场景说明
  • AI智能安防监控视频播放卡顿的原因排查与分析
  • 荧光染料Cy7 酰肼,Cy7 hydrazide,Cy7 HZ参数及结构式解析
  • OSPF——DR和BDR讲解
  • es的安装
  • 【SpringBoot】SpringBoot 读取配置文件中的自定义属性的 5 种方法
  • 前端的(typeScript)interface详解(个人学习用)
  • Android Studio应用基础,手把手教你从入门到精通(小白学习)总结2 之 常用界面布局和ListView
  • Flink Unaligned Checkpoint
  • 数据面最流行的工具包dpdk的前世-现在和未来
  • C++异步:asio的scheduler实现!
  • 跨境电商:YouTube视频营销必看攻略
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Android 控件背景颜色处理
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Java编程基础24——递归练习
  • SpriteKit 技巧之添加背景图片
  • VUE es6技巧写法(持续更新中~~~)
  • win10下安装mysql5.7
  • Windows Containers 大冒险: 容器网络
  • 包装类对象
  • 基于组件的设计工作流与界面抽象
  • 聊一聊前端的监控
  • 排序(1):冒泡排序
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 再谈express与koa的对比
  • ​VRRP 虚拟路由冗余协议(华为)
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #微信小程序(布局、渲染层基础知识)
  • %@ page import=%的用法
  • (编译到47%失败)to be deleted
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET命令行(CLI)常用命令
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @Autowired标签与 @Resource标签 的区别
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [.net] 如何在mail的加入正文显示图片
  • [20160902]rm -rf的惨案.txt
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [ACTF2020 新生赛]Upload 1
  • [Android]如何调试Native memory crash issue
  • [C#][DevPress]事件委托的使用
  • [Cocoa]iOS 开发者账户,联机调试,发布应用事宜
  • [c语言]小课堂 day2
  • [go] 迭代器模式