首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >哈夫曼树(Huffman Code)

哈夫曼树(Huffman Code)

作者头像
None_Ling
发布2019-05-31 10:23:52
发布2019-05-31 10:23:52
8410
举报
文章被收录于专栏:Android相关Android相关

定义

给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,则称之为最优二叉树,也就是哈夫曼树。

特点

  • 变长编码,压缩数据,减少数据量大小
  • 数据都存储在叶子节点,解码时不会出现重复编码的冲突
  • 根据数据的权重(出现频率)来决定编码,进一步压缩数据

使用场景

主要用于文件的不等长编码的无损压缩,如视频、文件等

构建Haffuman树

假如,有一个文件中有一串文本:hello,huffman,接着需要对该文件进行压缩。

在压缩前,文本使用ASCII进行编码,每一个字符都占用1个字节,8bit,那么写入文件后会占用13个字节,共占用104bit。

如果使用Huffuman编码进行压缩的话,会需要这几个步骤:

  1. 统计字符出现的次数,统计权重

字符

h

f

l

e

o

,

u

m

a

n

次数

2

2

2

1

1

1

1

1

1

1

  1. 根据权重构建Huffman树
  • 从权重最小的开始构建树的叶子节点,即an

构建A与N

  • 同样再构建权重排序后的最小的叶子节点,即um

构建U与M

  • 同理,构建O,的叶子节点

构建O与,

  • 接着开始找到权重最小的两个节点,也就是O,组成的子树以及E,来构建一个新的子树,然后再根据权重重新排序

构建O与,与E的子树

  • 接着按照权重再构建子树,也就是通过后两个子树构建新的子树

构建新子树

  • 同理构建FL的子树

构建F与L的子树

  • 最后,通过一层层子树的堆叠,就变成了以下的样子,而这就是最终的Huffman树

最优二叉树

  • 最终在树的左右子树中,加入01的编码,而对应的编码也就是Huffman编码。 部分编码如下:

字符

A

H

L

M

编码

0000

11

011

0011

由于所有的字符都在Huffman树的叶子节点上,所以编码与解码不会有冲突。

通过这棵编码树,就可以对文件进行编解码,来压缩与解压文件了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.05.27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 定义
  • 特点
  • 使用场景
  • 构建Haffuman树
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档