最近点对问题(分治思想的经典应用)

今天开始复习典型算法,首先回顾了分治算法的应用。一个经典的问题是求二维空间中最近点对。如果硬性用循环解决这个问题的话,当点的数量较大时,循环的次数会以O(n2)增加,所以这不是较好的解决方法。对于这种问题,可以通过将原问题不断划分为更小的子问题进而加以解决。在《数据结构、算法与应用-----c++语言描述》一书中给出了这一问题完备的分治递归解决方案。 算法过程如下:

1、如果点的数量n较小,则直接用暴力循环求解。

2、否则将点集分为大致相等的两个部分A和B。

3、分别确定A和B中距离最近的点对,并取较小者L。

4、求A与B中的最近点对。

5、取上面二者中较小的解为最终答案。

其中的关键问题在第4步,即如何求两个子问题之间的最近点对。可以将A和B中与分界线距离小于L的点找到,如果这些点中任意两点的纵向距离小于L则计算其距离,取最小距离即为所求。

按照书上的解释,代码如下:

// NearestPointsFinal.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <vector>
#include <ctime>
#define  squaresize 1000
using namespace std;
int count1=0;
class Npoint
{
public:
	int ID;
	int x;
	int y;
};
void mysortX(vector<Npoint>& v)
{
	const size_t s=v.size();
	for(int gap=s/2;gap>0;gap/=2)
		for(int i=gap;i<s;++i)
			for(int j=i-gap;j>=0;j-=gap)
				if(v[j+gap].x<v[j].x){
					::count1++;
					Npoint temp=v[j];
					v[j]=v[j+gap];
					v[j+gap]=temp;
				}
}
void mysortY(vector<Npoint>& v)
{
	const size_t s=v.size();
	for(int gap=s/2;gap>0;gap/=2)
		for(int i=gap;i<s;++i)
			for(int j=i-gap;j>=0;j-=gap)
		
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值