登录循环的时间复杂度

时间:2016-08-09 11:06:30

标签: c++ algorithm loops time-complexity

这个循环的复杂性是什么

for (int i = 0; i < n; i++)
{
    for (int j = 0; j < log(i); j++)
    {
        // do something
    }
}

根据我的说法,内循环将运行log(1)+log(2)+log(3)+...+log(n)次,所以我如何计算其复杂性?

3 个答案:

答案 0 :(得分:8)

如果不以正式方式执行此操作,可以使用积分“猜测”这种复杂性计算。被积函数是do_something的复杂度,假定为O(1),并且与log N的区间相结合,然后内圈的变为log N。结合外循环,总体复杂度为O(N log N)。所以在线性和二次之间。

注意:这假设“做某事”是O(1)(就N而言,它当然可能是一个非常高的常数。)

答案 1 :(得分:8)

所以,你有一笔钱log(1) + log(2) + log(3) + ... + log(n) = log(n!)。使用Stirling's approximation以及ln(x) = log(x) / log(e)可以获得的事实

log(n!) = log(e) * ln(n!) = log(e) (n ln(n) - n + O(ln(n)))

给出与其他答案相同的复杂度O(n ln(n))(稍微更好地理解所涉及的常量)。

答案 2 :(得分:0)

让我们从log(1)+log(2)+log(3)+...+log(n)开始。该总和的大约一半元素大于或等于log(n/2) = log(n) - log(2)。因此,这个总和的下限是n / 2 * (log(n) - log(2)) = Omega(nlog(n))。要获得上限,只需将n乘以log(n)的最大元素,即O(nlog(n))