查找单个节点的主导者列表(相对于单个入口节点)?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找单个节点的主导者列表(相对于单个入口节点)?相关的知识,希望对你有一定的参考价值。
在Tarjan的算法上有许多资源可以找到关于单个入口节点的支配树。但是,我只想找到树的单个节点的支配者。
有没有比使用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查找单个节点