在 Python 中将集合转换为冻结集合的复杂性

ere*_*ner 5 python set time-complexity frozenset

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

例如,第二行是否

a = {1,2,3}
b = frozenset(a)
Run Code Online (Sandbox Code Playgroud)

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

jpp*_*jpp 4

b不是一个视图a。您可以通过以下方式检查id

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

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

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

id(a) == id(b)  # False
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句, 没有什么特别之处frozenset,即使set从 a创建 a 也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   
Run Code Online (Sandbox Code Playgroud)