这个算法的复杂性是什么(在数组中搜索两次整数等于)

时间:2015-01-20 18:12:54

标签: python algorithm complexity-theory

我有一个问题,这个算法的复杂性是多少?

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

由于

2 个答案:

答案 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)。