如何测试无序区间队列的连通性问题
开始说下,写代码的时候难免会遇到算法的问题,所以无论是做什么职位,只要跟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*来解决这个问题,但发现需要维护两个队列,并且由于区间序列是无序的,还要用二叉树堆来维护排序,也是增加很多成本,最后就决定使用首先构建出区间矩阵,并通过不停的拓展区间的起点和终点,然后通过遍历来解决这个问题,思路如下:
- 创建一个map,用来维护矩阵(map用红黑树,查找效率很不错。)。
- while(插入一个区间): #设插入节点为p, p.x为区间起点, p.y 为区间终点
- map是否为空。
- 直接放入map,继续循环。
- 是否有以p.x为起点的节点。
- 检查p.y所能达到的是否比当前区间的终点要远。
- 更新当前区间的终点。
- 检查p.y所能达到的是否比当前区间的终点要远。
- 是否有以p.y为起点的节点。
- 检查p.x所能达到的是否比当前区间的起点要近。
- 更新当前区间的起点。
- 检查p.x所能达到的是否比当前区间的起点要近。
- 遍历map,查找p能插入的区间,并修改区间的起点和终点。
- map是否为空。
- 从最低起点深度遍历(此时矩阵基本是已经是一条线了)到最高顶点,成功就联通。
经过程序实现,测试后验证想法是正确的,用时0.06m测试通过了97个无序的区间队列的连通性,当然还可以算出最短路径,那就直接上Dijkstra就行了。
由于本人并未系统的学习过算法,也非数学专业的科班出身,所以很多地方还是可以继续优化的,也可以用其他更好更优的办法来做,还希望各位科班出身的人不吝赐教哈。