【python】霍夫曼树

本文介绍了一种基于霍夫曼树的编码方法实现过程。通过定义节点类和霍夫曼树类,采用递归方式生成霍夫曼编码。文章详细展示了如何构建霍夫曼树并为每个字符分配最优前缀编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 节点类
class Node:
    def __init__(self, name=None, value=None):
        self._name = name
        self._value = value
        self._left = None
        self._right = None

# 霍夫曼树类
class HuffmanTree:

    # 根据Huffman树的思想:以叶子节点为基础,根据value排序,反向创建Huffman树
    def __init__(self, char_weights):
        self.a = [Node(key, value) for key, value in dict.items()]
        while len(self.a) != 1:
            self.a.sort(key=lambda node: node._value, reverse=True)
            c = Node(value=(self.a[-1]._value + self.a[-2]._value))
            c._left = self.a.pop(-1)
            c._right = self.a.pop(-1)
            self.a.append(c)
        self.root = self.a[0]
        self.b = list(range(20))

    # 递归的思想生成编码
    def pre(self, tree, length):
        node = tree
        if (not node):
            return

        elif node._name :
            str_num = ""
            for i in range(length):
                str_num += str(self.b[i]) + " "
            print(node._name + '编码为:',str_num)
            return

        self.b[length] = 0
        self.pre(node._left, length+1)

        self.b[length] = 1
        self.pre(node._right, length+1)

    # 生成霍夫曼编码
    def get_code(self):
        self.pre(self.root, 0)


if __name__ == '__main__':

    dict = {"a": 9, "b": 12, "c": 6, "d": 3,"e":5, "f": 15}
    tree = HuffmanTree(dict)
    tree.get_code()

 

输出结果

a编码为: 0 0 
b编码为: 0 1 
c编码为: 1 0 0 
d编码为: 1 0 1 0 
e编码为: 1 0 1 1 
f编码为: 1 1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值