目录
- 一、哈夫曼树
- 二、哈夫曼编码
- 三、Python算法实现
- 四、作者Info
一、哈夫曼树
上图是根据“this is an example of a huffman tree”中得到的字母频率来建构的哈夫曼树
二、哈夫曼编码
多年来,哈夫曼编码在统计数据压缩方面是非常先进的,应当指出,主要原因可能是算术编码是有专利权的
哈夫曼编码的思想与 Samuel Morse(塞缪尔·摩尔斯)的一个非常相似,就是创建数据的稀疏表示
但是不像摩尔斯码,哈夫曼编码有独特的前缀,这可以消除对分隔符的需求,并且编码得到的结果只有一种解码方式。但他的缺点是任何一个比特的错误都有可能很容易地破坏消息的剩余部分
三、Python算法实现
from collections import Counter
def find_min(freq):
item = min(freq, key=lambda i: i[0])
freq.remove(item)
return item
def print_codes(tree, prefix=''):
if isinstance(tree, tuple):
print_codes(tree[0], prefix + '0')
print_codes(tree[1], prefix + '1')
else:
print(tree, prefix)
def huffman_codes(text):
freq = [(i, x) for x, i in Counter(text).items()]
while len(freq) > 1:
li, lx = find_min(freq)
ri, rx = find_min(freq)
freq.append((li + ri, (lx, rx)))
print_codes(freq.pop()[1])
huffman_codes('The reason why Mr. chen can succeed is that he is not only handsome but also wise')
注意:
-
min() 方法返回给定参数的最小值,参数可以为序列
-
lambda函数也叫匿名函数,使用lambda可以省去定义函数的过程,让代码更加精简
-
isinstance(object,classinfo) 函数来判断一个对象是否是一个已知的类型,类似
type()。其中object表示实例对象,而classinfo表示直接或间接类名、基本类型()或者由它们组成的元组。tuple表示元组。返回值为bool类型 -
Counter用于计数,调用它会返回一个key为列表的值,value为该值的具体个数的对象. items() 函数以列表返回可遍历的(键,值) 元组数组。
输出结果
如图所示,哈夫曼编码能用二进制的形式来代替出现的每一个字母,从而可以加密信息
四、作者Info
Author:小鸿的摸鱼日常,Goal:让编程更有趣!
专注于算法、爬虫,游戏开发,数据分析、自然语言处理,AI等,期待你的关注,让我们一起成长、一起Coding!
版权说明:本文禁止抄袭、转载,侵权必究!