最短路径算法/最快路径算法--G-tree/TD-Gtree


清华大学的李国良老师在2019年将G-tree扩展到时间依赖环境下,提出了 TD-G-tree,发表在当年的VLDB中。

划分子图

G-tree的主要思路是将路网划分为若干个大小几乎相同子图,并且为子图创建一棵树。划分子图的大小是由两个参数来确定的:kl和kf,其中kl 用来控制叶子节点中,也就是最终划分完之后,每个子图中路网节点的个数。kf用来控制划分子图时,将一个大子图划分为几个小子图,例如kf=4,那么在划分下一级子图时,就是对每个当前子图切两刀,将每一块再次平均分为四块。
如下图所示:
图中控制kl=4,kf=2,即每次划分子图的时候切一刀,将上一级的图划分为两块,直到子图中的节点个数小于等于4为止。首先将整个大图G1划分为G2,G3两个子图,再分别将G2,G3划分为G4,G5和G6,G7两个子图。这样的操作可以尽量保证后面建的树是一棵平衡树。当然,kl这个参数并不是将叶子节点严格的控制在4这个值,路网中的节点也不可能恰好的等分成这样,只能控制在这个值附近,尽量的保证能平衡。

划分完子图之后,需要找到子图之间的联系,这样在进行最短路径查询时才能跨子图进行查询。这里使用的是一个”边界点“的概念。还是如下图所示,如果在原图中两个子图之间存在一条边,子图之间可以通过这一条边进行连接,那么这条边的两个端点就分别是这两个子图中的边界点。例如在子图G2,G3中,节点v2-v3,v2-v6,v6-v9之间都存在一条边,那么对于这两个子图来说,v2,v9和v3,v6就分别是它们的边界点。同样对于子图G4,G5来说,节点v1,v2和v9分别是它们的边界点。G6,G7同理。

在这里插入图片描述

建树/索引结构

在划分完子图之后,下一步就是对这些子图建树,利用树结构进行预处理,构造索引,利用索引进行查询。这是一个用空间来换时间的操作,需要空间来存储建好的索引,但是有了索引之后,避免了在线查询需要浪费的大把时间。G-tree的索引大小并不是目前所有利用索引方法进行查询中最大的。例如H2H的索引大小就大于G-tree,但是查询时间小于G-tree。换一个角度来讲,G-tree将空间和时间结合得很好,避免了过大的索引,也大大的提高了查询时间。G-tree的查询时间相对于目前比较受欢迎的集中最短路径查询算法——CH,A*,Dijkstra,优势还是很明显的,至少在一个数量级。
建树的过程需要用到上面提到的边界点,如下图所示:
其中叶子节点(leaf node)里面存储的是最后一级子图中的所有顶点(为了避免混淆,下面的节点代表树中的节点,用顶点来代表路网中的点),这些顶点加起来就是整个路网中的所有顶点了。非叶子节点中存储的是每一个子图中的边界点。这里需要注意的一点是,在上面的图中可以看到,v1是子图G2中的一个顶点,并且也是边界点之一,但是在树中,它不属于G2的边界点,因为v1成为边界点,是相对于子图G4,G5来说的,v1是子图G4,G5之间的一个边界点。在树中,G2的边界点是相对于G3来说的,它的边界点就只有v2,v9,所以树中G2这个节点下只存储了这两个边界点。

在这里插入图片描述

距离矩阵:从上面可以看出,各个子图之间是通过边界点联系起来的,一个子图中的节点如果想要到达另一个子图中的节点,就必须要先从自己子图的边界点出去,再通过另一个子图中的边界点进入到另一个子图中。如何建立边界点之间的联系,从上图的结构中可以看出,根节点是整个路网,叶子节点是被划分出来的最小的子图。孩子节点的边界点是被包含在它们的父亲节点中的。所以在建立距离矩阵的时候,每一个树中的节点建立一个矩阵,叶子节点的矩阵中包含叶子节点中的所有顶点,非叶子节点的矩阵中包含当前节点对应的子图和它的孩子节点对应的子图中的所有边界点,非叶子节点建立矩阵的目的主要是将它的孩子节点联系起来,所以要包含孩子节点的边界点。距离矩阵中的顶点确定好之后,利用Floyd算法,将矩阵中所有顶点之间的最短距离全部计算并存储下来,用来进行之后任意顶点之间最短距离计算。

最短距离查询

给定一个查询,查询起点和终点分别是u和v,返回两点之间的最短距离。
G-tree的查询过程首先要先找到查询起点和终点的LCA,即两点之间的最低公共祖先节点,然后找到一条从起点开始经过LCA到达终点的路径。从起点所在的子图开始,依次利用子图之间的边界点,判断经过哪个边界点到达终点作用的距离最短。
正式的查询过程有一个动态规划的过程,如下面左侧的图,查询起点和终点分别是v4和v11,v4在子图M6中,v11在子图M5中,路径在图中以红色线表示。子图M3和M6的公共边界点是v3,要从子图M6到M3,需要走的路径就是V4-V3,M3与M1的公共边界点是V3和V6,下一步是计算V3分别到这两个点的距离,M1和M2的公共边界点是V2和V9,下一步再分别计算V3,V6到这两个点的距离,最后M2和M5之间的公共边界点是V9,在计算到达V9的距离,最后就是到达M5中的V11,得到达到终点的最短距离。
这儿过程中,需要不断地判断下一步需要经过的子图和边界点,要找到可以提供最短路径的边界点访问顺序。

在这里插入图片描述

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值