任务:
给定一个由N个整数组成的数组A,返回最小的正整数 (大于0)在A中不会出现。
我的代码:
surf(peaks)
set(gca, 'ZDir', 'reverse')
xlabel('x')
ylabel('y')
zlabel('z')
为什么我的时间复杂度为O(N ^ 2)?
答案 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/TimeComplexity或Complexity of *in* operator in Python。