C 征求对哈夫曼压缩的意见

C 征求对哈夫曼压缩的意见,c,C,我看到的文件压缩器的实现总是压缩字节数组 但它可以压缩短数组,甚至整数 如果二叉树中的每个符号代表一个字节,那么在最佳情况下,一个位最多可以压缩8位 如果哈夫曼树中的每个符号都代表一个短符号,那么在最佳情况下,我们最多可以压缩一个单格位中的16位 对吗 有人能用这个额外的哈夫曼编码信息更新维基百科吗?绝对正确。无论如何,在实现压缩算法方面几乎没有什么用处(除了智力挑战或训练),因为几乎每种语言的标准库中都有压缩算法。绝对正确。无论如何,在实现压缩算法方面几乎没有什么用处(除了智力挑战或培训),因

我看到的文件压缩器的实现总是压缩字节数组

但它可以压缩短数组,甚至整数

如果二叉树中的每个符号代表一个字节,那么在最佳情况下,一个位最多可以压缩8位

如果哈夫曼树中的每个符号都代表一个短符号,那么在最佳情况下,我们最多可以压缩一个单格位中的16位

对吗


有人能用这个额外的哈夫曼编码信息更新维基百科吗?

绝对正确。无论如何,在实现压缩算法方面几乎没有什么用处(除了智力挑战或训练),因为几乎每种语言的标准库中都有压缩算法。

绝对正确。无论如何,在实现压缩算法方面几乎没有什么用处(除了智力挑战或培训),因为几乎每种语言的标准库中都有压缩算法。

Arabcoder,您的假设是正确的


作为旁注:许多8位哈夫曼编解码器不仅仅压缩一个字节的256个自然符号。它们也有一个或多个特殊符号。这些用于检测哈夫曼流的结束,或从一棵哈夫曼树切换到另一棵…

Arabcoder,您的假设是正确的


作为旁注:许多8位哈夫曼编解码器不仅仅压缩一个字节的256个自然符号。它们也有一个或多个特殊符号。这些用于检测哈夫曼流的结束或从一个哈夫曼树切换到另一个…

最佳压缩是将整个文件视为单个标记,并使用零长度哈夫曼代码进行压缩。这将为您提供无限的压缩比。不幸的是,哈夫曼代码的描述将非常大。

最佳压缩是将整个文件视为单个标记,并使用零长度的哈夫曼代码进行压缩。这将为您提供无限的压缩比。不幸的是,哈夫曼代码的描述将相当大。

哈夫曼是一种非常古老的压缩方法,并没有这样使用。它包含在课程中讲授的基本压缩方法中。考虑到JPEG、PDF或JAR等许多文件都是经过压缩的,运行普通的哈夫曼压缩不会给您带来太多好处


我这么说是因为我做了这件事。即使您对符号表进行了大量优化,这一点也适用。

哈夫曼是一种非常古老的压缩方法,并没有这样使用。它包含在课程中讲授的基本压缩方法中。考虑到JPEG、PDF或JAR等许多文件都是经过压缩的,运行普通的哈夫曼压缩不会给您带来太多好处


我这么说是因为我做了这件事。即使您对符号表进行了大量优化,这也适用。

这是正确的,但它并不像听起来那么神奇

要解码哈夫曼编码的字节流,必须传输两段数据。编码流(当然)是必需的,但字典也是必需的,它允许您正确地构建哈夫曼树来执行解码

使用较大的令牌对数据进行编码总是会产生较小的编码流。不幸的是,除非您的数据具有一些非常具体和特殊的特征,否则较大的标记也会导致您的字典大小意外增加。退化情况(由Mark Byers的答案引用)将导致整个未压缩数据流为单个令牌,而编码流为单个比特,从而导致绝对没有压缩

因此,哈夫曼编码(和几乎所有东西一样)是一种折衷的练习。在编码文件的效率和字典的大小之间取得平衡可能很棘手。我从未根据数据特征进行过实际分析,以找出各种理想的令牌大小,但我认为字节往往会被使用,因为它是一个简单的划分点,通常会导致一些真正的压缩。我知道在大学时,我曾经做过一次四字节标记的练习,但我不能说它比一字节标记好


当然,欺骗也是可能的,您可以使用一个预构建的树并用它进行压缩,而不是动态地构建字典以获得真正贪婪的压缩。这样可以避免传输字典,但解码器也必须使用相同的字典来解码数据。

这是正确的,但它并不像听起来那么神奇

要解码哈夫曼编码的字节流,必须传输两段数据。编码流(当然)是必需的,但字典也是必需的,它允许您正确地构建哈夫曼树来执行解码

使用较大的令牌对数据进行编码总是会产生较小的编码流。不幸的是,除非您的数据具有一些非常具体和特殊的特征,否则较大的标记也会导致您的字典大小意外增加。退化情况(由Mark Byers的答案引用)将导致整个未压缩数据流为单个令牌,而编码流为单个比特,从而导致绝对没有压缩

因此,哈夫曼编码(和几乎所有东西一样)是一种折衷的练习。在编码文件的效率和字典的大小之间取得平衡可能很棘手。我从未根据数据特征进行过实际分析,以找出各种理想的令牌大小,但我认为字节往往会被使用,因为它是一个简单的划分点,通常会导致一些真正的压缩。我知道在大学时,我曾经做过一次四字节标记的练习,但我不能说它比一字节标记好

当然,也有可能作弊,而不是动态构建字典以获得真正的信息