是否可以压缩单个字节而不会有任何损失?

时间:2018-05-13 15:45:47

标签: compression byte bit

我知道这听起来有点不可能,因为1个字节可以表示256个不同的值,但我仍然想知道是否有(甚至只是理论上)任何方法来实现这一点。

1 个答案:

答案 0 :(得分:1)

当然,您可以压缩一些组合并扩展其他组合。因此从这个角度来看是有可能的。

这引起了一个有趣的问题,假设均匀随机输入并且输入长度固定为一个字节,节省3位以指定少于8位的长度,则可达到的最小平均压缩大小是多少?在另一个答案中说明的示例将需要(1 + 2 + ... + 255 + 256)/ 256位,即257×128/256 = 257/2 = 128.5位。这远比8位差。据我所知,没有最低限度的证据吗?但是给定输出长度本身对信息进行编码,应该是0位可以是有效值,1位可以再提供2个,2位可以再增加4个,依此类推,因此1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255加一个完整的8位剩余值将映射为256个唯一值。

因此(0 + 1×2 + 2×4 + 3×8 + 4×16 + 5×32 + 6×64 + 7×128 + 8)/256=1546/256=6.0390625。
因此,如果是8位,则总固定数据长度平均应可压缩为刚好超过6位。但是,可以解压缩的代码的复杂性可能要比平均128.5位的简单方案高得多。

在压缩数据的数据大小与用于解压缩的代码的数据大小之间进行权衡是使用Kolmogorov复杂度表示的一部分。解压缩算法越大,由于解压缩算法本身包含很多信息,数据压缩的程度就越高。这没有考虑到减压算法的实际速度效率,这实际上是很重要的。从理论上讲,从纯数据角度来看,最好的算法是平均压缩大小加上解压缩所需的代码大小最小的算法。出于数学上的通用性考虑,需要在通用图灵机(UTM)上对整个数据和解压缩算法进行编码,以进行有效的比较。

这又回到了理论最小值未知的原因。否则,从逻辑上讲,纯粹针对8位固定输入的情况,我指定的理论值应为最大,而不考虑算法。我认为有可能找到最适合该映射的匹配算法,这仍然是最好的。

如果您想要任意位长度或例如1到8位的任何位长度,则肯定会改变问题。在这一点上,可能还需要指定输出长度,除非将其内置到压缩方案中,例如使用上述0标记,甚至预先指定长度。但是,再次指定长度是可以使用这种高度紧凑的映射算法的。处理任何小于一个字节的单元时,有很多实际问题,尽管有效地无论如何它都会舍入为8位。

但这足以证明其确实可行。