【问题标题】:Difference of complexity between double nested for loops? (Java)双嵌套for循环之间的复杂性差异? (爪哇)
【发布时间】:2013-08-19 20:46:02
【问题描述】:
这两个嵌套的 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
}
}
【问题讨论】:
标签:
java
performance
for-loop
time
【解决方案1】:
第一个循环的速度大约是第二个循环的两倍,但就渐近时间复杂度而言,它们是相同的:
O(N^2)
您可以用图形来思考:想象一个正方形,每边有 N 个单位。第二个循环访问所有单位正方形;
######
######
######
######
######
######
第一个循环访问属于覆盖一半正方形的三角形的点:
#
##
###
####
#####
######
【解决方案2】:
两个循环具有相同的渐近行为 - O(n**2)
- 第一个循环:
1 + 2 + ... + n = n(n+1)/2 = n*n/2 + n/2 -> O(n**2)
- 第二次循环:
n*n -> O(n**2)
所以第二个循环比第一个循环慢两倍,而渐近是相同的