一般的问题: 我有一个很大的二维点空间,点点稀疏。把它想象成一块洒满黑点的白色大画布。我必须遍历并搜索这些点很多。Canvas(点空间)可以很大,接近 int 的限制,并且在其中设置点之前它的大小是未知的。
这让我想到了散列:
理想: 我需要一个采用 2D 点的散列函数,返回一个唯一的 uint32。这样就不会发生碰撞。您可以假设 Canvas 上的点数可以通过 uint32 轻松计算。
重要提示:不可能事先知道画布的大小(甚至可能会改变),所以像
画布宽度 * y + x
可悲的是,这是不可能的。
我也试过很幼稚
绝对(x)+绝对(y)
但这会产生太多的碰撞。
妥协: 一种散列函数,为键提供非常低的冲突概率。
有什么想法吗?谢谢你的帮助。
最好的问候,安德烈亚斯 T。
编辑:我必须更改问题文本中的某些内容:我将假设“能够使用 uint32 计算画布的点数”更改为“能够计算画布上的点数(或要存储的坐标对数”) by uint32. 我最初的问题没有多大意义,因为我会有一个 sqrt(max(uint32))xsqrt(max(uint32)) 大小的画布,它可以通过 16 位移位和 OR 来唯一地表示。
我希望这没问题,因为所有答案对于更新的假设仍然最有意义
对此感到抱歉。