假設我有一個2維點的集合,以及一種確定它們之間距離的方法。這個集合經常被修改,添加了額外的點並刪除了現有的點。在任何時候,我都需要知道點之間的最大和最小距離,即最遠的兩點之間的距離以及兩點之間最近的距離。有沒有一種數據結構或算法可以很好地完成這項任務?每次點改變時,我寧願不必重新計算整個距離。追蹤一組點中最大距離的最佳方法?
回答
從理論上講,您可以通過存儲您所擁有的點的convex hull高效地完成此操作。
每當您添加一個新點時,請測試以確定它是否位於此polytope的內部。如果是這樣,則保留最大距離。如果不是,那麼它可能已經改變。
同樣,如果您從內部刪除一個點,最大距離(直徑)被保留,所以不做任何改變。但是,如果刪除邊界點,則必須重新計算凸包。
如果您在2維中,那麼當您添加或從邊界移除時,多邊形的至多兩側都會受到影響。這些應該很容易計算,具體取決於你如何存儲信息(例如一系列線段)。
編碼這可能有點痛苦,但最簡單的方法是標記邊界上的點,然後有一個函數,測試點是否位於標記點的凸包內。
我一點也不確定這是最好的,但這是我現在能想到的最好的。
將最大值與在該距離處的一組點對一起保存。 (最大值不一定是唯一的。)
同樣當然最小。
當您添加一個點,計算所有其他點新點的距離,而其對應的一組端點對替換您保存的最大值和最小值在一起,如果新的點在一個更好的最大或最小參與,或者如果它匹配當前最好的,則更新該組端點。
刪除點時,檢查是否清除整個記住的最小或最大點集。如果沒有,你不需要做任何事情。但如果是這樣,我認爲你需要重新計算一切。
爲了最大化計算,我相信PengOne的建議可以告訴你,如果你可以完全跳過計算。
而不是使用凸包(如在另一個答案中建議),你可以使用Delaunay三角?
最小投影距離:
要計算從節點的最短距離的任何其他集合中,你應該只需要檢查節點的近鄰,即那些通過在邊緣連接到它三角測量。
因此,如果插入新節點,更新三角測量,找到新節點的鄰居以及更新中「涉及」的任何其他節點,計算此本地「更新」集中所有節點的距離,並且檢查是否找到新的最小值。類似地,如果現有節點被刪除,則再次更新三角測量並重新計算「涉及」的所有節點的距離。
有一類所謂的「增量」算法,可以用來構建Delaunay三角剖分,只需要在插入/刪除新節點時對整個三角剖分進行局部修改,所以這就是我想要的方法類型建議頻繁插入/刪除。
最大距離:
如凸包風格回答表明,你只需要重新計算邊界節點之間的距離,如果一個新的節點是在現有的三角測量之外,或如果現有的邊界節點加入已被刪除。
希望這會有所幫助。 「
- 1. Kinect 2對象追蹤最佳方法
- 2. 最小,最大,各組/縣之間的平均點距離
- 3. 數據量過大時計算距離的最佳和最快的方法?
- 4. iOS - 測量距離的最佳方式
- 5. 找到距離地點最小總距離的點的算法
- 6. 填充numpy數組與點距離的最快方法
- 7. 計算網格中目標的距離的最佳方法
- 8. LINQ的最大距離表
- 9. 找到一個點,使距離一個有限區域內的一組點的總距離最大
- 10. 以最短距離覆蓋圓中所有點的最佳算法
- 11. 到點的最短距離
- 12. 最大 - 最小距離的計算
- 13. Python中三維點之間的最小距離,平均距離和最大距離
- 14. 根據距離在點之間分配最佳值的算法
- 15. AGREP最大距離參數
- 16. 最大。藍牙距離
- 17. Three.js FogExp2與最大距離?
- 18. iOS - 確定距離穿越的最佳方法
- 19. 這是平行餘弦距離的最佳方法嗎?
- 20. Android:計算兩個位置之間距離的最佳方法
- 21. fmod中的最大3D距離
- 22. Android:尋找Point和Rect之間最短距離的最佳方法?
- 23. Magento:如何追蹤或追蹤客戶會議的最佳方式?
- 24. 跟蹤Javascript代碼的最佳方法
- 25. 與Mongoid的Model.near方法的最大距離
- 26. 分離值的最佳方法
- 27. 最小距離
- 28. 距離(最短)
- 29. 跟蹤文本文件中最後一行的最佳方式
- 30. 用3D計算點到三角形距離的最快方法?
」每當添加一個新點時,測試它是否位於該多面體的內部,如果是,則保留最大距離,如果不是,則可能已經改變。 這是真的嗎?對於一個簡單的反例,假設您有12個點以2D排列在一個圓圈內。如果在中心添加新點,最大距離將會增加。 –
@Kevin:給定一組點,它們之間的最大距離是點凸包的直徑。我的主張是從這個事實得出的。 – PengOne
你是對的,我的簡單例子實際上也說明了很多。哎呀,謝謝。 –