哈夫曼编码 / Huffman Encoding

4月 30, 2024·
Junhong Liu
Junhong Liu
· 1 分钟阅读时长

此程序为哈夫曼(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)