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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找单个节点的主导者列表(相对于单个入口节点)?相关的知识,希望对你有一定的参考价值。

在Tar​​jan的算法上有许多资源可以找到关于单个入口节点的支配树。但是,我只想找到树的单个节点的支配者。

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

答案

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

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

现在请注意,t的支配者集合是DFS树上t的祖先的子集,并且只有前向边和交叉边可以“避免”从根到t的路径上的那些节点。所以:

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

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

  • 以根为根目录创建DFS树。
  • 将所有t的祖先标记为“可能的候选人”。
  • 计算所有节点的f(节点)。
  • 对于如上所述的每个x→y,使用求和表在O(1)时间内将路径f(x)→...→y(不包括端点)中的节点列表标记为“不能是支配者”。 (类似于总面积表但在1D中)
  • 剩下的候选人是统治者。

不确定这是否更容易。

以上是关于查找单个节点的主导者列表(相对于单个入口节点)?的主要内容,如果未能解决你的问题,请参考以下文章

在单个链表中查找循环

Python爬虫编程思想(95):使用Selenium查找单个节点

XPath:使用单个路径表达式查询查找重复 n 次的节点

text 将新节点插入单个链接列表

st_network_paths 仅生成带有单个节点的 node_path

如何在swift(SpriteKit)中绘制一个作为单个节点的圆点[关闭]