Python中设置差异函数的运行时间是多少?

时间:2017-12-31 17:03:59

标签: python set

问题解释了,但是Python中设置差异操作的时间复杂度是多少?

EX:

A = set([...])
B = set([...])

print(A.difference(B)) # What is the time complexity of the difference function? 

我的直觉告诉我O(n)因为我们可以遍历集合A并且对于每个元素,看看它是否在常量时间内包含在集合B中(使用散列函数)。

我是对的吗?

(以下是我遇到的答案:https://wiki.python.org/moin/TimeComplexity

2 个答案:

答案 0 :(得分:3)

看起来你是对的,在最好的情况下以O(n)复杂度执行差异

但请记住,在最糟糕的情况下(最大化与哈希的冲突),它可以提升到O(n**2)(因为查找最差情况为O(n)How is set() implemented?,但似乎你可以通常依赖于O(1)

另外,速度取决于set中对象的类型。整数散列很好(大概和自己一样,可能有一些模数),而字符串需要更多的CPU。

答案 1 :(得分:0)

https://wiki.python.org/moin/TimeComplexity建议在您描述的示例中,其O(集合A的基数)。

我了解其O(len(A))不是 O(len(B)),因为您只需要检查setB中是否存在setA中的每个元素。 setB中的每个查找都是O(1),因此您将在setB上进行len(A) * O(1)查找。由于O(1)是常数,所以它的O(len(A))

例如:

A = {1,2,3,4,5}
B = {3,5,7,8,9,10,11,12,13}
A-B = {1,2,4}

调用A-B时,将遍历A中的每个元素(仅5个元素),并检查B中的成员资格。如果在B中找不到,则它将出现在结果中。

注意:当然,所有这些都是摊销的复杂性。实际上,setB中的每个查找都可以超过O(1)