Algorithm 计算给定代码段的时间复杂度的问题

Algorithm 计算给定代码段的时间复杂度的问题,algorithm,big-o,Algorithm,Big O,我在计算此代码的时间复杂度时遇到问题 int count = 0; for(int i = 0; i < n; i++) for(int j = 0; j < i; j++) count ++; int count=0; 对于(int i=0;i

我在计算此代码的时间复杂度时遇到问题

int count = 0;
for(int i = 0; i < n; i++)
    for(int j = 0; j < i; j++)
        count ++;
int count=0;
对于(int i=0;i
我知道外循环将执行
n次
,但我无法计算出内循环将执行多少次。
有人能告诉我答案以及如何解决这个问题吗?

内部循环执行
i
次。
i
的值将是0,然后是1,然后是2,然后是3。。。在外循环的最后一次迭代中最多为
n-1

因此,内部循环的总迭代次数将为1+2+…+(n-1)=n(n-1)/2,即O(n²)


一种更非正式的推导方法是,平均而言,
i
约为n/2,因此内部循环迭代O(n)次(但不完全是n次)。所以总的迭代次数是n(来自外循环)乘以O(n),得到O(n²)。

你可以在纸上画一个草图。外循环是行数,列数是内循环中的
count++
操作数。
结果将是一个三角形。也就是n²/2,也就是O(n²)

示例n=5:

i=0:   
i=1:   x
i=2:   xx
i=3:   xxx
i=4:   xxxx 


(我们可以忽略循环的条件检查和计数器增量的执行时间)

从哪里得到2的除法?我不知道它是从哪里来的。公式n(n-1)/2只是从1到n-1的数字之和的标准公式。
i
的平均值约为n/2的说法只是给出了其最低值(0)和最高值(n-1)之间的大致中点,因为它们之间呈线性变化。