【问题标题】:A faster sorting algorithm given a magic data structure?给定神奇的数据结构的更快的排序算法?
【发布时间】:2011-08-23 19:38:39
【问题描述】:

假设您有一个神奇的数据结构,它表示元素的线性序列,支持在最坏情况 O(1) 时间内查找、插入和删除任何索引。 (我很确定,鉴于现代机器的内存模型,不可能有这样的结构,但我们假设我们有一个有趣的结构)。

我的一个朋友指出,如果你有这个数据结构,那么你可以为整数构建一个很酷的排序算法,它在预期的 O(n lg lg n) 时间内运行,如下所示。首先,创建上面提到的一种神奇的数据结构。接下来,对于输入数组中的每个元素,使用插值搜索在预期的 O(lg lg n) 时间内找到该元素所属的魔法数组中的索引,然后在 O(1) 时间内插入该元素。最后,在 O(n) 时间内,读取排序后的魔法数据结构。这使得 n 次调用 O(lg lg n) 插值搜索,这将在 O(n lg lg n) 时间内运行。

我知道,上述方法不会给最坏情况 O(n lg lg n) 时间进行排序,因为存在病态错误的输入数组,如果用于插值搜索会将搜索退化为 O(n2) 时间。我的问题是,鉴于这种神奇的数据结构,可以构建最快的整数排序算法,假设我们只关心算法的最坏情况运行时?

(这可能更适合 cstheory,但我想我会先在这里问,因为我过去得到了一些很棒的算法答案。)

【问题讨论】:

  • 如果我被允许使用魔法数据结构,我会使用一个总是预先排序的。那么排序将是一个O(1) 操作。
  • 这个问题似乎离题了,因为它是关于一个理论 CS 结构,而不是一个实际的编程问题。

标签: algorithm sorting data-structures


【解决方案1】:

插值搜索需要的操作不仅仅是比较,因此不能用于比较排序。如果您可以运行插值,您可能可以执行类似基数的操作,因此性能比 O(n log n) 更好,而神奇的数据结构会有所帮助。

在您的魔术结构上以 O(n) 计算排序排序,这与任何整数排序算法可能的速度差不多。一个有趣且可能未解决的问题是最快的整数并行排序算法有多快。给定无限数量的处理器(例如在非确定性图灵机中),我希望您可以做得比 O(n) 更好,但我不知道能做到多少。

【讨论】:

    【解决方案2】:

    任何基于比较的排序在一般情况下都需要O(n log(n)) 比较,更不用说最差的情况了。有关原因的详细信息,请参阅http://en.wikipedia.org/wiki/Comparison_sort#Number_of_comparisons_required_to_sort_a_list。因此,即使使用神奇的数据结构,也没有基于比较的排序能够超过这个下限。

    基于非比较的排序(例如基数)的设计方式往往不会从您的数据结构中受益,因此我认为这不会对它们产生影响。

    【讨论】:

      【解决方案3】:

      计数排序的复杂度为 O(n) http://en.wikipedia.org/wiki/Counting_sort 。 但是,使用起来并不总是很方便,因为算法创建的临时数组的大小是排序数组的最大整数值。

      【讨论】:

      • 我不确定我是否了解如何使用这种数据结构在 O(n) 时间内运行计数排序。计数排序需要 O(n + U) 时间,其中 U 是被排序元素的大小,我看不出魔术数组如何消除 U 项。你能详细说明一下吗?
      • @templatetypedef 如果我们将计数排序与基数排序结合使用,我们可以消除 U 项(我们可以这样做,因为计数排序是稳定排序)。