博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法导论-14.1-8
阅读量:7059 次
发布时间:2019-06-28

本文共 830 字,大约阅读时间需要 2 分钟。

【题目】现有一个圆上的n条铉,每条铉都是按其端点来定义的。请给出一个能在O(n log n)的算法,确定圆内相交铉的对数(例如:如果n条铉都是直径,他们交于圆心,则正确的答案为C(n,2),组合数)。另外任意两条铉没有公共点。

【解答】[转]

  通过角度来判断两条弦是否相交,这样可以在O(n*logn)内完成。

  对于两条弦P1P2和Q1Q2来说(顺时针),圆心与端点形成的向量有一个角度A
  如果A(P1)<A(Q1)<A(P2)<A(Q2)或者A(Q1)<A(P1)<A(Q2)<A(P2),这样角度区间“交叉”就意味着两条弦有交叉。
  通过角度来统计交叉弦的对数,和“逆序对”的问题本质上是一样的

  这可以看做是“顺序统计树”的典型应用。

  我们判断两条弦是否相交的依据还是上面提到的“角度”区间是否有“交叉”现象发生
 (注意一个区间包含另一个区间的情况不能算作“交叉”)
  首先n条弦共2n个端点,每个端点对于圆心来说,都对应一个[0,2*pi)内的角度。
  我们按角度大小(实际上就是逆时针方向)对这2n个角度进行排序,这一步需要花费O(n*logn)
  对于每条弦来说,它的两个端点都可以看做是“事件点”:从0角度开始逆时针在圆上扫描,遇到弦的第一个点可以看成是弦的“起点”,遇到的第二个点看成是弦的“终点”。
  然后,我们用一棵“顺序统计树”来辅助进行处理(初始化当然为空)。
  按照角度小到大的顺序遍历这2n个端点:
  如果该端点是某条弦X的“起点”
  {
    将弦X插入顺序统计树中(以X的“起点”角度作为key);
  }
  如果该端点是某条弦X的“终点”
  {
    统计出目前这棵树中有多少条弦的“起点”角度比X的“起点”角度大,这就是与X相交的弦的数量;
     //对于顺序统计树来说,上面这步只要O(logn)就能实现
    将弦X从顺序统计树中删除; //这一步同样只需要O(logn)
  }

转载地址:http://deyll.baihongyu.com/

你可能感兴趣的文章
C语言的左位移能不能超过8位?
查看>>
关于读博,关于成为一个专家
查看>>
Java下拼接执行动态SQL语句(转)
查看>>
linux 系统负载高 如何检查
查看>>
怎么样 javascript / js 在 建立map
查看>>
复杂度
查看>>
利用navicat创建存储过程、触发器和使用游标的简单实例
查看>>
可视化分析之图表选择
查看>>
linux -- ubuntu 14.10开机出现错误“Error found when loading /root/.profile”解决
查看>>
ecshop修改产品详情 折扣倒计时时间
查看>>
把linux的man手册转化为windows下可读的格式
查看>>
Cannot refer to a non-final variable inside an inner class defined in a different method
查看>>
利用Hessian如何实现Webservice
查看>>
zend studio 13 curl 请求本机地址 无法跟踪调试的问题解决方案。。。(chrome等浏览器调试原理相同)...
查看>>
大型web系统数据缓存设计
查看>>
hdu-1016素数环
查看>>
Git常用命令
查看>>
tcpkill清除异常tcp连接
查看>>
[XML] CoolFormat
查看>>
我是如何做列表页的
查看>>