两个嵌套for循环的运行时
Runtime of two nested for loops
我将下面 Python 代码的 运行 时间复杂度计算为 n^2
,但它似乎不正确。显示的正确答案是 n(n-1)/2
。谁能帮助我理解为什么内部循环不是 运行ning n*n
次而是 n(n-1)/2
次?
for i in range(n):
for j in range(i):
val += 1
在内循环的第一个运行上,当i = 0
时,for
循环根本不执行。 (range(0)
中有零个元素要迭代)。
在内循环的第二个运行,当i = 1
时,for
循环执行一次迭代。 (在 range(1)
中有一个元素要迭代)。
然后,第三个有两个元素运行,第四个有三个,按照这个模式,直到i = n - 1
。
总迭代次数为0 + 1 + ... + (n - 1)
。这个求和有一个众所周知的形式*:对于任何自然 m
、0 + 1 + ... + m = m * (m + 1) / 2
。在这种情况下,我们有 m = n - 1
,因此总共有 n * (n - 1) / 2
次迭代。
你是对的,这个算法的渐近时间复杂度是O(n^2)
。但是,鉴于您已经说过“正确答案”是 n * (n - 1) / 2
,问题很可能会询问确切的迭代次数(而不是渐近界限)。
* 请参阅 here 以获得此封闭形式的证明。
我将下面 Python 代码的 运行 时间复杂度计算为 n^2
,但它似乎不正确。显示的正确答案是 n(n-1)/2
。谁能帮助我理解为什么内部循环不是 运行ning n*n
次而是 n(n-1)/2
次?
for i in range(n):
for j in range(i):
val += 1
在内循环的第一个运行上,当i = 0
时,for
循环根本不执行。 (range(0)
中有零个元素要迭代)。
在内循环的第二个运行,当i = 1
时,for
循环执行一次迭代。 (在 range(1)
中有一个元素要迭代)。
然后,第三个有两个元素运行,第四个有三个,按照这个模式,直到i = n - 1
。
总迭代次数为0 + 1 + ... + (n - 1)
。这个求和有一个众所周知的形式*:对于任何自然 m
、0 + 1 + ... + m = m * (m + 1) / 2
。在这种情况下,我们有 m = n - 1
,因此总共有 n * (n - 1) / 2
次迭代。
你是对的,这个算法的渐近时间复杂度是O(n^2)
。但是,鉴于您已经说过“正确答案”是 n * (n - 1) / 2
,问题很可能会询问确切的迭代次数(而不是渐近界限)。
* 请参阅 here 以获得此封闭形式的证明。