Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 高度压缩数字网格_C++_C - Fatal编程技术网

C++ 高度压缩数字网格

C++ 高度压缩数字网格,c++,c,C++,C,我有一个包含数字的正方形网格,我需要对它进行大量压缩,以便它可以通过网络轻松传输。例如,我需要能够将40x40网格压缩到512字节以下,而不考虑网格中数字的值。这是我的基本要求 网格的每个单元格都包含一个0-7之间的数字,因此每个单元格可以容纳3位 有谁知道一个好的算法可以实现我想要的吗?您可以对信息进行不同的编码。您不需要为所有数字0到7分配具有相同位数的代码。您可以根据序列中的次数进行分配 首先读取整个序列,计算每个数字的出现次数。 基于此,您可以将代码分配给每个数字。 例如,如果您指定以下

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

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


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

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

首先读取整个序列,计算每个数字的出现次数。 基于此,您可以将代码分配给每个数字。 例如,如果您指定以下代码,则代码将是前缀代码,这意味着没有额外字符用于分隔数字

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


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

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

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


另一方面,此表示可以在不到600字节的时间内表示多达1064个已更改的单元格。

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

在你的情况下,这可能比哈夫曼表现更好


的确,在某些情况下,您将需要超过512字节。因此,在您的协议中,只需为“反常”网格做一个例外。但是在一般情况下,你应该很容易地将其控制在512以下。

请参见。@myrkos:你有4800位数据,因此可以有2^4800条不同的消息。512字节只能容纳2^4096封邮件。我们必须付出点什么。迈尔科斯:@KerrekSB是对的。如果您的消息完全是随机的,您无法保证大小将在512字节以下。“我需要数据始终在512字节以下”——这是一个不可能的条件;某些值集至少需要4800位。这是信息论的一个基本定理。()@myrkos可能更复杂,但可能不会比神奇的压缩算法更复杂;-)OP说“不管网格中的数字值是多少”。不管编码是什么,总会有一组至少需要600字节(40x40x3/8)的值。你是对的,我很困惑,我认为有七个值,而不是8个,因此如果所有值以相同的概率出现,则每个值将有3位。我编辑。只要您使用TCP,这将起作用。如果您使用UDP进行低延迟更新,则无法保证获得每个增量。@rafaelbaspatista:Word。所做的编辑反映了可靠性的假设。