我有一个有向图(N, A)
,其中每个节点n[i]
都有一个值v[i]
和一个阈值t[i]
。对于每个箭头(n[i], n[j])
,不变的v[i] <= v[j]
成立。我需要有效地执行以下操作:
increaseThreshold(i, x)
:设置t[i] = max(t[i], x)
。这是微不足道的,仅是为了完整起见。 increaseValue(i, x)
:设置v[i] = max(v[i], x)
并根据需要增加其他值,以使上述不变量成立。 evaluate(i)
:如果v[i] < t[i]
最简单的实现是将
v[i]
,t[i]
和传出的箭头与每个节点一起存储。在increaseValue(i, x)
上,它沿所有传出的箭头传播值(与许多其他图形算法一样,使用一组“开放”节点)。通过将v[i]
存储在每个节点上,evaluate(i)
变得微不足道。由于
increaseValue
比其他操作要频繁得多,因此这种急切的方法似乎很浪费。因此,我想知道,是否可以根据需要重新计算v[i]
的某些惰性传播是否更有效。为此,我将w[i]
保留为x
中所有increaseValue(i, x)
的最大值,并在v[j]
需要时即时计算evaluate(j)
。可以将其计算为存在w[i]
路径的所有节点n[i]
上的n[j]
的最大值。其实,一旦我知道v[j] >= t[j]
,确切的值
v[j]
无关紧要,我可以停止计算。不幸的是,这种惰性算法效率很低,因此即使
increaseValue
比evaluate
的频率高几个数量级,也无法奏效。我想,有些“部分惰性”算法可能会更好,但这只是我的直觉,我无法在此方面取得任何进展。
这是一个众所周知的问题吗?还有其他想法吗?
最佳答案
在您需要评估之前,阻止增量的传播怎么样? gainValue仅会更新该值,将节点标记为脏节点并将其添加到一组脏节点中。
当您需要评估时,请传播所有已更改节点的增量,从最大的新值开始。这应该为同一节点以及路径上的潜在节点(可能在旅途中得到验证)节省传播多个增量的时间吗?
关于algorithm - 图值传播算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46145641/