按平均


10

是否存在基于比较的排序算法,该算法平均使用了lg(n!)+o(n)比较?

最坏情况的lg(n!)+o(n)比较算法的存在是一个开放问题,但是平均情况足以满足对每个输入具有预期的lg(n!)+o(n)比较的随机算法。的意义lg(n!)+o(n)是它是o(n)从最佳比较,浪费平均只有o(1)每个元素的比较。

由于我已经有了这样的算法,因此我将其作为答案(使用Q / A格式),但是我欢迎其他答案,包括其他算法,无论这种算法是否已知,都可以改善o(n)以及情况lg(n!)+o(n)

先前的工作:
合并排序使用比较(即使在最坏的情况下)。 合并插入排序(也称为福特约翰逊排序)也使用比较,但常数要小得多。改进了基于比较的排序的平均复杂度(由岩和一雄和Teruyama Junichi联合提出),他们的(1,2)Insertion算法类似于下面我的部分回答。l gn + Θn Θn lg(n!)+Θ(n)
lg(n!)+Θ(n)Θ(n)


这个问题与最优随机比较排序重叠,但是鉴于重点不同(此处的特定渐近行为-与一般知识状态,所有输入大小以及与最坏情况的区别),我决定使用一个新问题。
Dmytro Taranovsky '18

Answers:


4

更新: 我将此答案扩展为一篇论文,平均进行比较lg(n!)+o(n)

是的,存在这样的算法。我只会证明界线,但在可能的随机假设下,我们也会得到。我还将描述对和的尝试。l gn + O n 1 - εn 0.5 + o 1 O n 0.5 - εlg(n!)+o(n)lg(n!)+O(n1ε)n0.5+o(1)O(n0.5ε)

我们可以假设所有元素都是不同的,可以在必要时进行注释;平均情况使用随机顺序的不同元素。我们可以通过相对于使用公平硬币的每次比较加上熵损失来计算平均比较数。

起点是带有二进制搜索的插入排序,以决定将下一个元素插入已排序子集。当,一个插入最多使用比较,根据熵(对于熵),该比较最适合加和因子(对于平均情况复杂度,也可以)。现在,当并非接近2的幂,插入元素并不是最佳选择(即使在一般情况下,无论我们如何平衡每个查询),但是如果浪费了比较,我们都可以将引导到近似均匀的分布超过1 - ε2 | S | 2 - 1 Ö ε2 | S | 1 + ε2 m | S | A o 1 A SS(1ε)2m|S|2m1mO(ε)2m|S|(1+ε)2m|S|Ao(1)AS长度接近2的幂次,我们获得了所需的最优性。

我们通过批量添加元素,有时高效地将批量中的元素相互比较来实现这一点,从而使与元素对应的的间隔以准随机的方式减小(并且间隔内的概率分布几乎均匀的),并且当时间间隔的长度是足够接近的2的幂,这样做的二进制搜索来插入。一个一个一个SAAA

常见构造

我们将保留已排序元素的子集,对于每个未排序元素,我们将跟踪已知所在的的最小间隔。 是的长度;由间隔的标识组成。A I A S A | A | I A I A = I BSAIASA|IA|IAIA=IB

令为:将与进行比较,然后(以随机顺序)将和与对应元素进行比较,直到它们的间隔不相交(或长度为1)。选择的元素(以一致的方式)以使比较的概率尽可能接近1/2,假设在调用,均匀分布在。由于最后不相交,保留了均匀性假设。小号小号Ç Ò p 一个ř ëÇ Ò p 一个ř ëCompare(A,B)ABABSSCompare(A,B)IAIBCompare

以下各节可以相互独立阅读。

一算法lg(n!)+o(n)

给定: 排序列表,以及未排序元素的批次; ; 未排序的元素相对于是随机的。∈ ω1 Ö |小号|小号Smmω(1)o(|S|)S

尽可能重复(1)-(3):
1. 从批次中选择两个元素和,且(任何选择均有效)。 2.运行。 3.如果足够接近2的幂(注1)从批处理中删除(不要忘记);并与相似。最后:将 所有元素插入并完成排序。 = Ç Ò p 一个ř ë| A | A I A B SABIA=IB
Compare(A,B)
|IA|AIAB
S

注1:对于“足够接近”,只要在步骤(4)中删除元素,任何相对误差(作为的函数都可以工作(可能由注2引起)。在猜想随机假设下,使用相对误差捕获元素,从而允许平均比较排序算法。m m - o m c log log m / log m m 1 - log - Θc m l gn + O n log log n / log n o(1)mmo(m)cloglogm/logmm(1logΘ(c)m)lg(n!)+O(nloglogn/logn)

注2:因为相同的比较序列导致相同的边界间隔,所以几乎所有元素都将经过步骤(1)次(除非在步骤4中删除)。在开始时,如果,我们挑选,我们比较针对元素,和步骤(3)的每一个应用到具有降低可能性 以倍。现在,对于每个不是a的2的有理幂的比率,我们有,因此我们得到A < B A A S [ 1 1 / Ω(logm)A<BAAAO1| A| 1/1-1/S[(11/2)|S|]AO(1)|IA|一个>1ε>0d>0ÑÑ1/(11/2)a>1ÖÑε>0d>0m,nN1ε<amd2n<1+εo(n) 界。

可能的算法lg(n!)+O(n1ε)

模量一个随机假设,我们可以达到平均比较,如下所示。lg(n!)+O(n1ε)

  • 随机将项目随机排序,然后将前半部分排序为列表,同时将后半部分保留为未排序的批次。S

  • 重复执行直到批次为空:
    随机选择。令。如果为空,则从批次中删除并插入。除此以外:ģ = { 批次| P A < B 0.5 | < Ñ - 0.51 ε } g ^ 小号AbatchG={Bbatch:|P(A<B)0.5|<n0.51ε}GAS

    1. 如果有使得与概率(说≥0.05),使在2的幂的相对误差内,运行,如果成功(即在2的幂的相对误差内) ,除去从批料中并插入。Θ1 ç Ò p 一个ř ë| A | ñ - ε Ç ö p 一个ř ë| A | ñ - ε小号BGΘ(1)Compare(A,B)|IA|nεCompare(A,B)|IA|nεAS
    2. 如果没有这样的,则对随机运行。Ç Ò p 一个ř ëģBGCompare(A,B)BG

如果我们的随机化的假设无效(即间隔长度和位置的分布是随机的足够),然后在整个多的过程中,典型的可以有效地与一种选择相比,的元素(带不同的间隔长度)。因此,我们通常可以为上面的(1)选择一个比较,并且如果我们对比较结果不太满意,我们仍然可以获得机会,从而获得(如果足够小,比如说0.01)一个比较算法。通过一些更改和近似,可以使总计算成为准线性的:给定元素Ñ Θ1 ñ Θ1 Θ日志Ñ ε Ñ + Ö Ñ 1 - εAnΘ(1)nΘ(1)Θ(logn)εlg(n!)+O(n1ε)A,计算有前途的间隔长度,然后使用正确的近似中心和间隔长度查找 s。B

有很多方法可以优化比较,但是障碍是每个比较最终可能会很不幸,而且我们的比较数量有限。如果优化后以1/4的概率平均进行4次比较并“成功”,我们得到。ε1 - ε/ 4 / 登录4 / 3 2 0.09Compare(A,B)ε(1ε)/4/log4/320.09

也许更好的方法是等到一个间隔接近2的幂时才控制单个间隔的长度,而不是控制长度的分布。

尝试使用算法lg(n!)+n0.5+o(1)

假设,我们得到了元素的未排序批次,也给出了间隔,其中通常为并带有均匀分布(直到随机误差,并且即使以条件也保持足够的精度)。然后,我们可以对浪费平均比较的项进行排序,如下所示: (*)按其初始。这样,当所有元素的间隔长度接近2的幂时,都会插入它们。|S|=nnIA|IA|n1o(1)|IA|2lg|IA|A<S[i]n0.5+o(1)
|IA|2lg|IA|

排序算法将是:随机对列表进行随机排序,并对前一半排序。要插入第二部分,请正确分配,然后执行上面的(*)。S

制作分配权,我们可以进行'random'分配,然后为每个保留元素的正确分数。同时将其余部分随机化(必要时重复)。但是,这应该可以纠正在全球范围内,我们不知道是否可以以所需的精度在本地对其进行控制(因此,上面的“尝试”一词)。|IA|2lg|IA||IA|/2lg|IA||IA|2lg|IA|

为了进行“随机”分布,我们可以随机使用与,除了初始都相同,我们不希望在对数深度进行随机化(即使用足够长的时间)。但是,我猜想我们可以使用到元素的泛化(大概可行的合理选择)在亚对数深度进行随机化:如果我们让元素纠缠在一起(即使用比较结果进行连接),对于每个与比较,我们应该有大约非换向选择。这应该允许Compare(A,B)P(A<B)0.5IAIAComparek=ω(1)k=ω(1)kSO(logkn+logk)根据需要随机化深度(假设不太大,因为我们需要深度来消除元素的纠缠)。我希望如果使用足够小的可以使计算成为准线性的。kΘ(logk)k

由于与是,概率仅浪费熵,因此元素的初始随机化和边界范围内的轻微不均匀性只需要熵浪费。如果分布整形成功的足够好,则熵浪费主要来自(*)期间的间隔长度不匹配(因此)。1/2+n0.5O(1/n)no(1)n0.5+o(1)

可能的组合:lg(n!)+O(n0.5ε) 如果分布整形效果很好,并且使批大小等于并有选择地拒绝(*)中的元素(上面),我们可以插入除这些元素之外的所有元素,但浪费熵如下。将分成几乎相等的间隔,并且在插入期间,在一个间隔上,如果间隔太长,则拒绝(即取消插入),从而减小这些间隔|S|+n0.5+εn0.5+εn0.5+εn0.5ε/2+o(1)SnεIAΘ(nε/2)次,这又根据需要减少了随机长度间隔在次中的长度变化。现在,我们可以使用上面的算法来插入剩余元素,如果小,则浪费足够。 ñ ε / 2 - Ö 1 Ñ+Ö Ñ 1 - εø ñ 0.5 - ε ' εn1o(1)nε/2o(1)lg(n!)+O(n1ε)O(n0.5ε)ε

最坏情况下的排序复杂度: 最有可能的是,存在最坏情况比较的排序算法。为了找到中位数,平均情况(比较)和最坏情况(至少比较)之间存在线性差距。但是,对于排序,有足够的自由来安排比较和查找新的排序算法。1.5 n + o n 2 + εn - O 1 lg(n!)+o(n)1.5n+o(n)(2+ε)nO(1)


1
我想你应该把它写成论文。
EmilJeřábek'18

@EmilJeřábek同意。作为研究级别的网站,这里的许多问题和答案都是小型论文,但是鉴于篇幅和重要性,需要正式论文。随时(通过dmytro@mit.edu)让我知道应在论文中扩展哪些部分(此答案保留为简明版本)。
Dmytro Taranovsky
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.