编写具有复杂度O(N)的代码很麻烦

时间:2019-01-11 00:14:35

标签: python time-complexity

任务:

  

给定一个由N个整数组成的数组A,返回最小的正整数   (大于0)在A中不会出现。

我的代码:

surf(peaks)
set(gca, 'ZDir', 'reverse')
xlabel('x')
ylabel('y')
zlabel('z')

为什么我的时间复杂度为O(N ^ 2)?

3 个答案:

答案 0 :(得分:1)

您正在O(N)遍历列表中所有肯定的项目。 在每次迭代中,您都可以通过询问“ O(N)”让python在列表中再走j in A条?可能会遍历A的所有元素,并搜索j。 这样您的复杂性就变成了:O(N) * O(N) = O(N^2)

答案 1 :(得分:0)

假设您输入的内容为1..N。

然后您的代码将执行N次迭代,每一次迭代都可能检查列表的整个长度,以查看j的当前值是否在列表中。检查长度N的整个列表的N次迭代得到N * N = N ^ 2。

这是最坏的例子,但是我们不知道典型的输入应该是什么。也许您知道,也许您不知道。一种简单且最坏的情况是,对列表进行排序,然后在列表中的项目之间找到第一个“空白”。像这样:

def my_search(A):
   A = [i for i in sorted(A) if i > 0]  # Gets rid of <1 values as well
   min_pos_val = 1
   for val in A:
      if val > min_pos_val:
         return min_pos_val
      min_pos_val += 1
   return min_pos_val

答案 2 :(得分:-1)

“ in”运算符为O(N)。 并且“ while”是O(返回值)。

[edit]让我详细介绍一下:您的代码等同于

j = 1
while True:     # is O(the returned j)
   if j in A:   # is O(N), bec. has to go through the whole array
      j += 1
   else: 
      return j

因此,在最坏的情况下,您的算法确实为O(N ^ 2)。在最佳情况下(例如,如果A中没有1),该算法仅为O(N)。

如果A是一个集合(不是列表或array.array),则平均为O(N) 。 在此处查看详细信息:https://wiki.python.org/moin/TimeComplexityComplexity of *in* operator in Python