SICP_Python版本:Hufuman编码
2016-07-29 21:40
363 查看
采用递归定义来构造hufuman树,且进行编码解码。
def make_leaf(symbol,weight): return ('leaf',symbol,weight) def is_leaf(obj): return obj[0]=='leaf' def weight_ofleaf(x):return x[2] def symbol_ofleaf(x):return x[1] def make_tree(left,right): return ('node',left,right,weight(left)+weight(right),symbols(left)+symbols(right)) def lefttree(t):return t[1] def righttree(t):return t[2] def symbols(t):return symbol_ofleaf(t) if is_leaf(t) else t[4] def weight(t): return weight_ofleaf(t) if is_leaf(t) else t[3] def dec(bits,tree): def decode_one(): nonlocal bits,tree,i node = tree while not is_leaf(node): if bits[i]=='0':node = lefttree(node) elif bits[i]=='1':node = righttree(node) else:assert(bits[i]=='0' or bits[i]=='1') i+=1 return symbol_ofleaf(node) i,n = 0,len(bits) res = [] while i<n:res.append(decode_one()) return res def create_set(l): u = sorted(l,key = lambda x:x[1]) return set([make_leaf(e[0],e[1]) for e in u]) sample_tree = make_tree(make_leaf('A',4),make_tree(make_leaf('B',2),make_tree(make_leaf('D',1),make_leaf('C',1)))) #print(dec('0110010101110',sample_tree)) def encode(message,tree): def encode_symbol(symbol,tree): if is_leaf(tree):return '' if symbol in symbols(lefttree(tree)):return '0'+encode_symbol(symbol,lefttree(tree)) else:return '1'+encode_symbol(symbol,righttree(tree)) if len(message)==0:return '' return encode_symbol(message[0],tree)+encode(message[1:],tree)
2.71很容易判断出来每次最小两个子树的权重和还是当前最小的,不改变原本的顺序。所以最频繁的用1个二进制,最不频繁的用n-1个二进制。
2.72这里需要稍微分情况看待问题:
(a):如果符号表利用了hash表,那么最频繁的编码复杂度始终是O(1),而最不频繁的是O(n)
(b):如果直接查找符号,那么最不频繁的应该是O(N),当然你可以构造树时总将权重较大的放在同一个位置(left or right),这样也就是O(1).如果随即放两个子树的位置,那么应该是O(n).
对于最频繁的来说T(N)=O(N)+O(N−1)+....O(1)=O(N2)
相关文章推荐
- 关于Python函数参数传递方式--值传递?引用传递!
- python3 fibonacci的高效解法
- 利用python进行数据分析-时间序列1
- Python语言100例
- 最坏情况为线性时间的选择算法之Python实现
- python入门笔记(1):lambda
- Python 机器学习 简单实现
- python 图像对比
- 制作基于pbr的python可发布package
- 用python对指定目录下的所有文件(夹)大小进行排序
- Python多进程编程
- 在mac上搭建python环境
- Python 数学运算
- python与mysql传递数据乱码问题
- Graphviz -图形可视化,python实现
- Python 'takes exactly 1 argument (2 given)' Python error
- python Web框架
- Python中self的含义
- Python NumPy入门归纳~持续更新
- Python 实战之列表(list)实战详解