查找单个节点的主导者列表(相对于单个入口节点)?

时间:2018-05-25 01:15:00

标签: performance

在因特网上有许多资源用于Tarjan算法,它可以找到关于单个入口节点的支配树。但是,我只想找到树的单个节点的支配者。

有没有比使用Tarjan的O(m log n)时间算法更简单的方法来计算支配树,然后我们遍历树来查找特定节点的支配者?对于单节点情况,我想比O(m log n)时间更快地完成此操作。

1 个答案:

答案 0 :(得分:1)

虽然我不知道任何现有的算法可以做到这一点,但我可以想到一个。

让入口节点为 root t arget节点(找到其支配者)为 t 。创建一个以 root 为根的DFS树。

现在请注意, t 的支配者集合是DFS树上 t 的祖先的子集,只有前向边和交叉边可以&#34 ;避免"从 root t 的路径上的那些节点。所以:

  • 对于每个节点节点,让 f(节点)成为 t 的最高祖先,可以到达 node 不要在 t 的任何其他祖先上行走。这可以通过记忆来计算线性时间。
  • 对于每个交叉边 x→y ,其中 y t 的祖先,所有节点都是 f的严格优势(x) y 的严格祖先不是 t 的支配者。 (因为路径 root→...→f(x)→...→x→y→...→t 不会通过这些节点)

算法( O(n + m))将是:

  • 将DFS树植根为 root
  • t 的所有祖先标记为"可能的候选人"。
  • 为所有节点计算 f(节点)
  • 对于如上所述的每个 x→y ,将路径 f(x)→...→y (不包括端点)中的节点列表标记为& #34;不能成为支配者"在 O(1)时间使用求和表。 (类似于总面积表但在1D中)
  • 其余的候选人都是统治者。

不确定这是否更容易。