如何解决在Python中,为什么集合运算的并集,交集和对称差之间的时间复杂度不同? Union Symmetric Difference
根据python wiki,这是以下两个集合s和t之间的集合操作的平均案例时间复杂度:
- 联盟:O(s + t)
- 交叉点:O(min(s,t))
- 差异:O(s)
- 对称差:O(s)
交集和差的时间复杂度对我来说很有意义,但我不明白为什么联合和对称差的时间复杂度与交集的时间复杂度(O(min(s,t) )。
如果我们将s设为较小的集合,将t设为较大的集合,那么并集和对称差的以下逻辑都不会具有(O(min(s,t)))的时间复杂度吗? 2个操作是在python的后台进行的,那为什么呢?
# Symmetric Difference
for element in s:
if element in t:
t.remove(element)
else:
t.add(element)
return t
# Union
for element in s:
t.add(element)
return t
解决方法
Union
请考虑两组s
和t
。为了构建代表s
和t
的并集的新集合,您需要对其进行迭代。这导致时间复杂度为O(len(s) + len(t))
。
def union(s,t):
"""Simple example for union,ignoring error-handling on inputs,etc."""
result = set(s) # copy: O(len(s))
for el in t: # iterate over t: O(len(t))
result.add(el) # ignoring collisions,O(1) amortized time
return result
Symmetric Difference
def symmetric_difference(s,t):
"""Simple example for symmetric difference,etc."""
result = set(t) # copy: O(len(t))
for el in s: # iterate over s: O(len(s))
if el not in t:
result.add(el)
else:
result.remove(el)
return result
CPython的作用是从t
的副本开始,然后遍历s
并根据查找结果在输出集中添加或删除元素。
同样在这种情况下,假设查找的摊销时间复杂度为O(1),则与联合一样,结果时间复杂度应为O(len(s) + len(t))
。
该表指示对称差异的平均时间复杂度为O(s)
的时间复杂度不同,原因可能是它们忽略了make_new_set
的时间复杂度函数(从t
开始构建一个新集合)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。