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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

算法笔记分治法最接近点对问题_精品文档.docx

1、问题场景:在应用中,常用诸如点、圆等简单的几何对象代表现实世界中的实体。在涉及这些几何对象的问题中,常需要了解其邻域中其他几何对象的信息。例如,在空中交通控制问题中,若将飞机作为空间中移动的一个点来看待,则具有最大碰撞危险的2架飞机,就是这个空间中最接近的一对点。这类问题是计算几何学中研究的基本问题之一。问题描述:给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小。严格地说,最接近点对可能多于1对。为了简单起见,这里只限于找其中的一对。 1、一维最接近点对问题算法思路: 这个问题很容易理解,似乎也不难解决。我们只要将每一点与其他n-1个点的距离算出,找出达到最小距离的

2、两个点即可。然而,这样做效率太低,需要O(n2)的计算时间。在问题的计算复杂性中我们可以看到,该问题的计算时间下界为(nlogn)。这个下界引导我们去找问题的一个(nlogn)算法。采用分治法思想,考虑将所给的n个点的集合S分成2个子集S1和S2,每个子集中约有n/2个点,然后在每个子集中递归地求其最接近的点对。在这里,一个关键的问题是如何实现分治法中的合并步骤,即由S1和S2的最接近点对,如何求得原集合S中的最接近点对,因为S1和S2的最接近点对未必就是S的最接近点对。如果组成S的最接近点对的2个点都在S1中或都在S2中,则问题很容易解决。但是,如果这2个点分别在S1和S2中,则对于S1中任

3、一点p,S2中最多只有n/2个点与它构成最接近点对的候选者,仍需做n2/4次计算和比较才能确定S的最接近点对。因此,依此思路,合并步骤耗时为O(n2)。整个算法所需计算时间T(n)应满足:T(n)=2T(n/2)+O(n2)。它的解为T(n)=O(n2),即与合并步骤的耗时同阶,这不比用穷举的方法好。从解递归方程的套用公式法,我们看到问题出在合并步骤耗时太多。这启发我们把注意力放在合并步骤上。 设S中的n个点为x轴上的n个实数x1,x2,.,xn。最接近点对即为这n个实数中相差最小的2个实数。我们显然可以先将x1,x2,.,xn排好序,然后,用一次线性扫描就可以找出最接近点对。这种方法主要计算

4、时间花在排序上,在排序算法已经证明,时间复杂度为O(nlogn)。然而这种方法无法直接推广到二维的情形。因此,对这种一维的简单情形,我们还是尝试用分治法来求解,并希望能推广到二维的情形。假设我们用x轴上某个点m将S划分为2个子集S1和S2,使得S1=xS|xm;S2=xS|xm。这样一来,对于所有pS1和qS2有pq。递归地在S1和S2上找出其最接近点对p1,p2和q1,q2,并设d=min|p1-p2|,|q1-q2|,S中的最接近点对或者是p1,p2,或者是q1,q2,或者是某个p3,q3,其中p3S1且q3S2。如图所示。 如果S的最接近点对是p3,q3,即|p3-q3|d,则p3和q3

5、两者与m的距离不超过d,即|p3-m|d,|q3-m|m。容易看出,如果选取m=max(S)+min(S)/2,可以满足线性分割的要求。选取分割点后,再用O(n)时间即可将S划分成S1=xS|xm和S2=xS|xm。然而,这样选取分割点m,有可能造成划分出的子集S1和S2的不平衡。例如在最坏情况下,|S1|=1,|S2|=n-1,由此产生的分治法在最坏情况下所需的计算时间T(n)应满足递归方程: T(n)=T(n-1)+O(n) 它的解是T(n)=O(n2)。这种效率降低的现象可以通过分治法中“平衡子问题”的方法加以解决。即通过适当选择分割点m,使S1和S2中有大致相等个数的点。自然地,我们会

6、想到用S的n个点的坐标的中位数来作分割点。在选择算法中介绍的选取中位数的线性时间算法使我们可以在O(n)时间内确定一个平衡的分割点m。 本程序确定平衡点采用m=max(S)+min(S)/2方法。如果需要利用中位数作分割点,看结合笔者博文0005算法笔记线性时间选择改写。 一维最接近临近点对问题程序清单如下:cppview plaincopy1. /2d10-1一维最邻近点对问题2. #includestdafx.h3. #include4. #include5. usingnamespacestd;6. 7. constintL=100;8. /点对结构体9. structPair10. 1

7、1. floatd;/点对距离12. floatd1,d2;/点对坐标13. ;14. floatRandom();15. intinput(floats);/构造S16. floatMax(floats,intp,intq);17. floatMin(floats,intp,intq);18. template19. voidSwap(Type&x,Type&y);20. template21. intPartition(Types,Typex,intl,intr);22. PairCpair(floats,intl,intr);23. 24. intmain()25. 26. srand(

8、unsigned)time(NULL);27. intm;28. floatsL;29. Paird;30. m=input(s);31. d=Cpair(s,0,m-1);32. coutendl最近点对坐标为:(d1:d.d1,d2:d.d2);33. coutendl这两点距离为:d.dendl;34. return0;35. 36. 37. 38. floatRandom()39. 40. floatresult=rand()%10000;41. returnresult*0.01;42. 43. 44. intinput(floats)45. 46. intlength;47. co

9、utlength;49. cout点集在X轴上坐标为:;50. for(inti=0;ilength;i+)51. 52. si=Random();53. coutsi;54. 55. 56. returnlength;57. 58. 59. 60. floatMax(floats,intl,intr)/返回s中的最大值61. 62. floats_max=sl;63. for(inti=l+1;i=r;i+)64. if(s_maxsi)65. s_max=si;66. returns_max;67. 68. 69. floatMin(floats,intl,intr)/返回s中的最小值70

10、. 71. floats_min=sl;72. for(inti=l+1;isi)74. s_min=si;75. returns_min;76. 77. 78. template79. voidSwap(Type&x,Type&y)80. 81. Typetemp=x;82. x=y;83. y=temp;84. 85. 86. template87. intPartition(Types,Typex,intl,intr)88. 89. inti=l-1,j=r+1;90. 91. while(true)92. 93. while(s+ix&ix);95. if(i=j)96. 97. br

11、eak;98. 99. Swap(si,sj);100. 101. returnj;102. 103. 104. /返回s中的具有最近距离的点对及其距离105. PairCpair(floats,intl,intr)106. 107. Pairmin_d=99999,0,0;/最短距离108. 109. if(r-l1)returnmin_d;110. floatm1=Max(s,l,r),m2=Min(s,l,r);111. 112. floatm=(m1+m2)/2;/找出点集中的中位数113. 114. /将点集中的各元素按与m的大小关系分组115. intj=Partition(s,m,l,r);116. 117. P

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

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