最近點對問題 c

2021-10-22 13:56:02 字數 1873 閱讀 7831

最近點對的演算法還是比較清楚的,在實際**階段要讓效率達到最高,需要先對x排好序,遞迴過程中保證不再更改(因為x只用於分割這一步)。之後對y的排序要融合歸併排序進去,即把元素分割到1個,這樣保證排好序。之後在合併步驟只要合併兩個排序好的陣列,o(n)即可解決。

#include

typedef

long

long ll;

using

namespace std;

typedef tuple<

double

,double

> p;

int inf =

1<<30;

bool

cmp_y

(p a, p b)

double

calculate_dist

(p a, p b)

// 呼叫時,橫座標都是排好序的

double

min_dist

(vector& v,

int l,

int r)

}return d;

}int

main()

sort

(v.begin()

, v.

end())

;double ret =

min_dist

(v,0

, v.

size()

-1);

if(ret >

10000

)printf

("infinity\n");

else

printf

("%.4f\n"

, ret);}

}

c++的lambda表示式用過嗎?這裡面很好用的。下圖為更改之後的新方案,首先,要用fabs處理浮點數的絕對值,然後就是,inplace_merge最後乙個是end,就是end+1的位置,這個bug實在是不應該啊,說明對c++特性不熟。

這種新方案的特點是,沒有常數迴圈,而是利用縱座標超過閾值時最多是常數個點的特性,動態的中斷迴圈。其實這種是更合理的。

#include

typedef

long

long ll;

using

namespace std;

typedef tuple<

double

,double

> p;

int inf =

1<<30;

double

calculate_dist

(p a, p b)

// 呼叫時,橫座標都是排好序的

double

min_dist

(vector& v,

int l,

int r));

vector<

int> prev_y;

for(

int i = l; i <= r; i++

) prev_y.

push_back

(i);

}return d;

}int

main()

sort

(v.begin()

, v.

end())

;double ret =

min_dist

(v,0

, v.

size()

-1);

if(ret >

10000

)printf

("infinity\n");

else

printf

("%.4f\n"

, ret);}

}

最近點對問題

在n n 1 個點的集合中尋找最近點對。即求任意兩點的歐幾里得距離的最小值。1 最簡單的暴力搜尋演算法,時間複雜對為o n n 2 這裡主要考慮分治演算法,執行時間的遞迴式為t n 2 t n 2 o n 時間複雜度為o n lgn 演算法思想 將集合中的點按x座標排序,我們可以想象一條垂直的直線將...

最近點對問題

在二維平面上的n個點中,如何快速的找出最近的一對點,就是最近點對問題。一種簡單的想法是暴力列舉每兩個點,記錄最小距離,顯然,時間複雜度為o n 2 在這裡介紹一種時間複雜度為o nlognlogn 的演算法。其實,這裡用到了分治的思想。將所給平面上n個點的集合s分成兩個子集s1和s2,每個子集中約有...

最近點對問題

最近點對問題,是分治法的乙個典型應用,可以作為分治法入門的乙個切入點。最近點對問題的描述比較簡單,在二維平面中,給定一堆點,求距離最近的一對點,思路是,講這一堆點分為兩部分,左域與右域,如何劃分左域右域呢?我們知道,這一堆點,每乙個點都有其橫座標,假如有十個點,對應十個橫座標,我們就取其中間數,然後...