繁体   English   中英

多个请求的有向无环图中的有效根查找

[英]Efficient root finding in directed acyclic graph for multiple requests

我正在努力寻找时间复杂度为 o(m log n) + O(n) 的这个问题的解决方案。

假设你有 n 个节点和 m 个请求的有向无环图,每个节点最多有一个父节点。 在时间 = 0 时,图形为空。 请求有两种类型:添加边 (u, v) 或查找具有顶点 u 的子图的根。 只有在不破坏图的任何属性的情况下才应该添加边(它应该保持非循环并且每个节点应该仍然最多有一个传入边)。

我可以想到多种解决方案,但它们都没有所需的复杂性。 在这里,我描述了我的最佳解决方案(复杂性)。 创建向量根(roots[ u ] 是具有顶点 u 的子图的根)和向量子图的向量(children[ u ] 是顶点 u 的后代)。 添加边缘 (u, v) 后,我按以下方式更新向量:

for child in children[v]:
    root[child] = u
    children[u].append(child)
children[v] = []

这样,检查添加边是否会破坏属性或返回根需要 O(1) 时间。 然而,更新过程的总复杂度为 O(n^2)(在这样的图中最多可以有 n - 1 条边,并且对于每个 u,children[ u ] 的大小最多为 n - 1)。 总复杂度为 O(m + n^2)。

您能否就如何解决它提出任何想法? 我假设必须有一个 O(m log^2 n + n) 解决方案。

这可以通过带有路径压缩的联合查找来完成,但没有按等级联合,因为能够控制哪个节点仍然是其组件的根很重要。 时间复杂度如所愿,O(m log n + n)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM