运行时间计算/算法的复杂性

时间:2013-01-22 03:38:48

标签: time-complexity big-o

我必须逐行计算算法的时间复杂度或理论运行时间(给定伪代码),作为T(n)。我试了一下,但有几件事令我困惑。例如,“if”语句的时间复杂度是多少?我如何处理嵌套循环?代码如下,以及我的评论。

长度[A] = n

    for i = 0 to length[A] - 1    // n - 1 
      k = i + 1                   // n - 2
      for j = 1 + 2 to length[A]  // (n - 1)(n - 3)
        if A[k] > A[j]            // 1(n - 1)(n - 3)
          k = j                   // 1(n - 1)(n - 3)
      if k != i + 1               // 1(n - 1)
        temp = A[i + 1]           // 1(n - 1)
        A[i + 1] = A[k]           // 1(n - 1)
        A[k] = temp               // 1(n - 1)

1 个答案:

答案 0 :(得分:1)

Blender是对的,结果是O(n ^ 2):两个嵌套循环,每个循环都有一个依赖于n的迭代计数。

更长的解释:

在这种情况下,if并不重要:由于O符号仅查看算法的最坏情况执行时间,因此您只需选择对整个执行时间更差的执行路径。因为在您的示例中,两个执行路径(k != i+ 1都为true或false)对运行时没有进一步的影响,您可以忽略它。如果在n内有第三个嵌套循环,也运行到if,则最终会得到O(n ^ 3)。

逐行概述:

for i = 0 to length[A] - 1    // n + 1 [1]
  k = i + 1                   // n
  for j = 1 + 2 to length[A]  // (n)(n - 3 + 1) [1]
    if A[k] > A[j]            // (n)(n - 3)
      k = j                   // (n)(n - 3)*x [2]
  if k != i + 1               // n
    temp = A[i + 1]           // n*y [2]
    A[i + 1] = A[k]           // n*y
    A[k] = temp               // n*y

[1] for循环语句将执行n + 1次,其i的值如下:0(真,继续循环),1( true,continue loop),...,length[A] - 1(true,continue loop),length[A](false,break loop)

[2]在不知道数据的情况下,你必须猜测if条件的真实频率。这个猜测可以通过引入变量0< = x< = 1来数学地完成。这与我之前所说的一致:x独立于n因此影响整体运行时复杂性仅作为一个常数因素:您需要查看执行路径。