【发布时间】:2019-11-19 20:02:46
【问题描述】:
我无法计算这段代码的时间复杂度。
int count = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < i; j++)
count ++;
我知道外循环将执行n 次,但我不知道内循环将执行多少次。
谁能告诉我答案以及如何解决这个问题?
【问题讨论】:
我无法计算这段代码的时间复杂度。
int count = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < i; j++)
count ++;
我知道外循环将执行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²)。
【讨论】:
i 平均约为 n/2 的说法只是给出了其最低值 (0) 和最高值 (n-1) 之间的近似中点,因为它在它们之间呈线性变化。
你可以在纸上画一个小草图。外循环是行数,列数是内循环中count++ 操作的数量。
结果将是一个三角形。即 n² / 2 即 O(n²)
示例 n=5:
i=0:
i=1: x
i=2: xx
i=3: xxx
i=4: xxxx
【讨论】: