和圆有关离散化方法_第1页
和圆有关离散化方法_第2页
和圆有关离散化方法_第3页
和圆有关离散化方法_第4页
和圆有关离散化方法_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、和圆有关离散化方法引言:一道经典的问题引言:一道经典的问题lN个矩形,求他们的面积并。l解决方法:离散化。l取每个矩形的上下边界,将平面分为若干部分,然后计算每一部分的面积。引言:新的问题引言:新的问题l由于矩形的边界为折线,如果我们用折线的转折点作为分界点,则折线被化简为许多线段。所以离散化法取得了成功。l如果需要统计的并不是矩形,而是某些曲线图形,怎么办?l对于曲线来说,根本没有所谓的转折点,传统的离散化法似乎对这一类问题失效了。l而梯形和弓形的面积很容易求出l但如果增加一些其他的分割线,我们发现,整个图形由若干梯形和弓形构成。引言:新的问题引言:新的问题l事实上,如果我们对于划分后每一部

2、分的性质要求不那么严格,划分还是可以继续下去的。l如图,图形被划分为5部分,初看特征不明显。圆的离散化算法圆的离散化算法l算法的一般步骤:根据问题将平面中的圆分割成若干区域,使每个区域具有一定简单的粗粒属性。一般可用直线分割。根据属性确定区域内圆的具体算法,计算每个区域中结果。综合每个区域的结果,给出问题的最终答案。l圆的离散化算法关键在于保证区域内数据在整体上易于处理。算法应用实例算法应用实例l以上便是离散化法在圆的计算几何问题中最基本的应用。而这里将通过两道例题详细说明。l例1 Dolphin Pool (Tehran 2000)l例2 Empire strikes back (ural

3、1520)Dolphin Pool (Tehran 2000)l给定N(N=20)个圆的圆心坐标(xi,yi)和半径Ril求平面内在圆外的封闭区域的个数。l例如:如下四个圆构成一个圆外的封闭区域l没有任何两个圆相切,且没有任何一个圆的圆心在另一个圆内。封闭区域初步分析初步分析l尽管圆的位置有一定的限制,但可能的情况还是很多的,我们希望有一个通用的算法来解决所有情况而不分类讨论,避免增加编程复杂度和错误几率。l由于输入输出都是整数,似乎题目对于精度的要求不高,并且坐标的范围较小(x,y=1000)。于是可以使用一个基于floodfill的算法。基于基于Floodfill的算法概述的算法概述l在原

4、图中建立点阵。l标记所有在圆内的点为已访问。l使用深度优先遍历(DFS)求连通块数l连通块数减1即为答案l可以看到,这个算法的效率和正确性都由点阵的密集程度决定。l而对于这道题目的时限来说,这个算法远远不能达到要求,因此我们需要改进算法。 第一次离散化第一次离散化l考虑点阵中的每一横行,我们发现圆在每一横行上覆盖的一定是一个连续区间。l因此,可以仅记录每一个圆在当前横线上覆盖的区间而不记录每个点具体的被覆盖情况。l考虑平面内的一条平行于x轴的直线。可以很容易的计算出每一个圆在其上覆盖的区间。第一次离散化第一次离散化区间合并区间合并l接下来,将所有的被覆盖区间合并。这一问题需要应用到基本数据结构

5、栈,可以在线性时间复杂度内解决。l区间合并完成后,可以得到所有未被覆盖的区间。第一步离散化第一步离散化图论模型图论模型l建图,每个未覆盖区间为一个顶点,相邻两条横线上的区间如果相交,则在它们之间连一条边。然后判断在建成的图中有多少个连通块。l判断图中的连通块数量可以使用按层次遍历的方式减少空间需求。仍存在的问题仍存在的问题l经过初步的离散化,上述算法的正确性和速度都有很大提高。但由于ACM竞赛要求程序必须通过全部数据,而该算法对于某些极限数据的精度仍不能令人满意,因此还有进一步改进算法的必要。第二次离散化第二次离散化l仔细观察程序的运行,我们发现它似乎作了许多无用的工作,如下图:l我们一眼可知

6、,下图中所有的区间同属于同一连通块。但是我们的程序却为了得到这一结果在不断的迭代。l于是,我们有了一个新的想法:跳过无用的横行。第二次离散化第二次离散化l事实上,区间之间的继承关系在大多数时候并没有发生改变,仅在少数时刻才会有所改动:一个圆新出现时,将一个区间分为两半。一个圆最下端,两个区间合并为一个。两圆相交,一个区间逐渐减小直至消失。两圆相交,一个新的区间生成。l这样,我们可以求出所有的点事件,并模拟区间的生长消亡,从而求出最终答案。l但是,如果完全按照上述想法编程实现,编程复杂度非常高。事实上,我们可以考虑一种懒惰的实现方式。第二次离散化第二次离散化图示图示点事件小结小结l至此,本题已被

7、完美解决,时间复杂度为O(N3)。l回顾我们得到算法的步骤:根据题目描述得到一种简单的算法。通过离散化不断将其时间复杂度降低,并将精度提高。l可以看到,使用了离散化法后,我们轻易地得到了一个简单而优秀的算法。例例2 Empire strikes back(ural 1520)l平面中有1个大圆和N(N=300)个小圆,大圆圆心为(0,0),小圆圆心都在大圆内。所有小圆半径相同。l求使所有小圆能覆盖整个大圆的小圆最小半径。初步分析初步分析l由于题目仅需求出一个实数,因此我们考虑使用二分法求得答案。l在已知小圆半径的情况下,我们所需要做的工作仅仅是判断大圆是否被小圆完全覆盖。试探性离散化试探性离散

8、化l如果使用和例1相同的离散化策略,得到的时间复杂度为O(N3*k),k为二分的次数,这个时间复杂度太高了!l之所以会出现离散化失败的情况,是因为我们没有透彻的分析问题。l由于已经二分了答案,所以问题已被转化为一个判定性问题,而我们仍使用原先解决计数性问题的思路解题,必然无法设计出高效的算法。l当然,这一处理并不能使算法的时间复杂度有所改进。但是,如果整体观察所有特殊点,会发现它们所组成的图形正好是所有小圆分别向左向右移动一小步得到新的圆之和。l这样我们可以根据这一特性进行离散化。离散化算法改进离散化算法改进l由于题目仅需我们判断一条横线是否被完全覆盖,因此取特殊点似乎是一个不错的想法。考虑横

9、线上所有关键点(线段的左右端点),并取它们左右两端距离非常接近的点作为特殊点。如果所有的特殊点都被覆盖,则整条横线一定被完全覆盖。第二次离散化第二次离散化l注意到,每一个圆在向左向右偏移后,得到的新的圆一部分在原先的圆内,可以不做考虑。而向左向右偏移后得到的图形之和与原先的圆非常相近,可以认为是相同的。l于是问题转化为,其他N-1个小圆在这个小圆上覆盖的边界是否完全覆盖了大圆在这个小圆上覆盖的边界。l这和例1中第一步离散化时得到的问题非常相似,可以使用类似的方法解决。时间复杂度分析时间复杂度分析l算法总复杂度 O(N2logN*k)二分的复杂度 O(k)区间排序的复杂度O(NlogN)区间合并

10、的复杂度O(N)枚举N个圆O(N)l事实上,如果采用一些其他的小优化,可以将算法的复杂度进一步降低为O(N2logN+NlogNk)小结小结l回顾我们得到最终算法的步骤:一开始,我们分析问题,得到了一种简单的算法。然后,我们尝试利用离散化法对其进行优化,但传统的离散化得到的时间复杂度十分不理想。于是我们进一步分析问题的特性,并通过转化问题的方式得到了一个新的离散化法,最终完美解决了此题。l由此可见,离散化法并不仅仅是把图形按照横纵坐标划分为若干区域。对于同一个问题,不同的离散化法得到的算法效率相差甚远。总结及讨论总结及讨论l离散化法作为一种较为朴素的处理方法,可以解决多数与圆有关的计算几何问题

11、。l成功的关键是要把握区域划分的精细程度:过细区域划分,单元内的计算简单,但整合复杂度增加。区域划分过粗,会使单元内的计算无法实现。l虽然这里分析的是圆,但很容易推广到其他曲线的计算几何问题。区间合并动画区间合并动画l每次插入一个区间时,先察看栈顶区间是否和即将进栈的区间相交,如果相交则将栈顶区间出栈和新插入的区间合并,然后继续察看栈顶区间,直至栈顶区间和新插入的区间不相交或栈已被清空。l然后新的区间进栈。1,23,52,91,91,9一些其他的小优化一些其他的小优化l事实上,如果在排序时,按照区间的中点的极角进行排序,则区间的序和小圆半径长度无关,排序可以在预处理时完成,复杂度可降为O(N2 (logN+k)。l由于每个小圆被完全覆盖所需要的最小半径都是相互独立的,因此可以认为它是一个常数,而我们所求出的就是这个常数的大小。因此可以在枚举每个圆的时候,先判断一下它在当前

温馨提示

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

评论

0/150

提交评论