huffman树和huffman编码,什么是huffman树

  huffman树和huffman编码,什么是huffman树

  目录0。太阳镜代码为1。二叉树的几个基本概念。路径1.2。路径长度1.3。节点权重1.4。节点加权路径长度1.5。树加权路径长度2。霍夫曼树构造3。代码实现(pythhhfman树)

  blog.csdn.net/Google 3359号1989年1月2日

  3359zh.wikipedia.org/wiki/Hoffman电码

  0.从粗心的太阳镜代码开始

  提出粗心太阳镜树是为了得到粗心太阳镜代码。相反,太阳镜编码是可逆数据压缩编码,采用变长二进制编码对符号数据进行编码。通过评估符号的出现概率来设计不同符号的码长。出现概率高的符号使用短码,出现概率低的符号使用长码。无心太阳镜码,在知道符号及其出现概率的前提下,被证明是最好的二进制编码方法。生成的粗心墨镜码的数据结构称为粗心墨镜树,是权重路径长度最小的二叉树,也称为最优二叉树。

  1.二叉树的基本概念1.1。从一个节点到另一个节点的路径

  1.2.路径长度路径上的边数

  1.3.节点权重节点上的权重值

  1.4.该节点的加权路径长度将从根节点到一个节点的路径长度乘以该节点的权重值。

  1.5.树的加权路径长度是所有叶节点的加权路径长度的总和

  2.构建Huffman树统计所有字符的频率,排序后的集合为S,如果S中的元素个数小于2,则完成S中频率最低的两个元素的提取,小元素为e1,大元素为e2,e1为左子,e2为右子,将它们的权重设置为各自的频率。然后做一个父节点e3,e3的权重设置为e1和e2之和。把e3放入S,排序,跳到23。代码实现(python),并参考https://朱兰进行优化。智假设输入和输出都是字符串。

  类别:

  classnode3360def_init_(self,frequency):self . left=none self . right=none self . father=none self . father

  # Count字符出现的频率,映射表def Count _ frequency(text):chars=[]ret=[]for charin text 3360 ifcharinchars:continue elss

  #通过创建叶子节点def create _ leaves (frequency list):为frequency _ list中的频率返回[node]frequency](在frequency _ list中)

  Huffman tree def create _ Huffman _ tree(leaves):queue=leaves[:]创建queue . sort(key=lambda item 360 item . freaves)的reverse=true(whilelen)队列13360 node _ left=queue . pop ather=node(node _ left . frequency node _ right . frequency))。node _ father . left=node _ left node _ father . right=node _ right node _ left . father=node _ father node _ right it ather . frequency queue[0]。frequency 3360 queue Node _ Father(ContinueforinRange(0,len _ queue) 3360IF Node _ Father获取Node _ Father的霍夫曼代码(breakqueue (0)。Father=noneturnqueue) 0)并获取{char:code}字典:

  # Huffman code是{ char:code } dictionary def Huffman _ encoding(leaves,root,获取char _ frequency中的频率:char _ to _ code[char]of char _ frequency)3360 char _ to _ code={ } ff man)= wh iii=root 3360 if leaf . is _ left(:char _ to _ code[char _ frequency[I][0]= 0 char _ to _ char]elsser

  对整个字符串进行编码的# defencode_str(text,char _ to _ code):ret= for char intext 3360 ret=char _ to _ code(char))

  # Decode def Decode _ str(Huffman _ str,char _ to _ code)整个字符串:ret= while Huffman _ str!=: i=0 for char,Code char _ to _ Code . items(:ifcodeinhuffman _ strand Huffman _ str . index)Code)==03:ret=char Huffman I请参考lankuohsing/datastructureinpython/blob/main/tree/binary _ tree/huf man _

  4.应用旨在量化AI模型的重量的太阳镜压缩代码可以减少存储空间和互联网下载延迟。在这种情况下,每个权重值都是一个整数(通常是int8),可以看作一个字符。

huffman树和huffman编码,什么是huffman树