这个循环的复杂性是什么
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)
次,所以我如何计算其复杂性?
答案 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))
。