最近點對問題(一維)

2021-10-09 22:00:42 字數 2281 閱讀 5001

#include

#include

#include

#include

using

namespace std;

const

int maxn =5;

const

int inf =

1e9;

void

swap

(int

*x,int

*y)int

partition

(int

*a,int p,

int q)

}swap

(&a[i]

,&a[p]);

return i;

}int

select

(int

*a,int p,

int q,

int k)

//選擇第k小的點,返回座標

intcpair1

(int

*a,int p,

int q)

}for

(int i = mid+

1;i <= q;i++)}

return d;

}void

print

(int

*a,int p,

int q)

}int

judge

(int

*a,int p,

int q)

}return mingap;

}int

main

(void

)print

(a,0

, maxn-1)

; cout << endl;

cout <<

cpair1

(a,0

, maxn-1)

<< endl;

cout <<

judge

(a,0

, maxn-1)

<< endl;

return0;

}

思路: 分治法

按中位數進行劃分

1.中位數左邊找最近點對(不包括中位數)

2.中位數右邊找最近點對(不包括中位數)

3. 二者取最小值,然後比較中位數與其兩側的點,更新最小距離

#include

#include

#include

#include

using

namespace std;

const

int maxn =5;

const

int inf =

1e9;

void

swap

(int

*x,int

*y)int

partition

(int

*a,int p,

int q)

}swap

(&a[i]

,&a[p]);

return i;

}int

select

(int

*a,int p,

int q,

int k)

//選擇第k小的點,返回座標

intcpair1

(int

*a,int p,

int q)

void

print

(int

*a,int p,

int q)

}int

judge

(int

*a,int p,

int q)

}return mingap;

}int

main

(void

)print

(a,0

, maxn-1)

; cout << endl;

cout <<

cpair1

(a,0

, maxn-1)

<< endl;

cout <<

judge

(a,0

, maxn-1)

<< endl;

return0;

}

思路: 分治法

按中位數進行劃分

1.中位數左邊找最近點對(包括中位數)

2.中位數右邊找最近點對(包括中位數)

3. 二者取最小值。

4.每次劃分都會將主元歸位,搞清楚中位數是第幾小 。

最近點對問題

在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,每個子集中約有...

最近點對問題

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