我无法找到这段代码的Big-O表示法。 我需要找到两个for循环的表示法。
public static int fragment(int n)
{
int sum = 0;
for (int i = n; i >= 1; i /= 2)
{
for (int j = 1; j <= i; j *= 3)
{
sum++;
}
}
return sum;
}
答案 0 :(得分:3)
分别考虑两个循环:
首先让我们在每次迭代时考虑for(int i=n; i>=1; i/=2)
,将i
的值除以2,直到达到小于1
的值。因此,迭代次数N将等于i
除2
之前除以log(n)
之前的次数。有一个众所周知的函数代表这个数字 - for(int j=1;j<=i; j*=3)
现在让我们考虑一下内循环。 i
。在这里,你将j乘以3直到它变得超过for(int j=i; j>=1; j/=3)
。如果您认为这与第一个周期的以下轻微修改将完成相同的迭代次数:O(log(n)^2)
。并且具有完全相同的解释,我们具有相同的功能(但具有不同的基础 - 3)。这里的问题是迭代次数取决于i。
所以现在我们的总体复杂性是:
log 3 (n)+ log 3 (n / 2)+ log 3 (n / 4)... + log 3 (1)=
log 3 (n)+ log 3 (n) - log 3 (2)+ log 3 (n).... - log 3 (2 log 2 (n))=
log 3 (n)* log 2 (n) - log 3 (2) - 2 * log 3 < / sub>(2) - ... log 2 (n)* log 3 (2)=
log 3 (n)* log 2 (n) - log 3 (2)*(1 + 2 + ... log 2 )=
log 3 (n)* log 2 (n) - log 3 (2)*(log 2 (n)*(log 2 (n)+ 1))/ 2 =
log 2 (n)*(log 3 (n) - log 3 (2)*(log 2 < / sub>(n)+ 1)/ 2)=
log 2 (n)*(log 3 (n) - (log 3 (n)+ log 3 < / sub>(2))/ 2)=
(log 2 (n)* log 3 (n))/ 2 - (log 2 (n)* log 3 (2))/ 2
计算有点棘手,我使用了一些对数属性。然而,最后的结论是循环具有复杂性{{1}}(记住你可以忽略对数的基数)。
答案 1 :(得分:1)
要正式推断时间复杂度,使用sigma表示法是一种合适的方法:
WolframAlpha帮助我完成了闭式公式的总结。
对于对数,您可以查看this document的最后一张幻灯片,其中Jauhar博士解释了对数循环。