我有一个嵌套的for循环,我试图分析效率。循环看起来像这样:
int n = 1000;
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
System.out.print("*");
}
}
我不相信这个算法是O(n ^ 2),因为内部循环不运行n次,它只运行i次。但是,肯定不是O(n)。所以我假设它必须在两个效率之间,这给出了O(nlog(n))。这是准确的还是它真的是一个O(n ^ 2)算法,我误解了内循环对效率的影响?
答案 0 :(得分:4)
您的算法将运行triangular number次:
n *(n + 1)/ 2
在上述情况下,n = 999
因为第一个j
循环没有运行:
(999 * 1000)/ 2 = 499500
低于n**2
,但仍为O(n**2)
,因为n * (n + 1) / 2
为n**2 / 2 + n / 2
。当n
较大时,与n / 2
相比,您可以忽略n**2 / 2
,也可以忽略常量1 / 2
因素。
答案 1 :(得分:2)
我有点怀疑,但试着这样想:i
在最坏的情况下会有什么价值?答案是n-1
,对吗?因此,通过考虑最坏的情况来评估复杂性,结果是O(n^2)
为n * (n-1) ~ n^2
。
答案 2 :(得分:0)
迭代次数为sum from i=0 to n-1 (sum from j=0 to i-1 (1))
。内部总和显然等于i
。 sum from i=0 to n-1 (i) = n * (n-1) / 2 = O(n^2)
众所周知。