现在,有很多有序的数值向量(大约50维)。每个维度都是0到200之间的整数。我希望对它们进行排序,以确保相同存储桶中的相似向量,相邻存储桶中的所有向量也具有一定程度的相似性。例如,<1,24,25,78,9>和<2,24,24,78,9>应该在同一个存储桶中(存储桶编号为010),但是<3,29,26,74,11>和<4,28,29,75,10> (它们也在同一个存储桶中)在相邻的存储桶中(存储桶编号为011)
如何设计这样的排序函数?
发布于 2009-07-13 05:30:24
你想要一个Morton code。它交错了每个维度的位,以帮助将相似的值保持在一起。这通常适用于二维和三维,但它适用于任何维度。
将每个D值表示为B比特的二进制字,然后交织这些比特以形成新的D*B比特长数字。这是你的查找表号。如果你想要一个较小的数字,丢弃较低的位以获得较少的存储箱。
一个更好的(但计算起来麻烦得多)函数是multidimensional Hilbert curve mapping.,这在实践中很难使用,但它确实拥有您能得到的最好的索引位置。
发布于 2009-07-13 05:02:33
你所描述的并不是一个正常意义上的“好的”散列函数。
您能更具体地说明如何从这些特定序列到这些存储桶编号(010,011)吗?您的散列函数基本上将是相同的过程。
发布于 2009-07-13 05:42:16
您想要的与散列正好相反:对于散列,您希望避免相似的值出现在相同的存储桶中。
看起来你正在寻找一棵树;R-spatial index听起来是最有前途的。
https://stackoverflow.com/questions/1117758
复制相似问题