自动构面算法中拓扑网络建构的优化

我在《插件式GIS应用框架的设计与实现》一书的算法章节介绍过基于“左转算法”的自动构面过程和具体代码,如果仔细看过的读者会发觉,我们的构面过程的套路是:1.寻找出建构拓扑网络的节点和路径 2.建立拓扑网络 3.自动构面 4.剔除无效面和处理岛与洞。

在 这个过程中,自动构面的过程的效率其实是不低的,由于引入了“正向”和“反向”是否已经“走”过的标记判断,这个基于“左转算法”的过程实际上会越走越快 (因为越到后面,越多的点会发现自己的连通路径已经被正反走过,它们也就无需再进行构面的搜索过程),那么效率出在什么地方呢?就是拓扑网络的建立。

如果在第一个过程中寻找出了10000条路径和15000个节点,那么下一步我们必须建立其它们的网络,让每条路径知道自己的首位节点是谁?让每个节点知道自己的连通路径是谁?这个过程有多么费劲呢?

1. 根据路径实体ISegment建立clsEdge对象,显然,要计算10000次 ;2. 根据节点实体IPoint建立clsNode对象,也需要15000次。没办法,这个没法避免掉。

下一步,遍历每一条路径clsEdge对象,寻找它的起点和终点在clsNode集合中的位置,这是个双重循环的过程,在我的书中,它需要计算10000×15000次,即1.5亿次。而遍历每个clsNode对象,寻找出与其连通的clsEdge对象,显然也是双重循环,也是1.5亿次。

也就是说,不改良的算法,在这个过程中至少要执行3亿多次的计算

我最近正在用VB代码重写这个例子,遇到这个问题,肯定也要解决,要不然光是拓扑网的建立就够让人吐血了,这个算法就是个大笑话。数据量稍微大一点,就彻底完蛋了。

我的两个改进办法是:

1. 在clsEdge寻找它的起点clsNode和终点clsNode的ID之前,先判断其对象的ID(我默认设置为-1,即两个节点的ID都没找到),如果两个都已经找到了,则都不是-1了,显然可以跳出内层循环。

2. 在clsEdge寻找clsNode时候,也记录每个clsNode出现的次数,如果一个clsNode在被寻找的过程中出现了3次(即是路径的起点或终 点),那么它的连通路径数量也肯定是3。在每个clsNode寻找连通路径时,也这么先判断下,如果累计的连通边大于或等于3,显然也可以跳出了。

虽然有这两个改进办法,但在大数量时,我个人仍然并不满意,现在仍然在绞尽脑汁想,如何让这两个过程更快些,不知道大家有什么好主意?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值