我有一个2D MxN网格(或矩阵)。矩阵中的单元可以保持整数。据说填充了具有非零整数的单元格。矩阵中的填充单元集称为“配置”。
我想提出一种编码或散列算法,它允许我通过计算其编码值(应该生成一个唯一的数字)来唯一地识别矩阵中的配置。
我更喜欢编码到散列,因为碰撞是完全不合需要的。
有人可以建议我使用编码算法来计算给定配置的唯一“id”吗?
答案 0 :(得分:1)
我建议使用散列算法,该算法将有99.999999999%的机会生成唯一ID。在大多数情况下,每十亿个哈希都会发生冲突是可以接受的。我的建议是使用CRC算法,因为它生成高度分布的哈希集并且具有相对较低的冲突率。
答案 1 :(得分:0)
所以这是一个1和0的数组?那个阵列的RLE或LZW压缩怎么样?
答案 2 :(得分:0)
对于提供精确比较的表示,不可能比表示配置的位序列的最佳压缩做得更好。
如果要求MxN布尔值以整数唯一编码,则需要2个 M * N 值。使用平台的固定精度整数是否可行取决于M和N的大小;如果不是,你将不得不使用位串或大整数。
因为原始数据是任何整数值而不是1或0,所以朴素矩阵的朴素位串ID将给出8 * sizeof ( matrix::cell_type )
的压缩。针对稀疏值优化的位串可能更好。稀疏位串的良好实现压缩数据,因此这将减少表示的存储空间,并允许快速精确比较,这是要求。
如果模式保证稀疏到某个级别,则可以进行优化以压缩信息,但是您需要提供更多信息。
例如,您使用的是稀疏矩阵表示(带状,对角线,行压缩等),并且可以访问稀疏矩阵存储的内部,然后自然而有效地映射到压缩的位串。
看看你的另一篇文章,似乎矩阵被用作游戏的网格而不是矩阵。在这种情况下,最好对bitstring使用行程长度压缩,因为这会产生另一个有用的属性 - 矩阵的编码位串表示,其配置是彼此的转换,只会在编码的第一个值上有所不同。
答案 3 :(得分:0)
目前尚不清楚您希望实现的目标,但自定义 bloom filter实施可能适合您的问题。
答案 4 :(得分:0)
根据您尝试解决的问题,我想到了以下问题:
答案 5 :(得分:0)
是否存在collsion无关紧要。即使存在冲突,您也可以继续通过int检查矩阵int,看看它是否实际上是相似的。
只要碰撞很少发生,开销就是0
所以散列函数可以简单到将所有int添加到一起。如果这已足够,则取决于整数的可能值及其中有多少(因此,如果在整个矩阵中只有1或2个单元格具有值,则此散列将不起作用)