algorithm - 迭代 k 层深循环嵌套的时间复杂度始终为 θ(nᵏ)?

标签 algorithm big-o time-complexity

许多算法中都有如下所示的循环:

for a from 1 to n
  for b from 1 to a
    for c from 1 to b
      for d from 1 to c
        for e from 1 to d
           ...
           // Do O(1) work

也就是说,循环嵌套有k层深,外层从1循环到n,每个内层从1向上循环到它上面的索引。例如,这会出现在迭代数组内所有 k 元组位置的代码中。

假设k是固定的,那么这段代码的运行时间是不是总是θ(nk)?对于 n = 1 的特殊情况,功为 θ(n),因为它只是数组上的标准循环,而对于 n = 2 的情况,功为 θ(n2),因为内循环完成的工作由下式给出:

0 + 1 + 2 + ... + n-1 = n(n-1)/2 = Θ(n2)

当 k 变大时,这种模式还会继续吗?还是只是巧合?

最佳答案

是的,时间复杂度为 θ(nk)。衡量此代码复杂性的一种方法是查看它生成的值。一个特别有用的观察结果是,这些循环将迭代数组 {1, 2, 3, ..., n} 的所有可能的 k 元素子集,并且将花费 O(1) 时间生成其中每一个。因此,我们可以说运行时间是由此类子集的数量给定的。给定一个n元素集合,k元素子集的数量为n选k,等于

n! / k!(n - k)!

这是由

给出的

n (n-1)(n-2) ... (n - k + 1) / k!

这个值肯定不会大于这个值:

n · n · n · ... · n / k! (with k copies of n)

= nk / k!

这个表达式的复杂度是 O(nk),因为 1/k! term 是一个固定常数。

同样,当n - k + 1 ≥ n/2时,该表达式大于或等于

(n / 2) · (n / 2) · ... · (n / 2) / k! (with k copies of n/2)

= nk / k! 2k

这是 Ω(nk),因为 1/k! 2k 是一个固定常数。

由于运行时间为 O(nk) 和 Ω(nk),因此运行时间为 θ(nk)。

希望这有帮助!

关于algorithm - 迭代 k 层深循环嵌套的时间复杂度始终为 θ(nᵏ)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19719441/

相关文章:

java - 在 Java 中合并和删除多个列表中的重复项的最佳方法

java - 找出 10 个线程的最大值

algorithm - STM32L1xx 上的闪存 ECC 算法

java - 为什么对数组进行排序/初始化不计入 Big O 中?

python - 收集雨水的时间复杂度

java - 如何根据一些规则按降序创建优点列表?

algorithm - 获取 O(N) 算法以找到具有奇怪约束的数字集合的乘积

python - 计算最多具有m个偶数元素的不同子数组的数量

javascript - 搜索 JavaScript 对象键的时间复杂度是多少?

c++ - 包含指数的嵌套循环的时间复杂度是多少?