我理解大多数复杂性问题,但这个问题让我感到困惑。
当for循环中的第二个语句是如下形式时(i * i < n),那么循环的大O值会是什么?该如何计算?
for ( i = 1 ; i * i < n ; i++)
我理解大多数复杂性问题,但这个问题让我感到困惑。
当for循环中的第二个语句是如下形式时(i * i < n),那么循环的大O值会是什么?该如何计算?
for ( i = 1 ; i * i < n ; i++)
假设n
是输入大小的代理(并且您的代码将仅为可处理的每个成员执行一次循环体,并且没有其他输入元素选择器逻辑)。
i * i < n
i^2 < n
i < Sqrt(n)
因此,时间复杂度为O(Floor(Sqrt(n)))
。
让我们以n = 10
为例(表格显示了在每次迭代结束时变量的状态,在评估i++
并执行i * i < n
测试之前的确切时刻)。
Iteration, i, i * i, n
1, 1, 1, 10
2, 2, 4, 10
3, 3, 9, 10
4, 4, 16, 10 -- 16 > 10, abort loop
5, 5, 25, 10 -- for illustrative purposes
3.1622 ...,但迭代计数是基于0的自然数,因此请使用Floor
。)
i*i<n
可以转换为
i<sqrt(n)
O(sqrt(n))
。O()
中可以使用任何代数表达式(和符号)。请注意,O()
不一定是 n
的函数,例如,如果您正在处理一个二维数组(在这种情况下,它是宽度和高度的函数 m
和 n
)。 - Dai
i * i < n
如何等同于i < sqrt(n)
。 - Nick Zuber