【发布时间】:2015-08-12 03:02:59
【问题描述】:
有人知道吗?
循环树是从二叉树构建的加权有向图 通过将每个叶子的边缘添加回根。每条边都有一个 非负权重。
- Dijkstra 算法需要多少时间来计算具有 n 的循环树中两个顶点 u 和 v 之间的最短路径 节点?
- 描述和分析更快的算法。
【问题讨论】:
-
最好能描述一下你尝试过的东西,或者任何最初的想法
有人知道吗?
循环树是从二叉树构建的加权有向图 通过将每个叶子的边缘添加回根。每条边都有一个 非负权重。
- Dijkstra 算法需要多少时间来计算具有 n 的循环树中两个顶点 u 和 v 之间的最短路径 节点?
- 描述和分析更快的算法。
【问题讨论】:
我认为阿米特的答案是错误的。
描述和分析更快的算法。
你在 O(h) 中找不到从顶点 u 到这个祖先的最便宜的路线,因此,这个算法不是 O(h)。有两个原因,如果内部节点只有父到子的有向边,我们需要从 u 向下查找到共同祖先(或根)的最便宜的路线,我不知道可以做到这一点的算法。第二个原因,如果存在 parent->child 和 child->parent 边,那么从源顶点到最低公共祖先顶点的路径可以通过任何内部树节点的 3 个相邻顶点(顶点)或 1 个相邻顶点( root) 的任何叶节点顶点,因此我们不能在 O(h) 中完成。
根据我对问题的理解,child->parent edge不在looped-tree graph的定义中。因此,我们唯一的做法就是顺着树往下走,然后回到顶部,从根到目标是一条简单的单一路径。因此,我们将问题简化为找到从 u 到 root 的最便宜的路线,从而降低复杂度。
此外,如果目标是源的直接后代,我们将在寻找到根的最便宜的路线期间停止。如果源是根,则问题很简单,因为路由是从根到目标的简单单一路径,通过目标的子树向下走。
【讨论】:
Dijkstra 算法需要多少时间来计算 具有 n 的循环树中两个顶点 u 和 v 之间的最短路径 节点?
这将花费O(VlogV) 时间(最坏情况分析)。
请注意,每对节点 (u,v) 都有一个简单的路径,将 u 连接到 v。如果这条路径由于某种原因包含一个非常重的加权边,Dijksta 的算法将继续推迟获取这条边,并且直到它发现正确的路线才会发现,这将使得算法必须发现大部分的顶点。循环树,使复杂度 O(VlogV)(注意,此图中 E 在 O(V) 中)。
描述和分析一个更快的算法。
由于只有一条简单的路径,您只需找到它。
通过在树中找到lowest common ancestor(没有循环),然后找到从u 到这个祖先的路线,可以很容易地做到这一点。
此算法的复杂度为O(h) - 其中h 是图形的高度。
【讨论】: