You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

嵌套循环代码时间复杂度疑问:打印语句执行次数为何是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

火山引擎 最新活动