编程语言
首页 > 编程语言> > Python issubset()的复杂性

Python issubset()的复杂性

作者:互联网

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

1,O(a)或O(b)

发现:https://wiki.python.org/moin/TimeComplexity
和bit.ly/1AWB1QU

(很抱歉,我无法发布更多的http链接,所以我必须使用缩短网址.)

我从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)),假设A中的e是恒定时间.

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

在您的第二个代码段中,复杂性与上述相同.仔细观察,只有一个循环;另一个是if语句(如果e不在其他:).

标签:python,performance,loops,time-complexity
来源: https://codeday.me/bug/20190830/1766639.html