问题标签 [huffman-code]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 将位数据输出到二进制文件C++
我正在编写一个压缩程序,需要使用 c++ 将位数据写入二进制文件。如果有人可以就书面声明或提供建议的网站提供建议,我将不胜感激。
抱歉,如果这是一个简单或令人困惑的问题,我正在努力在网上找到答案。
jpeg - Jpeg编码技术
我听说 Jpeg 使用 Hufman 代码。什么是霍夫曼码?
algorithm - 霍夫曼“终结者”位串
动机
想象一个哈夫曼压缩文件被部分下载,就像在 P2P 软件中一样,所以我们首先为整个文件分配磁盘空间,然后开始下载随机文件块。其中一个霍夫曼码(但我们不知道是哪一个)是一个结束码,所以如果这个码被解码,我们就停止。假设该文件由几个霍夫曼压缩流组成,我们可以尝试在下载完成之前解压缩其中的一些。
磁盘空间的预分配方式现在很重要:假设我们有一个霍夫曼流的开始,但它不完整,所以我们遇到了预分配的磁盘空间。通常,这个空间都是 0,所以我们会继续用 huffman code 解码符号00..
。如果这不是我们的最终代码,我们不会注意到“无效”数据,如果有 2 GB 的预分配空间,我们会进行很多无用的解码。
所以我们想预先分配空间以使解码尽快停止。
问题
我正在寻找充当“霍夫曼终止符”的最短位串,这意味着如果我们解码这个字符串,我们将至少解码每个霍夫曼代码一次,所以我们肯定会收到一个结束代码。这应该适用于长度1..n
位的霍夫曼码的每种组合。
注意:我知道上面的假设场景有简单的解决方案(00..
用作结束代码,使用 P2P 段数据来检测尚未下载的块),但这只是一个示例场景,展示了“霍夫曼终结器”的理论使用位串,我对解决这种情况不感兴趣,而是寻找算法/方法/想法来生成/查找充当“霍夫曼终结者”的位串。
例子
让我们看看n = 2
: [0, 1]
, [00, 01, 1]
, [0, 10, 11]
,可能的 Huffman 代码组合[00, 01, 10, 11]
。现在让我们从一个包含所有可能长度的位序列1..n
(0
, 1
, 00
, 01
, 10
, 11
)的位串开始:
001011
使用不同的霍夫曼代码组合解码给出(霍夫曼代码分配给符号A..D
):
这是一个好的开始,它已经解码了前三个的每个霍夫曼代码,但是如果我们用 解码它[00, 01, 10, 11]
,我们就会丢失符号B
(霍夫曼代码01
)。因此,让我们将其附加到我们的位串中:
00101101
这是一个有效的“霍夫曼终止符” n=2
,长度为 8 位。如果我们用这个字节预先分配我们的磁盘空间,我们肯定会终止所有不超过 2 位的霍夫曼代码。我们甚至知道不会有更短的终止符字符串,n=2
因为它是组合[00, 01, 10, 11]
解码每个符号一次的最小长度。
n=3
我还找到了, (43 位)的“霍夫曼终结符” 0001011001110100111010011100010101111101110
,但我不能 100% 确定它是否正确,也不知道它是否是最短的。
我在寻找什么
为给定的.找到或生成霍夫曼终止符的算法/想法
n
。我的尝试将类似于示例:生成一个起始字符串并根据需要附加位以满足所有不同的霍夫曼代码组合。但我确信有更好的方法。特定的 Huffman 终止符,
n=8
和n=16
,虽然生成它们的计算成本可能很高,而且它们可能会很长。有关此问题(或类似问题)的论文/链接(如果有)。
奖金
寻找“霍夫曼终止符”的奖励积分如果我们从位开始也可以工作1..n
,因此如果数据之前解码并且我们不会到达并在第一位开始新的霍夫曼代码,它甚至会终止。
image - 霍夫曼编码表
我不明白 Jpeg 的霍夫曼表包含什么,有人可以向我解释一下吗?谢谢
decoding - 如何从霍夫曼编码比特流中解码消息?
如何从霍夫曼编码比特流中解码消息?我不清楚霍夫曼算法的想法。
据我了解,假设我收到一条短信“我的名字是 XYZ”。
然后编码过程是这样的: 1. 计算字符的频率。2. 按值对频率进行排序。3. 构建一棵树。4. 通过将左边缘视为 0 并将右边缘视为 1 来遍历树,以获取预期的消息字符。5. 连接代码以找到比特流。
现在的问题是,如何从编码的比特流中找到原始消息?
我认为我们需要再次构建霍夫曼树。
但是我怎样才能从比特流中构造霍夫曼树呢?
file - 将霍夫曼树与编码比特流一起存储为文件的基本技术是什么?
如何将霍夫曼编码比特流存储为二进制文件?
algorithm - 构建霍夫曼树时如何选择优先级?
假设我的字符及其频率如下:
在构建树时,在第 2 步中,我们有:
现在,既然我们有两个 3,我们如何确定它们的优先级呢?
在霍夫曼编码中,这被认为是:
为什么?
optimization - 如何强制haskell不存储整个字节串?
我在学术目的上写了一个关于haskell的小(相对)应用程序。我正在基于此代码http://www.haskell.org/haskellwiki/Toy_compression_implementations实现霍夫曼压缩。
我的此代码变体在这里https://github.com/kravitz/har/blob/a5d221f227c27fd1c5587217a29a169a377521a6/huffman.hs它使用惰性字节串。当我实现 RLE 压缩时,一切都很顺利,因为它一步处理输入流。但是 Huffman 对其进行了两次处理,结果我在内存中存储了一个评估的字节串,这对大文件不利(但对于相对较小的文件,它也在堆中分配了太多空间)。这不仅是我的怀疑,因为 profiling 还表明大部分堆都被字节串分配吃掉了。
此外,我在文件中序列化流长度,它也可能导致完整的字节串加载到内存中。有什么简单的方法可以说 ghc 友善并多次重新评估流?
zlib - 用于压缩文本数据并将其存储为文本的库
我想将网页存储在压缩文本文件 (CSV) 中。为了实现最佳压缩,我想提供一组 1000 个网页。然后,图书馆应该花一些时间为此内容创建最佳“字典”。一个明显的“字典”条目可能是<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
,它可以存储为 %1 或类似的东西,因为它几乎出现在所有网页上。通过创建这样的自定义字典,在我的情况下压缩率应该是 99%。
我的问题是,在具有 MIT 或类似自由许可的 Windows 上是否存在用于执行此操作的库?如果没有,您是否会推荐任何通用压缩库。我已经尝试过使用 zlib,但它输出二进制数据。如果我将此二进制数据转换为文本,我担心结果可能比原始文本长。
编辑:我需要能够将文本存储在 CSV 文件中,并且仍然能够将它们导入数据库甚至 Excel。
c++ - 用字符串中的 2 个键填充映射。字符和频率 c++
我是地图新手,所以有点不确定最好的方法。该任务与使用霍夫曼编码的压缩有关。这就是我所拥有的。
以上是我在网上找到的一种方法,但无法打印任何内容
我从一个文本文件中读入一个来填充字符串文件行。
这是我尝试填充地图的第二种方法,字符值不正确,符号和笑脸..
这就是我尝试打印地图的方式
当我运行我的 getFreq 方法时,程序崩溃了。我没有得到任何错误。使用第二种方法,char 值是无意义的。注意我没有同时运行这两种方法,我只是将它们都包含在内以显示我尝试过的内容。
任何见解将不胜感激。谢谢。对初学者宽容一点;)