[英]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.