哈夫曼编码的非树节点形式实现

  • 楔子
  • 思考过程
    • 于是想自己写一个headq
    • 构建二叉树实在太久了,完全不让看文档,不敢不相信在有限的时间里可以调试成功,于是就想了使用非树的实现方式,就是把手动画的二叉树,从树叶往上补充哈夫曼编码
  • 总结

楔子

今日心血来潮参加了某厂家的机试,牛客网上机试,一看只有一题且时间90分钟200分,允许使用本地IDE,就知道肯定几分钟出不来,看题目可喜的是秒懂哈夫曼编码,可悲的是一年半以前学的树图数据结构都忘光了。

思考过程

我知道用优先级队列+树可以实现,可是heapq和二叉树一年多没用了,只知道用numpy和pandas汗颜,于是慌了一逼。

于是想自己写一个headq

反正排序用sort()不用自己写,heapq也好实现,后来怕耗时太多,heapq勉强想起来怎么用,稍微试了一下,用起来没问题

构建二叉树实在太久了,完全不让看文档,不敢不相信在有限的时间里可以调试成功,于是就想了使用非树的实现方式,就是把手动画的二叉树,从树叶往上补充哈夫曼编码

from heapq import *
# 输入,转化为list
strs = input()
strs = [i for i in strs]# 去重
str_single = set(strs)# 按照词频入优先级队列
hq =[]
for s in str_single:heappush(hq,(strs.count(s),s))# 初始化明文字典
result = {}
for i in str_single:result[i] = ''# 从树叶往上构建哈夫曼编码
while hq:left = heappop(hq)if hq:right = heappop(hq)# 取两个最小词频的节点,单个字母优先在左边if left[0] == right[0]:if len(left[1]) > len(right[1]):left,right = right,left# 左边对应编码加0,非单个单词比如‘cd',那么对应的c和d的哈夫曼编码均需要加0for i in left[1]:result[i] +=  '0'# 右边对应编码加1for i in right[1]:result[i] +=  '1'# 把合成节点放入优先队列heappush(hq,(left[0]+right[0],left[1]+right[1]))else:break# 最后结果对应哈夫曼编码是反的,故反转一下
for k,v in result.items():v = [i for i in v]result[k] = ''.join(v[::-1])
# 输出结果
for i in strs:print(''.join(result[i]),end='')

总结

还是好好再复习一下树和图吧,否则连面试机会都没有,汗颜!!

哈夫曼编码的非树节点形式实现相关推荐

  1. 哈夫曼树及哈夫曼编码详解

    一.预备知识 • 结点的路径长度:从根结点到该结点的路径上所包括的边的数目: • 树的内路径长度:除叶结点外,从根到树中其他所有结点的路径长度之和: • 树的外路径长度:从根结点到树中所有叶子结点的路 ...

  2. 创建霍夫曼树,霍夫曼编码以及使用霍夫曼编码压缩文件

    那么,什么是霍夫曼树(赫夫曼树)呢? 给定n个权值(权值就是每个节点里面存放的数据,但是根据业务需求不同,存放的数据类型有些差别)作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样 ...

  3. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  4. 哈夫曼树与哈夫曼编码及等长编码

    哈夫曼树的构造:就是将给定的数据中选择最小的两个权值进行合并,然后重复该操作,构造出一个二叉树.使其带权路径长度WPL最小的二叉树称为哈夫曼树或最优二叉树. 例如:给定几个数值:0.07, 0.19, ...

  5. 哈夫曼编码Java实现

    哈夫曼编码 1.基本概念 1)一种可变长的前缀编码,常用于数据压缩 2.实现步骤 1)把字符串转换为字符数组,统计出每个字符出现的次数: 2)把每个字符出现的次数作为该字符的权值,每个字符对应的asc ...

  6. 5.1 Python图像处理之图像编码-哈夫曼编码

    5.1 Python图像处理之图像编码-哈夫曼编码 文章目录 5.1 Python图像处理之图像编码-哈夫曼编码 1 算法原理 2 代码 3 效果 1 算法原理 哈夫曼编码是一种根据词频变化的变长二进 ...

  7. 用Python对图像哈夫曼编码

    图像处理课要求对一幅图像进行哈夫曼编码/解码,并计算编码效率和平均编码长度.哈夫曼编码的原理就不写了,也可以在网上找到比较详细的介绍,比如这个博客.这种数据结构方面的代码其实最好用C写,用Python ...

  8. 基于哈夫曼编码对txt文档实现压缩处理 | 算法分析之贪心算法设计 C语言版

    声明:凡代码问题,欢迎在评论区沟通.承蒙指正,一起成长! 目录 一.实验内容与要求 二.概要设计 三.直接上代码 四.运行结果 一.实验内容与要求 内容:哈夫曼编码是广泛地用于数据文件压缩的十分有效的 ...

  9. 256色灰度图哈夫曼编码压缩

    哈夫曼编码原理:设256种颜色在图片中各出现了a1.a2.-.an次,于是可以得到一个对应的权重数组.将权重数组以以下范例形式建立哈夫曼树. 范例:假设一个含有6个数值的权重数组9.8.3.6.7.1 ...

最新文章

  1. android弹出选择usb,android 解决:默认情况下用于该USB设备 自动获取USB操作权限...
  2. mysql 常用小工具包_mssql+mysql小工具(无需环境依赖)-mysql数据库批量实体CS类导出工具下载v3.0免费版-西西软件下载...
  3. 我国火力发电站的大脑用上了国产系统
  4. 参数调优为什么要采样_程序员精进之路:性能调优利器--火焰图
  5. 递归学习 斐波那契 java代码实现
  6. python决策树的应用_机器学习-决策树实战应用
  7. java向有序数组里插数_Java向有序数组中插入一个元素,,使其仍按有序排列,并求出这个插入元素的下标...
  8. 重做LVM文件系统之减小PV
  9. 数据结构与算法分析(一)——C++文件读写+py文件读写
  10. Android GSON解析JSON数据
  11. linux||Linux的操作系统的简单指令
  12. html换行不出现横线,wps为什么在换行空格下划线不显示
  13. edup无线网卡驱动安装linux,EDUP EP-N8513 (RTL8188CUS芯片)在Ubuntu 12.10下的wifi不能连接问题解决方法...
  14. 树的同构 poj 1635
  15. 鸿蒙起源轩辕厉害吗,同为上古神兵,鸣鸿刀与轩辕剑相比哪个更厉害?
  16. 如何pip更新所有包?
  17. 许昌学院计算机宿舍,许昌学院宿舍条件及图片
  18. 图片上传与excel的导出
  19. msquic客户端认证服务器的自签名证书加密通信(windows)
  20. Charterstone for Mac 契约石 中文版 好玩的桌游棋盘战略游戏

热门文章

  1. python中os.system.获取输出信息_python中os.system()的返回值
  2. python树结构_Python-简单的树结构实现
  3. java nio socket长连接_netty学习实战—实现websocket长连接和socket之间进程通信
  4. 联想e470无线网卡驱动_笔记本显示已关闭无线功能,请问怎样打开?谢谢!
  5. 传智学员信息登记表html代码_IT兄弟连 HTML5教程 HTML5文字版面和编辑标签 使用HTML表格...
  6. java -jar 启动程序/设置classpath
  7. ios 监听一个控制器的属性_OC观察者模式之KVO的使用与思考
  8. vue 固定div 滚动_vue移动端 导航吸顶(固定定位)页面滚动出现抖动
  9. html制作动态坐标轴,HTML5 canvas制作动态随机星图
  10. python多分支实现四则运算器代码_一份让Python疯狂加速的工具合集!