我有一个问题,这个算法的复杂性是多少?
def search(t):
i = 0;
find = False
while (not(find) and i < len(t)) :
j = i + 1
while (not(find) and j < len(t)) :
if (t[j] == t[i]) :
find = True
j += 1
i += 1
return find
由于
答案 0 :(得分:2)
假设t
是一个列表,它是二次的(O(n^2)
,其中n
是列表的长度。)
你知道这是因为它遍历t
(第一次循环),并且在每次迭代中,它再次迭代t
。这意味着它会遍历len(t)
个元素,len(t)
次。因此,O(len(t)**2)
。
通过使用适当的数据结构,您可以将该算法的复杂性降低到O(len(t))
和恰好一行代码:
def search(t):
return (len(set(t)) != len(t))
有关集合如何工作的详细信息,请参阅https://docs.python.org/2/library/stdtypes.html#set-types-set-frozenset
答案 1 :(得分:1)
最佳案例复杂性为O(1),因为搜索可能会立即成功。
最坏情况复杂度为O(N²),在搜索失败的情况下实现(有(N-1)+(N-2)+ ... + + 2 + 1比较,即N(N-1) )/ 2总共。)
平均情况可以估计如下:假设数组包含不唯一且均匀分布的K个条目,其中第一个平均位于N / K个元素之后,因此外部循环将运行N / K次,成本为(N-1)+(N-2)+ .... +(NN / K)比较。在外循环的最后一次迭代中,内循环将运行大约2N / K次。
粗略地说,预期时间是O(N²/ K)。