两个总和运行时间O(n ^ 2)或O(n)

时间:2017-09-23 18:09:50

标签: python algorithm performance

对于两个求和问题,在列表中找到两个加起来的数字。

我的解决方案是创建一个字典/ hash_table,然后将所有内容存储为(value, index) [注意:对于列表中的重复数字:更高的索引会覆盖较低的索引]

然后再次遍历列表以查找其他项目。

def twoSum(nums, target): 
    lookup = dict((v, i) for i, v in enumerate(nums))
    for i, v in enumerate(nums):
        if target - v in lookup and i != lookup[target-v]:
            return [lookup[target - v], i]

我认为上面的算法需要O(n * n / 2)=,因此O(n ^ 2)时间,但我看到其他人说它只需要线性时间。有人可以证实吗?

1 个答案:

答案 0 :(得分:3)

该算法需要恒定时间,因为操作target - v in lookup在恒定时间内运行。 for循环只有一个深度。

def twoSum(nums, target):
    lookup = dict((v, i) for i, v in enumerate(nums)) # N
    for i, v in enumerate(nums):  # N
        if target - v in lookup and i != lookup[target - v]: # average constant
            return [lookup[target - v], i]  # constant

如果您执行O(N)操作,然后执行其他O(N)操作,则序列仍为O(N)

这里我们只讨论平均时间复杂度。有很多冲突的哈希函数可能非常糟糕,因此target - v in lookup实际需要O(N)时间,因此最坏情况的复杂性实际上是O(N^2)。但是使用dict,您不太可能遇到这种情况。