网站大量收购独家精品文档,联系QQ:2885784924

分治法解最接近问题.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
分治法解最接近问题

算法分析与设计实验报告 2014-2015第一学期 实验一:用分治法解最接近点对问题 指导教师:cccc 实验时间:2014年10月28日 实验地点:计算中心二楼 班级: 计ccc 学号: 124cc08 姓名: 杨cc 成绩: 实验一 用分治法解最接近点对问题的实验 一、实验内容: 实践名称: 时间安排:学时 一、实验目的 通过上机实验,要求掌握分治法的问题描述、算法设计思想、程序设计和算法复杂性分析等。 二、实验环境 装有Visual C++6.0的计算机。 本次实验共计3学时。 三、实验内容 1、熟悉分治算法思想 掌握如何创建应用程序。 掌握对最接近点对问题描述,及如何运用算法策略对问题解决和实现。 2、掌握如何编译程序 理解编译过程中的错误信息,并掌握如何排错。 3、掌握如何调试程序 掌握如何通过设置断点来单步调试程序,如何查看当前变量的值。 4、实验题: 完成用分治法解最接近点对问题的实验。 要求: 实现该实验结果。通过该实验题,解决最接近点对问题。 二、实验报告要求 1、报告内容包括实验目的、实验内容、实验步骤,实验结果和心得体会五部分;其中实验步骤包括算法分析、算法设计、算法实现主要步骤。 2、实验报告以电子文档形式发送到邮箱jsjalg@yeah.net 截止时间统一为下周二前。 算法分析 ?问题描述:已知集合S中有n个点,分治法的思想就是将S进行拆分,分为2部分求最近点对。将S拆分左右两部分为SL和SR,一般取点集S中所有点的中间点的x坐标来划分,这样可以保证SL和SR中的点数目各为n/2,依次找出这两部分中的最小点对距离:δL和δR,记SL和SR中最小点对距离δ?= min(δL,δR)??? ???? 以L为中心,δ为半径划分一个长带,最小点对还有可能存在于SL和SR的交界处,如下图2左图中的虚线带,p点和q点分别位于SL和SR的虚线范围内,在这个范围内,p点和q点之间的距离才会小于δ,最小点对计算才有意义。 ???? figure 2 ? 对于SL虚框范围内的p点,在SR虚框中与p点距离小于δ的顶多只有六个点,就是图二右图中的2个正方形的6的顶点。这个可以反推证明,如果右边这2个正方形内有7个点与p点距离小于δ,例如q点,则q点与下面正方形的四个顶点距离小于δ,则和δ为SL和SR中的最小点对距离相矛盾。因此对于SL虚框中的p点,不需求出p点和右边虚线框内所有点距离,只需计算SR中与p点y坐标距离最近的6个点,就可以求出最近点对,节省了比较次数。 ? figure 3 如上图:把距离分割线中间2δ范围内的点装入temp数组中,按照x坐标从小打到排序。若要找出距离P点最近的点,只需要和其下面六个点比较即可(具有稀疏性质)。再找出距离S1点最近的距离,也是之和其下六个点比较即可。依次对S2,S3,s4,……..,sm 进行同样操作。? 而且对于下图情况同样适用 figure 4 ?? 这样,先将带状区间的点按y坐标排序,然后线性扫描,这样合并的时间复杂度为O(nlogn), #includeiostream #includecstring #includecstdio #includecmath #includealgorithm using namespace std; const double INF =1e20; // 用于初始化 const int N=100005; // 用于申请数组长度为 N struct Point // 构造点 { double x; double y; }point[N]; int n; int tmpt[N]; // 用于保存距离 mid 为d的长度中的点 bool cmpx(const Point a,const Point b) // 按x坐标从小到大排序Point数组 { return a.xb.x; } bool cmpy(const int a,const int b)// 按y坐标从小到大排序Point数组 { return point[a].ypoint[b].y; } double min( double a,double b) { return ab?a:b; } double dis(int i,int j) // 求下标为 i和 j的两

您可能关注的文档

文档评论(0)

dri198 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档