Optimization 编码-高效发送稀疏布尔数组

Optimization 编码-高效发送稀疏布尔数组,optimization,encoding,Optimization,Encoding,我有一个256 x 256的布尔数组。这些阵列不断变化,设置位实际上是随机分布的 我需要发送一个设置位的当前列表给许多客户机,因为他们要求他们 以下数字是近似值 如果我发送每个设定位的坐标: set bits data transfer (bytes) 0 0 100 200 300 600 500 1000 1000 2000 如果我将距离(从左到右扫描)发送到下一个设定位:

我有一个256 x 256的布尔数组。这些阵列不断变化,设置位实际上是随机分布的

我需要发送一个设置位的当前列表给许多客户机,因为他们要求他们

以下数字是近似值

如果我发送每个设定位的坐标:

set bits    data transfer (bytes)
    0            0
  100          200
  300          600
  500         1000
 1000         2000
如果我将距离(从左到右扫描)发送到下一个设定位:

set bits    data transfer (bytes)
   0             0
  100          256
  300          300
  500          500
 1000         1000
此稀疏阵列中设置的典型位数约为300-500,因此第二种解决方案更好

有没有一种方法可以在不增加太多处理开销的情况下做得更好?

既然你说“实际上是随机分布的”,那么让我们假设每个位置都是概率为p的伯努利试验。选择p以获得您期望的填充率。你可以把“跑步”的长度(你的选项2)看作是获得成功所需的伯努利试验次数。结果表明,试验次数遵循几何分布(概率p)

到目前为止,您在选项2中所做的是识别p的每种情况下的最大运行长度,并保留足够多的位来发送它们。请注意,这个最大长度仍然只是一个概率,如果您真的非常不走运,那么该方案将失败,并且您的所有位都聚集在开始和结束处

正如@Mike Dunlavey在评论中建议的那样,Huffman编码或其他形式的熵编码可以根据长度的频率重新分配所花费的比特。也就是说,短距离运行更为常见,因此使用更少的位发送这些长度。这种编码效率的理论极限是分布的“熵”,你可以在维基百科的页面上查找,并评估不同的概率。在您的例子中,该熵的范围从每次运行7.5位(对于1000个条目)到每次运行10.8位(对于100个条目)

事实上,这意味着你不能做得比你目前在1000条输入案例中做得更好。8位=每个值1字节。对于100个条目的情况,您当前在每次运行中花费的是20.5位,而不是理论上可能的10.8位,因此end的改进机会最大。在300的情况下:我认为您没有保留足够的位来表示这些序列。熵为每像素9.23位,当前发送8。在许多情况下,true之间的空格超过256,这将使表示溢出

当然,所有这些都假设事情确实是随机的。如果不是,你需要一个不同的熵计算。你总是可以用直方图计算出数据的熵,然后决定是否值得追求一个更复杂的选项


最后,还要注意,现实生活中的熵编码器仅近似于熵,例如,必须为每个运行长度分配整数位数的位。可以分配小数位。

您尝试过任何标准的压缩算法吗?没有,您能推荐一种比上面更好的算法吗?不是我头上的那种。我会尝试一些常见的方法,比如gzip,看看是否有一个最佳的压缩点,我会选择第二种方法。这叫做运行编码。我想原则上你可以改变跑步的长度。谢谢你对跑步编码的指导。