Python之----Huffman 哈夫曼编码的实现

1、哈夫曼树, 即带权路径最小的树, 权值最小的结点远离根结点, 权值越大的结点越靠近根结点:
在这里插入图片描述
2、简单介绍完原理,我们来看这个实现:

# 哈夫曼编码字典(键为字母,值为编码)
codeDic = {}

# 树节点类构建
class TreeNode(object):
    def __init__(self, data):
        self.val = data[0]
        self.priority = data[1]
        self.leftChild = None
        self.rightChild = None
        self.code = ""
    
# 创建树节点队列函数
def creatnodeQ(codes):
    q = []
    for code in codes:
        q.append(TreeNode(code))
    return q

# 为队列添加节点元素,并保证优先度从大到小排列
def addQ(queue, nodeNew):
    if len(queue) == 0:
        return [nodeNew]
    for i in range(len(queue)):
        if queue[i].priority >= nodeNew.priority:
            return queue[:i] + [nodeNew] + queue[i:]
    return queue + [nodeNew]

# 节点队列类定义
class nodeQeuen(object):
    def __init__(self, code):
        self.que = creatnodeQ(code)
        self.size = len(self.que)
    def addNode(self,node):
        self.que = addQ(self.que, node)
        self.size += 1
    def popNode(self):
        self.size -= 1
        return self.que.pop(0)

# 各个字符在字符串中出现的次数,即计算优先度
def freChar(string):
    d ={}
    for c in string:
        if not c in d:
            d[c] = 1
        else:
            d[c] += 1
    return sorted(d.items(),key=lambda x:x[1])

# 创建哈夫曼树
def creatHuffmanTree(nodeQ):
    while nodeQ.size != 1:
        node1 = nodeQ.popNode()
        node2 = nodeQ.popNode()
        r = TreeNode([None, node1.priority+node2.priority])
        r.leftChild = node1
        r.rightChild = node2
        nodeQ.addNode(r)
    return nodeQ.popNode()
 
# 由哈夫曼树得到哈夫曼编码表
def HuffmanCodeDic(head, x):
    global codeDic, codeList
    if head:
        HuffmanCodeDic(head.leftChild, x+'0')
        head.code += x
        if head.val:
            codeDic[head.val] = head.code
        HuffmanCodeDic(head.rightChild, x+'1')
    
# 字符串编码
def TransEncode(string):
    global codeDic
    transcode = ""
    for c in string:
        transcode += codeDic[c]
    return transcode

if __name__ == '__main__':
    str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    t = nodeQeuen(freChar(str))
    tree = creatHuffmanTree(t)
    HuffmanCodeDic(tree, '')
    print("哈夫曼编码如下:\n", codeDic)
    print("原字符串为:\n", str)
    a = TransEncode(str)
    print("经哈夫曼编码转换后如下:", a)

3、这是编译结果

哈夫曼编码如下:
 {'Y': '0000', 'Z': '0001', 'W': '0010', 
 'X': '0011', 'A': '0100', 'B': '0101', 
 'E': '01100', 'F': '01101', 'C': '01110', 
 'D': '01111', 'Q': '10000', 'R': '10001',
 'O': '10010', 'P': '10011', 'U': '10100',
 'V': '10101', 'S': '10110', 'T': '10111',
 'I': '11000', 'J': '11001', 'G': '11010',
 'H': '11011', 'M': '11100', 'N': '11101',
 'K': '11110', 'L': '11111'}
原字符串为:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
经哈夫曼编码转换后如下:
01000101011100111101100011011101011011110
00110011111011111111001110110010100111000
010001101101011110100101010010001100000001
  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼_翻身

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值