我必须逐行计算算法的时间复杂度或理论运行时间(给定伪代码),作为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)
答案 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
因此影响整体运行时复杂性仅作为一个常数因素:您需要查看执行路径。