【问题标题】:More efficient way to build sum than for loop比 for 循环更有效的求和方法
【发布时间】:2013-01-23 12:59:36
【问题描述】:

我有两个大小相同的列表。两者都包含数字。第一个列表是生成的,第二个是静态的。由于我有许多生成的列表,我想找出哪一个是最好的。对我来说,最好的清单是最接近参考的清单。因此,我计算每个位置的差异并将其相加。

代码如下:

/// <summary>
/// Calculates a measure based on that the quality of a match can be evaluated
/// </summary>
/// <param name="Combination"></param>
/// <param name="histDates"></param>
/// <returns>fitting value</returns>
private static decimal getMatchFitting(IList<decimal> combination, IList<MyClass> histDates)
{
    decimal fitting = 0;
    if (combination.Count != histDates.Count)
    {
        return decimal.MaxValue;
    }

    //loop through all values, compare and add up the result
    for (int i = 0; i < combination.Count; i++)
    {
        fitting += Math.Abs(combination[i] - histDates[i].Value);
    }
    return fitting;
}

是否有更优雅但更重要和更有效的方法来获得所需的总和?

提前致谢!

【问题讨论】:

  • 如果要比较的列表数量很大,那么由于您只想要最佳匹配,您可以使用'best sofar'的差异作为参数,一旦当前列表有一个就停止比较更大的差异。

标签: c#


【解决方案1】:

您可以对 LINQ 执行相同的操作,如下所示:

return histDates.Zip(combination, (x, y) => Math.Abs(x.Value - y)).Sum();

这可以被认为更优雅,但它不能比你已经拥有的更有效。它也可以与任何类型的 IEnumerable 一起使用(因此您不需要专门的 IList),但这对您的情况没有任何实际意义。

如果您手头有此信息,您也可以在差异的运行总和大于目前看到的最小总和时立即拒绝 histDates

【讨论】:

  • 关于仅使用总和 - 他不是将每条记录的绝对个体差异相加吗? { 1, 5 } 和 { 2, 4 } 的总和都是 6,但会导致差为 2,对吧?
【解决方案2】:

这在不使用列表的情况下是可能的。而不是填写您的两个列表,您只想获得单个列表的每个值的总和,例如IList 组合变成int combinationSum

对 histDates 列表执行相同操作。

然后减去这两个值。在这种情况下不需要循环。

【讨论】:

  • 如果一个列表包含 1 和 5,另一个包含 2 和 4,那么它们将被视为相等,对吗?在他的示例中,他将每个元素的绝对差值相加。
  • 当然,他还需要获取值的数量。在每个总和处递增的整数。如果元素个数相同,则可以计算绝对差,否则返回 Math.MaxValue
  • 这种方法是不平等的,因为顺序很重要。
【解决方案3】:

您可以使用 LINQ 做得更优雅,但效率不会更高...如果您可以在将项目添加到列表时计算总和,您可能会获得优势...

【讨论】:

    【解决方案4】:

    我认为我不想保证任何直接提高效率,因为我现在无法对其进行测试,但这至少看起来更好:

    if (combination.Count != histDates.Count)
                    return decimal.MaxValue;
    
    return combination.Select((t, i) => Math.Abs(t - histDates[i].Value)).Sum();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-30
      • 2019-03-21
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 2015-05-07
      • 1970-01-01
      相关资源
      最近更新 更多