在Python中将集合转换为冻结集的复杂性
在Python中“冻结”集合的计算复杂度是多少 例如,第二行在在Python中将集合转换为冻结集的复杂性,python,set,time-complexity,frozenset,Python,Set,Time Complexity,Frozenset,在Python中“冻结”集合的计算复杂度是多少 例如,第二行在 a = {1,2,3} b = frozenset(a) 需要O(n)时间吗?或者它只是一个在固定时间内创建的“视图”b不是a的视图。您可以通过以下方式进行检查: 因此,b中的更改不会反映在a中。当然,你可以自己测试一下。由于frozenset将iterable作为参数,因此它必须迭代每个参数。这是一个O(n)过程 顺便说一句,frozenset没有什么特别之处,即使从set创建set也有O(n)时间复杂性: for i in [
a = {1,2,3}
b = frozenset(a)
需要O(n)时间吗?或者它只是一个在固定时间内创建的“视图”
b
不是a
的视图。您可以通过以下方式进行检查:
因此,b
中的更改不会反映在a
中。当然,你可以自己测试一下。由于frozenset
将iterable作为参数,因此它必须迭代每个参数。这是一个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
它不是一个视图,因为如果您稍后向
a
添加(..)某些内容,b
不会更新。该构造在参数的iterable所具有的元素数量上是线性的。因此构造为O(n)。对于单个元素,插入可能会像O(n)一样糟糕,但摊销成本是O(1)。为什么不简单地创建一个大型集合并尝试一下呢?从一次测试来看,这应该是非常明显的。
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