算法分析分治法之最近点对问题

本文介绍了如何利用分治法解决二维平面上找到最近点对的问题。首先解释了分治法的基本思想,即将大问题分解为小问题解决并合并结果。接着详细描述了最近点对问题的定义、输入输出格式以及输入样例。在问题分析部分,讨论了如何通过选取垂线将点集拆分为两个相等或接近相等的部分,并找到这些部分中最小的点对距离。最后,文章给出了代码示例来展示如何实现这一算法。
摘要由CSDN通过智能技术生成

算法分析分治法之最近点对问题

*分治法
将一个难以解决的问题,分成多个规模较小的问题逐个击破,并将解决的子问题进行合并得到母问题的解决方案。
最近点对问题
1.题目描述
给定二维平面上n个点,找其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小
2.输入描述
n
3.输出描述
最近点对距离,结果保留2位小数
4.输入样例
4
2 5
1 4
3 3
5 8
5.输出样例
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{δL,δR}

代码示例

#include<iostream>
#include<cmath>
#include <iomanip>
#define TRUE 1
#define FALSE 0
using namespace std;
typedef struct Node//坐标点
{
   
    double x;
    double y;
}Node;
typedef struct List
{
   
    Node* data;      //点
    int count;      //点的个数
}List;
typedef struct CloseNode
{
   
    Node a;
    Node b;     //计算距离的两个点
    double space;     //距离平方
}CloseNode;
    int n;     //点的数目
//输入各点到List中
void create(List &L)
{
   
    cin >> n;
    L.count = n;
    L.data = new Node[L.count];      //动态空间分配
    for (int i = 0; i<L.count; ++i)
    cin >> L.data
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值