我想知道是否有人可以向我解释这两种算法的空间复杂性是如何工作的。我已经对它做过阅读但如果我理解正确,它们似乎是矛盾的。
我对例如链表如何影响空间复杂性感兴趣,这个问题说它会让它变得更快? Why is mergesort space complexity O(log(n)) with linked lists?
然而,这个问题说这不重要; Merge Sort Time and Space Complexity现在我对编程有点新意,并且想要更好地理解这个理论,所以对dummie语言表示赞赏。
答案 0 :(得分:2)
合并排序的总空间复杂度为O(n)
,因为您必须将元素存储在某处。然而,在数组实现和链表实现之间,额外的空间复杂度确实存在差异。
请注意,您可以实现仅需要O(1)
额外空间的迭代版本。但是,如果我记得相关的话,这个版本会表现得非常糟糕。
在传统的递归版本中,您需要考虑堆栈帧。仅此一项就需要额外的O(log n)
空间。
在链表实现中,您可以在没有任何辅助内存的情况下就地执行合并。因此O(log n)
额外的空间复杂度。
在数组实现中,合并需要辅助内存(可能是辅助数组),最后一次合并需要的内存量与用于存储元素的内存量相同。因此O(n)
额外的空间复杂度。
请记住,空间复杂性会告诉您算法的空间需求随着输入大小的增长而增长。空间复杂性忽略了细节。也就是说,堆栈帧和元素的大小可能不同,并且链接列表由于链接(引用)而占用比数组更多的空间。最后一个细节对于小元素很重要,因为数组实现的额外空间要求可能小于链表实现的链接所占用的额外空间。
答案 1 :(得分:0)
为什么将排序空间复杂度O(log(n))与链表合并?
这仅适用于链表的自顶向下合并排序,其中由于递归而使用O(log2(n))堆栈空间。对于链表的自下而上合并排序,空间复杂度为O(1)(常量空间)。链表的优化自下而上合并排序的一个示例使用小的(26到32)指针数组或对列表的第一个节点的引用。这仍然被认为是O(1)空间复杂度。链接到wiki文章中的伪代码:
https://en.wikipedia.org/wiki/Merge_sort#Bottom-up_implementation_using_lists