1.减少编码的冗余,实现图像压缩。
2. huffman编码可以实现小概率数据用长码,大概率数据用短码,使得每个数据都能被唯一标识,即每一个信源符号都可被映射为一个固定的编码符号序列。
实现思路:
class Node(object):
def __init__(self,name=None,value=None):
self._name=name
self._value=value
self._left=None
self._right=None
注意我们这里以倒序的方式建立树
将他们的value之和给一个新创立的节点,该新节点的左右节点就是这两个,并将他们移除该数组,新创立的节点进该数组(末尾添加)。
注意一下此时的新节点他没有名字,就连root根节点也没有名字,因为它只是中间节点不是叶子节点,叶子结点即预先给定的数才有名字。这在对生成树进行huffman编码中可以体现该作用
def __init__(self,char_weights):
self.Leav=[Node(part[0],part[1]) for part in char_weights]
#根据输入的字符及其频数生成节点
while len(self.Leav)!=1:
#当reverse不为true时(默认为false),sort就是从小到大输出
#因为要排序的是结构体里面的某个值,所以要用参数key
#lambda是一个隐函数,是固定写法
self.Leav.sort(key=lambda node:node._value,reverse=True)
c=Node(value=(self.Leav[-1]._value+self.Leav[-2]._value))
#数组pop默认删除最后一个元素,参数为-1可加可不加,并返回该值
c._left=self.Leav.pop(-1)
c._right=self.Leav.pop(-1)
#在数组最后添加新对象
self.Leav.append(c)
#最后一个节点作为根节点
self.root=self.Leav[0]
self.Buffer=list(range(10))
主要思想就是利用递归,循环调用函数,实现编码。
class Node(object):
def __init__(self,name=None,value=None):
self._name=name
self._value=value
self._left=None
self._right=None
class HuffmanTree(object):
#根据Huffman树的思想:以节点为基础,反向建立Huffman树
def __init__(self,char_weights):
self.Leav=[Node(part[0],part[1]) for part in char_weights]
#根据输入的字符及其频数生成节点
while len(self.Leav)!=1:
#当reverse不为true时(默认为false),sort就是从小到大输出
#因为要排序的是结构体里面的某个值,所以要用参数key
#lambda是一个隐函数,是固定写法
self.Leav.sort(key=lambda node:node._value,reverse=True)
c=Node(value=(self.Leav[-1]._value+self.Leav[-2]._value))
#数组pop默认删除最后一个元素,参数为-1可加可不加,并返回该值
c._left=self.Leav.pop(-1)
c._right=self.Leav.pop(-1)
#在数组最后添加新对象
self.Leav.append(c)
#最后一个节点作为根节点
self.root=self.Leav[0]
self.Buffer=list(range(10))
#用递归的思想生成编码
def pre(self,tree,length):
node=tree
if (not node):
return
elif node._name:
print (node._name + ' encoding:',end=''),
for i in range(length):
print (self.Buffer[i],end='')
print ('\n')
return
self.Buffer[length]=0
self.pre(node._left,length+1)
self.Buffer[length]=1
self.pre(node._right,length+1)
#生成哈夫曼编码
def get_code(self):
self.pre(self.root,0)
if __name__=='__main__':
#输入的是字符及其频数
char_weights=[('a',6),('b',4),('c',10),('d',8),('f',12),('g',2)]
tree=HuffmanTree(char_weights)
tree.get_code()