Python实现huffman编码

Huffman树建立,右大左小
如arr = [(‘a’,15),(‘b’,8),(‘c’,6),(‘e’,5),(‘e’,3),(‘f’,1)]

  • Step1:根据values排序,生成:[(‘a’,15),(‘b’,8),(‘c’,6),(‘e’,5),(‘e’,3),(‘f’,1)]。
  • Step2: e,f值最小,从arr中取出,作左右孩子节点,e+f =4作为父节点(p1)。更新arr,重新排序;arr =[(‘a’,15),(‘b’,8),(‘c’,6),(‘e’,5),(‘p1’,4)]
  • Step3: 重复step2, b和p1值最小,作为左右孩子,e+p1 =9作为父节点(p2)。更新arr,重新排序;arr =[[(‘a’,15),(‘p2’,9),(‘b’,8),(‘c’,6)]

  • 在这里插入图片描述
class Node():
    def __init__(self,name=None,value=None):
        self.name = name 
        self.value = value
        self.right = None
        self.left = None
class HuffmanTree():
    def __init__(self,arr):
        self.nodes = [Node(values[0],values[1]) for values in arr] #每个值生成node
        while len(self.nodes)!= 1: #第一个作为root,所以不等于1
            self.nodes.sort(key =lambda node:node.value, reverse= True) #step1
            # step2  
            p = Node(value = (self.nodes[-1].value + self.nodes[-2].value)) #作为父节点
            p.left = self.nodes.pop(-1)
            p.right = self.nodes.pop(-1)
            self.nodes.append(p)
        self.root = self.nodes[0]

        self.Code = list(range(10)) #用于储存编码的code,长度比数深度大就行

    #生成Huffman编码
    def HuffmanCode(self,tree,length):
        node = tree
        if (not node):
            return 
        elif node.name:
            result = str(node.name)+'的编码为:'
            for i in range(length):
                result += str(self.Code[i])
            print(result)
            return
        self.Code[length] = 0
        self.HuffmanCode(tree.left,length +1)
        self.Code[length] = 1
        self.HuffmanCode(tree.right,length+1)
    def GenCode(self):
        self.HuffmanCode(self.root,0)
if __name__=='__main__':
     arr = [('a',15),('b',8),('c',6),('e',5),('e',3),('f',1)]
     tree=HuffmanTree(arr)
     tree.GenCode()
     
输出:
a的编码为:0
f的编码为:1000
e的编码为:1001
e的编码为:101
c的编码为:110
b的编码为:111
     
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值