Python的复杂性issubset()


问题内容

给定两个集合A和B及其长度:a = len(A)和b = len(B)其中a> = b。Python
2.7的issubset()函数(即B.issubset(A))的复杂性是什么?我可以从Internet找到两个矛盾的答案:

1,O(a)或O(b)

可从以下 网址找到: https
//wiki.python.org/moin/TimeComplexity和bit.ly/1AWB1QU

(很抱歉,我无法发布更多的http链接,因此必须改用Shortcut url。)

我从Python官方网站下载了源代码,发现:

def issubset(self, other):
    """Report whether another set contains this set."""
    self._binary_sanity_check(other)
    if len(self) > len(other):  # Fast check for obvious cases
        return False
    for elt in ifilterfalse(other._data.__contains__, self):
        return False
    return True

这里只有循环。

2,O(a * b)

从以下位置找到:bit.ly/1Ac7geK

我还发现一些代码看起来像来自以下代码的Python源代码:bit.ly/1CO9HXa如下:

def issubset(self, other):
    for e in self.dict.keys():
        if e not in other:
            return False
        return True

这里有两个循环。

那么哪一个是对的?有人可以给我详细回答以上两种解释之间的区别吗?预先非常感谢。


问题答案:

的复杂度B.issubset(A)O(len(B)),假设e in A是恒定时间。

通常,这是一个合理的假设,但是很容易被错误的哈希函数所破坏。例如,如果的所有元素都A具有相同的哈希码,则的时间复杂度B.issubset(A)将恶化为O(len(B) * len(A))

在第二个代码段中,复杂度与上面相同。如果仔细观察,只会有一个循环。另一个是if语句(if e not in other:)。