Big o 大O符号,复杂性

Big o 大O符号,复杂性,big-o,complexity-theory,pseudocode,Big O,Complexity Theory,Pseudocode,所以我们刚刚开始大O符号,我们有一个问题要问: 如果someWork的复杂度为O(i),则以下循环的最差时间复杂度是什么,注意这意味着i是循环计数器,因此每次计数器执行时,someWork的步数都会增加: while(i < n) someWork(...) i <-- i + 2 while(i

所以我们刚刚开始大O符号,我们有一个问题要问:

如果
someWork
的复杂度为
O(i)
,则以下循环的最差时间复杂度是什么,注意这意味着
i
是循环计数器,因此每次计数器执行时,someWork的步数都会增加:

while(i < n)
    someWork(...)
    i <-- i + 2
while(i这实际上取决于
someWork()
的复杂性。如果
someWork()
中有一个循环(或嵌套循环),复杂性将自动从O(n)增加到O(n^2)或更多。如果某些工作没有循环,则此代码具有O(n)复杂性。顺便说一句,我很难理解最后一句话。这是循环的一部分吗?是不是给i分配了什么(我的意思是一个输入错误)?

考虑到
someWork()
依赖于
i
,并且
i
在所有外循环迭代中平均大约是
n/2
,因此时间复杂度是
O(n2)

这是因为外部循环依赖于
n
,而
someWork()
(某种描述的“内部循环”)也依赖于
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)
复杂性。

为了简化问题,假设最后一行被替换为
如果有一个嵌套的for循环,它不一定从O(n)到O(n^2)。如果嵌套for循环在空列表上迭代会怎么样?他的伪代码不是sufficient@TheInternet:复杂性不适用于最佳情况。这通常是最重要的平均和最坏的时间。请参阅。伪代码本身可能不够,但文本明确指出,有些工作是O(i),在这种情况下,它实际上是O(n)。我会投票支持这一点,但dotNET似乎忽略了一个事实,即某些工作的复杂性实际上已经被指定。对于某些工作的复杂性,得到的O表示法是什么?假设n是一个大的正整数,I是0。因此,循环可能会进行n/2次,因为每次i都增加2。好吧,例如,第一个问题是“如果‘someWork’是一个‘O(1)’算法,那么这个循环的最坏情况时间复杂度是多少?这是一系列问题中的最后一个问题,难度增加了。如果答案是O(n/2),我得到的答案是‘O(n/2)’,这意味着
someWork()
的复杂性不是O(i),而是O(1).谢谢你,我今天上了另一节课,意识到了这个错误。回答得很好:)我喜欢这个,但我们不是在寻找平均值,而是在寻找最坏的情况。这个例子也是这样吗?对不起……第一次真正使用O符号。@Axirio,不要错误地认为我使用了“平均值”这个词“与复杂性有关。我使用平均值只是为了说明
someWork()
函数依赖于
n
。它类似于
1+2+3+4+5=3*5
(计数的中间数字),
1+2+3=2*3
,1+2+…+n=(n+1)/2*n`。就是这样!非常感谢!