主题:求一个算法 -- 东方射日
同人在上面给了一个链接,介绍了算法
其实我们的解法很接近上面所说的Applet’s Algorithm了
1.找凸包: O(nlogn)
2.找最长连线的两点: O(n)
3.凸包上其他点按与上述两点间的夹角排序: O(n)
4.找到最小夹角(必然大于60,否则断言错误)
5.如果夹角大于90,取两点中点--- 结束
6.如果夹角小于90,取外接圆圆心
7.检查是否有在圆外的顶点:O(n)
8.如果没有--- 结束
9.如果有,先后换掉其中一点,另外一点一一取其他顶点回到步骤三重复,取所有可能解答中的最小圆。这里的复杂度为:2*n*n --> O(n^2)
综上,整体复杂度为O(n^2)
这个算法应该没有错了吧,基于两点假设:
1.最小圆上至少有两点
2.最大距离的两点中至少有一点在圆上。
前面我们的算法缺少了步骤7-9,而且假定最大距离两点都在圆上,这个假定是错误的。
所以找凸包和找最大距离两点是有用的,先以O(nlogn)的代价找到两个点,然后以O(n^2)的代价找到圆。
否则我们没有最大距离的两个点只能一一遍历两点重复步骤3到9,那么整体复杂度为O(n^3)
- 相关回复 上下关系8
🙂我觉得没错了,这似乎就应该是最佳答案了。 温雅颂 字86 2009-01-08 18:17:21
🙂算法有错 东方射日 字459 2009-01-09 13:52:00
🙂你说的对,果然有错 温雅颂 字34 2009-01-09 14:23:58
🙂其实我们很接近一个O(N^2)的算法了
🙂追风兄对具体算法能说下 东方射日 字356 2009-01-09 10:22:07
🙂有人算过了 三力思 字167 2009-01-09 11:24:15
🙂放弃,彻底投降 1 沉宝 字1159 2009-01-08 13:03:01
🙂算法不正确 东方射日 字220 2009-01-09 18:26:41