在 Python 中将集合转换为冻结集的复杂性
Complexity of converting a set to a frozenset in Python
"freezing"一个集合在Python中的计算复杂度是多少?
例如
中的第二行
a = {1,2,3}
b = frozenset(a)
需要 O(n) 时间?或者它只是在恒定时间内创建的 "view"?
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
"freezing"一个集合在Python中的计算复杂度是多少?
例如
中的第二行a = {1,2,3}
b = frozenset(a)
需要 O(n) 时间?或者它只是在恒定时间内创建的 "view"?
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