多功能的大O表示法

时间:2011-02-08 14:38:20

标签: algorithm complexity-theory time-complexity

当一个人使用多个功能时,我有一个关于大O符号的问题。 假设我想知道以下伪代码的时间复杂度:

heap sort array of size n
for i = 1 to n{
  retrieve array[i]
  change value of array[i]
}

我知道使用堆排序是O(n log(n))。由于检索和更改数组中的数据是O(1),因此循环具有复杂度O(n)。 现在我的问题是:整个代码的复杂性是多少?它只是最大的时间复杂度;在这种情况下O(n log(n))? 如果是这样,那么函数的复杂性将是这样的:

for i = 1 to n{
  // nothing fancy here
}
for y = 1 to n{
  // nothing fancy here either
}

提前致谢。

2 个答案:

答案 0 :(得分:2)

for i = 1 to n{
  // nothing fancy here
}  //O(n)

for y = 1 to n{
  // nothing fancy here
}  //O(n)

所以它是O(n) + O(n) = O(n)

答案 1 :(得分:1)

Big-O表示法是关于当n(输入大小)接近无穷大时哪个因素占主导地位。因此,如果您按顺序执行了两个代码AB,那么整体时间行为将是O(A)和O(B)中的较大者。

在您的情况下,如果heapsort是O(nlogn)算法,并且循环只是O(n)算法,那么当n接近无穷大时,nlogn最终会方式更大,所以它是唯一重要的术语。 因此,您的整体时间行为为O(nlogn)

当然这都是理论。在现实世界中,如果你在循环内部做一些缓慢的事情(比如I / O),那么在mergesort变慢之前你的n可能必须变得庞大(可能比它合理得到的更大)而不是循环。