在C#字典中获取相似值的最快方法

时间:2013-03-27 16:31:34

标签: c# algorithm sorting generics

我在C#中有一个空间哈希类来检测3D数据。每个顶点位置都有一个空间散列,Vector3存储在Dictionary<float, Vector3>中,其中float是我计算的实际空间散列。我理解空间哈希的方法是将哈希值排序到桶中,然后获得彼此在阈值(例如,0.0001f)之内的值。我所做的大多数研究都实现了桶分类,我无法弄清楚如何使用Dictionary来实现。

所以,我的问题是,我应该如何在像这样的字典中获取相似的值?到目前为止,在我看来,我需要将哈希值排序到大小为threshold的存储桶中,并以某种方式保持与Vector3的链接。我完全以错误的方式接近这个吗?比方说,是否有更适合这种特殊用例的不同通用?

4 个答案:

答案 0 :(得分:0)

实施界面

IEqualityComparer<float>

处理模糊匹配并将其传递给Dictionary的构造函数

http://msdn.microsoft.com/en-us/library/ms132151.aspx http://msdn.microsoft.com/en-us/library/ms132072.aspx

答案 1 :(得分:0)

如果您试图避免麻烦,请重新考虑使用空格散列。虽然绝对可以实现,但3D哈希函数非常复杂(如果你想要一个完美的哈希),并且很容易被一些聪明的“足够接近”的函数所取代。

所以,选择是你的:

Perfect Hashing

Smartly used 'Close-Enough' functions(取自OpenGL SuperBible的源代码,请查找'm3dCloseEnough')

答案 2 :(得分:0)

Dictionary类不允许键冲突,因此如果您希望多个向量与相同的空间哈希相关联(即它们存储在同一个存储桶中),您需要存储向量列表而不是个体。基本上你将自己的存储桶存储在字典中:

Dictionary<float, List<Vector3>> Buckets;

接下来,您需要确保空间哈希函数为每个需要在同一个存储桶中的项返回相同的值。考虑到这一点,您可能最好使用整数作为空间哈希。

最后,为了从字典中获取类似的项目,您将不得不使用以下步骤:

  1. 确定获取类似项目的边界框(例如&lt; X-delta, Y-δ,Z-δ>,&lt; X + delta,Y + delta,Z + delta&gt;)
  2. 迭代可能与边界框相交的所有桶
    1. 对于每个相交的存储桶,计算存储桶内某点的空间哈希值,并使用字典获取存储桶中的项目列表
    2. 将存储桶中的项目添加到结果列表
  3. 如果你的铲斗尺寸相对于你的边界框很小,上面可能会有很多不必要的工作。如果是这种情况,那么您应该考虑使用不同的数据结构,例如八叉树。

答案 3 :(得分:0)

为了使Dictionary起作用,必须为每个项目分配一个桶,这样每个项目可能被盲目地假定为与不同桶中的任何项目不相等。因此,不可能直接使用Dictionary来定位靠近给定点的对象,因为这些对象可能会落入多个存储桶中。

如果您希望能够找到距离给定点严格小于半个单位的所有对象,我建议您分配整数坐标的桶组合,然后将每个点放在每个对象中(通常8)桶,其坐标表示与所讨论的点相比的下一个较大或下一个较小的整数。要查找集合是否包含距离给定点严格小于半个单位的点,请在存储桶中查找最近的点。

根据所讨论的点的密度,使用较粗糙的网格可能会有所帮助,在这种情况下,许多对象只需要存储在一个存储桶中。关键要求是每个点必须存储在每个桶中,这些桶可能“最接近”它应匹配的任何点。