给出一个神奇的数据结构,更快的排序算法?

时间:2011-05-12 04:31:52

标签: algorithm sorting data-structures

假设您有一个魔术数据结构,该结构表示在最坏情况下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(n < sup> 2 )时间。我的问题是,鉴于这种神奇的数据结构,可以构建的最快的整数排序算法,假设我们只关心算法的最坏情况运行时?

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

任何基于比较的排序都需要在平均情况下进行O(n log(n))比较,更不用说最差的比较了。有关原因的详细信息,请参阅http://en.wikipedia.org/wiki/Comparison_sort#Number_of_comparisons_required_to_sort_a_list。因此,即使使用魔法数据结构,也没有基于比较的排序可以超过该下限。

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

答案 2 :(得分:0)

插值搜索需要的操作不仅仅是比较,因此不能用于比较排序。如果你可以运行插值,你可以做基数操作,因此比O(n log n)表现更好,而魔术数据结构也会有所帮助。

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