以下代码的小于比较频率为(N + 1)(N + 2)/ 2。
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
}
}
我认为N + 1是第一次循环。那(N + 2)/ 2呢,知道吗?
答案 0 :(得分:1)
在第一次迭代中,内部循环运行N-1
次,在第二次迭代中运行N-2
次,依此类推。每次都再次检查<
操作(当条件不再成立时),因此在内部循环的所有迭代中N + N-1 + N-2 + ... + 1
检查<
。在外部循环中,<
被额外检查N+1
次,总共N+1 + N + ... + 1
次。该总和等于(N+2)*(N+1)//2
。
您还可以将迭代次数可视化为(锯齿状)三角形:
#####
####
###
##
#
通常,边长为N+1
的直角三角形的面积为(N+1)*(N+1)//2
,但是由于其假设是“锯齿状的”,因此附加了(N+1)//2
(即{{ 1}}个边长为1)的较小三角形,该三角形又加起来为N+1