[問題] 平面上 N 點,放額外一點 P 求最近點

作者: EdisonX (卡卡獸)   2014-10-30 21:00:26
變數假設
struct Point { float x , y ; }
Point a[m];
Point b[n];
最大點對 問題是在 a 裡面,找最近的兩點 ,
( ↑雖然這我也不會有效的方法 )
但我的問題是,把 a[i] 依序放入 b 中,
從 b 裡找出與 a[i] 最近的點,
暴力法用虛碼表示如下
for(i = 0 : m-1 )
{
min_idx = 0 ;
min_dist = distance( a[i], b[min_idx] );
for(j = 1 : n-1)
{
dist = distance( a[i] , b[j] ) ;
if ( dist < min_dist)
{
min_dist = dist ;
min_idx = j;
}
}
// min_dist , min_idx 是要求的 , 到時候會全部存下來
}
想請教是否有什麼算法可較快完成上述需求?
或我該找什麼 keyword ?
先謝謝各位。
作者: bibo9901 (function(){})()   2014-10-30 21:02:00
closest pair problem
作者: FRAXIS (喔喔)   2014-10-30 21:06:00
nearest neighbor query
作者: EdisonX (卡卡獸)   2014-10-30 21:28:00
疑!想一下也像是 knn(k==1) , 實作上似乎麻煩多 Orz謝謝 FRAXIS , 我再搜一下有什麼算法解這問題 , 感謝
作者: m80126colin (許胖)   2014-10-31 04:27:00
有個東西叫做 Voronoi Diagram,不知道有沒有相關?
作者: scwg ( )   2014-10-31 09:09:00
http://stackoverflow.com/questions/5077318/是你要的嗎? 還是你要 min_dist/idx forall a?kd-tree for b should help anyway
作者: EdisonX (卡卡獸)   2014-10-31 09:28:00
@scwg , 嗯 , 我要的是 min_dist/idx forall a? , 謝謝提供的 keyword , 感謝。
作者: LPH66 (-6.2598534e+18f)   2014-11-01 00:28:00
kd-tree 主要是查詢省時間, 點集固定查詢點很多時很有用
作者: FRAXIS (喔喔)   2014-11-01 06:07:00
因為你的b是靜態的 先建Voronoi diagram然後建立point location的查詢 應該會比較快
作者: DJWS (...)   2014-11-01 07:39:00
scholar.google.com.tw/scholar?&q=nearest+neighbor+querybooks.google.com.tw/books?&q=nearest+neighbor+query這個題目有成千上萬人做過 方向很多比較淺顯易懂的介紹 http://www.cs.uu.nl/geobook/
作者: EdisonX (卡卡獸)   2014-11-01 22:31:00
明天我整理下目前所做的 code 放上來 , 先謝謝各位給的資訊,真的非常感謝!
作者: FRAXIS (喔喔)   2014-11-04 03:25:00
Kd-Tree是支援dynamic insert/delete的你的問題中b是靜態的 所以要找static data structure

Links booklink

Contact Us: admin [ a t ] ucptt.com