我有一个关于计算给定函数的预期运行时间的问题。我理解得很好,如何计算带有循环的代码片段(for / while / if等),但没有它们的函数对我来说似乎有些奇怪。例如,假设我们有以下代码片段:
public void Add(T item)
{
var newArr = new T[this.arr.Length + 1];
Array.Copy(this.arr, newArr, this.arr.Length);
newArr[newArr.Length - 1] = item;
this.arr = newArr;
}
如果我的逻辑工作正常,Add函数的复杂度为O(1),因为在最佳/最差/平均情况下,它只读取每行代码一次,对吧?
答案 0 :(得分:0)
您也必须考虑函数调用的时间复杂度。我不知道Array.Copy
是如何实施的,但我会猜测它是O(N)
,从而使整个Add
函数O(N)
成为可能同样。但是你的直觉是正确的 - 它的 rest 实际上是O(1)
。
答案 1 :(得分:0)
如果您有多个 O(n) + O(log(n))等子操作,而且成本最高的步骤是整个操作的成本 - 默认情况下,大O指的是最坏的情况。在复制数组时,这是一个 O(n)操作
答案 2 :(得分:0)
复杂性按照以下两条规则计算:
- 采用方法(复杂性+ 1)
- 遇到以下关键字:if,while,repeat,for,&&,||,catch,case等...(复杂性+ 1)
在您的情况下,假设您尝试复制数组而不是单个值,算法将完成 N 复制操作,为您提供 O(N)操作