需要有关如何使用霍夫曼代码对单词进行编码的帮助

2023-12-15

如何使用哈夫曼代码对单词进行编码,例如 NEED


霍夫曼编码基本上使用可变长度位字符串来表示标记(通常是字符,但有几个例外)。令牌越常见,其位长度越短,并且在处理流时(通常)是动态的。

通常有两个特殊的标记,ESCAPE 和 END-STREAM。

编码维护一个字典,它基本上是查找位序列以获取令牌。最初它仅包含两个特殊标记。

ESCAPE 和 END_STREAM 的初始位序列可以是 0 和 1(这在开始时并不重要)。当编码器接收到字典中没有的字符时,它会输出 ESCAPE 和全长标记,然后根据所有标记的频率将其添加并分配新的位序列。

所以你的“N”可能会导致输出流:

0 xxxxxxxx
| +- token code for N
+--- ESCAPE

和新词典:

ESCAPE:00
END-STREAM:01
N:1

那么你的“E”可能会产生输出流:

0 xxxxxxxx 0 yyyyyyyy
             +- token code for E

和新词典:

ESCAPE:00
END-STREAM:01
N:10
E:11

您的下一个 E 不会导致 ESCAPE 输出,因为它已经在字典中,因此您只需输出其代码 (11)。它将更改字典,因为 E 现在具有更高的计数。这在我们的情况下并不重要,因为所有字符都是两个二进制数字,但在更复杂的示例中,“E”令牌的位长度会缩短。

当D到达时,输出流变为:

0 xxxxxxxx 0 yyyyyyyy 11 0 zzzzzzzz
                      |    +- token code for D
                      +------ second E

和新词典:

ESCAPE:00
END-STREAM:011
N:010
E:11
D:10

因此,您可以看到,随着更多字符的进入,常见字符的位长度会减少,不常见字符的位长度会增加,从而实现压缩。在这种情况下,N(或 D)会得到一个 3 位代码,而 E 则坚持使用 2 位代码,因为它们的数量更多。

美妙之处在于您不需要将字典与文件一起存储,因为 ESCAPE 部分也会动态构建它以进行解压缩。

此外,由于直到最后才出现 END-STREAM 令牌,因此它的位长度不断变大。与 ESCAPE 类似,虽然仍然有很多新字符进入,但它的位长度仍然很短,但是,当没有新字符到达时,它会遭受与 END-STREAM 相同的命运。

(8 位 ASCII)输入流的最佳情况是一个文件只包含数百万个相同字符。第一个字符花费 9 位,每个附加字符花费 1 位,然后流末尾花费 2 位。这个速度接近 1:8 的压缩比 (97.5%)。

最坏的情况正是每个字符之一,每个字符花费 9 位加上流末尾 - 这实际上将流扩展了 12.5%。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要有关如何使用霍夫曼代码对单词进行编码的帮助 的相关文章

  • 查找 int 中的第 n 个 SET 位

    我想要找到的位置不仅仅是最低设置位n最低的设置但是 我是NOT谈论价值n第 位位置 例如 假设我有 0000 1101 1000 0100 1100 1000 1010 0000 我想找到设置的第四位 然后我希望它返回 0000 0000
  • 链表分区函数及反转结果

    我编写了这个 F 函数来将列表分区到某个点并且不再进一步 很像之间的交叉takeWhile and partition let partitionWhile c l let rec aux accl accr match accr with
  • 从 2 个平面轮廓进行表面重建 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有一类用于两个平面轮廓之间的三角测量的算法 这些算法尝试进行 良好的三角测量 来填充这些轮廓之间的空间 其中之一 基于动态规划技术 并使用成本函
  • 查找top-k元素的平均时间复杂度

    考虑在一组 N 个独立且同分布的浮点值中查找前 k 个元素的任务 通过使用优先级队列 堆 我们可以对所有 N 个元素进行一次迭代 并通过以下操作维护一个 top k 集合 如果元素 x 比堆头 更差 丢弃 x 复杂度 O 1 如果元素 x
  • 棒材切割 - 动态规划

    问题陈述 棒材切割问题如下 给定一根长度为n英寸和价格表Pi for i 1 2 3 n 确定最大收益Rn可以通过切割棒并出售碎片来获得 请注意 如果价格Pn对于一根长度的杆n足够大 最佳解决方案可能根本不需要切割 考虑以下情况 n 4 图
  • 在地图元素上使用 for_each

    我有一个映射 我想在其中对每个数据类型对象成员函数执行调用 我还知道如何在任何序列上执行此操作 但是是否可以在关联容器上执行此操作 我能找到的最接近的答案是 Boost Bind 访问 std for each 中的 std map 元素
  • 滑动窗口最小算法

    这是一个家庭作业问题 设 A 是一个整数数组和整数 K 窗口大小 当窗口滑过 A 时 生成在窗口中看到的最小值的数组 M 我发现一篇文章 http home tiac net cri 2001 slidingmin html有这个问题的解决
  • ASM 中从小端到大端的快速转换

    我在 C 中有一个 uint 类型数组 在检查程序是否在小端机器上运行后 我想将数据转换为大端类型 因为数据量可能会变得非常大 但总是均匀的 所以我想考虑将两个 uint 类型作为 ulong 类型 以获得更好的性能并在 ASM 中对其进行
  • 验证是否存在唯一字符串的组合

    class Details String name String age String email String location 1 如果有详细信息列表 如下所示List
  • O(log n) 总是比 O(n) 快吗

    如果有 2 种算法以不同的复杂度计算相同的结果 O log n 总是会更快吗 如果是这样请解释一下 顺便说一句 这不是作业问题 不会 如果一种算法运行在N 100另一个在 log N 100 那么对于较小的输入大小 第二个将会较慢 渐近复杂
  • 输入编码:接受UTF-8

    我需要在 PowerShell 下获取本机应用程序的输出 问题是 输出是用 UTF 8 无 BOM 编码的 PowerShell 无法识别它 只是将那些时髦的 UTF 字符直接转换为 Unicode 我发现 PowerShell 有 Out
  • 计算排列中“反转”的数量

    设 A 为一个大小的数组N 我们称之为几个索引 i j 一个 逆 如果i lt j and A i gt A j 我需要找到一种接收大小数组的算法N 具有唯一的数字 并返回时间的倒数数O n log n 您可以使用归并排序 http en
  • Java 服务器和浏览器客户端之间乐观对象复制的解决方案?

    我正在构建一个系统 多个用户需要同时创建 查看和修改一组对象 该系统计划在 Java 服务器和现代浏览器客户端上运行 我可以选择哪些 它需要在网络和服务器中断时具有鲁棒性 用户界面不得阻止修改 修改需要存储在本地并在连接恢复时发布 在正常操
  • 如果我在计算强连通分量时不使用 G 转置会怎样?

    我正在阅读算法导论 在 22 5 强连通分量中 算法 STRONGLY CONNECTED COMPONENT G 定义为 调用 DFS G 计算每个顶点 u 的完成时间 u f 计算 G 转置 调用 DFS G transpose 但在
  • 快速计算幂(例如 2^11)[重复]

    这个问题在这里已经有答案了 可能的重复 实现基于整数的幂函数 pow int int 的最有效方法 https stackoverflow com questions 101439 the most efficient way to imp
  • 如何使用 C 中的 Banker's Rounding 将 double 舍入为 int

    我想编写一个函数 使用银行家的舍入方法将双精度数舍入为整数 将一半舍入为偶数 http en wikipedia org wiki Rounding Round half to even http en wikipedia org wiki
  • 如何规划庭院灯最有效的路线

    我正在尝试挂一些庭院灯 基于另一个问题 https cs stackexchange com questions 80134 christmas light route efficiency我问 我意识到我需要一种算法来解决路由检查问题 h
  • 高效编写航空公司路由算法

    Given 航班数据库 出发城市 到达城市 出发时间 到达时间 问题 如果出发时间不重要 那么在两个城市之间列出服务的最有效算法是什么 考虑到我们想要最小化中途停留时间 但仍高于标称最小值 即 20 分钟 并最小化中途停留次数 如果有直达航
  • STL 哈希函数

    STL 是否有公开公开的可用哈希函数 我知道有一些使用哈希值的非标准实现 例如boost hash map 并且MSVC8实现了hash map hash set 等的版本 但有没有哈希函数C 98 STL 中定义的 如果不是 可靠哈希函数
  • 优化完美平方问题,类似于Python中的硬币找零

    我这里有一个硬币兑换的解决方案 python 中的 leetcode 硬币兑换 https stackoverflow com questions 69517078 coin change leetcode in python 因为完全平方

随机推荐

  • Ionic 3 错误 没有 AppVersion 的提供程序

    我正在使用 Ionic 3 延迟加载 我收到此错误 但似乎找不到我的方法的错误 错误 没有 AppVersion 的提供者 I have 设置 module ts import NgModule from angular core impo
  • 子类上的重复生成器序列休眠

    我按照这篇文章来解决我最初的问题 在 Hibernate 中的子类上指定每个表的不同序列 但现在我得到一个例外 调用init方法失败 嵌套异常是 java lang IllegalArgumentException 重复的生成器名称 idg
  • 在设计 C# 类库时,什么时候应该选择继承而不是接口? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我有一个号码Processor类将执行两种截然不同的操作 但从通用代码中调用 控制反转 情况 我想知道在决定它们是否都应该继承时 我应该认识到 或为您的用户认识到 哪些设计考虑因素Base
  • 使用 sed 替换文本

    我在通过 sed 替换脚本中的修改日期时遇到问题 我得到的最后修改日期是这样的 olddate grep m1 Built script sh cut c 22 29 我通过以下方式获取当前日期 newdate date d m y 基本上
  • 如何在实体框架代码优先方法中使用表值函数?

    我正在使用实体框架开发一个项目 现在我遇到了一种情况 我需要使用表值函数 它返回包含 2 列的表 因此我搜索了很多 我开始知道我们在数据库优先方法中使用表值函数虽然我首先需要在代码中使用它 情况是这样的 我有一个有两列的表格 Table1
  • 流畅的 nHibernate、Hi-Lo 表,使用约定每行实体

    有没有办法通过约定指定用于 Hi Lo 值的表 每个实体都有一个每行条目 同时仍然让 nHibernate 创建表结构 我想复制 Phil Haydon 博客上的内容here 但无需手动管理表 就目前情况而言 只有当您已经在表中为 Tabl
  • PostgreSQL:如何从 Unix 纪元转换为日期?

    声明给了我日期和时间 如何修改该语句 使其仅返回日期 而不返回时间 SELECT to timestamp TRUNC CAST epoch ms AS bigint 1000 You use to timestamp函数 然后将时间戳转换
  • 如何缩小 rand() 中的数字?

    以下代码每秒输出一个随机数 int main srand time NULL Seeds number generator with execution time while true int rawRand rand std cout l
  • VB.Net 隐藏标签页

    我在这里看到了一些关于如何在选项卡控件中隐藏选项卡的讨论 但它们似乎都是用 C 或某种变体编写的 我还没见过 vb net 的 我不会做 C 我想要做的是隐藏或禁用所有一些选项卡 直到用户登录 我已经解决了登录和注销问题 我需要做的就是添加
  • 在 UIScrollView 上显示大型 UIView 的最佳方式是什么?

    我有一个大UIView 它的大小可变 它可能大于 5000x5000size 我用它在上面画线 圈UIBezierPath 我还添加一些view就在上面 这些中的每一个subview的包含buttons textview labels et
  • Visual Studio 2015 调试自定义控件

    我将自定义控件编译为 DLL 这些控件是使用 Visual Studio 2012 开发的 并且部署到生产环境中没有任何问题 当应用程序加载时 这些控件将使用反射作为 插件 加载 当我使用 Visual Studio 2015 打开解决方案
  • (Godot 引擎)用 Tilemap 瓷砖填充 2D 多边形

    我在 Godot 引擎中遇到一个无法解决的问题 怎么可能 在代码中 用图块填充 Polygon2D 区域 我尝试过获得点位置 使用 2D for 循环遍历线的顶点 但我无法理解这一点 这是我期待的结果的模型 我有解决方案 有一点 hacky
  • MySQL 可以远程连接但不能本地连接

    这是一个奇怪的问题 我不确定发生了什么 我在运行 Ubuntu 10 04 LTS 的 Linux 机器上安装了 MySQL 我可以通过 SSH 访问 mysqlmysql p并以这种方式执行我的所有命令 我添加了一个用户 我可以使用Add
  • 我们如何使用 python 删除长度为 16 个字母或以上的所有不同单词

    我们如何删除长度为 16 个字母或以上的所有不同单词 将这些单词的大小减少到十五个字母 同时保持它们清晰 提示删除后缀 后缀和 或中缀 到目前为止我已经完成了以下代码 fo open anyFile txt wb words set w l
  • protobuf-net 和接口支持

    这个问题很大程度上直接向 protobuf net 维护者提出 但其他人请发表评论 我试图序列化一个包含具有接口类型的属性的类 即 DataContract public class SampleDataClass DataMember O
  • 如何使用正则表达式分割字符串以返回值列表?

    我怎样才能把绳子拿走foo 1 foo 5 foo 2并返回包含值的集合1 5 2以该顺序 我正在寻找在 C 中使用正则表达式的答案 谢谢 在 C 中 您可以使用捕获组 private void RegexTest String input
  • php过滤数组值并从多维数组中删除重复项

    大家好 我试图从此数组中查找重复的 x 值并将其删除 只保留唯一的值 例如我的数组是 Array 0 gt Array x gt 0 5 y gt 23 1 gt Array x gt 23 y gt 21 75 2 gt Array x
  • ArrayList 区分大小写

    我目前正在使用属于 ArrayList 类的 contains 方法进行搜索 有没有办法让java中的搜索不区分大小写 我发现在 C 中可以使用 OrdinalIgnoreCase 有没有等效的 java 或其他方法来做到这一点 谢谢 您可
  • flutter找不到Android SDK

    我已经安装了flutter通过 AUR 我也有aur android sdk 26 0 2 1安装 当我跑步时flutter run I get Warning This package referenced a Flutter repos
  • 需要有关如何使用霍夫曼代码对单词进行编码的帮助

    如何使用哈夫曼代码对单词进行编码 例如 NEED 霍夫曼编码基本上使用可变长度位字符串来表示标记 通常是字符 但有几个例外 令牌越常见 其位长度越短 并且在处理流时 通常 是动态的 通常有两个特殊的标记 ESCAPE 和 END STREA