繁体   English   中英

登录循环的时间复杂度

[英]Time complexity with log in loop

这个循环的复杂性是多少?

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)次,那么我如何计算其复杂性?

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

注意:这假定“做某事”是O(1) (就N ,它当然可以是非常高的常数)。

所以,你有一个sum log(1) + log(2) + log(3) + ... + log(n) = log(n!) 通过使用斯特林的近似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)) (稍微更好地理解了所涉及的常数)。

让我们从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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM