今天开始复习典型算法,首先回顾了分治算法的应用。一个经典的问题是求二维空间中最近点对。如果硬性用循环解决这个问题的话,当点的数量较大时,循环的次数会以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)