哈夫曼编码输出情报

1 问题

在之前的课程中我们学到在数据通信中,哈夫曼树可以用于构造电文编码的代码长度最短的编码方案,那么如何利用哈夫曼编码输出情报。

2 方法

  1. 导入需要使用的模块,包括heapq和defaultdict。创建一个栈的对象。

  2. 定义一个函数encode(s),这个函数接受一个字符串s作为参数。这个函数会返回s的哈夫曼编码结果。

  3. 创建一个字典freq,用于记录s中每个字符出现的频率,并将其初始化为0。

  4. 遍历字符串s,对于每个字符,都将其出现的频率加1。

  5. 通过将freq字典中的键值对转换成元组,将其放入一个列表q中。列表q中的每个元素都是形如 [出现频率,[字符, 编码]] 的形式。

  6. 使用heapq.heapify()函数将列表q变成一个堆

  7. 当堆中元素的数量大于1时,执行以下操作:用heapq.heappop()函数从堆中弹出出现频率最小的两个元素,分别命名为 lo 和 hi。修改每个出现频率最低的元素的编码,在编码中添加’0’以确保这些元素在哈夫曼树中处于左侧。修改每个出现频率次低的元素的编码,在编码中添加’1’以确保这些元素在哈夫曼树中处于右侧。将 lo 和 hi 元素的权值之和放入一个元素 [lo[0] + hi[0]] + lo[1:] + hi[1:] 中,并把这个元素放回堆中。

  8. 将哈夫曼编码结果放入一个字典result中,并按照编码长度对其排序。

  9. 使用字典result中每个字符的编码,生成最终的哈夫曼编码结果。

  10. 最后,打印哈夫曼编码的结果。

代码清单 1

import heapq
from collections import defaultdict
def encode(s):
   freq = defaultdict(int)
   for c in s:
       freq[c] += 1
   q = [[wt, [sym, ""]] for sym, wt in freq.items()]
   heapq.heapify(q)
   while len(q) > 1:
       lo = heapq.heappop(q)
       hi = heapq.heappop(q)
       for pair in lo[1:]:
           pair[1] = '0' + pair[1]
       for pair in hi[1:]:
           pair[1] = '1' + pair[1]
       heapq.heappush(q, [lo[0] + hi[0]] + lo[1:] + hi[1:])
   result = dict(sorted(heapq.heappop(q)[1:], key=lambda p: (len(p[-1]), p)))
   encoded = ''.join([result[c] for c in s])
   return encoded
# 测试
s = "情报是假的"
encoded = encode(s)
print(encoded)

3 结语

上述程序打印结果为:

0101101011110010011001000001101010111010001100000

代码输出了原始字符串的哈夫曼编码结果以及该字符串对应的哈夫曼编码字典。对于压缩的字符串,我们可以看到其长度为 59,相比原始的长度 5,可以得到巨大的压缩比。总之,哈夫曼编码是一种非常有用的算法,可以被用于数据压缩和解压缩等场景。通过 Python 实现哈夫曼编码,我们可以更深入地了解到这个优秀算法的精髓和实现方式。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

MASA MAUI iOS 文件下载与断点续传

文章目录 背景介绍方案及代码1、新建MAUI项目2、建立NSUrlSession会话连接3、使用NSUrlSessionDownloadTask 创建下载任务4、DidWriteData 监听下载5、DidFinishDownloading 完成下载6、CancelDownload (取消/暂停)下载7、ResumeDownload 恢复下载8、杀死进程-恢复下载 效果图总…

MySQL基础篇-约束

目录 1.约束概述 2.分类 3.测试user表的约束情况 主键约束 非空约束及唯一约束 检查约束 默认约束 4.外键约束 外键约束的语法 外键约束的删除/更新行为 小结 1.约束概述 MySQL约束(Constraints)是用于确保表中数据完整性和一致性的规则。它们定…

多线程(虚拟地址空间)

代码展示线程 既然我们提到了,线程隶属于进程,是进程的一个执行分支 真的是这样吗? 我们还需要用代码来验证 初步思路是创建三个线程,其中main函数里面的为主线程 不断循环,并且打印相应的pid 假如它们属于不同的进程…

四,立方体贴图

Pbr的间接光用到立方体贴图,所以,先用shader进行立方体贴图。 立方体贴图很简单,就是用方向向量(不一定是单位向量)采样cubeMap的颜色。 也就是在片元着色器中传递。 "float x outPos.r;\n" "float y…

位运算符与高级操作

位运算符与高级操作 运算符 高级操作 左移实现乘法 左移n位等价于乘以2的n次方 int x; x 2; x x << 2; x x << 3;使用左移实现乘法运算仅限于乘以2的倍数 是不是只要左移就能够实现乘以2的倍数呢? char x 120; x x << 1;右移实现除法 右移n位等价于除…

查看基站后台信息

查看基站后台信息 电脑配置固定ip: 192.168.1.99: 打开“网络和共享中心”&#xff0c;选择更改适配器设置&#xff1a; 右键“本地连接”&#xff0c;选择属性 基站网线直连电脑网口 Telnet 登录基站 打开dos窗口 windows键R”&#xff0c;输入cmd&#xff0c;点确定&…

MySQL的执行流程

在聊mysql的执行流程之前&#xff0c;咱们要先聊聊mysql的逻辑架构。 逻辑架构 可以将上图简化为下图 连接层 客服端访问mysql服务器前&#xff0c;要先和mysq建立tcp连接。经过3次握手建立连接成功后&#xff0c;mysql服务器对tcp传输过来的账号密码进行身份认证&#x…

【大数据】Doris 构建实时数仓落地方案详解(二):Doris 核心功能解读

本系列包含&#xff1a; Doris 构建实时数仓落地方案详解&#xff08;一&#xff09;&#xff1a;实时数据仓库概述Doris 构建实时数仓落地方案详解&#xff08;二&#xff09;&#xff1a;Doris 核心功能解读Doris 构建实时数仓落地方案详解&#xff08;三&#xff09;&#…

Selenium —— Web自动化多浏览器处理!

一、多浏览器测试介绍 1.1、多浏览器测试背景 用户使用的浏览器(firefox,chrome,IE 等)web 应用应该能在任何浏览器上正常的工作&#xff0c;这样能吸引更多的用户来使用 1.2、多浏览器测试概述 是跨不同浏览器组合验证网站或 web 应用程序功能的过程是兼容性测试的一个分支…

git学习使用

git使用 1、cmd #查看版本 git version2、初识 Git GUI: Git提供的图形界面工具 Git Bash: Git提供的命令行工具 1.打开Git Bash2.设置自己的用户名和邮箱地址git config --global user.name "xxx"git config --global user.email "123456789163.com"查…

大数据Flink(八十七):DML:Joins之Regular Join

文章目录 DML:Joins之Regular Join DML:Joins之Regular Join Flink 也支持了非常多的数据 Join 方式,主要包括以下三种: 动态表(流)与动态表(流)的 Join动态表(流)与外部维表(比如 Redis)的 Join动态表字段的列转行(一种特殊的 Join)细分 Flink SQL 支持的

【数据结构与算法】链表的实现以及相关算法

目录 单选链表的基本实现 有序列表的合并&#xff08;双指针法&#xff09; 链表的反转 链表实现两数之和 判定链表是否有环 双链表的实现 public class DLinkedList<E> {private Node<E> first;private Node<E> last;int size;/*** 头插法* param i…

Prettier - Code formatter格式化规则文件

文章目录 前言安装使用 前言 先前公司在规范代码时,由于个人业务繁忙跟技术总监是后端出身用的IDEA不熟悉vsCode;以及大多数时都自己一个人负责一个项目,当时并不看重这些;最近在整理vue3tsvite的脚手架模板(平时工作用的react),开始整理格式化代码,方便之后 vue 和 react 中应…

Android Shape设置背景

设置背景时&#xff0c;经常这样 android:background“drawable/xxx” 。如果是纯色图片&#xff0c;可以考虑用 shape 替代。 shape 相比图片&#xff0c;减少资源占用&#xff0c;缩减APK体积。 开始使用。 <?xml version"1.0" encoding"utf-8"?…

高效查询大量快递信息,轻松掌握技巧

在如今快节奏的生活中&#xff0c;快递已经成为我们日常不可或缺的一部分。然而&#xff0c;对于一些忙碌的人来说&#xff0c;单个查询每一个快递单号可能会浪费太多时间。因此&#xff0c;我们需要一款可以帮助我们批量查询快递的软件。 在市场上&#xff0c;有很多款专门用于…

【2023年11月第四版教材】第15章《风险管理》(第四部分)

第15章《风险管理》&#xff08;第四部分&#xff09; 8 过程4-实施定量风险分析8.1 实施定量风险分析★★★8.2 数据分析★★★8.3 定量成本风险分析S曲线示例8.4 决策树示例8.5 龙卷风图示例8.6 项目文件&#xff08;更新&#xff09;★★★ 9 过程5-规划风险应对9.1 规划风险…

【2023款奔驰改款E260 L运动型:豪华与性能的完美结合】

在汽车市场中&#xff0c;奔驰一直以其卓越的品质和卓越的性能赢得了消费者的喜爱。而2023款奔驰改款E260 L运动型&#xff0c;更是将豪华与性能完美结合&#xff0c;让人无法抗拒。首先&#xff0c;让我们来看一下这款车的外观设计。新款E260 L运动型的前脸设计更加犀利&#…

【Linux】——基操指令(一)

个人主页 代码仓库 C语言专栏 初阶数据结构专栏 Linux专栏 LeetCode刷题 算法专栏 目录 前言 基操前的碎碎念 计算机的层状结构 基础指令 查看登录用户指令 查看用户指令 查看当前所处工作目录 清屏指令 基操指令 ls命令 cd命令 makdir指令 rmdir指令 &…

十二、MySql的事务(下)

文章目录 一、事务隔离级别二、如何理解隔离性三、隔离级别&#xff08;一&#xff09;读未提交【Read Uncommitted】&#xff1a;&#xff08;二&#xff09;读提交【Read Committed】 &#xff1a;&#xff08;三&#xff09;可重复读【Repeatable Read】&#xff1a;&#x…

【计算机网络笔记六】应用层(三)HTTP 的 Cookie、缓存控制、代理服务、短连接和长连接

HTTP 的 Cookie HTTP 的 Cookie 机制要用到两个字段&#xff1a;响应头字段 Set-Cookie 和请求头字段 Cookie。 Cookie 可以设置多个 key-value 对&#xff0c; 响应头中可以设置多个 Set-Cookie 字段&#xff0c;请求头Cookie后面可以设置多个键值对&#xff0c;用分号隔开&a…