3. 个人思考
在论文中提到用局部地标标签来降低错误,且局部地标标签是在生成树中求得的,因此最短路径生成树决定了局部地标标签选择的“准确性”。如图3-1为原图的一部分,令其中每条边的权值为1,顶点a为全局地标标签。
图 3-1
以a为根结点的最短路径生成树如图3-2中生成树1所示。由公式D(s, t) = min{D(s,li) + D(s, li) – 2D(lca, li)}以及生成树1可得D1(c, h) =5,且结点c和h的局部地标标签为a。从原图显然有将b作为局部地标标签更接近于真实值。当原图的生成树如图3-2生成树2所示时,D2(c, h) = 3。但在生成树2中,D2(e, g) =3,大于在生成树1中,D1(e, g) = 1。
图3-2 生成树
我们设想构造一颗最短路径全生成树,来去除局部地标标签选择带来的误差。图3-1的完全生成树如图3-3所示,其中虚线表示该两个结点具有祖先后代关系,但位于高层的那个结点具有多个父结点,例图中结点b与g,结点b、e、f均为结点g的父亲。利用完全生成树D(c, h) = 3,D(e, g) = 1,完全消除了因局部地标标签选择带来的误差。
图 3-3 完全生成树
3.1RMQ求LCA
3.1.1一般生成树
(1) 对于生成树2进行深度优先遍历得到序列T = abcbdbghgigbaeafjfkfa,并记录结点在生成树中的层数。
(2) 给定查询(s, t),首先在序列T中找到第一个s和t所在的位置,他们中间位于层数最小的结点即为结点s和t的LCA。
例1:求LCA(c, h),T = abcbdbghgigbaeafjfkfa中标红处分别为结点c和结点h出现的第一个位置,且两个位置之间层数最小的为结点b,则可得LCA(c, h) = b。
例2:求LCA(i, k),T = abcbdbghgigbaeafjfkfa中标红处分别为结点i和结点k出现的第一个位置,且两个位置之间层数最小的为结点a,则LCA(i, k) = a。
3.1.2完全生成树
(1) 类似于一般生成树深度优先遍历完全生成树(图3-3)得到遍历序列T = abcbdbgbaegeafghgigfjfkfa,易得红色部分为完全生成树遍历序列比生成树1多处的结点。注意到虚线引入的结点(虚结点g)我们不继续深度遍历,而是记录该节点为虚访问结点。
(2) 给定查询(c, h),首先在序列T中找到第一个c与h的位置(T = abcbdbgbaegeafghgigfjfkfa),先c和h之间存在虚结点g,将它用实际结点替换掉可得第一个h的位置应该在第一个虚拟结点g的位置,因此有LCA(c, h) = b。求得的结果与生成树1求的结果相同。
(3) 给定查询(i, k),首先在序列T中找到第一个i与k的位置(T = abcbdbgbaegeafghgigfjfkfa),两个位置之间不存在虚结点,因此直接可得LCA(i, k) = f。求得的结果优于生成树1。
论文:Approximate Shortest Distance Computing: A Query-Dependent LocalLandmark Scheme