我有以下代码,我正在努力获得时间复杂度。
seen = set()
a=[4,4,4,3,3,2,1,1,1,5,5]
result = []
for item in a:
if item not in seen:
seen.add(item)
result.append(item)
print (result)
据我所知,当我访问列表时,该操作的时间复杂度为O(n)
。与if块一样,每次我查找该集合时都会花费另一个O(n)
。整体时间复杂度O(n^2)
也是如此? set.add()
是否也增加了复杂性?
另外,空间复杂度是O(n)
吗?因为每次遇到新元素时,集合的大小会增加吗?
非常感谢任何有关时间和空间复杂性的输入或链接。
答案 0 :(得分:2)
Python中的集合实现为哈希表(类似于字典),因此in
和set.add()
都是O(1)。 list.append()
also O(1)摊销。
总的来说,这意味着时间复杂度为O(n),因为迭代超过a
。
空间复杂度也是O(n),因为所需的最大空间与输入的大小成正比。
有关Python集合上各种操作的时间复杂性的有用参考可以在https://wiki.python.org/moin/TimeComplexity找到...而PyCon talk The Mighty Dictionary提供了一个有趣的深入探讨Python如何实现各种O(1)复杂性设置和字典操作。