我在一組中具有相當大的一組2D點(~20000),並且對於x-y平面中的每個點想要確定來自該組的哪一點最接近。 (實際上,這些點是不同類型的,我只想知道哪種類型最接近,而xy平面是位圖,比如說640x480)。使用網格劃分的2D中的最近鄰居搜索
從this answer到問題「All k nearest neighbors in 2D, C++」我的想法是做一個網格。我創建了n * m個C++向量,並將這些點放入向量中,具體取決於它落入哪個bin。這個想法是,你只需要檢查倉內點的距離,而不是所有的點。如果垃圾箱中沒有點,則以螺旋方式繼續相鄰垃圾箱。
不幸的是,我只看過奧利查爾斯沃思的評論算賬:
不只是相鄰的,不幸的是(考慮到在細胞點的兩個 向東可能比點更接近直接在單元格東北部,例如: ;這個問題在更高維度上變得更糟)。 另外,如果相鄰單元碰巧有少於10個點的話呢?在實踐中,你需要「螺旋形」。
幸運的是,我已經有不斷上升的代碼想通了(一個不錯的C++ version here,並有在同一個問題的其他版本)。但我還是留下的問題:
如果我發現小區內的打擊,有可能是在相鄰的小區更近的命中(黃色是我的探頭,紅色的是錯誤的選擇,綠色實際的最近點):
如果我發現相鄰小區一擊,有可能是在細胞內命中2步之遙,爲奧利查爾斯沃思說:
但更糟糕的是,如果我在兩步之外的單元格中發現命中,那麼三步之外的命中仍然可能更接近命中!這意味着我不得不考慮所有的細胞與DX,DY = -3 ... 3,或49細胞!
現在,在實踐中,這不會經常發生,因爲我可以選擇我的窗口尺寸使細胞充滿足夠。不過,我想得到一個正確的結果,而不是遍歷所有點。
那麼,我該如何找出何時停止「螺旋」或搜索?我聽說有多個重疊網格的方法,但我不太明白。是否有可能挽救這種網格技術?
你的觀點是靜態的還是動態的?對一個點集執行多少個「最近查詢」查詢? – MBo 2013-04-05 03:06:50
是 - 有沒有原因不使用現有的良好開發的庫,如內部使用kd樹的ANN?或者是 - 出於好奇? – WhitAngl 2013-04-05 23:26:37