簡體   English   中英

二維平面中任意點(自身除外)的最近鄰點

[英]Closest neighbor to any point (other than itself) in a 2D plane

給定一個 2D 平面和 N 個點 (n1=(x1,y1), n2=(x2,y2)..., nN=(xN,yN)),什么是快速(O(n) 或更好)算法將找到任何點的最近鄰居(例如,n1 最近鄰居是 n3,n2 最近鄰居是 n4)。 我正在考慮將它存儲在字典中,其中鍵是點,值是鄰居。

SO上好像有很多類似的問題,但我在Python中找不到任何代碼或不是其他語言的答案。

對於給定的點 P,簡單的解決方案:

  • 計算 P 與所有其他點的距離,這是用 O(n) 時間復雜度完成的。
  • 將它們保存為元組列表(或類似的數據結構),(點,距 P 的距離)的元組。
  • 遍歷列表一次可以在 O(n) 時間復雜度內為您提供前 K 個最接近的點。

第二種解決方案在空間復雜度 (O(n^2)) 和隨時間推移的維護方面會花費更多,但會縮短尋找 K 個最近鄰居的時間:

  • 將每個點的字典按距離保存到點的有序列表(或類似的數據結構)——構建此表一次是 O(n^2 * log(n))。
  • 找到 K 個最近點是 O(k) - 字典訪問 + 從有序列表中復制 k 個元素。
  • 時間復雜度的開銷將是添加一個新點或刪除一個舊點,以保持此數據結構有效的方式 - O(n*log(n)) 在兩者中。

您選擇的解決方案應針對您要優化的內容

平均而言可以產生比 O(n) 更好結果的簡單解決方案是使用k-d 樹來存儲點。 構建樹的最壞情況復雜度為 O(nlogn)。 之后搜索平均為O(logn) ,最壞情況為 O(n)(通常針對遠離所有其他數據的點)。

此外,您可能對 LSH 或局部敏感哈希感興趣,雖然它是一種近似方法,這意味着您不會總是得到正確的答案,對於高維數據,它提供了重要的加速,其復雜性與所選參數密切相關。

暫無
暫無

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

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