缩小输入时的空间复杂度

时间:2019-04-07 15:40:58

标签: python algorithm big-o space-complexity

想象一下,您想在一个数组中找到所有重复项,并且必须在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|空间。

2 个答案:

答案 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不会释放任何内存;这样可以避免将来需要它,而不必要求找回内存。