【发布时间】:2012-02-24 04:33:42
【问题描述】:
快速排序通常被描述为原位(就地)算法,尽管它需要 O(log n) 堆栈空间。那么 in situ 是否意味着“需要少于 O(n) 的额外空间”,或者堆栈空间通常不算作空间复杂度(但为什么会这样呢?),或者 Quicksort 实际上不是原位算法?
【问题讨论】:
-
之前有人问过这个问题:cstheory.stackexchange.com/q/9563/6586。基本上,它是一个带有许多相互矛盾的论点的火焰诱饵。
-
请注意,这实际上取决于您希望如何定义 in-situ。如果您只是比较排序算法,那么不考虑快速排序是非常挑剔的,但是如果您有一个更正式的定义(希望有一个理由),那么停止忽略小 O(log n) 细节是有意义的.
-
这只是“O(log n) 也可能是一个较大的常数”的特例,不是吗?原则上,快速排序使用 O(log n) 额外空间。在实践中,您通常将其实现为将数组之类的东西作为参数。大多数语言中的数组具有基于用于地址和/或索引的固定宽度类型的自然大小上限,并且快速排序只需要在每个
log n深度存储几个地址。因此,对于您实际编写和使用的几乎所有 Quicksort 实现,堆栈使用都是有界的,即使它不是“理想”版本。 -
... 所以剩下的就是关于“原位”的适当定义的争论 - 快速排序的属性很简单,但例如 C 的
qsort具有任何体面实现的属性它有一个固定的最大堆栈使用量。 -
@Jason:当然存在争议,因为定义只有在有用时才有意义。我认为如果您所做的只是将快速排序与合并排序之类的东西进行比较,那么将快速排序考虑在原位是完全可以接受的。如果您要定义复杂性类或执行类似形式的操作,那么应该在原位给出精确的 O(1) 定义的唯一原因。
标签: algorithm terminology complexity-theory quicksort space-complexity