想象一下,您想在一个数组中找到所有重复项,并且必须在Person#toString()
空间和O(1)
时间内进行。
这样的算法将具有O(N)
空间:
O(N)
我的问题是以下算法将使用def find_duplicates(arr):
seen = set()
res = []
for i in arr:
if i in seen: res.append(i)
seen.add(i)
return res
空间还是O(1)
空间:
O(N)
从技术上讲,def find_duplicates(arr):
seen = set()
res = []
while arr:
i = arr.pop()
if i in seen: res.append(i)
seen.add(i)
return res
变小了,arr
和|seen|
的总和总是小于原始的|arr|
,但是总的来说,我认为它仍然是为|arr|
分配|arr|
空间。
答案 0 :(得分:1)
每当您尝试进行时间和空间复杂性分析时,请考虑一个可能会使您的程序崩溃最多的测试用例。
您的空间复杂度为O(N)。对于第二个程序,如果您的数字列表只有1。例如:x = [1,1,1,1,1,1,1]
。然后您会看到res
几乎增长到N的大小。请考虑当您拥有所有不同数字时会发生什么。 x = [1,2,3,4,5,6,7,8]
。现在seen
增长到N的大小。
考虑时间复杂性,python列表的pop()
函数有时可能会成为问题。请查看此post,以了解更多详细信息。
答案 1 :(得分:1)
为了确定空间的复杂性,您必须了解pop
的实现方式以及Python如何管理内存。为了使算法使用恒定的空间,arr
必须释放弹出项目使用的内存,而seen
必须能够重用该内存。但是,大多数可能的Python实现均不支持该级别的共享。特别是pop
不会释放任何内存;这样可以避免将来需要它,而不必要求找回内存。