【问题标题】:algorithm to update an aggregated value when an element changes当元素更改时更新聚合值的算法
【发布时间】:2011-01-09 05:51:41
【问题描述】:

(我使用的是 C#,但这不一定是特定于平台的)

假设我有一个值表,它由三个键(A、B、C)索引。表中的值不时从外部源流入。我想在各种密钥集上发布聚合,例如计算 B = b1 的所有值的总和。

如果我每次只遍历整个表,这很简单,但显然这不是有效的。我想知道的是,是否有一种特别好的方法来设计这样的东西,以便我只在表中的值更改会影响这个总和时更新sum(B = b1)?似乎我需要创建某种Aggregation 对象来维护包含在该聚合中的每个值的列表,但我觉得可能有一种更优雅的方式可以让我逃避。类似于“实时”LINQ 查询...

【问题讨论】:

  • 请发布代码示例以帮助我们开始...

标签: c# real-time aggregation


【解决方案1】:

好吧,对于您提供的简单示例,为什么不创建一个事件,例如,OnValueChanging,表明值即将发生变化?然后您可以记录当前值,例如x。然后触发另一个事件OnValueChanged 并记录新值,例如y。那么你要更新的总和就是currentSum - x + y

【讨论】:

  • 可以,但是这些值来自另一台机器。估计发出来的消息可能同时包含新值和旧值,我没想到。
【解决方案2】:

使用Dictionary<TypeOfB, int>。每次你添加一个新的 b,做

dictionary[b] += value;

如果一个值改变,做

dictionary[b] += (newValue - oldValue)

【讨论】:

  • 您在下面所说的机器只发送新值。我的印象是它发送了四个东西:(a,b,c)value,这样你就可以在接收端跟踪旧值。否则,如果接收端的任何东西实际上不需要新值,您可以简单地发送(newValue - oldValue)(当然还有b)来更新总和。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 2010-12-24
  • 2016-05-26
  • 1970-01-01
  • 2018-05-06
相关资源
最近更新 更多