// Test.cpp : Defines the entry point for the console application.
//
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
time_t t1,t2;
void Tic()
{
t1=time(NULL);
// for(int i=0;i
void Toc()
{
t2=time(NULL);
std::cout<<"time:"<<(t2-t1)/3600<<"时:"<<(t2-t1)%3600/60<<"分:"<<(t2-t1)%60<<"秒"<
int RandInt(int low,int high)
{
float temp=rand()/(static_cast
int k=low+static_cast
return k;
}
struct Point
{
float x;
float y;
int tag;//数据唯一性标志
Point():x(0),y(0)
{
}
Point(float xx,float yy):x(xx),y(yy)
{
}
Point &operator=(const Point& p)
{
this->x=p.x;
this->y=p.y;
this->tag=p.tag;
return *this;
}
friend bool operator==(const Point &p1,const Point &p2);
void Init(const float xx,const float yy);
friend ostream& operator<<(ostream &out,const Point &p);
};
bool operator==(const Point &p1,const Point &p2)
{
if(abs(p1.tag-p2.tag)<1e-8)return true;
else return false;
}
void Point::Init(const float xx,const float yy)
{
x=xx;
y=yy;
}
ostream& operator<<(ostream &out,const Point &p)
{
out<<"tag:"<
}
void FindMin1(const vector
{
minDis=FLT_MAX;
first.Init(FLT_MIN,FLT_MIN);
last.Init(FLT_MAX,FLT_MAX);
for(int i=low;i
for(int j=i+1;j<=high;++j)
if(Diff(pV[i],pV[j])
minDis=Diff(pV[i],pV[j]);
first=pV[i];
last=pV[j];
}
}
}
vector
void FindMin22(const vector
{ //算法导论求二维空间最小点对 标准方法
if(high-low<3)
{
minDis=FLT_MAX;
for(int i=low;i
for(int j=i+1;j<=high;j++)
if(Diff(pVX[i],pVX[j])
minDis=Diff(pVX[i],pVX[j]);
first=pVX[i];
last=pVX[j];
}
}
}
else
{
int mid=(low+high)/2;
Point lFirst,lLast,rFirst,rLast;
float lMinDis,rMinDis;
lMinDis=FLT_MAX;
rMinDis=FLT_MAX;
vector
for(int i=0;i
if(pVY[i].x
else if(pVY[i].x>pVX[mid].x)
rPVY.push_back(pVY[i]);
else
{
for(int k=mid;k>=low&&pVX[k].x==pVY[i].x;k--)
if(pVX[k].tag==pVY[i].tag){lPVY.push_back(pVY[i]);break;}
for(int k=mid+1;k<=high&&pVX[k].x==pVY[i].x;k++)
if(pVX[k].tag==pVY[i].tag){rPVY.push_back(pVY[i]);break;}
}
}
assert(lPVY.size()==mid-low+1);
assert(rPVY.size()==high-mid);
FindMin22(pVX,lPVY,low,mid,lFirst,lLast,lMinDis);
FindMin22(pVX,rPVY,mid+1,high,rFirst,rLast,rMinDis);
minDis=min(lMinDis,rMinDis);//
vector
for(int i=0;i
for(int i=0;i
for(int j=i+1;j<=i+7&&j
minDis=Diff(pVY[i],pVY[j]);
first=pVY[i];
last=pVY[j];
}
}
}
}
//void FindMin2(const vector
//{
// //二维空间寻找最小点对
// if(low==high)
// {
// minDis=FLT_MAX;
// first=last=pV[high];
// }
// else if(high==low+1)//两个顶点
// {
// minDis=Diff(pV[low],pV[high]);
// first=pV[low];
// last=pV[high];
// }
// else
// {
// int mid=(low+high)/2;
// Point lFirst,lLast,rFirst,rLast;
// float lMinDis,rMinDis;
// FindMin2(pV,low,mid,lFirst,lLast,lMinDis);
// FindMin2(pV,mid+1,high,rFirst,rLast,rMinDis);
//
// if(lMinDis
// minDis=lMinDis;
// first=lFirst;
// last=lLast;
// }
// else
// {
// minDis=rMinDis;
// first=rFirst;
// last=rLast;
// }
// if(pV[mid+1].x-pV[mid].x
//
// for(int l=mid;l>=low&&pV[mid+1].x-pV[l].x
// for(int r=mid+1;r<=high&&pV[high].x-pV[mid].x
// if(Diff(pV[l],pV[r])
//
// minDis=Diff(pV[l],pV[r]);
// first=pV[l];
// last=pV[r];
//
//
//
// }
// }
// }
// }
// }
//
//}
void RunAlgorithm()
{
vector
vector
int size;
cin>>size;
while(size)
{
pVX.clear();
pVY.clear();
Init(pVX,pVY,size);
PrintVector(pVX);
PrintVector(pVY);
//PrintVector(pV);
std::sort(pVX.begin(),pVX.end(),CompareX());//按x轴排序
std::sort(pVY.begin(),pVY.end(),CompareY());
PrintVector(pVX);
PrintVector(pVY);
Point p1,p2;
float minDis;
/* minDis=FLT_MAX; minDis=FLT_MAX; int main() return 0;
minDis=FLT_MAX;
Tic();
FindMin1(pVX,0,pVX.size()-1,p1,p2,minDis);
Toc();
std::cout<<"FindMin1:"<
Tic();
FindMin2(pV,0,pV.size()-1,p1,p2,minDis);
Toc();
std::cout<<"FindMin2:"<
Tic();
FindMin22(pVX,pVY,0,pVX.size()-1,p1,p2,minDis);
Toc();
std::cout<<"FindMin22:"<
cin>>size;
}
}
{
RunAlgorithm();
system("pause");
}