Huffman算法基本步骤(离散数学p336):
给定实数w1,w2,.....,wt.
1.作t片树叶,分别以w1,w2,...,wt为权。
2.在所有入度为0的顶点(不一定是树叶)中选出两个权最小的顶点,添加一个新分支点,它以这2个顶点为儿子,其权等于这2个儿子的权之和.
3.重复2,直到只有1个入度为0的顶点为止。
W(T)等于所有分支点的权之和。
Huffman算法是求最优二叉树的一种算法,利用求得的最优二叉树可以获得2元前缀码。
算法原理不是很难,利用python中的networkx库可以轻松解决。
一·通过给定的权值生成最优二叉树
利用networkx中的各种函数翻译出来即可。就是要注意一下用合适的pos进行画图,不然画出来的根本看不懂。使用multipartite_layout参数可以将节点按subset属性自动对齐。
import networkx as nx
import matplotlib.pyplot as plt
def Huffman(w): #w为权值列表
g = nx.DiGraph()
l = 0
for i in w:
g.add_node(l, weight=i,checker=0,parent=0)
l = l + 1
#生成所有树叶,权值为所给权值
listw = w
listw.sort()
while len(listw) >= 2:
w0 = listw[0]
w1