我有一个有向图(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)
上,它会沿着所有传出箭头传播值(使用一组&#34; open&#34;节点,就像许多其他图算法一样)。每个节点都存储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
,
确切的值var Hapi = require('hapi');
var server = new Hapi.Server(80);
var httpsServer = new Hapi.Server(443, { tls: { // your certificates here} });
并不重要,我可以停止计算。
不幸的是,这种懒惰的算法效率很低,所以即使server.register({
register: require('hapi-gate'),
options: {https: true} // will force https on all requests
});
的频率比node
更频繁,它也不会有效。
我想,有些&#34;部分懒惰&#34;算法可能会更好,但这只是我的直觉而我无法取得任何进展。
这是一个众所周知的问题吗?还有其他想法吗?
答案 0 :(得分:3)
在需要评估之前,如何阻止增量的传播? increaseValue只会更新值,将节点标记为脏并将其添加到一组脏节点。
当您需要评估时,传播所有已更改节点的增量,从最大的新值开始。这应该为同一节点和路径上的潜在节点保存传播的多个增量(可能会在旅途中得到验证)?
答案 1 :(得分:0)
我对“部分懒惰”算法有一个简单的想法(没有解决方案,只是一个想法)。
让我们从告诉算法的问题中调用“最直接的实现”,因为每个节点告诉其后继者要做什么。让我们将“懒惰算法”重命名为询问算法,因为每个节点都询问其前任是否有事可做。
箭头可以划分为告诉和询问。所有告知箭头在increase
之后处理,而请求箭头等到evaluate
。我猜,这个分区不能是任意的:对于任何两个箭头(n[i], n[j])
和(n[j], n[k])
,我无法想象当前者询问后者如何处理而后者正在告诉时,所以这种情况必须被禁止。
当有许多节点只有传入的箭头很少得到evaluate
时,这可能会有很大的帮助,这似乎就是这种情况。
它可能与其他答案中的想法相结合。