详细图解哈夫曼Huffman编码树

1 引言

  哈夫曼(Huffman)编码算法是基于二叉树构建编码压缩结构的,它是数据压缩中经典的一种算法。算法根据文本字符出现的频率,重新对字符进行编码。因为为了缩短编码的长度,我们自然希望频率越高的词,编码越短,这样最终才能最大化压缩存储文本数据的空间。
  假设现在我们要对下面这句歌词“we will we will r u”进行压缩。我们可以想象,如果是使用ASCII码对这句话编码结果则为:119 101 32 119 105 108 108 32 119 101 32 119 105 108 108 32 114 32 117(十进制表示)。我们可以看出需要19个字节,也就是至少需要152位的内存空间去存储这些数据。
  很显然直接ASCII码编码是很浪费空间的,Unicode就更不用说了,下面我们先来统计一下这句话中每个字符出现的频率。如下表,按频率高低已排序:


这里写图片描述

2 哈夫曼二叉树构建

2.1 初始队列

  那么我们按出现频率高低将其放入一个优先级队列中,从左到右依次为频率逐渐增加。


这里写图片描述

  下面我们需要将这个队列转换成哈夫曼二叉树,哈夫曼二叉树是一颗带权重的二叉树,权重是由队列中每个字符出现的次数所决定的。并且哈夫曼二叉树始终保证权重越大的字符出现在越高的地方。

2.2 第一步合并

  首先我们从左到右进行合并,依次构建二叉树。第一步取前两个字符u和r来构造初始二叉树,第一个字符作为左节点,第二个元素作为右节点,然后两个元素相加作为新空元素,并且两者权重相加作为新元素的权重。


这里写图片描述

  同理,新元素可以和字符i再合并,如下:

这里写图片描述

2.3 重新调整队列

  上图新元素权重相加后结果是变大了,需要对权重进行重新排序。


这里写图片描述

  然后再依次从左到右合并,每合并一次则进行一次队列重新排序调整。如下:

这里写图片描述

  经过多步操作之后,得到以下的哈夫曼二叉树结构,也就是一个带有权重的二叉树:

这里写图片描述

2.4 哈夫曼编码

  有了上面带权重的二叉树之后,我们就可以进行编码了。我们把二叉树分支中左边的支路编码为0,右边分支表示为1,如下图:


这里写图片描述

  这样依次遍历这颗二叉树就可以获取得到所有字符的编码了。例如:‘ ’的编码为10,‘l’的编码为00,‘u’的编码为11100等等。经过这个编码设置之后我们可以发现,出现频率越高的字符越会在上层,这样它的编码越短;出现频率越低的字符越会在下层,编码越短。经过这样的设计,最终整个文本存储空间才会最大化的缩减。
  最终我们可以得到下面这张编码表:

这里写图片描述

2.5 字符串编码

  有了上面的编码表之后,”we will we will r u”这句重新进行编码就可以得到很大的压缩,编码表示为:01 110 10 01 1111 00 00 10 01 110 10 01 1111 00 00 10 11101 10 11100。这样最终我们只需50位内存,比原ASCII码表示节约了2/3空间,效果还是很理想的。当然现实中不是简单这样表示的,还需要考虑很多问题。

3 补充

  我们需要弄明白哈夫曼二叉树概念,它是带权路径达到最小的二叉树,也叫最优二叉树。它不一定是完全二叉树,也不一定是平衡二叉树,它们描述的完全不是一件事情,完全没有概念上的重叠关系。


  个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!
  转载请注明出处:http://blog.csdn.net/fx677588/article/details/70767446

### 刷入或安装Linux操作系统的准备 对于MDZ 06 AA设备而言,在其上刷入或安装Linux操作系统涉及多个重要环节。准备工作包括获取适合该硬件架构的定制化Linux镜像文件以及必要的驱动程序[^1]。 ### 进入并解锁Bootloader模式 由于提到的小米盒子启动流程是从启动BootLoader到加载Linux Kernel再到Android系统,如果目标是在此类似的设备即MDZ 06 AA主板上进行Linux系统的刷写,则需先确保能够进入BootLoader模式。通常情况下,这可能涉及到通过特定组合键或者命令行指令来实现。一旦成功进入了BootLoader界面,并按照制造商指导完成解锁过程(如果有锁定的话),就可以为后续的操作铺平道路。 ### 下载合适的Linux发行版映像 针对ARM架构设计的MDZ 06 AA板来说,不是所有的Linux版本都能兼容运行在其上面。因此建议寻找专门为这类平台优化过的Linux发行版,比如Armbian或者其他支持ARM处理器的社区维护版本。下载完成后应验证文件完整性以防止因传输错误而导致失败。 ### 使用工具烧录Linux映像至存储介质 获得正确的Linux映像之后,下一步便是利用专门软件如Etcher、Win32DiskImager等将其刻录到U盘或其他可引导媒体上去。注意选择与所选Linux版本相匹配的目标分区表类型(MBR/GPT)。另外还需确认使用的USB接口速度足够快以便减少等待时间。 ```bash sudo dd if=/path/to/linux.img of=/dev/sdX bs=4M status=progress && sync ``` 上述命令展示了如何在类Unix环境下直接使用`dd`命令将`.img`格式的Linux映像写入指定磁盘(请替换路径和设备名)。 ### 启动并配置新安装的Linux环境 当一切就绪后,重启MDZ 06 AA并将BIOS/UEFI设置更改为优先从外部媒介启动。顺利的话应该能看到新的Linux系统正在初始化过程中;根据提示完成初始设定工作——例如创建管理员账户、调整网络连接参数等等。最终移除临时安装源转而依赖内部闪存保存整个操作系统实例。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值