假设模块A的运行时间为常数M,N为输入数据的大小。
1. Set J:=N.
2. Repeat Steps 3 and 4 while J>1.
3. Module A.
4. Set J:=J/2.
[End of Step 2 loop.]
5. Return.
答案 0 :(得分:2)
此算法的时间复杂度为 O(log(n))
Set J:=J/2
指令也一样,它在 O(1) 答案 1 :(得分:0)
给定一个整数除数可以在恒定时间内完成,该算法的时间复杂度为 O(log N)。对于(很大)数字,将其除以2会花费一些额外的时间: O(log K)和 K 是要除的值。
当J
小于或等于1时,算法停止。因此,这意味着如果J=2
,则将花费 M + 1 个步骤(该时间用于评估模块,并且将J
除以2,我们在这里假设除以2需要固定的时间。
现在为J=2*K
(带有K
一个变量),它再次需要 M + 1 个步骤来完成循环,以及使用{{1}所花费的时间}解决问题。
所以这意味着我们得到以下方程式:
J=K
因此,我们看到工作量随着迭代次数的增加而线性增长,迭代次数的上限为 log 2 N :如果必须执行 K 个步骤,则初始 N 在 2 K-1 +1 之间和 2 K 。
这意味着步骤总数受以下限制:
T(1) = 0
T(N) = T(N/2) + M + 1
T(N) = (M+1) * log2(N)
是常量,因此意味着M
是常量,因此 variable 部分是M+1
。这是 O(log N)。
但是严格来说,如果 N 可能非常大,以至于我们需要任意数量的内存,则划分不是恒定的。如果我们使用二进制数系统,则可以将 O(log K)中的位与 K 数相除以除以2(和 log 2 k 个位数)。
在这种情况下,需要采取以下步骤:
log2(N)
通过T(1) = 0
T(N) = T(N/2) + M + log2(N)
迭代,步数受以下限制:
K
log 2 (i)与 i 从 1 到 k 的总和em>等于 log 2 (k!),其上限为 O(k log k)。由于 k 步数受 O(log N)约束,因此这意味着除法的总时间复杂度为 O(log N× log(log N))。所有对该模块的调用的总时间复杂度保持为 O(M×log N),因此 O(log N),因此时间复杂度为 O(log N×(1 + log(log N))),或更简单的 O(log N + log N×log(log N))。
但是可以略微更改算法,以使我们不必明确执行这些划分:我们可以使用某种光标,每次将光标向前移动一步,直到 N 是“精疲力尽”,在这种情况下,时间复杂度再次为 O(log N)。