【发布时间】:2010-10-15 12:14:02
【问题描述】:
一般问题: 我有一个大的 2d 点空间,点点稀疏。 把它想象成一块洒满黑点的白色大画布。 我必须遍历并搜索这些点很多。 画布(点空间)可能很大,接近极限 int 的大小,在设置点之前它的大小是未知的。
这让我想到了散列:
理想: 我需要一个采用 2D 点的散列函数,返回一个唯一的 uint32。 这样就不会发生碰撞。 你可以假设 Canvas 上的点很容易被 uint32 数数。
重要提示:不可能事先知道画布的大小 (它甚至可能改变), 所以像
画布宽度 * y + x
很遗憾,这是不可能的。
我也试过很幼稚的
abs(x) + abs(y)
但这会产生太多的冲突。
妥协: 一种散列函数,可为键提供非常低碰撞概率。
有什么想法吗?感谢您的帮助。
最好的问候, 安德烈亚斯 T.
编辑: 我不得不更改问题文本中的某些内容: 我改变了假设“能够计算画布的点数 使用 uint32” 转换为“能够计算画布上的点数(或要存储的坐标对的数量”),由 uint32. 我最初的问题没有多大意义,因为我会有一个 sqrt(max(uint32))xsqrt(max(uint32)) 大小的画布,这是唯一可表示的 通过 16 位移位和或。
我希望这没问题,因为所有答案在更新的假设下仍然最有意义
对不起。
【问题讨论】:
-
另外,作为参考,请参阅@JonSkeet 的类似回答:stackoverflow.com/a/892640/210709