*分治法
將乙個難以解決的問題,分成多個規模較小的問題逐個擊破,並將解決的子問題進行合併得到母問題的解決方案。
最近點對問題
1.題目描述
給定二維平面上n個點,找其中的一對點,使得在n個點組成的所有點對中,該點對間的距離最小
2.輸入描述
n3.輸出描述
最近點對距離,結果保留2位小數
4.輸入樣例
42 5
1 43 3
5 85.輸出樣例
1.41
問題分析
已知集合s中有n個點,使用分治法的思想就是將s進行拆分,分為2部分求最近點對。演算法每次選擇一條垂線l,將s拆分左右兩部分為sl和sr,( l一般取點集s中所有點的中間點的x座標來劃分,這樣可以保證sl和sr中的點數目各為n/2 否則以其他方式劃分s,有可能導致sl和sr中點數目乙個為1,乙個為n-1,不利於演算法效率,要盡量保持樹的平衡性 )
依次找出這兩部分中的最小點對距離:δl和δr,記sl和sr中最小點對距離δ = min
**示例
#include
#include
#include
#define true 1
#define false 0
using
namespace std;
typedef
struct node//座標點
node;
typedef
struct list
list;
typedef
struct closenode
closenode;
int n;
//點的數目
//輸入各點到list中
void
create
(list &l)
//求距離的平方
double
square
(node a, node b)
//氣泡排序
void
bubblesort
(node r,
int length)}}
}//分治法中先將座標按x軸從小到大的順序排列
void
paixu
(list l)
//左右各距中線d的區域的最近對演算法
void
middle
(const list & l, closenode &cnode,
int mid,
double midx)
}--i;}}
//分治法求最近對
void
divideconquer
(const list &l, closenode &closenode,
int begin,
int end)
}void
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中點數目乙個為...
分治法求解最近點對問題
問題 設p1 x1,y1 p2 x2,y2 p3 x3,y3 p4 x4,y4 是平面上n個雜湊點構成的集合s,最近對問題就是找出集合s中距離最近的點對。解析設s中的點為平面上的點,它們都有2個座標值x和y。為了將平面上點集s線性分割為大小大致相等的2個子集s1和s2,我們選取一垂直線l x m來作...