锁定老帖子 主题:二维点集的凸包及其直径(1)
精华帖 (2) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-06-21
前言
:因为前几天做了一个有关凸包的题,并答应crackerwang写个blog解释一下我的算法.因为我比较懒的原因,一直拖到现在才写.预计一共有两篇,第一篇介绍求二维点集凸包的O(N*logN)时间复杂度的算法.第二篇介绍求凸包直径的O(N)时间复杂度的算法. cpp 代码
一:凸包的定义及其应用
那么,我们为什么需要凸包这个概念呢?它又能解决什么问题? 这样处理后的结果是:stack[]中得到一条连接ps[0]与ps[k]的,并且维持逆时针顺转的链.这个链就是我们要求的凸包的下半部分.用伪代码来描叙就是: java 代码
显然,我们再从ps[k]到ps[0]做类似的处理就可以得到凸包的上半部分.当然,事实上我们可以把这两个工作一起做了:维持一个双头栈,使其头部的三个点为右手系,其尾部的三个点为左手系.这样经过一次扫描就可以得到整个凸包.伪代码如下: java 代码
可以看出,整个算法并不复杂,或者可以说很优美.哦,等等,伪代码里面还有个判断"左手系","右手系"是怎么来的?这就涉及到一个数学概念:叉积 三:叉积
四:具体代码 java 代码
下面给出求凸包的代码:
java 代码
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-06-24
终于明白了..
但是我在做那个题目的时候是想构造一个最小外接圆,然后在求上面所有点的两两距离.最后因为没有看明白书上的dephi代码而做罢了.. 看来eastsun大哥对算法和数据结构的功底不在一般计算机学生之下了..对你的佩服已经由如滔滔...(将来也要和你一样,嘿嘿) 我再问个典型算法的问题:RMQ-LCA,你会吗?这个好像是个很典型的算法,但是在网上却找不到很好的答案...你要是会就稍微在底下给我留言一下...(当然要是再写个BLOG就更加好了..嘿嘿) 具体的问题你可以参照这个:http://acm.pku.edu.cn/JudgeOnline/problem?id=2823 我用优先队列过是能过,但是效率就.... |
|
返回顶楼 | |
发表时间:2007-06-24
当时(打拼音老是打错)我在做那个题目...(打拼音老是打错)
|
|
返回顶楼 | |
发表时间:2007-06-24
crackerwang 写道 终于明白了..
但是我在做那个题目的时候是想构造一个最小外接圆,然后在求上面所有点的两两距离.最后因为没有看明白书上的dephi代码而做罢了.. 看来eastsun大哥对算法和数据结构的功底不在一般计算机学生之下了..对你的佩服已经由如滔滔...(将来也要和你一样,嘿嘿) 我再问个典型算法的问题:RMQ-LCA,你会吗?这个好像是个很典型的算法,但是在网上却找不到很好的答案...你要是会就稍微在底下给我留言一下...(当然要是再写个BLOG就更加好了..嘿嘿) 具体的问题你可以参照这个:http://acm.pku.edu.cn/JudgeOnline/problem?id=2823 我用优先队列过是能过,但是效率就.... 直接看 The LCA Problem Revisted 这篇论文好了,可以直接下载,很容易懂。 |
|
返回顶楼 | |
发表时间:2007-06-25
不过扫了一眼这道题:
http://acm.pku.edu.cn/JudgeOnline/problem?id=2823 这道题用 RMQ 应该是违规的。从题意来看,任意时刻你应该只能访问其中 k 个元素。而且事实上,这题用 RMQ 也是牛刀割鸡了。 |
|
返回顶楼 | |
发表时间:2007-06-26
貌似RMQ是一个很典型的算法.不知道为什么找不到具体的.都是找到一些什么分类的东西.The LCA Problem Revisted 这个我找到了.
你的RMQ是在哪本书上看到的.. 难道是传说中的算法导论?? |
|
返回顶楼 | |
发表时间:2007-06-26
crackerwang 写道 貌似RMQ是一个很典型的算法.不知道为什么找不到具体的.都是找到一些什么分类的东西.The LCA Problem Revisted 这个我找到了.
你的RMQ是在哪本书上看到的.. 难道是传说中的算法导论?? 某年月日,某人问我:你可知道 RMQ 问题? 我说:不曾听过这个名字。 某人于是描述了一遍 RMQ 问题,并说:似乎有一个算法,可以做到预处理时间 O(n),查询时间 O(1)。 我想了一回,便说:那定然是个很精巧的算法,我不能及。 某人说:请替我查访一下罢。 我说:好,我便查访一下罢。 于是我拜请 google 大神,照见一切以 RMQ 为名的先贤足迹,于 15 分钟后寻得 R.E.Tarjan、M.A.Bender 等先知留下的文献卷轴。于是 RMQ-LCA 问题的一切秘奥,均展现在我们的眼前。 于是某人说:赞美政委大能!算法的光辉必将照亮一切黑暗前路。 我说:善。 |
|
返回顶楼 | |
发表时间:2007-08-16
你要是有时间不如把凸包直径的求法也写一下吧
|
|
返回顶楼 | |
发表时间:2007-08-16
...
你说“终于明白了”。 我还以为我可以不用写第二篇了。 不过你还是先自己google一下吧,我现在不在学校不方便写。 |
|
返回顶楼 | |
发表时间:2007-08-17
你高估我了.
凸包那个算法还好. 不过还是有点小小的问题. 这个地方while(down-len>=2&&multiply(tmp[down-2],tmp[down-1],tmp[down])<=0){ tmp[down-1] =tmp[down]; down--; } 改成while(down-len>=2&&multiply(tmp[down-2],tmp[down-1],tmp[down])<0) 求周长会不会有影响? 上次在做一个题目的时候发现加等号错不加就对.一直没有找到这个特殊的数据 |
|
返回顶楼 | |