快增长自然归并排序中的疾驰
数据结构与算法
2023-12-04 v3
摘要
我们研究基于归并的排序算法中归并例程的影响。更确切地说,我们关注 TimSort 用于归并单调子数组(以下称为 run)的疾驰(galloping)例程,以及若使用该例程代替朴素归并例程对执行的元素比较次数的影响。该例程的引入是为了使 TimSort 在具有少量不同值的数组上更高效。遗憾的是,我们证明,尽管它使 TimSort 能在线性时间内对具有两个值的数组排序,但它不能阻止 TimSort 在排序长度为 n、具有三个不同值的数组时需要多达 Θ(n log(n)) 次元素比较。然而,我们也证明,略微修改 TimSort 的疾驰例程可在最坏情况下仅需要 O(n + n log(σ)) 次元素比较,当排序长度为 n、具有 σ 个不同值的数组时。我们通过关注 1990 年代引入的对偶 run(dual runs)概念及其相关的对偶 run 长度熵来做到这一点。该概念既与不同值的数量有关,也与数组中 run 的数量有关,而 run 数量带有自身的 run 长度熵,曾用于解释 TimSort 原本“超自然”的效率。我们还引入了自然归并排序(即基于归并 run 的算法)的快增长与中增长新概念,这见于若干类似于 TimSort 的归并排序算法中。我们证明,具有快增长或中增长性质的算法,只要它们使用我们对 TimSort 疾驰例程的变体来归并 run,就在排序具有低 run 诱导或双对偶 run 诱导复杂度的数组时尽可能高效。
引用
@article{arxiv.2012.03996,
title = {Galloping in fast-growth natural merge sorts},
author = {Elahe Ghasemi and Vincent Jugé and Ghazal Khalighinejad and Helia Yazdanyar},
journal= {arXiv preprint arXiv:2012.03996},
year = {2023}
}
备注
38 pages, 9 figures