让我澄清一点,我不是在谈论能够压缩任何给定源材料的算法意义上的完美压缩,我意识到这是不可能的。我想要得到的是一种能够将任何源位串编码到其绝对最大压缩状态的算法,由其的Shannon熵确定。
我相信我听说过一些关于霍夫曼编码在某种意义上最优的东西,所以我相信这种加密方案可能基于此,但这是我的问题:
考虑位串:a =“101010101010”,b =“110100011010”。
使用普通香农熵时,当我们将位串简单地视为0和1的符号时,这些位串应具有完全相同的熵,但这种方法存在缺陷,因为我们可以直观地看到位串a具有比位串更少的熵b因为它只是一个重复10的模式。考虑到这一点,我们可以通过计算复合符号00,10,01和11的香农熵来更好地了解源的实际熵。
这只是我的理解,我可能完全偏离基础,但从我的理解,对于一个遍历源为真正随机,对于长度为n的遍历源。所有n长度符号组的统计概率必须具有相同的可能性。
我想比标题中的问题更具体,我有三个主要问题:
使用单个位作为符号的霍夫曼编码是否会像最佳一样压缩位串,即使我们在2位符号级别分析字符串时会出现明显的模式?如果没有,可以通过循环通过霍夫曼编码的不同“级别”(抱歉,如果我在这里屠宰术语)来最佳地压缩源,直到找到最佳压缩率?在某些情况下,可以通过霍夫曼编码的不同“轮次”进一步提高压缩率吗? (例如,首先使用5位长的符号进行霍夫曼编码,然后对4位长的符号进行霍夫曼编码?huff_4bits(huff_5bits(bitstring))
)
答案 0 :(得分:7)
正如Mark所说,由于Kolmogorov的复杂性,一般的答案是“没有”。让我对此进行一些扩展。
压缩基本上是两个步骤: 1)模型 2)熵
模型的作用是“猜测”下一个字节或字段。 模型可以有任何形式,其有效性没有限制。 一个简单的例子是随机数生成器函数:从外部角度来看,它看起来像一个噪声,因此无法压缩。但是如果你知道生成函数,可以将无限长的序列压缩成一小组代码,即生成函数。
这就是“无限制”的原因,而Kolmogorov的复杂性恰恰表明:你永远无法保证没有更好的方法来“建模”数据。
第二部分是可计算的:熵是你找到“香农限制”的地方。 给定一组符号(通常是模型的输出符号),它们是字母表的一部分,您可以计算最优成本,并找到一种方法来达到已证实的最终压缩限制,即香农限制。
霍夫曼在香农极限方面是最优的如果你接受每个符号必须使用整数位编码的限制。这是近似但不完美的近似。通过使用小数位(可以是算术编码器提供的)或更新的基于ANS的Finite State Entropy coder,可以实现更好的压缩。两者都更接近香农的限制。
香农限制仅适用于“单独”处理一组符号的情况。只要您尝试“组合它们”,或找到符号之间的任何相关性,您就是“建模”。这是Kolmogorov Complexity的领土,这是不可计算的。
答案 1 :(得分:6)
没有。可以证明,甚至没有算法来确定完美压缩机的性能。请参阅Kolmogorov Complexity。
霍夫曼编码(或算术编码)本身并不接近最佳压缩。需要使用其他技术来利用数据中的高阶冗余。