分治法求最近對問題

2021-09-02 05:59:52 字數 1006 閱讀 6221

首先感謝博主讓我收穫很多,今天感覺很睏,狀態不佳,解析與講解會改天補上,註明:我這裡採用遞迴時是左閉右開區間,而博主採用的左閉右閉。

還有感謝「nx」童鞋為我調好vs2017,之前因為環境問題一直裝不上,不過vs2017的除錯是真的好用啊,哈哈!

code

#include #include #include #define inf 0x3f3f3f3f

using namespace std;

const int maxn = 1005;

typedef struct point

point;

int n;

point p[maxn];

double dist(point p1, point p2)

bool cmp(point p1, point p2)

bool cmp2(point p1, point p2)

double solve(int left, int right)

if (right - left == 2)

int mid = (left + right) / 2;

double d1 = solve(left, mid);

double d2 = solve(mid, right);

double d = min(d1, d2);

int l = left;

while (p[l].x < p[mid].x - mid && l < right) l++;

int r = right - 1;

while (p[r].x > p[mid].x + d && r >= left) r--;

sort(p + l, p + r + 1, cmp2);

double d3;

for (int i = l; i <= r; i++) }

return d;

}int main()

分治法求最近點對問題

分治法 1 演算法描述 已知集合s中有n個點,分治法的思想就是將s進行拆分,分為2部分求最近點對。演算法每次 選擇一條垂線l,將s拆分左右兩部分為sl和sr l一般取點集s中所有點的中間點的x座標來劃分,這樣可以保證sl和sr中的點數目各為n 2,否則以其他方式劃分s,有 可能導致sl 和sr中點數...

分治法求最近點對問題

1 演算法描述 已知集合s中有n個點,分治法的思想就是將s進行拆分,分為2部分求最近點對。演算法每次 選擇一條垂線l,將s拆分左右兩部分為sl和sr,l一般取點集s中所有點的中間點的x座標來劃分,這樣可以保證sl和sr中的點數目各為n 2,否則以其他方式劃分s,有 可能導致sl 和sr中點數目乙個為...

分治法求最近點對

1 演算法描述 1.分割 將集合s進行以垂直於x軸的直線l進行平均劃分,並且保證sl和sr中的點數目各為n 2,否則以其他方式劃分s,有可能導致sl和sr中點數目乙個為1,乙個為n 1,不利於演算法效率,要盡量保持樹的平衡性 依次找出這兩部分中的最小點對距離 l和 r,記sl和sr中最小點對距離 m...