嵌套循环代码时间复杂度疑问:打印语句执行次数为何是n(n-1)/2?
理解嵌套循环的执行次数与时间复杂度
嘿,我来帮你理清这个嵌套循环的问题,你应该是在循环次数的计算逻辑上出现了偏差,咱们一步步拆解:
首先先把你的代码清晰列出来:
for (int i = 1; i <= n - 1; i++) for (int j = i + 1; j <= n; j++) Console.WriteLine(i, j);
一、先纠正循环次数的错误计算
你提到的外层循环执行4n-1次、内层循环执行3n²-3次明显是错误的,问题出在你可能混淆了循环的「控制步骤次数」和「循环体执行次数」,或者推导逻辑完全走偏了:
- 外层循环:
i从1开始,到n-1结束,每次递增1,所以外层循环体(也就是内层循环)会执行n-1次(比如n=5时,i取1、2、3、4,共4次)。 - 内层循环:它的执行次数不是固定值,而是随着外层
i的变化而递减的:- 当
i=1时,j从2到n,执行n-1次 - 当
i=2时,j从3到n,执行n-2次 - ...
- 当
i=n-1时,j从n到n,执行1次
- 当
二、打印语句的执行次数为什么是n(n-1)/2?
打印语句是内层循环的循环体,所以它的总执行次数就是所有内层循环执行次数的总和,也就是一个等差数列求和:(n-1) + (n-2) + ... + 2 + 1
这个等差数列的求和公式就是 n(n-1)/2,比如n=5时,总和是4+3+2+1=10,而5*4/2=10,完全吻合。
三、关于时间复杂度的误区
你得出的n(n-1)其实和n(n-1)/2是同阶的,因为时间复杂度会忽略常数系数和低阶项。不过准确的执行次数是n(n-1)/2,展开后是(1/2)n² - (1/2)n,所以时间复杂度最终是O(n²),这应该就是课件里的结果。
你忽略的核心点概括
- 错误地固定了内层循环的执行次数,没有意识到它会随着外层循环变量
i的递增而递减 - 混淆了循环的控制操作(比如条件判断、变量递增的次数)和我们真正关注的「关键操作(打印)」的执行次数
- 外层循环的执行次数计算完全偏离了实际逻辑
内容的提问来源于stack exchange,提问作者polors2




