【问题标题】:Complexity of converting a set to a frozenset in Python在 Python 中将集合转换为冻结集的复杂性
【发布时间】:2018-10-01 11:52:14
【问题描述】:

在 Python 中“冻结”一个集合的计算复杂度是多少?

比如第二行在

a = {1,2,3}
b = frozenset(a)

需要 O(n) 时间?还是只是在恒定时间内创建的“视图”?

【问题讨论】:

  • 这不是一个视图,因为如果您稍后将.add(..) 某些内容发送到ab 不会更新。
  • 结构在参数的可迭代元素的数量上是线性的。
  • 所以构造是O(n)。对于单个元素,插入可能会像 O(n) 一样糟糕,但 amoritized 成本是 O(1)
  • 为什么不简单地创建一个大集合并尝试一下呢?从单个测试中应该很明显。

标签: python set time-complexity frozenset


【解决方案1】:

b 不是a 的视图。你可以通过id查看这个:

a = {1, 2, 3}
b = a

id(a) == id(b)  # True

b = frozenset({1, 2, 3})

id(a) == id(b)  # False

因此b 的更改将不会反映在a 中。当然,您可以自己测试一下。由于frozenset 将可迭代对象作为参数,因此它必须遍历每个参数。这是一个 O(n) 过程。

顺便说一句,frozenset 没有什么特别之处,即使从set 创建一个set 也有 O(n) 时间复杂度:

for i in [10**5, 10**6, 10**7]:
    a = set(range(i))
    %timeit set(a)

100 loops, best of 3: 3.33 ms per loop
10 loops, best of 3: 30.2 ms per loop
1 loop, best of 3: 421 ms per loop   

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 2010-10-15
    相关资源
    最近更新 更多