c# - 这个函数是线性的、二次的还是两者都不是?(C#)
问题描述
关于作为输入 (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;
}
解决方案
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 项支配。
推荐阅读
- javascript - 除了在 Chrome 中看到的 `favicon` 之类的 Electron 中的 `BrowserWindow` 的 `title` 之外,无法设置图标?
- python - 如何从 Python 脚本在后台启动进程并避免僵尸?
- amazon-web-services - LaunchConfiguration 用户数据与 AWS::CloudFormation::Init
- mysql - 在mysql中仅显示多行的单个不同ID
- python - 如何在搜索查询中加入文档
- r - 我似乎无法在 R studio for windows 上安装“ecospat”包
- javascript - windows.open、chrome.tabs.create、webbrowser.open 不打开任何浏览器/窗口
- python - 在 Python 中创建二维非矩形形状的三角形网格
- android - 禁用收集时防止 Firebase-Crashlytics 发送版本号
- mips - LLDB 是否与 gdbserver 兼容(用于调试交叉编译的代码?)