Python实现的哈夫曼编码

Python实现的哈夫曼编码,第1张

概述Python实现的哈夫曼编码

下面是内存溢出 jb51.cc 通过网络收集整理的代码片段。

内存溢出小编现在分享给大家,也给大家做个参考。

#Coding:utf-8import structcodeDict={}#全局字典key=字符,value=数字encodeDict={}filename=NoneListForEveryByte=[]class Node:    def __init__(self,right=None,left=None,parent=None,weight=0,charcode=None):        self.right=right        self.left=left        self.parent=parent        self.weight=weight        self.charcode=charcode#按权值排序def sort(List):    return sorted(List,key=lambda node:node.weight)#构建哈夫曼树def Huffman(listofNode):    listofNode=sort(listofNode)    while len(listofNode)!=1:        a,b = listofNode[0],listofNode[1]        new=Node()        new.weight,new.left,new.right = a.weight + b.weight,a,b        a.parent,b.parent = new,new        listofNode.remove(a),listofNode.remove(b)        listofNode.append(new)        listofNode=sort(listofNode)    return listofNodedef inputfile():    global filename    global  ListForEveryByte    filename=raw_input("请输入要压缩的文件:")    global  codeDict    with open(filename,'rb') as f:        data=f.read()        for Byte in data:            codeDict.setdefault(Byte,0) #每个字节出现的次数默认为0            codeDict[Byte]+=1            ListForEveryByte.append(Byte)def outputCompressedfile():    global  ListForEveryByte    fileString=""    with open(filename.split(".")[0]+".jbj","wb") as f:        for Byte in ListForEveryByte:            fileString+=encodeDict[Byte]  #构成一个长字符序列        leng=len(fileString)        more=16-leng%16        fileString=fileString+"0"*more          #空位用0补齐        #print(fileString)        leng=len(fileString)        i,j=0,16        while j<=leng:            k=fileString[i:j]            a=int(k,2)            #print(a)           # print(repr(struct.pack(">H",a)))            f.write(struct.pack(">H",a))           # f.write(str(a))            i=i+16            j=j+16def encode(head,listofNode):    global  encodeDict    for e in listofNode:        ep=e        encodeDict.setdefault(e.charcode,"")        while ep!=head:            if ep.parent.left==ep:                encodeDict[e.charcode]="1"+encodeDict[e.charcode]            else:                encodeDict[e.charcode]="0"+encodeDict[e.charcode]            ep=ep.parentif __name__ == '__main__':    inputfile()    listofNode=[]    for e in codeDict.keys():        listofNode.append(Node(weight=codeDict[e],charcode=e))    head=Huffman(listofNode)[0]    #构建哈夫曼树,head称为树的根节点    encode(head,listofNode)    for i in encodeDict.keys():         print(i,encodeDict[i])    #outputCompressedfile()

以上是内存溢出(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

总结

以上是内存溢出为你收集整理的Python实现的哈夫曼编码全部内容,希望文章能够帮你解决Python实现的哈夫曼编码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1199191.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存