Huffman实现对26个英文字母的编码

Huffman实现对26个英文字母的编码

题目:应用Huffman编码实现对26个字母的编码。已知各字母出现频率如下图所示:

在这里插入图片描述
以下是生成霍夫曼树的一个示例:

  1. 利用字符集中每个字符的使用频率作为权值构造一个哈夫曼树;
  2. 从根结点开始,为到每个叶子结点路径上的左分支赋予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个字母 编码结果如下所示:

符号频率分配的代码码长
A7.2510104
B1.250011006
C3.5100115
D4.2500104
E12.750113
F3100005
G2110105
H3.5100105
I7.7511014
J0.251000111019
K0.5100011018
L3.75111005
M2.75010005
N7.7511004
O7.510114
P2.75001115
Q0.5100011008
R8.511114
S601014
T9.250003
U3010015
V1.51000106
W1.50011016
X0.5100011118
Y2.251110116
Z0.251000111009
  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值