此函数是线性函数,二次函数还是都不是? (C#)

时间:2019-01-16 17:58:25

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

关于列表的长度是输入(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;
}

1 个答案:

答案 0 :(得分:1)

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

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

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

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

这有助于理解吗?


说明:

序列n的总和为1 .. n或(n ^ 2 + n)/2。这由n ^ 2项决定。