确定运行时复杂性

时间:2014-02-01 21:01:12

标签: python algorithm big-o

我正在尝试确定我编写的算法的运行时复杂度,该算法用于获取数组并确定数组最长连续子序列的长度,其中子序列的最大值和最小值之差小于或等于等于某个给定的值。

代码

input = [16,19,20,22,27,23]
compareValue = 3
tmp,length = 0,0
for i in range(0,n):
  newArray = []
  for j in range(i,n):
      newArray.append(input[j])
      if abs(max(newArray) - min(newArray)) <= compareValue:
          tmp = len(newArray)
      else:
           if tmp > length
               length = tmp

此示例的输出为3

我已经尝试通过阅读关于Big-O的示例来自行确定这一点,但我并不是100%确定其确切的复杂性,并且非常感谢您的澄清。

编辑:从阅读内容我认为这是在O(n ^ 2)中运行,但同样,我不完全确定

1 个答案:

答案 0 :(得分:3)

你有2个循环。假设元素的数量为5.在每个父循环迭代中,第二次循环迭代将减少1:

外循环迭代:* * * * *
内循环迭代:5 4 3 2 1

通过对第二次(或内部)循环迭代求和,您可以计算“操作”或复杂性的总数。你在这里有简单的从1到n的自然数的总和(5)。该汇总的公式是:

n * (n + 1) / 2(n^2 + n) / 2

最后在每次迭代的内循环中,您要将元素添加到newArray并在其上调用minmaxminmax的复杂度为O(n),但数组长度减少:

min,j在0-4中的最大值:2 * (O(1)+O(2)+...+O(5))
min,max为j在0-3:2 * (O(1)+O(2)+...+O(4))
min,max为j在0-2:2 * (O(1)+O(2)+...+O(3))
最小值,最大值为0-1中的j:2 * (O(1)+O(2)+...+O(2))
min,max为j in 0:2 * O(1)

总体复杂度将为summ:O(n^2 + n) + O((n-1)^2 + (n-1)) + ... O(1)

我认为min + max的大致复杂度为O(2*n/2)O(n),因此总体而言:

(n^2 + n) / 2 * (n)(n^3 + n^2) / 2

O(n^3)