有霍夫曼编码到算术编码的推广吗?


11

在试图理解霍夫曼编码,算术编码和范围编码之间的关系时,我开始想到霍夫曼编码的缺点与分数位打包问题有关。

也就是说,假设一个符号有240个可能的值,并且需要将其编码为位,即使您不需要“全” 8,因为每个符号8个位都可以表示256个可能的值,因此每个符号将被卡住8位每个符号。解决这个问题的方法就是我所说的“小数位压缩”,在这种情况下,您可以使用乘法以2的非幂次幂进行“移位”。就像2的幂的乘积是移位的x * 2 == x << 1x * 4 == x << 2等等对于2的所有幂一样,所以您也可以通过乘以非2的幂来“移位”,然后打包成小数位大小的符号。

问题与霍夫曼编码类似:您最终得到的代码长度必须是非小数位大小的,因此这种打包效率很低。但是,您不能只使用fracitonal-bit-packing解决方案,因为该解决方案假定使用固定大小的符号。

问题是,是否有任何论文或解决方案可对霍夫曼编码进行改进,其思想与小数位打包相似,可实现类似于算术编码的功能?(或任何相反的结果)。


1
算术编码已经是最佳的。无需对其进行改进。
Yuval Filmus 2015年

@YuvalFilmus是的,我的意思是,如何改进霍夫曼编码,使其与算术编码保持一致。
Realz Slaw 2015年

1
就像一个建议一样,您可能会发现非对称数字系统(ANS)编码比算术编码更容易理解。特别是,将特定的公式称为“小数位填充”要容易一些。
别名

@Pseudonym我发现此页面似乎在rANS和Huffman编码之间建立了联系。不能说我明白了,但我认为就足够了。如果您发表评论,我会接受的。
Realz Slaw 2015年

@YuvalFilmus我希望我提出了算术编码确实需要改进的情况,而ANS是一种改进。
化名

Answers:


13

让我们看一下关于霍夫曼编码的稍微不同的方式。

假设您有一个由三个符号A,B和C组成的字母,概率分别为0.5、0.25和0.25。因为概率都是2的反幂,所以它具有最佳的霍夫曼码(即与算术编码相同)。在此示例中,我们将使用规范代码0、10、11。

假设我们的国家是一个大的整数,我们称之为。您可以将编码视为一个接受当前状态,一个要编码的符号并返回新状态的函数:s

encode(s,A)=2sencode(s,B)=4s+2encode(s,C)=4s+3

因此,让我们从状态11(二进制为1011)开始,对符号B进行编码。新状态为46(二进制为101110)。如您所见,这是“旧”状态,序列10添加到末尾。我们基本上已经“输出”了位序列10。

到目前为止,一切都很好。

现在考虑一下算术编码是如何工作的。如果将概率放在一个公分母上,则符号A实际上表示范围,符号B表示范围[2[04,24),符号C表示范围[3[24,34)[34,44)

基本上,我们在这里所做的就是将所有内容都乘以公分母。想象一下,状态实际上是在基数4中。对符号B进行编码实际上是在该基数中输出数字2,对符号C进行编码实际上是在该基数中输出数字3。

但是,符号A有所不同,因为它不是以4为底的整数。

相反,我们可以将字母视为具有相等概率的符号A_0,A_1,B,C的集合。再次具有最佳霍夫曼代码00、01、10、11。或者再次,我们可以在基数4中考虑这一点。要对符号进行编码,我们只需执行以下操作:

encode(s,A0)=4s+0encode(s,A1)=4s+1encode(s,B)=4s+2encode(s,C)=4s+3

因此,现在很清楚如何对符号B和C进行编码,但是对于编码符号A,我们可以选择。我们应该使用A 1中的哪个?A0A1

现在这是一个聪明的主意:我们从状态窃取一点信息:s

=小号2

s=s2
i=smod2

然后encode(s,Ai)

s=11s=5i=1encode(5,A1)=4×5+1=21

现在,它不会产生与霍夫曼编码完全相同的位输出,但是会产生具有相同长度的输出。我希望您能看到的是,它也是唯一可解码的。为了解码符号,我们将除以4的余数取整。如果值为2或3,则符号分别为B或C。如果它是0或1,则符号是A,然后我们可以通过将状态乘以2并加上0或1来放回信息位。

3525

encode(s,A0)=5s+0encode(s,A1)=5s+1encode(s,A2)=5s+2encode(s,B0)=5s+3encode(s,B1)=5s+4

s=s3i=smod3encode(s,Ai)

这等效于算术编码。它实际上是称为非对称数字系统的一系列方法,由Jarek Duda在过去几年中开发。名称的含义应该很明显:以概率编码符号pq

之所以使用一系列编码方法,是因为我们在这里看到的内容本身是不切实际的。它需要进行一些修改以处理以下事实:您可能没有无限精度的整数来有效地操作状态变量,并且可以通过多种方法来实现。当然,算术编码在状态上也有一个类似的问题。

实用的变体包括rANS(“ r”表示“比率”)和tANS(“表驱动”)。

与算术编码相比,ANS在实用和理论上都具有一些有趣的优点:

  • 与算术编码不同,“状态”是一个单词,而不是一对单词。
  • 不仅如此,ANS编码器及其相应的解码器具有相同的状态,并且它们的操作是完全对称的。这带来了一些有趣的可能性,例如您可以交错不同的编码符号流,并使所有内容完美同步。
  • 当然,实际的实现需要在输出时“输出”信息,而不只是将其收集为大整数以在末尾写入。但是,可以配置“输出”的大小,以换取(通常适度的)压缩损失。因此,在算术编码器必须一次输出一位的情况下,ANS可以一次输出一个字节或一个半字节。这使您可以直接在速度和压缩之间进行权衡。
  • 在当前的硬件上,它看起来与二进制算术编码一样快,因此与霍夫曼编码具有竞争优势。这使其比大字母算术编码及其变体(例如范围编码)快得多。
  • 它似乎是无专利的。

我认为我再也不会做算术编码了。


4
现在,这是我所见过的最清晰的ANS编码解释。
Michael Deardeuff '16

2

举一个简单的例子,如果您有三个符号,每个符号的概率为1/3,则最佳霍夫曼编码将使用三个符号0、10和11,其平均5/3位。

通过连接5个原始符号创建的243个符号,每个符号的概率为1/243。接近1/256。最佳霍夫曼编码将以7位编码这些组中的13个,以8位编码为230组,平均为每组7.9465位或每个原始符号为1.5893位,低于原始霍夫曼编码的1.6667位,而算术编码为1.5850位。

因此,从理论上讲,您可以将两个符号分别组合为一个较大的符号,或者将三个符号分别组合为一个较大的符号,然后对组合使用哈夫曼编码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.