Huffman实现对26个英文字母的编码
题目:应用Huffman编码实现对26个字母的编码。已知各字母出现频率如下图所示:
以下是生成霍夫曼树的一个示例:
- 利用字符集中每个字符的使用频率作为权值构造一个哈夫曼树;
- 从根结点开始,为到每个叶子结点路径上的左分支赋予0,右分支赋予1,并从根到叶子方向形成该叶子结点的编码。
用 python 实现上述题目中的要求:
#树节点类构建
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_possibility] #根据输入的字符及其频率生成节点
while len(self.Leav)!=1:
self.Leav.sort(key=lambda node:node._value,reverse=True) # 逆向排序
c=Node(value=(self.Leav[-1]._value+self.Leav[-2]._value)) # 以最小两个结点的值相加成为新节点
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_possibility=[('A',7.25),('B',1.25),('C',3.5),('D',4.25),('E',12.75),('F',3),('G',2),('H',3.5),('I',7.75),('J',0.25),('K',0.5),('L',3.75),('M',2.75),('N',7.75),('O',7.5),('P',2.75),('Q',0.5),('R',8.5),('S',6),('T',9.25),('U',3),('V',1.5),('W',1.5),('X',0.5),('Y',2.25),('Z',0.25)]
tree=HuffmanTree(char_possibility)
tree.get_code()
最后得到 26个字母 编码结果如下所示:
符号 | 频率 | 分配的代码 | 码长 |
---|---|---|---|
A | 7.25 | 1010 | 4 |
B | 1.25 | 001100 | 6 |
C | 3.5 | 10011 | 5 |
D | 4.25 | 0010 | 4 |
E | 12.75 | 011 | 3 |
F | 3 | 10000 | 5 |
G | 2 | 11010 | 5 |
H | 3.5 | 10010 | 5 |
I | 7.75 | 1101 | 4 |
J | 0.25 | 100011101 | 9 |
K | 0.5 | 10001101 | 8 |
L | 3.75 | 11100 | 5 |
M | 2.75 | 01000 | 5 |
N | 7.75 | 1100 | 4 |
O | 7.5 | 1011 | 4 |
P | 2.75 | 00111 | 5 |
Q | 0.5 | 10001100 | 8 |
R | 8.5 | 1111 | 4 |
S | 6 | 0101 | 4 |
T | 9.25 | 000 | 3 |
U | 3 | 01001 | 5 |
V | 1.5 | 100010 | 6 |
W | 1.5 | 001101 | 6 |
X | 0.5 | 10001111 | 8 |
Y | 2.25 | 111011 | 6 |
Z | 0.25 | 100011100 | 9 |