簡體   English   中英

在C#詞典中獲取相似值的最快方法

[英]Fastest Way to Get Similar Values in C# Dictionary

我在C#中有一個空間哈希類,用於檢測3D數據。 每個頂點位置都有一個空間哈希值和Vector3存儲在Dictionary<float, Vector3> ,其中float是我計算出的實際空間哈希值。 我了解空間哈希的方式是將哈希分類到各個存儲桶中,然后獲得彼此在閾值(例如0.0001f)以內的值。 我所做的大多數研究都實現了存儲桶排序,但我不知道如何使用已有的Dictionary來實現。

所以,我的問題是,我應該如何在類似的Dictionary中獲得相似的值? 到目前為止,在我看來,我需要將哈希值按threshold的大小分類到存儲桶中,並以某種方式維護與Vector3的鏈接。 我是否完全以錯誤的方式來處理? 比方說,是否存在另一個更適合該特定用例的泛型?

實施界面

IEqualityComparer<float>

處理模糊匹配並將其傳遞給字典的構造函數

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

如果您想避免麻煩,請重新考慮使用空格哈希。 雖然絕對有可能實現,但3D哈希函數非常復雜(也就是說,如果您想要完美的哈希),並且可以輕松地由一些智能的“足夠接近”的函數代替。

因此,選擇是您的:

完美哈希

要么

巧妙使用的“ Close-Enough”功能 (取自OpenGL SuperBible的源代碼,請查找“ m3dCloseEnough”)

Dictionary類不允許鍵沖突,因此,如果要將多個向量與同一個空間哈希關聯(即它們存儲在同一存儲桶中),則需要存儲向量列表而不是單個列表。 本質上,您是在字典中存儲自己的存儲桶:

Dictionary<float, List<Vector3>> Buckets;

接下來,您需要確保您的空間哈希函數為需要位於同一存儲桶中的每個項目返回相同的值。 考慮到這一點,您最好使用整數作為空間散列。

最后,為了從字典中獲得相似的項目,您將必須使用以下步驟:

  1. 確定用於獲取相似項的邊界框(例如,<X-delta,Y-delta,Z-delta>,<X + delta,Y + delta,Z + delta>)
  2. 遍歷所有可能與邊界框相交的存儲桶
    1. 對於每個相交的存儲桶,計算存儲桶內某個點的空間哈希,並使用字典獲取存儲桶中的項目列表
    2. 將存儲桶中的項目添加到結果列表中

如果您的存儲桶尺寸相對於邊界框較小,則上面的內容可能是很多不必要的工作。 如果是這種情況,那么您應該考慮使用其他數據結構,例如八叉樹。

為了使Dictionary能夠正常工作,必須為每個項目分配一個存儲桶,以便可以盲目地將每個項目假定為與另一個存儲桶中的任何項目都不相等。 因此,不可能直接使用Dictionary來定位靠近給定點的對象,因為此類對象可能會落入多個桶中。

如果您希望能夠找到距離給定點嚴格小於半個單位的所有對象,我建議您為存儲桶分配整數坐標的組合,然后將每個點放置在每個(通常是八個)存儲桶中其坐標表示與所討論點相比的下一個較大或下一個較小的整數。 要查找集合中是否包含與給定點相距嚴格小於半個單位的點,請在存儲桶中查找最近的點。

根據所討論點的密度,使用較粗的網格可能會有所幫助,在這種情況下,只需將多個對象存儲在單個存儲桶中即可。 關鍵要求是每個點都必須存儲在每個存儲桶中,而每個存儲桶都應“最接近”它應匹配的任何點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM