[問題] 多點到直線的距離

作者: firingmoon (小天)   2015-05-16 22:46:44
各位版友好
今天我有n個點,求每一個點到直線L的距離,最終找出其中一點
且此點到直線L的距離最長
直觀的來講我只需要做n次並用max函數即可
但我希望速度能夠更快
所以想請教各位是否有演算法可以加速計算此部分 謝謝
作者: yr (Sooner Born Sooner Bred)   2015-05-17 00:16:00
那就邊做算把 max 存著,這樣快了一些 :p
作者: firingmoon (小天)   2015-05-17 00:19:00
這部分我有做了
作者: RealJack   2015-05-17 00:25:00
我認為距離公式有乘除又有根號,計算量很大如果先做convex hull再對外圍頂點做距離公式,取其最大值這樣應該會比較快,但或許有更好的方式啦
作者: EdisonX (卡卡獸)   2015-05-17 00:27:00
分母部份應該可以省掉,只要算分子。
作者: Leeng (Leeng)   2015-05-17 00:35:00
是不是只要求哪個點就好,距離的值不care?其他的點也不care那就每次只要算|ax+by+c|;比前一個小就discard後面根號那一坨根本就不用算,或最後取完點後,算一次就好不能先排序吧 一排序就是NlogN 除非你在輸入資料的時候
作者: firingmoon (小天)   2015-05-17 01:09:00
抱歉 剛剛才想到排序這樣做不行Orz
作者: Leeng (Leeng)   2015-05-17 01:11:00
就先建好,不過那也是要N量級想到一個啦 假如取index[i]會耗時的話 就用指標++ ....不過你的data可能是文件讀進來的吧 那可能連陣列都不用存
作者: firingmoon (小天)   2015-05-17 01:14:00
不好意思 這部分我不太懂你的意思是指?
作者: Leeng (Leeng)   2015-05-17 01:14:00
邊讀就能邊算、邊discard是寫C/C++ ?
作者: azureblaze (AzureBlaze)   2015-05-17 01:15:00
指標++和index[i]最佳化開下去是一樣的東西我不認為有O(N)以下的方法平行處理吧 分k組個別求最大,在比較各組冠軍再來就你真的嫌太慢還是只是想做?這種狀況讀檔可能比計算慢
作者: firingmoon (小天)   2015-05-17 01:19:00
讀檔的部分在時間上我可以不在意,我只在意計算距離找點的部分我只是想試著看看沒有更快的方式
作者: Leeng (Leeng)   2015-05-17 01:20:00
如果還有其他幾何可能的話,只能有請高斯了
作者: RealJack   2015-05-17 01:25:00
只求一次的話就直接算吧,也會對其他線求最大值那做個convex hull,第二次會快很多
作者: azureblaze (AzureBlaze)   2015-05-17 01:31:00
你的n個點有任何特殊性質嗎?像照著某種順序給?
作者: RealJack   2015-05-17 01:31:00
還有你的檔案是文字格式還是可直接序列化的二進制格式這兩者速度會差上數百倍
作者: firingmoon (小天)   2015-05-17 01:49:00
我的n個點是時間序列,沒有甚麼特別性質RealJack抱歉 不太懂你的意思
作者: EdisonX (卡卡獸)   2015-05-17 01:54:00
(1) 對 10K 個點找最近,是只會做一次還是會重覆做 ?(2) 你的來源資料是你可以讀得懂的文字檔嗎 ?(3) n個點是時間序列沒錯,已知是2維,還有沒有特殊性質 ?結果上述的問題。然後平行化+1.抱歉修正一下, 是對 10K 個點找最遠 @@
作者: azureblaze (AzureBlaze)   2015-05-17 02:04:00
改用C 平行處理 SIMD 能用的方法大概就這些
作者: LiloHuang (十年一刻)   2015-05-17 15:10:00
這類問題很適合用 GLSL 或者 OpenCL 來做平行計算我找到一個 GLSL 版本供你參考 http://goo.gl/SokaVC
作者: FRAXIS (喔喔)   2015-05-17 21:45:00
依照我的經驗 dis 的計算和 if condition 會造成 delay你可以手動用類似 software pipeling 的方法加快一點你可以試著用 profiling tool 去觀察每個 instruction的時間 然後再思考怎麼改進你的問題 O(n) 的時間是不能避免的了 但是或許可以減少outer loop 呼叫這 function 的次數..
作者: firingmoon (小天)   2015-05-18 10:39:00
感謝各位版友的幫助 我會試著你們給的建議測試看看
作者: sulf (sulf)   2015-11-13 12:01:00
矩陣旋轉,把直線當成新X軸,只要計算新的y座標比較

Links booklink

Contact Us: admin [ a t ] ucptt.com