Python set()函数算法的复杂性和&&引用;一起使用时的操作员

Python set()函数算法的复杂性和&&引用;一起使用时的操作员,python,algorithm,big-o,code-complexity,Python,Algorithm,Big O,Code Complexity,我想计算给定大小n的这行代码(用于在两个数组中查找公共元素)的big-o,但我不知道set在Python中是如何工作的。还有它们之间的“&”运算符。有人能帮我理解他们到底在做什么吗 result = set(arr1) & set(arr2) 给定两组s1和s2,平均和运算符为O(min(len(s1),len(s2)) &操作符计算两个集合之间的交集。这意味着结果集合将只包含来自s1和s2的元素 例如: {1, 2, 3, 4} & {3, 4, 5} 输出: {3, 4}

我想计算给定大小n的这行代码(用于在两个数组中查找公共元素)的big-o,但我不知道set在Python中是如何工作的。还有它们之间的“&”运算符。有人能帮我理解他们到底在做什么吗

result = set(arr1) & set(arr2)

给定两组
s1
s2
,平均
运算符为
O(min(len(s1),len(s2))

&
操作符计算两个集合之间的交集。这意味着结果集合将只包含来自
s1
s2
的元素

例如:

{1, 2, 3, 4} & {3, 4, 5}
输出:

{3, 4}
该操作大致等于:

def intersection(s1, s2):

    # make s1 the smaller set no matter what
    if len(s1) > len(s2): s1, s2 = s2, s1

    res = set()

    # iterate over all items in the smaller set and add if they are common to both sets
    for item in s1:
        if item in s2: res.add(item)
    return res
这个时间复杂度是从以下方面推导出来的:要构建结果集,必须迭代其中一个集合中的每个元素,并检查该元素是否在另一个集合中

在一个集合中的所有元素上迭代是
O(N)
,而
中的
操作平均是
O(1)
,从而导致整体
O(N)
运行时

由于您迭代的集合实际上并不重要,python通过迭代较小的集合来节省一些时间,使
O(N)
中的
N
尽可能小,从而导致
O(min(len(s1),len(s2))的复杂性


请注意,这只是平均大小写复杂度。
操作中
的最坏(但非常罕见)大小写复杂度是
O(N)
,如果集合中的每个元素都有相同的散列。这将使
操作的最坏情况为
O(len(s1)*len s2)
complexity

请参见注释,在这种特殊情况下,您至少在两个列表上迭代一次以创建集合。