我有一个有向图
由于
不幸的是,这种懒惰算法非常低效,即使
我想象中可能有一些“部分懒惰”的算法更好,但这只是我的直觉,我对此没有任何进展。
这是否是一个众所周知的问题?还有其他想法吗?
(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]
,则返回 true。
v[i]
、t[i]
和所有出边。在执行 increaseValue(i, x)
操作时,它会沿着所有出边传播该值(使用类似许多其他图算法的“打开”节点集合)。由于每个节点都存储了 v[i]
,因此 evaluate(i)
是简单的。由于
increaseValue
操作比其他操作频繁得多,这种急切的方法似乎是浪费的。因此我想知道,是否可以采用一些懒惰的传播方式来重新计算需要的 v[i]
,从而提高效率?为此,我会维护 w[i]
作为所有 increaseValue(i, x)
的 x
值的最大值,并在需要时直接计算出 v[j]
。它可以计算为从所有路径上的节点 n[i]
中选择最大的 w[i]
来计算 v[j]
。实际上,一旦我知道 v[j] >= t[j]
,精确值 v[j]
就无关紧要了,我可以停止计算。不幸的是,这种懒惰算法非常低效,即使
increaseValue
比 evaluate
频繁几个数量级,也不值得采用。我想象中可能有一些“部分懒惰”的算法更好,但这只是我的直觉,我对此没有任何进展。
这是否是一个众所周知的问题?还有其他想法吗?
increaseThreshold
必须传播?它可能会更新t[i],但为什么它会影响其他节点? - algrid