问题标签 [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.

0 投票
2 回答
1413 浏览

compression - 压缩具有已知概率分布的符号的最佳熵编码方案是什么?

我正在寻找在一长串通话记录中对 user_ids 进行编码。这些记录中占用空间最多的部分是调用者和接收者的符号。我将创建一个映射,为最活跃的调用者分配较短的符号——这将有助于降低文件的整体大小(以及 I/O 时间)。

我事先知道每个符号将被使用多少次——换句话说,我知道相对概率分布。此外,生成的代码是否“无前缀”(例如霍夫曼代码)并不重要。那么最好的编码方案是什么,即能够提供最多压缩并且存在快速实现的方案?

答案不仅应指向压缩方案,还应指向该编码方案的实现。

0 投票
1 回答
746 浏览

c++ - 读取和 Huffman 压缩 4 字节二进制字符串 STD C++ Linux 环境

我正在为霍夫曼编码做一些作业。我已经完成了 Huffman 算法,但需要稍微改变它以处理二进制文件。我花了一些时间阅读相关问题,也许由于我对数据类型和二进制文件缺乏了解,我仍然有点挣扎,所以希望我不会重复之前的问题(我不会发布相关的代码到程序的霍夫曼部分)。

这是关键短语:“您可以假设将映射到代码字的每个符号都是一个 4 字节的二进制字符串。”,我想我知道的是 Char 代表一个字节,而 unsigned int 代表四个字节,所以我猜我应该一次将输入的四个字节读入一个无符号整数缓冲区,然后为程序的霍夫曼部分收集我的数据。

这看起来像是处理数据的好方法吗?如果只剩下 1,2 或 3 个字节,我应该如何处理文件的最后?因此,我只是将缓冲区作为 unsigned int 存储在结构中。只是出于好奇,我将如何将缓冲区重新转换为字符串?
编辑:存储霍夫曼压缩文件的标题的最佳方法是什么?

0 投票
2 回答
1166 浏览

huffman-code - 霍夫曼编码的有效性是否有限?

我的问题是我有 100,000 多个不同的元素,据我所知,霍夫曼的工作方式是为最常见的元素分配 0 代码,接下来是 10,接下来是 110、1110、11110 等等。我的问题是,如果第 n 个元素的代码是 n 位长,那么肯定一旦我通过了第 32 项,那么只发送 32 位数据类型(例如整数)会更节省空间吗?我是否错过了方法论中的某些内容?

非常感谢您提供的任何帮助。我目前的实施通过做

生成每个新代码(这似乎是正确的!),但我可以对超过 100,000 个元素进行编码的唯一方法是在临时的新数据类型中使用 int[] 来访问我们将从 int 中读取的值数组作为一个连续的长符号......这不像传输 32 位 int 那样节省空间?或者它更像是霍夫曼使用其前缀代码的情况,并且能够明确地确定连续比特流中的每个唯一值?

谢谢

0 投票
3 回答
2284 浏览

c++ - 如何使用霍夫曼代码压缩文件?

我的程序将霍夫曼代码存储在一个char[8]变量中。我想将它存储在一个unsigned char变量中。我这样做了,但认为它不能正常工作,因为当我使用以下代码提取文件时,它不起作用:

0 投票
3 回答
3527 浏览

c++ - 保存霍夫曼代码的问题?

我想将霍夫曼代码保存到文件中。我怎样才能做到这一点?我将霍夫曼代码保存到字符串中,但生成文件的大小大于原始文件。

0 投票
1 回答
2046 浏览

python - 霍夫曼编码:如何在 Python 中编写二进制数据

我已经尝试过使用 struct 模块的方法,如我的代码中注释掉的行所示,但没有成功。基本上我有两个选择:我可以逐个编写二进制数据代码(我的代码是长度从 3 位到 13 位不等的位序列),或者转换整个 n 个字符的字符串(在这种情况下,n=25000+)为二进制数据。但我不知道如何实现这两种方法。代码:

0 投票
1 回答
390 浏览

algorithm - JT 文件格式:构建哈夫曼树

我正在尝试读取JT文件。JT 文件可能包含使用 Huffman 算法压缩的信息。我在构建霍夫曼树时遇到了问题。当两个符号具有相同的频率时,实现中会出现歧义,这取决于我们在节点之间使用的比较,顺序可能不同,并导致树的某些分支倒置。所以我无法建立正确的霍夫曼树。以前有人遇到过这个问题吗?有什么解决办法吗?

0 投票
7 回答
1645 浏览

ios - 像霍夫曼编码这样的算法是否真的在生产中使用?

目前,我正在开发一个需要在 iPad 上存储大量文本的应用程序。我的问题是,像霍夫曼编码这样的算法是否真的用于生产?我只需要一个非常简单的压缩算法(不会有大量的文本,它只需要一种更有效的存储方法),那么像 Huffamn 这样的算法行得通吗?我应该看看其他类型的压缩库吗?

0 投票
1 回答
192 浏览

c - 不正确的二叉树

上面的代码应该生成一个霍夫曼树。但是,形成的二叉树是不正确的。所有包含字母的节点都应该是叶子或没有儿子的节点,但一些字母节点仍然有儿子。代码有什么问题?

0 投票
3 回答
3795 浏览

python - 将霍夫曼代码字符串转换为二进制

我在如何将霍夫曼编码字符串转换为二进制 python 时遇到问题。

这个问题与霍夫曼算法无关。

它是这样的:

我可以得到一个编码的霍夫曼字符串,比如说01010101010注意,它是一个字符串。

但现在我想将字符串表示形式保存为真正的二进制文件。

在霍夫曼编码的字符串中,每个 0 和 1 都是一个byte

我想要的是每 0 和 1有点

我怎么能在python中做到这一点?

编辑1:

请原谅我没有足够清楚地描述我的问题。

让我解释一下我目前将零写入二进制的方法。

比如说,我们可以编码字符串 s='010101010'。

  1. int用来将其转换为整数
  2. 然后用于unichr将其转换为字符串,以便我可以将其写入文件
  3. 以二进制模式将字符串写入文件

还要注意的是,我需要读取文件才能解码霍夫曼代码。

所以我的方法是,

  1. 从文件中读取字节
  2. 将它们恢复为 int
  3. 将 int 转换为其二进制表示字符串。
  4. 解码字符串

第 2 步,问题发生了,我变得一无所知。

因为有些霍夫曼字符串可以很短(如,10),而有些可以很长(010101010101001)。这导致它们在 int 值中的字节长度不同(一些短字符串可能只占用一个字节,而长字符串可能占用两个甚至更多)

以下代码说明了我的问题:

我在第二个部分中一次读取一个字节但这实际上是不正确的。因为字符串10010101010占用了两个字节。

那么,当我从文件中读取这些字节时,我应该一次读取多少字节?