[英]Finding maximum distance between (x,y) coordinates
我試圖計算一個大的2D輸入的最大曼哈頓距離,輸入由(x,y)s組成,我想要做的是計算這些坐標之間的最大距離小於O(n ^ 2)時間,我可以通過遍歷所有元素來在O(n ^ 2)中完成它,例如:
*(兩點(X1,Y1)和(X2,Y2)之間的曼哈頓距離為:| X1-X2 | + | Y1-Y2 |)
for ( 0 -> n )
for ( 0-> n )
{ // here i calculate |Xi - Xj| + |Yi - Yj| which is maximum }
但對於非常大的輸入它不會有效:(
誰有任何想法更好的算法?
如果我們只考慮Xi <= Xj
結果,則只有兩種情況需要考慮。
Yi <= Yj
,那么距離是(Xj + Yj) - (Xi + Yi)
(Xj - Yj) - (Xi - Yi)
通過將其分解為這些情況,我已經擺脫了絕對值函數,使得更容易推斷距離。
因此,我們只需選擇具有最小和最大x+y
,並計算距離。 然后選擇具有最小和最大xy
,並計算距離。 這兩個距離中的一個是你的最大距離。
這可以在O(n)
,這是漸近最優的。
它非常簡單,可以用O(n)
計算
設x1>x2
, y1>y2
max(|x1-x2|+|y1-y2|) = max(x1-x2+y1-y2) = max(x1+y1) - min(x2+y2)
設x1>x2
和y1<y2
max(|x1-x2|+|y1-y2|) = max(x1-x2-y1+y2) = max(x1-y1) - min(x2-y2)
現在用x2更改x1並獲得相同的結果。
所以一般來說你的解決方案是
max ( (max(xi+yi)-min(xi+yi)), (max(xi-yi) - min(xi-yi)) )
對這樣的問題做的最好的事情就是嘗試建立一些可以幫助解決整體問題的小結果。
例如,確定對於任何三個點A,B和C來說並不難,這些點具有B 介於其間的條件(更多關於此秒)A和C,B將永遠不會超過第四個點點D大於A和C中的一個。對於距離的標准歐幾里德度量,如果點位於連接它們的段上,則點在兩個其他點之間。 對於曼哈頓測量而言,它並非如此簡單 - 部分原因是因為段的概念不是很清楚。
描述'之間'的更一般方式是這樣(使用A到B的距離為| AB |的符號):如果| AB |,則點B在兩個點A,C之間。 + | BC | = | AC |
你可以看到,在歐幾里德距離中,這意味着B位於連接A和C的段上。
在曼哈頓距離中,這意味着點B包含在由A和C定義的矩形中(如果AC與軸平行,則當然可以是直線段)。
這個結果意味着對於任何一點,如果它位於兩個現有點之間,那么添加到集合中的任何新點都不會比圍繞它的兩個點更遠。
現在,這些信息並沒有為您解決問題,但它確實讓您放棄了許多潛在的未來計算。 一旦確定某個點位於另外兩個點之間,就沒有必要跟蹤它。
因此,您可以通過僅跟蹤最外面的點,並忽略其中的任何內容來解決此問題。
對於不經意的觀察者來說,這是一項有趣
證明你可以擁有不超過4個不同點,這樣在曼哈頓意義上,其他兩個點之間沒有任何一點。
通過第二個結果,您可以清楚地了解到最多只需要跟蹤4個點。
已經呈現的一些其他方法可能更快,但這種方式更有趣!
額外信用
將這些想法概括為n維
第一個重大改進是:
for ( X: 0 -> n )
for ( Y: X -> n )
{ compute the distance between X and Y }
因為X和Y之間的距離與Y和X之間的距離相同,這會使你的計算減少一半......
最大距離將介於最遠離彼此的點之間。 因此,您只需找到具有最大X和最大Y的點,然后找到具有最小X和最小Y的點並計算它們之間的距離。 可能有很多點符合標准..但至少你會有更少的點來檢查
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.