Huffman Implementation with Python
Huffman Implementation with Python
码表
| Token | Frequency |
|---|---|
| a | 10 |
| e | 15 |
| i | 12 |
| s | 3 |
| t | 4 |
| space | 13 |
| n | 1 |
生成 Huffman 编码
根据上面的码表,先生成 Huffman 树,然后生成 Huffman 编码。代码如下:
def binary_tree(val=None):
return [val, [], []]
def insert_left(root, branch):
root[1] = branch
def insert_right(root, branch):
root[2] = branch
def get_root_val(root):
return root[0]
def set_root_val(root, val):
root[0] = val
def get_left_child(root):
return root[1]
def get_right_child(root):
return root[2]
def is_leaf(root):
if len(get_left_child(root)) == 0 and len(get_right_child(root)) == 0:
return True
return False
def huffman(data):
while len(data) > 1:
data = sorted(data, key=lambda e: e[1])
root = binary_tree()
left = data.pop(0)
right = data.pop(0)
insert_left(root, left[0])
insert_right(root, right[0])
data.append((root, left[1] + right[1]))
return data[0][0]
def tree2code(root, code, plan):
if is_leaf(root):
plan[get_root_val(root)] = code
else:
tree2code(get_left_child(root), code+'0', plan)
tree2code(get_right_child(root), code+'1', plan)
def build_data(d):
l = list()
for pair in d.items():
root = binary_tree(pair[0])
l.append((root, pair[1]))
return l
if __name__ == '__main__':
d = {'a':10, 'e':15, 'i':12, 's':3, 't':4, 'space':13, 'n':1}
l = build_data(d)
tree = huffman(l)
plan = dict()
tree2code(tree, str(), plan)
print(plan)
运行结果得到
{'i': '00', 'space': '01', 'e': '10', 't': '1100', 'n': '11010', 's': '11011', 'a': '111'}
结果分析
根据文献[1],可以知道当前的解是最好结果。
Bibliography
[1] 《数据结构与算法分析——C语言描述》 机械工业出版社
Huffman Implementation with Python的更多相关文章
- Tree Implementation with Python
Tree Implementation with Python List of List 代码如下: def binary_tree(val): return [val, [], []] def in ...
- [Data Structure] Stack Implementation in Python
We can realize a Stack as an adaptation of a Python List. S.push(e)=L.append(e) S.pop()=L.pop() S.to ...
- naive cube implementation in python
这篇论文中提到的naive cube算法的实现,python写出来真的就和伪代码差不多=.= 输入大约长这样,依次是 index userid country state city topic cat ...
- [Data Structure] Linked List Implementation in Python
class Empty(Exception): pass class Linklist: class _Node: # Nonpublic class for storing a linked nod ...
- 【数据压缩】Huffman编码
1. 压缩编码概述 数据压缩在日常生活极为常见,平常所用到jpg.mp3均采用数据压缩(采用Huffman编码)以减少占用空间.编码\(C\)是指从字符空间\(A\)到码字表\(X\)的映射.数据压缩 ...
- Python框架、库以及软件资源汇总
转自:http://developer.51cto.com/art/201507/483510.htm 很多来自世界各地的程序员不求回报的写代码为别人造轮子.贡献代码.开发框架.开放源代码使得分散在世 ...
- Awesome Python
Awesome Python A curated list of awesome Python frameworks, libraries, software and resources. Insp ...
- Machine and Deep Learning with Python
Machine and Deep Learning with Python Education Tutorials and courses Supervised learning superstiti ...
- Understanding Asynchronous IO With Python 3.4's Asyncio And Node.js
[转自]http://sahandsaba.com/understanding-asyncio-node-js-python-3-4.html Introduction I spent this su ...
随机推荐
- Maven中的-D(Properties属性)和-P(Profiles配置文件)
-D代表(Properties属性) 使用命令行设置属性-D的正确方法是: mvn -DpropertyName=propertyValue clean package 如果propertyName不 ...
- cocos2d JS 艺术字特殊符号的显示
this.setSocreAtion(score, this.tfMoneyList[index],mun); //传入分数与对象,调用下面的函数 setSocreAtion : function ( ...
- xml文档对象模型doc
对与DOM来说 ,一切都是节点Node; ②Document可以看成一个节点,Element可以看成一个节点,Text可以看成一个节点, 封装出来的对象都可以看成节点Node; ③在JDK中,Node ...
- /usr/lib/python2.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.22) or chardet (2.2.1) doesn't match a supported version!
/usr/lib/python2.7/site-packages/requests/ __init__.py:91: RequestsDependencyWarning: urllib3(1.22)或 ...
- UML学习笔记(五)--顺序图
顺序图是用来描述对象自身及对象间信息传递顺序的视图.它用来表示用例中的行为顺序.当执行一个用例行为时,顺序图中的每条消息对应了一个类操作或状态机中引起转换的触发事件.它着重显示了参与相互作用的对象和所 ...
- VS 星期作业 if else的应用 做一个受不受异性欢迎的小程序
static void Main(string[] args) { //漏掉代码 输入错误 进行提示! string T1, T2, T3, T4, T5, T6, T7, T8, T9, T10=& ...
- 如何控制TextBox的最打输入字符的长度
TextBox控件本身有个maxlength属性,它可以限制TextBox中输入字符的最大长度,所以在只有字符输入的情况下,该属性可以很好的帮助我们达到限制输入长度的目的. 但如果输入包含中文或中英文 ...
- linux如何在不重新登录用户的情况下使用户加入的组生效
这个问题在很早之前就遇到了,之前的解决方法是登出用户再登录用户.今天在配置virtualbox的过程中又遇到了同样的问题.于是又进行了一番搜索. 找到了如下答案: https://stackoverf ...
- 关于 LD_LIBRARY_PATH 这个环境变量
这个变量中可以保存linux寻找库时搜索的路径,按照一篇文章中的介绍,不应该设置这个变量.文章的重点如下: 1. 不要设置这个变量. 2. Solaris中,在编译时,使用 -L 选项指定编译时库的搜 ...
- 在lnmp1.3布置的web服务器上运行thinkphp3.2.3项目pathinfo路径模式
通过我的经历希望能给大家带来一些帮助: 我是在Linux系统上通过https://lnmp.org/install.html设置Nginx服务器,使用的是lnmp1.3版本,之后将一个thinkphp ...