ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:533.69KB ,
资源ID:19344933      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/19344933.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(中科大算法实验4求平面最近点对算法Word格式文档下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

中科大算法实验4求平面最近点对算法Word格式文档下载.docx

1、如果组成S的最接近点对的2个点都在S1中或都在S2中,则问题很容易解决。但是,如果这2个点分别在S1和S2中,则对于S1中任一点p,S2中最多只有n/2个点与它构成最接近点对的候选者,仍需做n2/4次计算和比较才能确定S的最接近点对。因此,依此思路,合并步骤耗时为O(n2)。整个算法所需计算时间T(n)应满足:T(n)=2T(n/2)+O(n2)在一维的情形,距分割点距离为的2个区间(m-,m(m,m+中最多各有S中一个点。因而这2点成为唯一的末检查过的最接近点对候选者。二维的情形则要复杂些,此时,P1中所有点与P2中所有点构成的点对均为最接近点对的候选者。在最坏情况下有n2/4对这样的候选者

2、。但是P1和P2中的点具有以下的稀疏性质,它使我们不必检查所有这n2/4对候选者。考虑P1中任意一点p,它若与P2中的点q构成最接近点对的候选者,则必有d(p,q)。满足这个条件的P2中的点有多少个呢?容易看出这样的点一定落在一个2的矩形R中.因此d(u,v)5/6 。这与的意义相矛盾。也就是说矩形R中最多只有6个S中的点。图4(b)是矩形R中含有S中的6个点的极端情形。由于这种稀疏性质,对于P1中任一点p,P2中最多只有6个点与它构成最接近点对的候选者。因此,在分治法的合并步骤中,我们最多只需要检查6n/2=3n对候选者,而不是n2/4对候选者。这是否就意味着我们可以在O(n)时间内完成分治

3、法的合并步骤呢?现在还不能作出这个结论,因为我们只知道对于P1中每个S1中的点p最多只需要检查P2中的6个点(确切的说,是矩形R中的6个S中的点),但是我们并不确切地知道要如何检查。为了解决这个问题,我们可以将p和P2中所有S2的点投影到垂直线l上。由于能与p点一起构成最接近点对候选者的S2中点一定在矩形R中,并且要满足d(p,q)m2. 1:=CPAIR2(S1);2:=CPAIR2(S2);3. m:=min(1,2);4. 设P1是S1中距垂直分割线l的距离在m之内的所有点组成的集合, P2是S2中距分割线l的距离在m之内所有点组成的集合。将P1和P2中的点依其y坐标值从小到大排序,并设

4、P1*和P2*是相应的已排好序的点列;5. 通过扫描P1*以及对于P1*中每个点检查P2*中与其距离在m之内的所有点(最多6个)可以完成合并。当P1*中的扫描指针逐次向上移动 时,P2*中的扫描指针可在宽为2m的一个区间内移动。设l是按 这种扫描方式找到的点对间的最小距离;6. =min(m,l);end;return();下面我们来分析一下算法CPAIR2的计算复杂性。设对于n个点的平面点集S,算法耗时T(n)。算法的第1步和第5步用了O(n)时间,第3步和第6步用了常数时间,第2步用了2T(n/2)时间。若在每次执行第4步时进行排序,则在最坏情况下第4步要用O(nlogn)时间。这不符合我

5、们的要求。因此,在这里我们要作一个技术上的处理。我们采用设计算法时常用的预排序技术,即在使用分治法之前,预先将S中n个点依其y坐标值排好序,设排好序的点列为P*。在执行分治法的第4步时,只要对P*作一次线性扫描,即可抽取出我们所需要的排好序的点列P1*和P2*。然后,在第5步中再对P1*作一次线性扫描,即可求得l。因此,第4步和第5步的两遍扫描合在一起只要用O(n)时间。这样一来,经过预排序处理后的算法CPAIR2所需的计算时间T(n)满足递归方程:显而易见T(n)=O(nlogn),预排序所需的计算时间为O(n1ogn)。因此,整个算法所需的计算时间为O(nlogn)。在渐近的意义下,此算法

6、已是最优的了。二、核心代码:1. 生成随机数: 如图,使用C#代码,先生成坐标的随机数:2. 生成的随机数之后,将这些点以中位数分治:Closetpair是递归函数。3. 求中位数的最进点对,将这些点对放到新的数组中:4. 将这些最近点对按y坐标排序:由于C#库函数只能对数组排序,不得不将对象数组取出来,拍完序之后再放回去:5.每个点与附近7个点进行比较:三、结果与分析:1.输出15,随机生成15个坐标对:2.输入155,随机生成坐标对:随机生成15万个:分析:如果在递归调用时,不对Y排序,非常卡,运行15万个坐标至少要运行5分钟。所以,主函数要对X排序,递归时要对Y排序。四、备注总结:本实验

7、重点:(1) 主函数对X排序,递归时对Y排序。(2) 筛选的中位数附近的点,对每个点取六个比较即可。(3) 如图:附录(源代码)算法源代码(C/C+/JAVA描述)C#: public partial class Form1 : Form public Form1() InitializeComponent(); public class Point public float x, y; public static float No_distance = 1000000; public static float AAA, BBB, CCC, DDD; public static void Se

8、tPoints(Point points, int length) Random ra = new Random(); for (int i = 0; i length; i+) pointsi = new Point(); pointsi.x = (float)ra.NextDouble() * 200 - 100; pointsi.y = (float)ra.NextDouble() * 200 - 100; public static float Distance(Point a, Point b) return (float)Math.Sqrt(a.x - b.x) * (a.x -

9、b.x) + (a.y - b.y) * (a.y - b.y); public static float Closetspair(Point points, int length, Point a, Point b) float distance;/记录集合中最近的两点 float d1, d2;/记录分割后两个子集中各自最小点对距离 int i = 0, j = 0, k = 0;/用于控制for循环的循环变量 Point a1 = new Point(); Point b1 = new Point(); Point a2 = new Point(); Point b2 = new Poi

10、nt(); /保存分割后两个子集中最小点对 if (length 2) return No_distance;/如果子集长度小于2,定义为最大距离,表示不可达 if (length = 2) distance = Distance(points0, points1); else Point pts1 = new Pointlength;/两个子集分别放入这两个 Point pts2 = new Pointlength; float mid = points(length - 1) / 2.x;/排完序后的中间下标值,即中位数 for (i = 0; length / 2; pts1i = po

11、intsi; for (j = 0, i = length / 2; pts2j+ = pointsi; d1 = Closetspair(pts1, length / 2, a1, b1); d2 = Closetspair(pts2, length - length / 2, a2, b2); if (d1 d2) distance = d1; a = a1; b = b1; else distance = d2; a = a2; b = b2; /求解跨分割线,并在6*26区间内最近的点对 Point pts3 = new Pointlength; for (i = 0, k = 0;

12、if (Math.Abs(pointsi.x - mid) = distance) pts3k+ = pointsi; float array = new floatk; for (int iii = 0; iii k; iii+) arrayiii = pts3iii.x; Array.Sort(array); for (int ia = 0; ia ia+) pts3ia.x = arrayia; for (j = i + 1; j = i + 7 & j+) /只需与有序的领接的的7个点进行比较 if (Distance(pts3i, pts3j) distance) /如果跨分割线的两

13、点距离小于已知最小距离,则记录该距离 distance = Distance(pts3i, pts3j); a = pts3i; b = pts3j; AAA = a.x; BBB = a.y; CCC = b.x; DDD = b.y; return distance; private void button1_Click(object sender, EventArgs e) int N;/随机生成的点对个数。 Point a = new Point(); Point b = new Point(); float distence; if (textBox2.Text = ) Messag

14、eBox.Show(请您先输入需要随机生成的多少对?,你好!输入为空,MessageBoxButtons.OKCancel); else N = Int32.Parse(textBox2.Text.Trim(); if (N 2)请输入大于等于2的点个数!); Point points = new PointN; SetPoints(points, N); N; listBox1.Items.Add( + pointsi.x + + pointsi.y + ) float array = new floatN; arrayiii = pointsiii.x; pointsia.x = arrayia; listBox2.Items.Add( distence = Closetspair(points, N, a, b); textBox1.Text = 最近点对为: + + AAA + + BBB + )和 + CCC + + DDD + ; textBox3.Text=最近点对距离为: + distence;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1