如何找到以下提到的算法的执行时间?

时间:2019-01-05 07:53:09

标签: algorithm time-complexity complexity-theory

假设模块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.

2 个答案:

答案 0 :(得分:2)

TL; DR

此算法的时间复杂度为 O(log(n))

说明

  • 由于模块A 在恒定的时间M中运行,因此可以说其运行时间为 O(1)
  • Set J:=J/2指令也一样,它在 O(1)
  • 中运行
  • 让我们说第二行的循环总共运行了 K 次。因此,在循环完成K次迭代之后,我们将得出 J = 1
    • 在循环的第1次迭代之后,我们还有 N / 2 次迭代。 2号之后,我们有 N / 4 。第3个 N / 8 ,第4个 N / 16 ,依此类推。
    • 经过 K 次迭代(当循环完成迭代时),我们将得到 J = 1 = N /(2 ^ K)
    • 所以 N /(2 ^ K)= 1 ,这使我们得到 N = 2 ^ K 。因此,迭代次数为 K = log2(N)
  • 循环的每次迭代中的指令采用 O(1),我们最终得到的总数为 O(log(N))

注释

答案 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)