哈夫曼编码与解码,基于Python实现

from itertools import count
from collections import Counter
from heapq import heapify, heappush, heappopdef huffman_tree(s):# 统计每个字符出现的次数s = Counter(s)                                      # 计算可迭代序列中元素的数量,返回字典类型数据chs, freqs = s.keys(), s.values()nums = count()                                      # 创建一个从start=0开始的无限迭代器,每次迭代加上step=1# 构造堆tree = list(zip(freqs, nums, chs))                  # 创建列表,列表中每项为一个三元组(fregs:出现频率,nums:序号,chs:字符名)heapify(tree)                                       # 基于tree列表,构建堆# 合并结点,构造哈夫曼树while len(tree)>1:fa, _, a = heappop(tree)                        # 从堆中弹出并返回最小的元素,保持堆属性fb, _, b = heappop(tree)heappush(tree, (fa + fb, next(nums), [a,b]))    # 将一个元素压入堆中,保持堆属性print('='*30)print(tree)print('='*30)return tree[0][2]                                   # tree为列表,tree[0][0]堆顶元素和,tree[0][1]:结点序号,tree[0][2]:字符化的树结构# tree = [(36, 20, [[['r', 'e'], [['d', 'f'], ['j', 'w']]], ['a', [[['s', 'g'], 'c'], 'b']]])]def get_table(tree, prefix=''):                         # tree:待编码子树,prefix:编码前已确定的树前哈夫曼编码# 遍历哈夫曼树,为每个字符编码if isinstance(tree, str):yield (tree, prefix)                            # yield:返回生成器returnfor bit, child in zip('01', tree):for pair in get_table(child, prefix+bit):yield pairdef main(s):print(s)tree = huffman_tree(s)print('='*50)gener_test = get_table(tree)for item in gener_test:print(item)print('='*50)table = dict(get_table(tree))                       # 单个get_table返回的的是一个生成器。每个生成器的内容为('字符名称','字符对应的哈夫曼编码')print(table)# 根据哈夫曼编码表对字符串进行编码code = ''.join(map(lambda ch: table[ch],s))         # s字符串的更换为哈夫曼编码后,以空格分割print(code)# 根据哈夫曼编码表进行解码code = '0101101101001'                              # 此处可以输入待解码的哈夫曼编码ss = ''while len(code) > 0:for ch, c in table.items():if code.startswith(c):ss = ss + chcode = code[len(c):]                    # code右移,移出已匹配的编码print()print(ss)main('baaabbcbbbcdcdfsraejajgfweraawaearaa')

引用位置(不带注释):Python实现哈夫曼编码与解码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/132334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web自动化测试框架Selenium

什么是自动化测试 自动化测试就是,假定一些预设值,由机器自动化完成的测试。 web自动化测试,将自动化测试技术艺能用到web测试中,是假定一些预设值,由程序驱动浏览器来完成web程序的测试,如下图&#xff1…

chrome 防止http自动转https的方法

1. 左上角,单击地址栏左边 2. 然后点击网站设置 3. 不安全内容改为【允许】 4. 然后以后访问此网站时,就不会再自动跳转为https了

oracle查询数据库内全部的表名、列明、注释、数据类型、长度、精度等

Oracle查询数据库内全部的表名、列明、注释、数据类型、长度、精度 SELECT a.TABLE_NAME 表名, row_number() over(partition by a.TABLE_NAME order by a.COLUMN_NAME desc) 字段顺序,a.COLUMN_NAME 列名, b.COMMENTS 注释,a.DATA_TYPE 数据类型, a.DATA_LENGTH 长度,DATA_SC…

C语言编写学生成绩管理系统-要求有增删改查(C语言基础题-8道)

文章目录 1-5题题目例题8(难度★ ★ ★ ★ ☆) 答案例题8答案1解析 答案2解析 1-5题 C语言基础例题1-3题-指针篇 C语言基础例题4-5题-二维数组篇 C语言基础例题6-7题-结构体篇 题目 例题8(难度★ ★ ★ ★ ☆) 编写一个学生成…

二、Hadoop分布式系统基础架构

1、分布式 分布式体系中,会存在众多服务器,会造成混乱等情况。那如何让众多服务器一起工作,高效且不出现问题呢? 2、调度 (1)架构 在大数据体系中,分布式的调度主要有2类架构模式&#xff1a…

使用Selenium Grid远程执行测试

我们将在同一台工作电脑上,分别启动主控(Hub)和节点(Node)2个Selenium Grid服务,IP地址均使用环回地址127.0.0.1,端口分别为4444和5555。开始以下操作前,请确认你的机器上已经安装、…

【MySQL基本功系列】第一篇 先熟悉MySQL的运行逻辑

​ 我将推出一系列关于MySQL的博客文章,涵盖了从入门到深入底层的原理。这些文章将包括MySQL的运行逻辑、InnoDB存储引擎、SQL优化、undo log、bin log等多个方面的知识。希望这些文章能为你提供宝贵的信息和洞见,并帮助你更好地理解和应用MySQL。同时&a…

打造高效运营底座,极智嘉一体化软件系统彰显科技威能

在仓储成本和物流需求日益增加的今天,创新且高效的物流机器人解决方案能够显著提升物流运营效率,降低物流成本,实现智能化、精益化、一体化的物流管理。全球仓储机器人引领者极智嘉(Geek)以「一套系统,天生全能」为准则&#xff0…

阿里巴巴1688商品详情 API 接口示例

1688.item_get 公共参数 请求地址: https://o0b.cn/anzexi 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_…

Windows ObjectType Hook 之 ParseProcedure

1、背景 Object Type Hook 是基于 Object Type的一种深入的 Hook,比起常用的 SSDT Hook 更为深入。 有关 Object Type 的分析见文章 《Windows驱动开发学习记录-ObjectType Hook之ObjectType结构相关分析》。 这里进行的 Hook 为 其中之一的 ParseProcedure。文章实…

7.spark sql编程

概述 spark 版本为 3.2.4,注意 RDD 转 DataFrame 的代码出现的问题及解决方案 本文目标如下: RDD ,Datasets,DataFrames 之间的区别入门 SparkSession创建 DataFramesDataFrame 操作编程方式运行 sql 查询创建 DatasetsDataFrames 与 RDDs 互相转换 使用…

创建基于多任务的并发服务器

有几个请求服务的客户端&#xff0c;我们就创建几个子进程。 这个过程有以下三个阶段&#xff1a; 这里父进程传递的套接字文件描述符&#xff0c;实际上不需要传递&#xff0c;因为子进程会复制父进程拥有的所有资源。 #include <stdio.h> #include <stdlib.h>…

如何再kali中下载iwebsec靶场

这个靶场有三种搭建方法&#xff1a; 第一种是在线靶场&#xff1a;http://www.iwebsec.com:81/ 第二种是虚拟机版本的&#xff0c;直接下载到本地搭建 官网地址下载&#xff1a;http://www.iwebsec.com/ 而第三种就是利用docker搭建这个靶场&#xff0c;我这里是用kali进行…

window10 定时任务

window10 定时任务 1、背景2、目标3、思路4、实操4.1、设置定时任务4.2、配置策略4.3、验证 1、背景 项目上由于业务调试需要&#xff0c;开具了一台window10系统&#xff0c;此台window10为项目组公共使用&#xff0c;为防止误操作分配了不通的账号&#xff0c;日常使用各自账…

学习视频剪辑:巧妙运用中画、底画,制作画中画,提升视频效果

随着数字媒体的普及&#xff0c;视频剪辑已经成为一项重要的技能。在视频剪辑过程中&#xff0c;制作画中画可以显著提升视频效果、信息传达和吸引力。本文讲解云炫AI智剪如何巧妙运用中画、底画批量制作画中画来提升视频剪辑水平&#xff0c;提高剪辑效率。 操作1、先执行云…

​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?

在当今汽车行业中&#xff0c;随着消费者偏好的多样化和年轻化&#xff0c;汽车制造商们正面临着前所未有的挑战与机遇。在2023年上海车展上&#xff0c;起亚汽车公司正式发布了全新紧凑级SUV——赛图斯。这款车型不仅标志着起亚对年轻消费市场的深入洞察&#xff0c;也展现了公…

Springboot+vue的导师双选管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的导师双选管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的导师双选管理系统&#xff0c;采用M&#xff08;model&a…

软件测试需不需要懂代码?

无论是刚入测试行业的萌新&#xff0c;还是已经在测试行业闯荡了两三年的小司机们&#xff0c;都会琢磨一个问题&#xff1a;如果要持续发展下去&#xff0c;我要不要懂代码&#xff1f; 在软件测试初级阶段&#xff0c;不需要编程能力。但是任何一个职业&#xff0c;都会追求…

微服务之Nacos注册管理

文章目录 一、Nacos安装步骤1.安装地址2.安装版本3.目录说明4.端口配置5.启动 二、Nacos服务注册1.Nacos依赖2.客户端修改配置文件3.启动效果图4.总结 三、Nacos服务集群属性1.服务跨集群调用问题2.服务集群属性3.总结 四、Nacos根据集群负载均衡1.修改配置文件2.设置集群服务类…

一题都看不懂,大厂的面试是真的变态......

最近我的一个读者朋友去了字节面试&#xff0c;来给我发信息吐槽&#xff0c;说字节的面试太困难了&#xff0c;像他这种三年经验的测试员&#xff0c;在技术面&#xff0c;居然一题都答不上来&#xff0c;这要多高的水平才能有资格去面试字节的测试岗位。 确实&#xff0c;字…