交叉口复杂性

jul*_*ria 13 python complexity-theory set

在Python中,您可以获得两组的交集:

>>> s1 = {1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> s2 = {0, 3, 5, 6, 10}
>>> s1 & s2
set([3, 5, 6])
>>> s1.intersection(s2)
set([3, 5, 6])
Run Code Online (Sandbox Code Playgroud)

&谁知道这个intersection()算法的复杂性?

编辑:此外,有谁知道Python集背后的数据结构是什么?

Ray*_*ger 22

交集算法始终在运行O(分钟(LEN(S1),LEN(S2))).

在纯Python中,它看起来像这样:

    def intersection(self, other):
        if len(self) <= len(other):
            little, big = self, other
        else:
            little, big = other, self
        result = set()
        for elem in little:
            if elem in big:
                result.add(elem)
        return result
Run Code Online (Sandbox Code Playgroud)

[回答附加编辑中的问题]集合后面的数据结构是一个哈希表.

  • "最坏情况"假设数据不适合在*dict*和*set*使用的哈希表中使用.数据必须是这样的,即每个数据都具有完全相同的散列值 - 这将强制散列表执行类似于线性搜索的操作来执行\ _ _ _ contains\_\_ _ check.IOW,我根本不担心这个.设置交集是盲目快速 - 它甚至重用内部存储的哈希值,因此它不需要对*hash()*进行任何调用. (11认同)

Kur*_*Kee 13

答案似乎是搜索引擎查询.您还可以使用此直接链接到python.org上的Time Complexity页面.快速摘要:

Average:     O(min(len(s), len(t))
Worst case:  O(len(s) * len(t))
Run Code Online (Sandbox Code Playgroud)

编辑:正如雷蒙德指出的那样,"最坏情况"的情况不太可能发生.我最初将它包括在内是彻底的,我将其留下来为下面的讨论提供背景,但我认为Raymond是对的.

  • 这是一个令人讨厌的最坏情况,不是吗? (2认同)
  • 对于"最坏情况"时间,这个答案有些误导.不要让它让你远离完美的算法. (2认同)