所以我理解大多数复杂问题;然而,这让我很困惑。
当for循环中的第二个语句如下(i * i< n)时,循环的大O是什么?怎么计算?
for ( i = 1 ; i * i < n ; i++)
答案 0 :(得分:6)
假设n
是输入大小的代理(并且您的代码将仅为输入的每个可处理成员执行一次循环体,并且没有其他输入元素选择器逻辑)。
i * i < n
i^2 < n
i < Sqrt(n)
因此,时间复杂度为O( Floor( Sqrt( n ) ) )
。
让我们看一下n = 10
的示例(该表显示每次迭代结束时的变量状态,恰好在i++
评估之前的那一刻,{{1执行测试)。
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
检查时,迭代4将不会执行,因此循环将执行3次。精确的平方根10是i^2 < 10
但是迭代计数是从0开始的自然数,所以使用3.1622...
。)。
答案 1 :(得分:6)
i*i<n
可以转换为
i<sqrt(n)
所以它的实际O(sqrt(n))