演算法分析分治法之最近點對問題

2021-10-04 20:25:28 字數 1486 閱讀 2258

*分治法

將乙個難以解決的問題,分成多個規模較小的問題逐個擊破,並將解決的子問題進行合併得到母問題的解決方案。

最近點對問題

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來作...