贪心法--哈夫曼编码
时间:2022-07-23
本文章向大家介绍贪心法--哈夫曼编码,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
现有五个节点:A B C D E以及对应的权值,如何建立一颗huffman树进行哈夫曼编码?
基本思路:每次选取其中最小的两个权值的和作为左右节点,比如0.1+0.15=0.25,再从0.2,0.2,0.25,0.35中选取两个最小的,以此类推。编码的时候,从上往下,如果是左孩子就记为0,右孩子则记为1。
#定义树的结构
class Node:
def __init__(self,freq):
self.left = None
self.right = None
self.parent = None
self.freq =freq
def isLeft(self):
return self.parent.left == self
#生成节点列表
def createNodes(freqs):
return [Node(freq) for freq in freqs]
def createHuffmanTree(nodes):
queue=nodes[:]
while len(queue)>1:
#按权值对节点排序
queue.sort(key=lambda x:x.freq)
#前两个最小的值出队列
node_left=queue.pop(0)
node_right = queue.pop(0)
node_parent=Node(node_left.freq+node_right.freq)
node_parent.left=node_left
node_parent.right=node_right
node_left.parent = node_parent
node_right.parent=node_parent
#生成新的节点,放到队列后
queue.append(node_parent)
#队列中最后剩下的元素就是根节点
queue[0].parent=None
return queue[0]
def huffmanEncoding(nodes,root):
#用于存储每个节点的编码值
codes=['']*len(nodes)
for i in range(len(nodes)):
#第i个节点
node_temp=nodes[i]
while node_temp !=root:
if node_temp.isLeft():
#如果是左节点就加‘0’
codes[i]='0'+codes[i]
else:
#否则加‘1’
codes[i]='1'+codes[i]
node_temp=node_temp.parent
return codes
letters_freqs=[('B',10),('E',15),('C',20),('D',20),('A',35)]
nodes = createNodes([item[1] for item in letters_freqs])
root = createHuffmanTree(nodes)
codes = huffmanEncoding(nodes,root)
for item in zip(letters_freqs,codes):
print("better:{} freq:{} HuffmanCode:{}".format(item[0][0],item[0][1],item[1]))
最后结果:
- MATLAB技巧——sort和sortrows函数
- Python对商品属性进行二次分类并输出多层嵌套字典
- 通过shell得到数据库中权限的脚本(r2笔记77天)
- 用Python实现PCA和MDA降维和聚类
- 通过shell解析dump生成parfile(r2笔记76天)
- Web Spider实战1——简单的爬虫实战(爬取"豆瓣读书评分9分以上榜单")
- 如何用R语言从网上读取多样格式数据
- C/C++——生成随机数
- PHP基础——PHP数组
- 使用shell抽取html数据之二(r2笔记75天)
- Python爬取链家网数据:新房楼盘价格分析
- 【编程基础】Java里面如何对字符串排序?
- 计算广告——广告定向实践
- 通过shell抓取html数据(r2笔记74天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 表格的实现
- 使用 Node.js 定制你的技术雷达:中篇
- 数据库PostrageSQL-在Windows上从源代码安装
- Redis的过期策略和内存淘汰策略及LRU算法详解
- 群晖Docker安装GitLab及腾讯企业邮件配置踩坑记录
- 基于docker搭建DNSmasq
- Django-admin配置和显示图标
- redis学习(八)
- 【剑指Offer】打印从1到最大的n位数
- 面试题-List之ArrayList、Vector、SynchronizedList、CopyOnWriteArrayList
- 面试题-JAVA设计模式之单例模式的5种实现方式
- 面试题-JAVA中的深拷贝、浅拷贝原理及实现
- Cross-Origin Resource Sharing (CORS)-跨域
- 多线程技术-CountDownLatch在业务中实践
- Mybatis源码阅读-准备环境搭建