给定两组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
这里有两个循环。
那么哪一个是对的?有人可以给我一个关于上述两种解释之间差异的详细答案吗?非常感谢提前。
答案 0 :(得分:5)
假设B.issubset(A)
是常量时间,O(len(B))
的复杂性为e in A
。
这通常是一个合理的假设,但是使用错误的哈希函数很容易被违反。例如,如果A
的所有元素都具有相同的哈希码,则B.issubset(A)
的时间复杂度将恶化为O(len(B) * len(A))
。
在您的第二个代码段中,复杂性与上述相同。仔细观察,只有一个循环;另一个是if
语句(if e not in other:
)。