C++ 二维空间(矩阵)中的编码模式

C++ 二维空间(矩阵)中的编码模式,c++,encoding,hash,sparse-matrix,C++,Encoding,Hash,Sparse Matrix,我有一个二维MxN网格(或矩阵)。矩阵中的单元格可能包含一个整数。具有非零整数的单元格称为已填充。矩阵中填充的单元格集称为“配置” 我想提出一种编码或散列算法,通过计算矩阵中的一个配置的编码值(该值应生成一个唯一的数字),使我能够唯一地识别该配置 我更喜欢编码而不是散列,因为冲突是完全不受欢迎的 有谁能推荐一种编码算法,我可以用它来计算给定配置的唯一“id”?所以它是一个1和0的数组?对该数组进行RLE或LZW压缩怎么样?所以它是一个1和0的数组?该阵列的RLE或LZW压缩如何?对于提供精确比较

我有一个二维MxN网格(或矩阵)。矩阵中的单元格可能包含一个整数。具有非零整数的单元格称为已填充。矩阵中填充的单元格集称为“配置”

我想提出一种编码或散列算法,通过计算矩阵中的一个配置的编码值(该值应生成一个唯一的数字),使我能够唯一地识别该配置

我更喜欢编码而不是散列,因为冲突是完全不受欢迎的


有谁能推荐一种编码算法,我可以用它来计算给定配置的唯一“id”?

所以它是一个1和0的数组?对该数组进行RLE或LZW压缩怎么样?

所以它是一个1和0的数组?该阵列的RLE或LZW压缩如何?

对于提供精确比较的表示,不可能比表示配置的位序列的最佳压缩做得更好

如果需要将MxN布尔值唯一编码为整数,则需要2M*N值。使用平台的固定精度整数是否可行取决于M和N的大小;如果不是,则必须使用位字符串或大整数

因为原始数据是任意整数值,而不仅仅是1或0,所以原始矩阵的原始位字符串ID将提供
8*sizeof(matrix::cell_type)
的压缩。为稀疏值优化的位字符串可能更好。稀疏位字符串的良好实现会压缩数据,因此这将减少表示的存储空间,并允许快速精确比较,这是需要的

如果保证模式稀疏到一定程度,则可以对压缩信息进行优化,但需要提供更多信息

例如,您是否使用稀疏矩阵表示法(带状、对角、行压缩等),并且可以访问稀疏矩阵存储的内部,然后该存储将自然有效地映射到压缩的位字符串


看看你的另一篇文章,矩阵似乎被用作游戏的网格,而不是矩阵。在这种情况下,最好对位字符串使用运行长度压缩,因为这会产生另一个有用的特性-配置为相互转换的矩阵的编码位字符串表示形式只会在编码的第一个值上有所不同。

对于提供精确比较的表示形式,不可能比提供精确比较的位序列的最佳压缩更好表示配置

如果需要将MxN布尔值唯一编码为整数,则需要2M*N值。使用平台的固定精度整数是否可行取决于M和N的大小;如果不是,则必须使用位字符串或大整数

因为原始数据是任意整数值,而不仅仅是1或0,所以原始矩阵的原始位字符串ID将提供
8*sizeof(matrix::cell_type)
的压缩。为稀疏值优化的位字符串可能更好。稀疏位字符串的良好实现会压缩数据,因此这将减少表示的存储空间,并允许快速精确比较,这是需要的

如果保证模式稀疏到一定程度,则可以对压缩信息进行优化,但需要提供更多信息

例如,您是否使用稀疏矩阵表示法(带状、对角、行压缩等),并且可以访问稀疏矩阵存储的内部,然后该存储将自然有效地映射到压缩的位字符串


看看你的另一篇文章,矩阵似乎被用作游戏的网格,而不是矩阵。在这种情况下,最好对位字符串使用运行长度压缩,因为这会产生另一个有用的属性-配置为相互转换的矩阵的编码位字符串表示形式只会在编码的第一个值上有所不同。

不清楚您想要实现什么,但可能自定义实现适合您的问题。

不清楚您想要实现什么想要实现,但可能自定义实现适合您的问题。

根据您试图解决的问题,您会想到以下几点:

  • 使用查找表关联矩阵宽度ID
  • 仅存储填充字段的值;它们在矩阵中的位置可以用单独的每个字段值进行编码,也可以用位图对整个矩阵进行编码

根据您试图解决的问题,您会想到以下几点:

  • 使用查找表关联矩阵宽度ID
  • 仅存储填充字段的值;它们在矩阵中的位置可以用单独的每个字段值进行编码,也可以用位图对整个矩阵进行编码

我建议使用哈希算法,该算法生成唯一ID的几率为99.99999999%。在大多数情况下,每十亿次哈希发生一次冲突是可以接受的。我的建议是使用该算法,因为它生成高度分布的哈希集,并且冲突率相对较低。

我建议使用一种哈希算法,该算法生成唯一ID的几率为99.99999999%。在大多数情况下,每十亿次哈希发生一次冲突是可以接受的。我的建议是使用该算法,因为它生成高度分布的哈希集,并且冲突率相对较低。

是否存在冲突应该无关紧要。即使存在冲突,您也可以继续逐个检查矩阵int,以查看它实际上是否相似

只要碰撞很少发生,开销就为0

所以