高度压缩数字网格

Highly compressing a grid of numbers

本文关键字:网格 数字网 数字 压缩 高度      更新时间:2023-10-16

我有一个包含数字的正方形网格,我需要对它进行大量压缩,以便可以轻松地通过网络传输。例如,我需要能够将一个40x40的网格压缩到512字节以下,而不考虑网格中数字的值。这是我的基本要求。

网格的每个单元格都包含一个0-7的数字,因此每个单元格可以容纳3位。

有人知道一个好的算法可以实现我想要的吗?

您可以对信息进行不同的编码。您不需要将所有数字0到7都分配给具有相同位数的代码。您可以根据序列中的次数进行分配。

首先阅读整个序列,计算每个数字的出现次数。在此基础上,您可以将代码分配给每个数字。如果你在下面指定代码,例如霍夫曼代码,代码将是前缀代码,这意味着没有额外的字符来分隔数字。

您可以根据测试结果在算法上引入某些变体,以微调压缩比。

我在一个项目(大学)中使用了这种技术,总的来说,它提供了很好的结果。至少它应该接近你理论上的每个字符3位,如果概率分布有帮助的话,它会更好。

您要做的是对数据执行"burrowes-wheeler"转换,然后对其进行压缩。在这种情况下,运行长度编码就足够了。

http://en.wikipedia.org/wiki/Burrows%E2%80%93Wheeler_transform

在你的情况下,这可能会胜过霍夫曼。

确实,在某些情况下,您需要超过512个字节。因此,在您的协议中,只需为"反常"网格破例。但在一般情况下,你应该很容易低于512。

正如其他人所说,所说的问题是不可能的,因为需要600字节来表示所有可能的网格。600字节来自40行、40列、每个单元3位和每个字节8位(40 * 40 * 3 / 8)。正如Kerrek SB在评论中解释的那样,您将8个单元格打包为3个字节。

在你自己的评论中,你提到这是通过网络传输的游戏状态。假设您有一种机制来确保数据的可靠传输,那么如果在更新之间可以更改的单元格数量有合理的限制,或者如果允许您在特定数量的单元格更改时发送更新,则可以实现512字节的表示。如果使用1位来表示单元格是否已更改,则需要200个字节。然后,剩下312个字节来表示已更改的单元格的新值。因此,您最多可以表示312*8/3 = 832修饰的细胞。

顺便说一句,这种表示可以在不到600个字节中表示多达1064个已更改的单元。