一般来说,霍夫曼编码是二进制的,但是非二进制的也可以。本文中,通过修改N,可以得到任意进制的霍夫曼编码。
非二进制编码的作用:例如,设计九键输入法,希望根据拼音的概率来编码,常用的拼音分配较短的编码。这时,需要使用九进制霍夫曼编码,N=9。
代码如下:
a1=[[63,[['澳门','']]],[5000,[['广西','']]],[100,[['香港','']]],[76,[['澳门','']]]
]data='''广东 11346
山东 10047
河南 9605
四川 8341
江苏 8051
河北 7556
湖南 6899
安徽 6324
湖北 5917
浙江 5737
广西 4926
云南 4830
江西 4648
辽宁 4359
福建 3941
陕西 3864
黑龙江 3773
山西 3718
贵州 3600
重庆 3102
吉林 2704
甘肃 2637
内蒙古 2491
新疆 2487
上海 2424
台湾 2359
北京 2154
天津 1560
海南 934
香港 745
宁夏 688
青海 603
西藏 335
澳门 63
'''#用正则表达式获取数据
#a[i][0]是概率,a[i][1]是个数组,记录着符号和编码的关系
import re
ret=re.findall(r'(.+)\t(.+)',data)
a=[]
for x in ret:a.append([int(x[1]),[[x[0],'']]])#用N=9表示九进制
N=2
while len(a)>1:#按第一列排序,小的在前面a.sort()for i in range(min(N,len(a))):for x in a[i][1]:x[1]=str(i)+x[1]for i in range(1,min(N,len(a))):a[0][0]+=a[i][0]a[0][1]+=a[i][1]del a[1:min(N,len(a))]#显示结果
for x in a[0][1]:print(x[0],'\t',x[1])
代码解释:
a1是个示例,不参与运算。
data是符号和概率,用制表符和换行符分割。
然后,用正则表达式获取data到a,a的结构要看清。
算法的主体,是先排序,选出概率最小的N项,合并成1项。合并的过程中,概率相加,符号相连。
最后显示结果。
本算法没有创建树状结构,而是通过字符串运算来完成的。
修改N=9,即得到九进制编码结果。