【问题标题】:How to efficiently update such a directed graph?如何有效地更新这样的有向图?
【发布时间】:2014-12-23 02:57:11
【问题描述】:

我有很多节点。 Node 的定义是这样的:

public class Node
{
   public string Name { get; private set; }
   string Expression { get; set; }
   double Value { get; private set; }
}

Value 在运行时由表达式评估引擎评估。 Expression 可以引用其他的Nodes,所以它可以形成一个有向图(或有向图的列表)。假设图中没有循环。

这是一个例子:

NodeA:
{
    Name: "NodeA",
    Expression: "[NodeB] + [NodeC] + 1.0"
    Value: 4.0
} 

NodeB:
{
    Name: "NodeB",
    Expression: "1.5"
    Value: 1.5
} 

NodeC:
{
    Name: "NodeC",
    Expression: "2.0"
    Value: 2.0
} 

问题是如果NodeB发生了变化,如何有效地将变化传播到其他节点?我可以使用一些并行方法来更新图表吗?

谢谢!

【问题讨论】:

  • 我不太明白您为什么要传播这些更改。当您评估节点 A 中的表达式时,这不会获取节点 B 和节点 C 的最新值吗?
  • 对不起,我的意思是如何更新整个图表。是的,我可以使用 BFS 连续评估依赖节点。我想知道是否有并行方法来更新图表。

标签: c# algorithm graph-algorithm


【解决方案1】:

您可以让每个节点维护一个依赖节点列表以及一个“脏”标志。然后每当一个节点发生变化时,递归地在每个依赖节点上设置脏标志。 (如果一个节点已经被标记为脏,不要递归。)然后您可以进行第二次遍历以重新评估每个脏节点,在计算新值时清除脏标志。

【讨论】:

  • 谢谢。这个方法和我现在做的差不多。首先,我使用 BFS 将所有依赖节点标记为脏节点,然后评估所有脏节点。我可以使用并行更新改进此算法吗?
  • @Johnsonlu - 我不确定。或许this MSDN magazine article 关于具有依赖关系的并行化操作可能会提供一些想法。
  • 谢谢:) 这个链接非常鼓舞人心。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 2018-08-01
  • 2014-03-21
  • 1970-01-01
  • 2015-04-01
相关资源
最近更新 更多