如何测试无序区间队列的连通性问题

    开始说下,写代码的时候难免会遇到算法的问题,所以无论是做什么职位,只要跟code有关,最好多多少少会一些算法,不会算法有时是很痛苦的,比如我。。。囧。

    需求很简单,就是检测在一堆无序的,有向区间内的连通性,比如:

    假设有如下的序列:

    1-4

    9-12

    2-6

    9-10

    6-9

    1-8

    其中,已知有1-8这个区间,那么如果有6-9的区间进入时,就可以确定1-9是联通的,因为6-9的起点在1-8的区间内。

    这里最低的起点是1,最高点是12,那么用什么办法可以快速的得到这队序列是否是联通的。

    经过思考,本打算用A*来解决这个问题,但发现需要维护两个队列,并且由于区间序列是无序的,还要用二叉树堆来维护排序,也是增加很多成本,最后就决定使用首先构建出区间矩阵,并通过不停的拓展区间的起点和终点,然后通过遍历来解决这个问题,思路如下:

  1. 创建一个map,用来维护矩阵(map用红黑树,查找效率很不错。)。
  2. while(插入一个区间):  #设插入节点为p,  p.x为区间起点, p.y 为区间终点
    1. map是否为空。
      1. 直接放入map,继续循环。
    2. 是否有以p.x为起点的节点。
      1. 检查p.y所能达到的是否比当前区间的终点要远。
        1. 更新当前区间的终点。
    3. 是否有以p.y为起点的节点。
      1. 检查p.x所能达到的是否比当前区间的起点要近。
        1. 更新当前区间的起点。
    4. 遍历map,查找p能插入的区间,并修改区间的起点和终点。
  3. 从最低起点深度遍历(此时矩阵基本是已经是一条线了)到最高顶点,成功就联通。

     经过程序实现,测试后验证想法是正确的,用时0.06m测试通过了97个无序的区间队列的连通性,当然还可以算出最短路径,那就直接上Dijkstra就行了。

     由于本人并未系统的学习过算法,也非数学专业的科班出身,所以很多地方还是可以继续优化的,也可以用其他更好更优的办法来做,还希望各位科班出身的人不吝赐教哈。

posted @ 2010-03-26 10:06  高级动物  阅读(1173)  评论(4编辑  收藏  举报