有没有一种排序算法可以最大限度地减少最后值的重用,同时保持有效的时间复杂度?

Is there a sorting algorithm that minimizes last-value reuse while maintaining efficient time complexity?

提问人:thatchedroof 提问时间:11/15/2023 更新时间:11/15/2023 访问量:51

问:

我正在探索经常重用比较值的排序算法。例如,在快速排序中,枢轴值通常会导致 (23, 5)、(23, 18)、(23, 44) 等比较。我对一种算法感兴趣,该算法可以针对低重用率进行优化,同时保持有效的时间复杂度。

例:

考虑一个比较序列,如 A 与 B、B 与 C、C 与 D、A 与 E。在这里,值 B 从第一次比较到第二次比较被重用,而 C 从第二次比较到第三次被重用。该算法的重用率为 r = .5,因为 2/4 的比较是重用。

问题:

  1. 是否有现有的排序算法可以在保持效率的同时本质上最大限度地减少这种最后值的重用?
  2. 如果没有,可以建议对标准算法(如快速排序、合并排序等)进行哪些修改来实现这一点?

我测试了一些排序算法的重用率 (r)。冒泡排序、快速排序和插入排序的 r 值都在 .9 左右,这意味着每次比较都与前一个比较共享一个值 ~90% 的时间。壳排序 (r = .4)、梳状排序 (r = .35) 和锦标赛排序 (r = .15) 最低,尽管壳排序在比较数量上优于其他排序。

算法 性能 排序优化 计算机科学

评论

0赞 500 - Internal Server Error 11/15/2023
FWIW,这对我来说似乎有悖常理:在其他条件相同的情况下,重用比较操作数难道不是最有效的方法吗?
0赞 thatchedroof 11/15/2023
是的,比较操作数的重用会更有效,这可能就是为什么很难找到具有低值的预先存在的算法的原因。
1赞 trincot 11/15/2023
在任何比较排序算法中,您都可以添加检查是否要执行重用的比较。如果是这样,则最多涉及三个索引(最后一个比较的两个索引和计划比较的两个索引减去一个重复使用的索引)。在不在这三个索引中的两个索引之间执行虚拟比较(仅当数组至少有 5 个元素时,这才有效)。然后执行计划的比较。这最多是比较次数的两倍,因此 O(nlogn) 算法仍将是 O(nlogn)。当数组有重复项时,它不会阻止重用值。
0赞 btilly 11/16/2023
我认为@trincot有最实用的方法。如果你不想要无用的比较,那么我建议你利用这样一个事实,即mergesort有很多可并行化的东西,因此很容易在其中重新排序工作。交错不相关的合并将避免重复使用的比较。

答: 暂无答案