【发布时间】:2014-03-28 11:56:45
【问题描述】:
所以快速排序的空间效率是O(log(n))。这是维护调用堆栈所需的空间。
现在,根据Wikipedia page on Quicksort,这符合就地算法,因为该算法只是交换输入数据结构中的元素。
According to this page 然而,O(log n) 的空间效率使快速排序无法到位,因为它的空间效率大于 O(1)。根据这个定义,任何空间效率大于 O(1) 的算法都不是就地的。所以我假设这意味着所有递归算法都没有按定义到位?
显然这里有两种不同的就地定义。维基百科并不总是一个完全可靠的来源,所以我咨询了我的一位教授。
我的教授同意第二个定义。他说 Quicksort 没有到位。即使数据保留在输入数组中,堆栈所需的额外空间也会使其不合格。我的教授写了一本关于算法的流行书,所以我非常尊重他的意见,但这个答案对我来说似乎并不正确。
我认为 in-place 的属性是非常真实的。数据保持不变。它不会脱离其原始数据结构。对我来说,这个定义更有用,因为它意味着您可以使用指针执行算法,而不是要求您复制数据。这似乎是一种算法的宝贵属性,名副其实。
【问题讨论】:
-
这个问题让我想起了我最近读到的关于鸭子类型和强类型的模糊含义。我们可以知道快速排序的好处,而无需将其标记为就地或非就地。我想我是在争论为什么重要的观点。 耸耸肩
-
数据没有留在原地。它以调用快速排序的索引的形式泄漏到堆栈。
-
相关,一个可以根据所有定义编写一个高度修改的快速排序版本。但是,关于天气是否存在一些争论,目前它仍然是一种快速排序。 ideone.com/cv6VsT
-
另一种观点是,对于较大的 N 值,log(N) 实际上是 O(1)。我在这里只是部分开玩笑——因为
10^100,大约是 @ 987654325@,远远大于宇宙中亚原子粒子的估计数量,我觉得对于任何现实的排序问题,log(N) 都以常数 300 为界。
标签: algorithm computer-science quicksort in-place space-efficiency