C# 在恒定时间内搜索集合中的给定点

C# 在恒定时间内搜索集合中的给定点,c#,algorithm,computational-geometry,C#,Algorithm,Computational Geometry,给定一组点和一个点p。找出该点p是否以恒定时间存在于该集合中。搜索应该是近似的。 对于eg:10、20和11,20应被视为相同的点。应该有一些阈值,比如1。 我用的是C#。当前实现使用字典。我的point类已重写Equals和GetHashCode()方法。GetHashCode方法始终返回1。这意味着所有东西都放在同一个桶中,这将使搜索更加彻底。当前的实现没有有效地使用哈希能力。我无法找到一个哈希函数或任何其他方法来完成这项工作 如果您愿意让“近似”的定义变得模糊,有一种简单的方法可以在O(1

给定一组点和一个点p。找出该点p是否以恒定时间存在于该集合中。搜索应该是近似的。 对于eg:10、20和11,20应被视为相同的点。应该有一些阈值,比如1。
我用的是C#。当前实现使用字典。我的point类已重写Equals和GetHashCode()方法。GetHashCode方法始终返回1。这意味着所有东西都放在同一个桶中,这将使搜索更加彻底。当前的实现没有有效地使用哈希能力。我无法找到一个哈希函数或任何其他方法来完成这项工作

如果您愿意让“近似”的定义变得模糊,有一种简单的方法可以在
O(1)
中执行


这是一张照片。给自己画一个网格。在偶数线上画方框。在奇数线上绘制不同颜色的方框。你要做的是将每个点散列到它的偶数框和奇数框。任何足够近的东西都会在其中一个里面。“足够近”的定义会因您相对于网格的位置而大不相同。

您的问题基本上转化为“检查给定项是否存在于给定的N个项的恒定时间集合中”。如果您找到了解决方案,请务必让我知道。这将是改变世界的下一代算法编写哈希函数很容易。查阅FNV1A。编写一个常数时间搜索算法并不容易。有了近似值,它还容易吗?我希望点是相似的,即使它们相距一些阈值。我真的无法想象如何用哈希代码满足邻近检查的要求。散列会丢弃信息,因此简单地按照鸽子洞原理,似乎不可能想出任何方法来“散列”一个连续的2D域,而不会以某种方式使您偏向网格。根据您的邻近度量是什么(半径?),通过适当的数据结构选择,可能仍然可以在恒定时间内完成此操作。根据空间网格(例如)对点进行散列怎么样。或者,更复杂的是,您可以使用位置敏感哈希()