快速空间最近点对C++实现.docx_第1页
快速空间最近点对C++实现.docx_第2页
快速空间最近点对C++实现.docx_第3页
快速空间最近点对C++实现.docx_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/* *im:平面最近点对 *&2016-2-25 15:47:50*Author:小花熊 *Q:1198253149 */#include#include#include#include struct Point float x,y; ; /插入排序 void _insert_sorty(Point *y,const int size) Point *x; int k,j; for(j=1;j=0 & x-yy) yk+1=yk; -k; if( k+1 != j ) yk+1=x; /假设点已经是按照x轴升序排列好了,并且size是2的整次幂/实验证明,对数数据量为40240的平面点,快速算法的时间为29毫秒/朴素算法的时间为:19017毫秒 float close_point(Point *_point,const int size) float *_distance=new floatsize1; Point *_object=(Point *)malloc(sizeof(Point *)*(size+1)1);/记录被选中的点的数目 int _object_count; int k,_step,j; float _near1,_near2; float x,y; / int _origin,_final;/首先,将两个相邻的点的距离计算出来 for(k=0;k1=sqrt(x*x+y*y); /分段计算最小两点间最小距离 for(_step=2;(1_step)=size;_step=_step+1) for(k=0;k size;k+=(1_step) int _origin=k;/左边界 int _final=k+(1_step-1;/上一次在左边界所取得的最小值 _near2=_distance(k_step-1)+1;/上一次在右边界所取得的最小值 float _min=_near1_near2?_near1:_near2; int _boundary=_origin+(1=_origin & x-_pointj.x =_min ;-j)/左侧 _object_object_count+=_point+j; for(j=_boundary;j_final & _pointj.x-x=_min;+j) _object_object_count+=_point+j; _insert_sorty(_object,_object_count);/对所得到的数组按照y坐标进行升序排序 for(j=0;j_object_count-1;+j) _boundary=j+6_object_count?j+6:_object_count; for(_origin=j+1;_originx-_object_origin-x; y=_objectj-y-_object_origin-y; _near1=sqrt(x*x+y*y); if(_min_near1) _min=_near1; _distancek_step=_min; _near1=_distance0; delete _distance; free(_object); return _near1; /朴素的算法 float prim_close_point(const Point *_point,const int size) float x,y; float _min=1e8; for(int i=0;isize;+i) for(int k=i+1;k_near) _min=_near; return _min; int main(int argc,char *argv) Point *_point=(Point *)malloc(sizeof(Point)*40240); const int size=40240; int i,k,j=0; Point _temp; srand(int)time(NULL); for(i=0;isize;+i) _pointi.x=rand(); _pointi.y=rand(); for(i=0;isize;+i ) j=i; for(k=i+1;ksize;+k) if(_pointk.x_pointj.x) j=k; if(j != i) _temp=_pointj; _pointj=_pointi; _pointi=_temp; / for(i=0;i%fn,i,_pointi.x);/测试两者需要耗费的时间 #ifdef _TEST_ time_t _start,_final; _start=clock(); float _near1=close_point(_point,size); _final=clock(); printf(fast method cost time %fn,difftime(_final,_start); _start=clock(); float _near2=prim_close_point(_point,size); _final=clock(); printf(prim method cost time: %fn,difftime(_final,_s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论