最近对问题_递归与分治算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

淮海工学院计算机工程学院

实验报告书

课程名:《算法分析与设计》

题目:实验1 递归与分治算法

最近对问题

班级:软件081班

学号:110831116

姓名:陈点点

实验1 递归与分治算法

一,实验目的和要求

(1)进一步掌握递归算法的设计思想以及递归程序的调试技术;

(2)理解这样一个观点:分治与递归经常同时应用在算法设计之中。

(3)分别用蛮力法和分治法求解最近对问题;

(4)分析算法的时间性能,设计实验程序验证分析结论。

二,实验内容

设p1=(x1, y1), p2=(x2, y2), …, pn=(xn, yn)是平面上n个点构成的集合S,设计算法找出集合S中距离最近的点对。

三,实验环境

Turbo C 或VC++

四,实验学时

2学时,必做实验

五,数据结构与算法

#include

#include

#define TRUE 1

#define FALSE 0

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)

{

cout<<"请输入平面上点的数目:\n";

cin>>n;

L.count=n;

L.data = new Node[L.count]; //动态空间分配

cout<<"输入各点坐标 :x_y):"<

for(int i=0;i

cin>>L.data[i].x>>L.data[i].y;

}

//求距离的平方

double square(Node a,Node b)

{

return ((a.x-b.x)*(a.x-b.x))+((a.y-b.y)*(a.y-b.y));

}

//蛮力法

void BruteForce(const List &L,CloseNode &cnode,int begin,int end) {

for(int i=begin;i<=end;++i)

{

for(int j=i+1;j<=end;++j)

{

double space=square(L.data[i],L.data[j]);

if(space

{

cnode.a=L.data[i];

cnode.b=L.data[j];

cnode.space=space;

}

}

}

}

//冒泡排序

void BubbleSort(Node r[],int length)

{

int change,n;

n=length;change=TRUE;

double b,c;

for(int i=0;i

{

change=FALSE;

for(int j=0;j

{

if(r[j].x>r[j+1].x)

{

b=r[j].x;c=r[j].y;

r[j].x=r[j+1].x;r[j].y=r[j+1].y;

r[j+1].x=b;r[j+1].y=c;

change=TRUE;

}

}

}

}

//分治法中先将坐标按X轴从小到大的顺序排列

void paixu(List L)

{

BubbleSort(L.data,L.count); //调用冒泡排序

}

//左右各距中线d的区域的最近对算法

void middle(const List & L,CloseNode &cnode,int mid,double midX)

{

int i,j; //分别表示中线左边,右边的点

double d=sqrt(cnode.space);

i=mid;

while(i>=0&&L.data[i].x>=(midX-d)) //在左边的d区域内

{

j=mid;

while(L.data[++j].x<=(midX+d)&&j<=L.count) //在右边的d区域内 {

if(L.data[j].y<(L.data[i].y-d)||L.data[j].y>(L.data[i].y+d)) //判断纵坐标是否在左边某固定点的2d区域内

continue;

double space = square(L.data[i],L.data[j]);

if(cnode.space>space) //在满足条件的区域内依次判断

{

cnode.a=L.data[i];

cnode.b=L.data[j];

cnode.space=space;

}

}

--i;

}

}

相关文档
最新文档