这两个嵌套的 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
}
}
这两个嵌套的 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
}
}
第一个循环的速度大约是第二个循环的两倍,但就渐近时间复杂度而言,它们是相同的:
O(N^2)
你可以用图形来思考:想象一个正方形,每边都有 N 个单位。第二个循环访问所有单位正方形;
######
######
######
######
######
######
第一个循环访问属于覆盖一半正方形的三角形的点:
#
##
###
####
#####
######
两个循环具有相同的渐近行为 - O(n**2)
1 + 2 + ... + n = n(n+1)/2 = n*n/2 + n/2 -> O(n**2)
n*n -> O(n**2)
所以第二个循环比第一个循环慢两倍,而渐近是相同的