博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
哈夫曼树构造
阅读量:4484 次
发布时间:2019-06-08

本文共 2417 字,大约阅读时间需要 8 分钟。

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""Created on Fri Jul 27 18:08:26 2018@author: luogan"""# 树节点类构建class TreeNode(object):    def __init__(self, data):        self.val = data[0]        self.priority = data[1]        self.leftChild = None        self.rightChild = None        self.code = ""# 创建树节点队列函数def creatnodeQ(codes):    q = []    for code in codes:        q.append(TreeNode(code))    return q# 为队列添加节点元素,并保证优先度从大到小排列def addQ(queue, nodeNew):    if len(queue) == 0:        return [nodeNew]    for i in range(len(queue)):        if queue[i].priority >= nodeNew.priority:            return queue[:i] + [nodeNew] + queue[i:]    return queue + [nodeNew]# 节点队列类定义class nodeQeuen(object):    def __init__(self, code):        self.que = creatnodeQ(code)        self.size = len(self.que)    def addNode(self,node):        self.que = addQ(self.que, node)        self.size += 1    def popNode(self):        self.size -= 1        return self.que.pop(0)# 各个字符在字符串中出现的次数,即计算优先度def freChar(string):    d ={}    for c in string:        if not c in d:            d[c] = 1        else:            d[c] += 1    return sorted(d.items(),key=lambda x:x[1])# 创建哈夫曼树def creatHuffmanTree(nodeQ):    while nodeQ.size != 1:        node1 = nodeQ.popNode()        node2 = nodeQ.popNode()        r = TreeNode([None, node1.priority+node2.priority])        r.leftChild = node1        r.rightChild = node2        nodeQ.addNode(r)    return nodeQ.popNode()codeDic1 = {}codeDic2 = {}# 由哈夫曼树得到哈夫曼编码表def HuffmanCodeDic(head, x):    global codeDic, codeList    if head:        HuffmanCodeDic(head.leftChild, x+'0')        head.code += x        if head.val:            codeDic2[head.code] = head.val            codeDic1[head.val] = head.code        HuffmanCodeDic(head.rightChild, x+'1')# 字符串编码def TransEncode(string):    global codeDic1    transcode = ""    for c in string:        transcode += codeDic1[c]    return transcode# 字符串解码def TransDecode(StringCode):    global codeDic2    code = ""    ans = ""    for ch in StringCode:        code += ch        if code in codeDic2:            ans += codeDic2[code]            code = ""    return ans# 举例string = "AAGGDCCCDDDGFBBBFFGGDDDDGGGEFFDDCCCCDDFGAAA"t = nodeQeuen(freChar(string))tree = creatHuffmanTree(t)HuffmanCodeDic(tree, '')print(codeDic1,codeDic2)a = TransEncode(string)print(a)aa = TransDecode(a)print(aa)print(string == aa)

转载于:https://www.cnblogs.com/luoganttcc/p/10525357.html

你可能感兴趣的文章
document
查看>>
Hadoop下大矩阵乘法Version2
查看>>
iPhone内存溢出——黑白苹果
查看>>
Struts2学习笔记(十二) 类型转换(Type Conversion)(下)
查看>>
tcpdump学习
查看>>
局域网内传输文件速度慢
查看>>
Linux的核心版本(摘抄)
查看>>
CASE表达式
查看>>
后缀自动机
查看>>
zkw线段树
查看>>
asp.net中导出Excel的方法
查看>>
[转]跟紧时代,让你的设计更加popular
查看>>
作业1226
查看>>
mainline.js主线
查看>>
fseek()
查看>>
Python学习笔记——PyQt控件中文字居中显示
查看>>
JAVA环境下利用solrj二次开发SOlR搜索的环境部署常见错误
查看>>
Beta阶段敏捷冲刺前准备
查看>>
mini web框架-3-替换模板
查看>>
Siamese Network简介
查看>>