列表设置转换的时间复杂度是多少?

我在 python 官方网站上注意到了设置操作的时间复杂度表。但是我只是想问一下把一个列表转换成一个集合的时间复杂度是多少,

l = [1, 2, 3, 4, 5]
s = set(l)

我知道这实际上是一个散列表,但它到底是如何工作的呢?那是 O (n)吗?

48085 次浏览

Yes. Iterating over a list is O(n) and adding each element to the hash set is O(1), so the total operation is O(n).

I was asked the same question in my last interview and didn't get it right. As Trilarion commented in the first solution, the worst-case complexity is O(n^2). Iterating through the list will need O(n), but you can not just add each element to the hash table (sets are implemented using hashtables). In the worst case, our hash function will hash each element to the same value, thus adding each element to the hash set is not O(1). In such a case, we need to add each element to a linked list - (note that hash sets have a linked list in case of collision). When adding to the linked list we need to make sure that the element doesn't already exist (as a Set by definition doesn't have duplicates). To do that we need to iterate through the same linked list for each element, which takes a total of n*(n-1)/2 = O(n^2).