python实现huffman编码_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

原文链接:https://blog.csdn.net/wo_renshen/article/details/111992426

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值