有指导的工会发现


11

考虑一个有向图在该图上可以动态添加边并进行一些特定的查询。G

示例:不相交的森林

考虑以下查询集:

arrow(u, v)
equiv(u, v)
find(u)

第一个向图形添加箭头,第二个确定,最后一个找到等价类的规范表示,即使得表示。ü * v * - [R Û Ü * v [R v = - [R Û uvuvr(u)uvr(v)=r(u)

有一种众所周知的算法,它使用不相交集森林数据结构以准恒定的摊销复杂度实现这些查询,即O(α(n))。请注意,在这种情况下,equiv是使用实现的find

更复杂的变体

现在,我对一个方向很重要的更复杂的问题感兴趣:

arrow(u, v)
confl(u, v)
find(u)

第一个添加箭头,秒确定是否存在从和均可到达的节点,即。最后一个应该返回对象,使得暗示其中应该易于计算。(例如,为了进行计算)。目的是找到一个好的数据结构,使这些操作快速进行。uvwuvuvr(u)uvr(u)r(v)confl

周期数

该图可以包含周期。

我不知道是否有一种方法可以有效地和增量地计算强连接的组件,以便仅针对主要问题考虑DAG。

当然,我也希望为DAG提供解决方案。这将对应于最小公共祖先的增量计算。

天真的方法

不相交的森林数据结构在这里没有帮助,因为它忽略了边的方向。请注意,在图形不汇合的情况下,不能是单个节点。r(u)

可以定义并在时将定义为。但是如何逐步计算呢?r(u)={vuv}S1S2S1S2

像通常的联合查找算法一样,计算这么大的集合可能没有用,而较小的集合应该更有趣。

Answers:


3

编辑:既然我对问题的理解更加清楚了,现在就完全重写了我的答案。)

听起来可以解决此问题,因为在构建和搜索图形时,可以将其减少为逐步构建和改善图形的传递闭合的近似值。

r(u)抽象是图中每个从和均可到达的所有节点的集合。(当然,并不是所有的对都必须有一个可以从两个对都到达的节点。)与并集查找的情况不同,该集合不能在图中表示为规范的代表性节点,因为可能存在从和以及从和均可到达的节点,但是从和都无法到达。uvvuu,vuvuwvw

假设您为每个维护了从可访问的一组节点(我将其称为)。对于每个节点,这些集将必然是额外的数据结构,或者至少是图中的一组额外的“快捷”边。如果您不关心保留图的指定结构,则无需在这些边和指定边之间进行区分。uuR(u)

对于没有比一般情况下更有效的数据结构(例如位向量或哈希表),我没有任何想法可用,但是您可以逐步更新这些集合:

每次将的边添加到其他节点,都设置。uvR(u)=R(u)R(v)

实现confl通过首先尝试 ; 如果非空,则返回true。但是,如果空,请从和进行两个并行的广度优先搜索,直到用尽了两个可达集或找到一个公共节点。在执行此操作时,还要更新和(以及找到的所有中间节点的),以包括找到的可达节点。如果确实找到一个公共节点,则设置R(u)= R(v)= R(u)\ cup R(v)R(u)R(v)R(u)R(v)R(u)R(v)R

find(u)只是返回。问题是,不能仅仅根据来实现。除非算法是非增量式的(即使用图的传递闭包来预先计算所有节点的所有集),否则我不知道怎么回事。成本,尽管我不知道它是否会很快达到。(可能不会。错误的答案要求即使您的集已饱和也要启动两个BFS ;这似乎是不可避免的,除非将算法设为非增量式。)R(u)conflfindRO(α(n))conflR

这听起来很像是LaPoutré和van Leeuwen保持图形的传递闭合的方法的特例。

我意识到这并不能完全回答问题,但是也许可以澄清这个问题,对图形算法有更多经验的人可以为集编码提供更好的数据结构。R


谢谢您的回答,我希望我现在让我的问题更加清楚:我不在乎连接的组件(但是强大的CC 可能对最终解决方案有所帮助);我还没有 ,并且这个不能是DAG中的单个节点。r(u)r(u)
jmad 2012年

好的,这更清楚了。这似乎是是抽象的集合,从两个到达的所有节点的和为每一个在图中。我认为,该集合可能是一组“快捷”边缘,然后开始看起来像在图中计算可及性的传递闭包。我仍然没有立即看到为什么不能以增量方式完成此操作(压缩路径时找到它们),尽管它可能需要比联合查找更多的存储/工作(标记/更新所有“捷径”边缘)。这有意义吗?r(u)uv vuu
克里斯·普雷西

假设传递闭包是表征一种公平方法,这听起来像是紧密相关的:en.wikipedia.org/wiki/…–r(u)
克里斯•普雷西

我不认为confl(u,v)应该合并和。它可以修改它们,但是已经可以通过调用来完成,就像在不交集的林方法中一样。R(u)R(v)find
jmad 2012年

你是对的,它不应该合并它们。我将编辑答案。但是调用find实际上并不能计算出任何有用的信息,因为除了,没有唯一的对象可以“查找” ,而近似于。(如何知道要进行查找的内容,进行更新?仅给出但的信息可能适用于图中的每个其他节点。)r(u)R(u)finduR(u)
Chris Pressey 2012年
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.