huffman编码python实现
//ns是根据频率排序后的node列表
//tree是根据ns生成的Huffman树(用元组表示的树),tree就是node
//node -->(frequency,symbol)
//hc是遍历树产生的Huffman编码列表
def huffman(frs):
ns=sorted([(x,y) for (y,x) in frs])
tree=make_tree(ns)
hc=traverse_tree(tree)
return sorted(hc)
//当ns中不止一个node时,把前两个node的频率加起来,
//创建包含原来的两个node的新node,
//然后插入剩下的列表中,递归,当ns中只剩一个元素时,这个元素就是最后的Huffman树
def make_tree(ns):
if len(ns)!=1:
(f1,s1),(f2,s2),*tail=ns
h=(f1+f2,((f1,s1),(f2,s2)))
nsr=insert(h,tail)
return make_tree(nsr)
else:
return ns[0]
def insert(h,tail):
for i in range(len(tail)):
if h[0]<tail[i][0]:
return (*tail[0:i],h,*tail[i:])
return (*tail,h)
def traverse_tree(tree):
return traverse_t(tree,'')
def traverse_t(tree,code):
F,S=tree
if type(S) != tuple:
return [(S,code)]
else:
Left,Right=S
hc1 = traverse_t(Left ,code+'0')
hc2 = traverse_t(Right,code+'1')
return [*hc1,*hc2]
>>> huffman([('A', 2), ('B', 4), ('C', 1), ('D', 1)])
[('A', '10'), ('B', '0'), ('C', '110'), ('D', '111')]