一、问题

利用二叉树的结构对Huffman树进行编码,实现最短编码

二、解决

 # 构建节点类
class TreeNode:
def __init__(self, data):
"""
:data is a tuple the first element is value and the second is priority
:param data:
"""
self.value = data[0]
self.priority = data[1]
self.left_child = None
self.right_child = None
self.code = "" # 创建树节点队列的函数
def create_node_queue(codes):
queue = []
for code in codes:
queue.append(TreeNode(code))
return queue # 在队列中间添加新的节点元素并保证优先度从大到小排列
def add_queue(queue, node_new):
if len(queue) == 0:
return [node_new]
for i in range(len(queue)):
if queue[i].priority >= node_new.priority:
return queue[:i] + [node_new] + queue[i:]
return queue + [node_new] # 节点队列类
class NodeQueue:
def __init__(self, code):
self.queue = create_node_queue(code)
self.size = len(self.queue) def add_node(self, node):
self.queue = add_queue(self.queue, node)
self.size += 1 def pop_node(self):
self.size -= 1
return self.queue.pop(0) # 各个字符在字符串中出现的次数 即计算优先度
def frequent_char(string_s):
store_d = {}
for c in string_s:
if c not in store_d:
store_d[c] = 1
else:
store_d[c] += 1
return sorted(store_d.items(), key=lambda x: x[1]) # 创建Huffman树
def create_huffman_tree(node_queue):
while node_queue.size != 1:
node1 = node_queue.pop_node()
node2 = node_queue.pop_node()
r_1 = TreeNode([None, node1.priority + node2.priority])
r_1.left_child = node1
r_1.right_child = node2
node_queue.add_node(r_1)
return node_queue.pop_node() code_dict1 = {}
code_dict2 = {} # 由Huffman树得到的Huffman编码表
def huffman_code_dict(head, x):
# global code_dict, code_list
if head:
huffman_code_dict(head.left_child, x + "")
head.code += x
if head.value:
code_dict2[head.code] = head.value
code_dict1[head.value] = head.code
huffman_code_dict(head.right_child, x + "") # 字符串编码
def trans_encode(string_s):
# global code_dict1
trans_code = ""
for c in string_s:
trans_code += code_dict1[c]
return trans_code # 字符串解码
def trans_decode(string_s):
# global code_dict1
code = ""
answer = ""
for c in string_s:
code += c
if code in code_dict2:
answer += code_dict2[code]
code = ""
return answer

三、总结
利用Huffman树的编码形式可以进行数据的压缩,因此Huffman的应用也很广泛。在此记录一下方便以后查看。

最新文章

  1. mysql 数据库连接超时的问题 autoReconnect=true
  2. c++ 副本构造器
  3. YUV到RGB的转换
  4. ios 网络字节顺序的转换HTOS
  5. 分布式消息系统Jafka入门指南之二
  6. Swift Array copy 的线程安全问题
  7. ldd获得可执行程序的所有库并输出到指定目录
  8. xamarin android listview的用法
  9. linux tar解压命令
  10. 浅析 JavaScript 中的 Function.prototype.bind() 方法
  11. 设计模式---数据结构模式之迭代器模式(Iterate)
  12. Scala-Unit-1-概述及安装
  13. [MySQL Reference Manual]17 Group Replication
  14. Xshell简单介绍
  15. leveldb 学习记录(五)SSTable格式介绍
  16. 区块链 -- Merkle Tree
  17. 远程操作linux
  18. Windows下Python第三方.whl的安装
  19. 【IP】Linux中检测IP地址冲突
  20. Zigbee事件

热门文章

  1. i春秋——“百度杯”CTF比赛 十月场——Login
  2. iOS编程
  3. Springboot入门及常用注解
  4. 使用Python3导出MySQL查询数据
  5. ggplot2学习笔记之图形排列
  6. 安装docker后,导致qemu的桥接网络出现问题
  7. 孪生网络(Siamese Network)在句子语义相似度计算中的应用
  8. vmware中桥接模式,NAT模式,主机模式的区别
  9. python基础语法15 面向对象2 继承,多态,继承json模块中JSONEncoder,并派生出新的功能
  10. [POJ1087]A Plug for UNIX