大O符号,复杂性

时间:2014-01-15 03:23:39

标签: big-o complexity-theory pseudocode

所以我们刚刚开始使用Big O表示法,我们有一个问题要问:

如果someWork的复杂度为O(i),则后续循环的最差时间复杂度是多少,注意这意味着i是循环计数器,因此某些工作的步骤会增加每次柜台都这样做:

while(i < n)
    someWork(...)
    i <-- i + 2

这显然是用伪代码编写的,我已经得到了更简单的问题,所以我不相信我在理解这个问题时遇到了问题,这是我坚持的特定问题。我可以帮忙吗?

提前非常感谢!

3 个答案:

答案 0 :(得分:1)

这实际上取决于someWork()的复杂性。如果someWork()内部有循环(或嵌套循环),则复杂性将自动从O(n)变为O(n ^ 2)或更多。如果someWork没有循环,则此代码具有O(n)复杂度。顺便说一下,我很难理解最后一行。它是循环的一部分吗?它是否为我分配任何东西(我的意思是拼写错误)?

答案 1 :(得分:1)

鉴于someWork()取决于ii平均约为n/2 所有外循环迭代,因此,时间复杂度为O(n2)

那是因为外环取决于nsomeWork()(某些描述的“内环”)也取决于n

someWork() O(n)背后的原因如下:

假设n为8.这意味着i取值{0, 2, 4, 6},平均值为12 / 4 == 3

现在让我们说n为16.这意味着i取值{0, 2, 4, 6, 8, 10, 12, 14},平均值为56 / 8 == 7

现在假设n为32.这意味着i的值为{0, 2, 4, ..., 28, 30},平均值为240 / 16 == 15

如果继续,您会发现someWork()执行的操作数始终为n / 2 - 1,因此O(n)

结合循环本身为O(n),可以提供O(n2)复杂度。

答案 2 :(得分:0)

为了简化问题,假设最后一行被替换为     我&lt; --- i + 1 这样您就不会跳过i的值。现在,做了多少工作?总数是,

O(1)+ O(2)+ O(3)+ O(4)+ ... + O(n-1)+ O(n)= O(1 + 2 + ... + n )= O(n(n + 1)/ 2)= O(n ^ 2)。

现在,在你的问题中,我们忽略了i的所有偶数值,这与删除一半的术语相同。不应该太难看出这应该加起来大约是操作数量的1/2,所以得到O(n ^ 2/2)= O(n ^ 2)。