许多算法都有循环,如下所示:
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是固定的,那么这段代码的运行时间总是Θ(n k )?对于n = 1的特殊情况,工作是Θ(n),因为它只是数组上的标准循环,对于n = 2的情况,工作是Θ(n 2 ),因为内循环完成的工作由
给出0 + 1 + 2 + ... + n-1 = n(n-1)/ 2 =Θ(n 2 )
当k变大时,这种模式会继续吗?或者只是巧合?
答案 0 :(得分:2)
是的,时间复杂度为Θ(n k )。衡量此代码复杂性的一种方法是查看它生成的值。一个特别有用的观察是这些循环将遍历数组{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! (带有k份副本)
= n k / k!
这个表达式是O(n k ),因为1 / k! term是固定常数。
类似地,当n - k +1≥n/ 2时,该表达式大于或等于
(n / 2)·(n / 2)·......(n / 2)/ k! (有k份n / 2)
= n k / k! 2 ķ
这是Ω(n k ),因为1 / k! 2 k 是固定常数。
由于运行时为O(n k )和Ω(n k ),运行时为Θ(n k )。< / p>
希望这有帮助!
答案 1 :(得分:0)
您可以使用以下等式:
其中 c 是最里面循环内的常量时间操作数, n 是元素数, r 是数字嵌套循环。