【问题标题】:Time complexity of python "set.intersection" for n setsn个集合的python“set.intersection”的时间复杂度
【发布时间】:2015-06-15 12:42:01
【问题描述】:

我想知道python的set.intersection的复杂度。我查看了 python 的文档和在线 wiki,但我没有发现这种方法对于多组的时间复杂度。

【问题讨论】:

  • 这只提供了两个集合的交集复杂度!
  • 在 CPython 中 set_intersection_multi() 是使用成对交集实现的,即将前两个集合相交,然后将结果与下一个集合相交,依此类推。因此最差的时间复杂度是number of sets x pairwise complexity

标签: python


【解决方案1】:

python wiki on time complexity lists单个交点为O(min(len(s), len(t)) 其中 s 和 t 是集合的大小,t 是集合。(英文:时间是有界的,并且与较小的大小成线性关系)设置。)

注意:根据下面的 cmets,如果传递的参数不是集合,则此 wiki 条目是错误的。我已经更正了 wiki 条目。

如果你有 n 个集合(集合,而不是可迭代的),你会做 n-1 个交集,时间可以是 (n-1)O(len(s)) 其中s 是具有最小尺寸的集合。

请注意,当您进行交叉时,结果可能会变小,因此虽然 O 是 最坏 的情况,但在实践中,时间会比这更好。

但是,looking at the specific code 这种采用 min() 的想法仅适用于一对集合,并不能扩展到多个集合。所以在这种情况下,我们只好悲观,把s作为最大尺寸的集合。

【讨论】:

  • 你提到了一般情况。最坏的情况是 O(len(s) * len(t))。在什么情况下会出现最坏的情况?这会改变你的答案吗?
  • @Steven Rumbalski 所有的套装都完全相同。不,它不会改变答案。
  • 我想如果有人真的担心将内存使用量强制到最小,例如:你在最后设置了一个元素,在此之前设置了 999 1000 万组,你可以这样做:min(list_of_sets, key=len).intersection(*list_of_sets) 这将也尽量减少比较的次数 - 并可能减少新的 sets 的创建......但我怀疑在大多数情况下,这真的不值得......
  • @JonClements 您可能会想象set_intersection_multi() 会为您执行此操作,但事实并非如此。我想人们可以更改代码以使其做到这一点。这样你就不必经历你建议的阴谋了。
  • @rocky 问题是intersection 接受任何可迭代对象 - 所以它们可能不是集合甚至序列......当它意识到这一点时,回溯并尝试原始方法...所以这样做是错误的...
猜你喜欢
  • 2011-11-13
  • 2023-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多