关于列表的长度是输入(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;
}
答案 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项决定。