python哈夫曼编码注意_Python的Huffman编码的实现

编程,一扯到算法的问题,就容易混乱,毕竟人的思维和计算机的思维,有时候转换起来总会觉得什么地方不对劲。huffman算法写过很多次了,但有时候自己也总是会被搞混了,最近学了个新语言--python,所以自己也稍微尝试了一下。

class HuffmanItem:

item = ""

value = 0

marked = False

code = ""

left = -1

right = -1

def __init__(self,item="",value=0):

self.item = item

self.value = value

class Huffman:

arr = []

result = []

def __init__(self):

self.initArr()

def initArr(self):

self.addItem("a",15)

self.addItem("b",7)

self.addItem("c",6)

self.addItem("d",6)

self.addItem("e",5)

def addItem(self,item,value):

if item and value > 0:

self.arr.append(HuffmanItem(item,value))

def initResult(self):

for i in self.arr:

self.result.append(i)

for i in range(len(self.arr),2*len(self.arr)-1):

self.result.append(HuffmanItem())

def clearItem(self):

self.arr = []

self.result = []

def getMinItem(self):

index = 0

value = 0

item = ""

for i in range(len(self.result)):

if not self.result[i].marked and self.result[i].value > 0:

if value == 0 or self.result[i].value < value:

index = i

value = self.result[i].value

item = self.result[i].item

self.result[index].marked = True

#print [index,value,item]

return [index,value,item]

def calcHuffman(self):

index = len(self.arr)

self.initResult()

while index < len(self.result):

ret1 = self.getMinItem()

left = ret1[0]

value1 = ret1[1]

item1 = ret1[2]

ret2 = self.getMinItem()

right = ret2[0]

value2 = ret2[1]

item2 = ret2[2]

self.result[index].item = item1+item2

self.result[index].value = value1+value2

self.result[index].left = left

self.result[index].right = right

index += 1

def huffmanCoding(self,index,code):

self.result[index].code += code

left = self.result[index].left

right = self.result[index].right

if left >= 0:

self.huffmanCoding(left,self.result[index].code+"0")

if right >= 0:

self.huffmanCoding(right,self.result[index].code+"1")

def printResult(self):

self.calcHuffman()

index = len(self.result)

self.huffmanCoding(index-1,"")

info = ""

count = 0

for i in range(len(self.arr)):

item =self.result[i]

info += "{%s,%d,huffmanCode:%s} " \

%(item.item,item.value,item.code)+"\r\n"

count += 1

print info

self.clearItem()

Huffman().printResult()

代码粘贴完了,说说自己的对这个算法的感悟吧,首先是在原有数组(长度为n)的基础上构造一个新数组(长度为2n-1)。这个新数组的前n个元素和原有数组完全一致,后面的n-1个元素初始化为空。然后还需要有一个从新数组中还没被标记的元素中筛选出最小元素的方法,调用该方法两次,选择出两个所谓的最小值元素,用这两个元素构造出一个新元素,把新元素填充到新数组的最后面,同时该新元素也成为了一个可以被筛选的对象,那两个最小值元素也成为了该新元素的左右孩子。依次循环到不能再进行选择了,新数组也就构造完成了。之后就可以从最后一个元素开始,对所有的元素进行huffman编码了,这里就是一个递归的操作,可以看代码理解,说起来会比较啰嗦。

总结:本不太习惯在网上写博客,印象中好像这应该是第一篇博文,而且还是用比较繁琐的语言在说这历史悠久的huffman编码,其中主要也是由于自己不喜欢用伪代码的方式描述,而且自己的所感所悟,也更倾向于用文字去阐述,哪怕是讲算法,哪怕是文字显得很乏味。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值