【问题标题】:Would this function be linear, quadratic, or neither? (C#)这个函数是线性的、二次的还是两者都不是? (C#)
【发布时间】:2019-06-10 21:03:36
【问题描述】:

关于作为输入 (n) 的列表的长度,此代码的时间复杂度是否是线性的,因为由于“任何”技术上循环遍历新数组,因此只有一个循环或二次循环 - 但不是通过每个循环上的每个项目?或者两者都不是?

public static List<Item> RemoveDuplicated(List<Item> listToFilter)
{
    var newItemList = new List<Item>();

    foreach(var item in listToFilter)
    {
        if(!newItemList.Any( i => i.ItemId == item.ItemId))
        {
            newItemList.Add(item);
        }
    }
    return newItemList;
}

【问题讨论】:

标签: c# algorithm time-complexity computer-science


【解决方案1】:

算法复杂度是n 变大时的渐近行为。 如果未指定,我们假设最坏情况的行为。 在这里,最坏的情况是列表中的每个项目都是新的,因此Any 必须遍历整个现有列表。

你搞定了这些部分:外部循环执行n 次;内部循环必须遍历该列表,直到找到元素(我们可能假设检查m 元素,其中m 是当前列表大小)或没有找到它(检查所有m 元素)。

在最坏的情况下,Any 1+2+3+ ... +(n-1) 次,将每个 item 添加到列表中。我确定您认为这是 O(n^2)。

假设重复项是原始列表的某个固定或有限比例,则该表达式取决于n。

这有助于理解吗?


澄清:

序列1 .. n之和为n(n+1) / 2,即(n^2 + n) / 2。这由n^2项支配。

【讨论】:

  • 非常感谢!我在理解外部循环的每个循环只留下内部循环的有限过滤列表以通过这一事实是否影响任何事情时遇到了问题。因此,在任何给定时间,内部循环所经历的第二个列表都变小了(仅在最后一次迭代中可能达到完整大小)不会产生任何影响?这仍然是 O(n^2)?
  • @MarcusDeCuir:没错——仍然是 O(n^2)。当我们可以用这样的封闭式表达式来描述时间时,只有最大项的程度对“Big-O”的确定很重要。在本例中,该术语为 1/2 * n^2,因此代码块为 O(n^2)。
  • @Prune 啊,我现在明白了。再次感谢。如果不是你,我早就绞尽脑汁了。
  • 为避免将来出现问题,请在线搜索其中一些代数技术,例如算术和几何序列之和 - 以及如何确定算法的复杂性。
猜你喜欢
  • 2012-12-13
  • 1970-01-01
  • 2015-04-21
  • 2012-02-17
  • 2016-08-27
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
相关资源
最近更新 更多