3

这两个嵌套的 for 循环在性能和复杂性方面有什么区别?

for(int i = 0; i < l.length; i++) {
    for(int j = 0; j <= i; j++) {
        //do something
    }
}

和 :

for(int i = 0; i < l.length; i++) {
    for(int j = 0; j < l.length; j++) {
        //do something
    }
}
4

2 回答 2

7

第一个循环的速度大约是第二个循环的两倍,但就渐近时间复杂度而言,它们是相同的:

O(N^2)

你可以用图形来思考:想象一个正方形,每边都有 N 个单位。第二个循环访问所有单位正方形;

######
######
######
######
######
######

第一个循环访问属于覆盖一半正方形的三角形的点:

#
##
###
####
#####
######
于 2013-08-17T15:29:09.510 回答
3

两个循环具有相同的渐近行为 - O(n**2)

  1. 第一个循环:1 + 2 + ... + n = n(n+1)/2 = n*n/2 + n/2 -> O(n**2)
  2. 第二个循环:n*n -> O(n**2)

所以第二个循环比第一个循环慢两倍,而渐近是相同的

于 2013-08-17T15:29:16.090 回答