哈夫曼编码 / Huffman Encoding
此程序为哈夫曼(Huffman)编码的Python实现
'''
All rights reserved by Liu Junhong
Reference books: 《信息论基础》
Completion time:2020-11-24
'''
import math
#程序说明
print("-------------------<哈夫曼编码>程序说明-------------------")
print("Designed by Junhong Liu:All rights reserved")
print("Reference books: 《信息论基础》、百度百科-哈夫曼编码 (https://baike.baidu.com/item/%E5%93%88%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81/1719730?fr=aladdin)")
print("Completion time:2020-11-24")
print("Last modification time :2020-11-25")
print("--------------------------------------------------------")
print("\n")
#*******录入数据
N_num = float(input("请输入需要编码字符个数:"))
while(N_num <= 0 or (N_num % 1)):
N_num = float(input("请输入正整数:"))
N_num = int(N_num)
Dict = []
Huffman_dict = {}
probability = 1
while(N_num > 0):
N_num = N_num-1
print("\n","------还需输入",N_num,"编码字符信息------")
print("\n","请输入一个编码字符名:")
name = str(input())
Huffman_dict.setdefault(name)
Huffman_dict[name] = ''
print("请输入小于",probability,"的对应编码字符概率:")
value = float(input())
probability = probability - value
Dict.append((value,[name]))
#按概率排序
Dict_order=sorted(Dict,reverse=False)
#编码算法
Dict_order_copy = Dict_order
Dict_order_copy_copy = []
while(len(Dict_order_copy)>1):
for i in range(int(len(Dict_order_copy)/2)):
if len(Dict_order_copy)-2*(i+1) == 1:
for j in Dict_order_copy[2*i][1]:
Huffman_dict[j] = '0' + Huffman_dict[j]
for j in Dict_order_copy[2*i+1][1]:
Huffman_dict[j] = '1' + Huffman_dict[j]
Dict_order_copy_copy.append((Dict_order_copy[2*i][0]+Dict_order_copy[2*i+1][0],Dict_order_copy[2*i][1]+Dict_order_copy[2*i+1][1]))
Dict_order_copy_copy.append((Dict_order_copy[len(Dict_order_copy)-1][0],Dict_order_copy[len(Dict_order_copy)-1][1]))
else:
for j in Dict_order_copy[2*i][1]:
Huffman_dict[j] = '0' + Huffman_dict[j]
for j in Dict_order_copy[2*i+1][1]:
Huffman_dict[j] = '1' + Huffman_dict[j]
Dict_order_copy_copy.append((Dict_order_copy[2*i][0]+Dict_order_copy[2*i+1][0],Dict_order_copy[2*i][1]+Dict_order_copy[2*i+1][1]))
Dict_order_copy = sorted(Dict_order_copy_copy,reverse=False)
Dict_order_copy_copy = []
#输出结果
print(Huffman_dict)