给定一个加权dag,是否有O(V + E)算法用其祖先权重之和替换每个权重?


34

当然,问题在于重复计算。对于某些类的DAG =树,甚至是串行并行树,这很容易做到。我发现唯一可以在合理的时间内在一般DAG上运行的算法是一种近似算法(摘要扩散),但是提高精度的位数是指数级的(我需要很多位)。

背景:此任务是在BBChop(http://github.com/ealdwulf/bbchop)概率计算中完成的(多次使用不同的“权重”),该程序用于查找间歇性错误(例如,贝叶斯版本的“ git bisect')。因此,有问题的DAG是修订历史。这意味着边的数量不太可能接近节点数量的平方,对于小于k的节点,它可能小于节点数量的k倍。不幸的是,我没有发现修订版DAG的任何其他有用属性。例如,我希望最大的三连接组件仅随着节点数的平方根增长,但可悲的是(至少在linux内核的历史上)它线性增长。


需要澄清的是:只有节点才有权重,而没有边?
Heinrich Apfelmus 2010年

是的,只是节点。
Ealdwulf


实际上,这似乎更为笼统,因为将单位权重分配给所有顶点会将这个问题简化为可达性问题。
Suresh Venkat 2010年

近似值似乎与某些额外的多对数因素并不难...
Sariel Har-Peled 2010年

Answers:


17

我们假设顶点权重可以是任意正整数,或更准确地说,它们可以是最多2 n的正整数。然后,即使在稍微弱的时间范围O(n 2)中也无法执行当前任务,除非可以在O(n 2)时间中计算任意有向图的传递闭合,其中n表示顶点数。(请注意,传递闭包的O(n 2)-时间算法将是一个突破。)这与以下声明相反:

索赔。如果当前任务可以在时间O(n 2)内执行,则可以在O(n 2)时间内计算作为其邻接矩阵给出的任意有向图的传递闭合(假设有一些合理的计算模型)。

证明。作为预处理,我们在时间O(n 2)中计算给定有向图G的强连接分量分解,以获得DAG G '。注意,如果我们可以计算G ' 的传递闭合,则可以重构G的传递闭合。

现在将权重2 i分配给DAG G '的每个顶点i,并将算法用于当前问题。然后,分配给每个顶点i的和的二进制表示形式精确地描述了i的祖先集合,换句话说,我们已经计算了G ' 的传递闭包。 QED

主张的反义也成立:如果您可以计算给定DAG的传递闭包,则可以通过在时间O(n 2)内进行额外的工作来轻松计算所需的总和。因此,从理论上讲,您可以通过使用基于Coppersmith-Winograd矩阵乘法算法的传递闭包算法,在O(n 2.376)的时间完成当前任务。

编辑:版本2和更早的版本没有明确说明有关顶点权重范围的假设。Per Vognsen在评论中指出,这种隐含假设可能不合理(谢谢!),我同意。即使在应用程序中不需要任意权重,我也认为此答案可能会通过以下推理排除某些方法:“如果这种方法有效,它将给出任意权重的算法,除非该传递是可传递的,否则将被排除在外。可以在时间O(n 2)中计算闭合。”

编辑:版本4和更早的版本错误地说明了边的方向。


4
昨晚我在考虑这一点,因为一个实际的解决方案是使用位向量进行排除计数。我猜唯一的问题是假设权重可以具有与n成正比的位长是否合理。在实践中,我可以想象权重由k限制,因此最大可能的和为kn,不足以拉动这个技巧。
Per Vognsen

@Per:我同意顶点权重可以是n位整数的假设可能会引起质疑。我编辑了答案以使这一假设明确。谢谢!
伊藤刚(Tsuyoshi Ito)2010年

1
@Per:我意识到,如果顶点权重是由O(1)界定的整数,则问题会归结为所有顶点都具有权重1的情况,方法是采用适当的方式复制顶点。
伊藤刚(Tsuyoshi Ito)2010年

不幸的是,我没有在该线程中找到计数问题的答案。与传递闭包的列表O(n log n)对O(n ^ 2)相比,计数包含的对数信息更少,因此我看不到直接的减少如何起作用。
Per Vognsen

顺便说一句,这个问题的一个有趣的版本是当我们对DAG的分支因子和有关代的大小增长(按拓扑结构排序)的信息有约束时。如果增长是指数级的,则该模式基本上是树状的。如果它是线性,对数线性,二次等,该怎么办?
Per Vognsen

2

这是我对Tsuyoshi的回答的评论的扩展。我认为对这个问题的否定答案可以是无条件的。

在最坏的情况下,即使对于具有O n 边的图形,此问题似乎也需要加法运算。因此,似乎不可能达到所需的界限。ωñØñ

考虑由网格排列的由r × c个顶点组成的图r行中的每一行中的顶点都取决于上一行中的两个顶点。该族由这样的图形组成,用于rc值的适当组合以及边的适当排列。G[RC[R×C[R[RC

特别是,令c = 2 n / log n。另外,让顶行顶点的权重为2的幂。[R=日志 ñ/2C=2ñ/日志 ñ

然后,底行中的每个顶点将取决于第一行中的 n个顶点。据我所知,然后存在一个特定的DAG,其每个底行权重具有不同的值,因此,对于这些总和中的每个,平均需要ωlogn不可重用加法。ñω日志 ñ

总的来说,这产生了相加数量的下界,而边的数量为2 c r - 1 = O n ωñ2C[R-1个=Øñ

关键似乎是底层的部分顺序是密集的,但DAG表示其传递减少,可以是稀疏的。


这个论点很有趣,但是我不确定是否可以证明它是任何有趣的陈述。考虑到证明问题下限的普遍困难,这种说法对我来说似乎是手摇的。
伊藤刚(Tsuyoshi Ito)2010年

@Tsuyoshi:我认为存在应该通过一个概率论来起作用,并且下界是弱的,因此似乎有足够的空间使它起作用。但是您是对的,这是手工的,这句话“平均不可重用的添加”需要更好的基础。
安德拉斯·萨拉蒙(AndrásSalamon)2010年

-2

这是错误的,是基于对该问题的误解。 感谢Tsuyoshi耐心指出我的错误。别担心别人犯同样的错误。

如果节点的直接前辈的数量由限制,则首先进行拓扑排序然后按此顺序处理节点的算法将完成这项工作。 建议通过将DAG视为部分订单来衡量直接前辈的数量。具有直接前辈数量有限的模型可能适用于修订历史记录,其中大多数修订只更改了几个文件。ķ

关键是,对于这种特殊情况,每个节点最多需要查看线性顺序的前任,因此可以通过添加O k | V |来完成。ķØķ|V|

拓扑排序需要的时间,它给你的约束,你正在寻找的渐近。但是在您描述的应用程序中,线性增加的数量很可能占主导地位。Ø|V|+|Ë|

如果某些节点具有许多直接的前任节点(只要它们相对不频繁),则该方法也应能很好地工作。


4
我不明白。当DAG不是树时,如何避免重复计算?实际上,如果我没记错的话,一般情况可以简化为每个顶点最多具有两个前任情况的情况,而针对后一种情况的任何线性时间算法都可以为一般情况提供线时间算法。
伊藤刚(Tsuyoshi Ito)2010年

Ø|V|+|Ë|ķ

恐怕您误解了我的评论。我在质疑您算法的正确性,而不是运行时间。假设DAG具有四个顶点A,B,C,D,且顶点A,B→D和A→C→D的边缘分别具有一定的权重。在计算了B和C的部分和之后,您不能简单地将B和C的部分和相加来计算D的和,因为这样做会增加顶点A的权重两次。
伊藤刚(Tsuyoshi Ito)2010年

ü<vwü

1
是。现在,我记得我第一次看到这个问题时,以同样的方式误读了该问题,并认为这很明显。但是,不,真正的问题比这更困难。该思考了。
伊藤刚(Tsuyoshi Ito)2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.