使用以下过程定义一个置换的运行分区号,表示为。令为最大整数,以使数字在以递增顺序出现。从删除它们,然后重复该过程。消耗整个排列所需的回合数为。π - [R (π )ķ 分钟(π ),... ,ķ π π - [R (π )πr(π)kmin(π),…,kππr(π)
例如,让我们计算。我们首先预留,得到。然后我们预留,得到。然后我们拨出,得到。最后,我们预留以获得空排列。这需要四轮,所以。r (62735814 )1 6273584 234 6758 5 678 678 r (62735814 )= 4r(62735814)1627358423467585678678r(62735814)=4
此表示形式对排序什么用?进行第二次运行,即,并将这些数字向右移动以获得(编辑:按它们在排列中出现的顺序,即)。现在只有两个运行,即,我们可以通过向右移动来对列表进行排序。62735814 234 ,678 51627384 627384 1234 ,5678 567862735814234,678516273846273841234,56785678
现在让我进行以下猜想:对于一个置换,令为一次移动可从到达的所有置换的集合。然后。π Π π 分钟α ∈ Π - [R (α )= ⌈ - [R (π )/ 2 ⌉πΠπminα∈Πr(α)=⌈r(π)/2⌉
鉴于这种猜想,很容易证明的排序置换需要移动的最小数量是,我已经验证了这个公式对所有排列为。π ⌈ 日志2 - [R (π )⌉ 小号Ñ Ñ ≤ 8π⌈log2r(π)⌉Snn≤8
编辑:这是对运行分区号的另一种解释,它给出了计算时间的线性时间算法,并允许我绘制我的猜想的证明,从而验证公式。⌈ 日志2 - [R (π )⌉⌈log2r(π)⌉
再次考虑排列。第一次运行以结尾的原因是出现在之前。同样,第二次运行以结尾,因为出现在之前,依此类推。因此,排列的游程分区号是的数目,以使出现在之前。62735814 1 2 1 4 5 4 i i + 1 i62735814121454ii+1i
如果我们看一下排列的倒数,我们可以更简洁地陈述这一点。再次考虑。以。此置换具有三个下降:(下降的位置小于前一个位置)。每个下降都对应于新运行的开始。因此等于1加的下降数。π=62735814π=62735814π−1=72485136π−1=724851367248513672485136r(π)r(π)π−1π−1
就而言,该操作是什么样的?设为我们向右移动的数字集,而为留在左侧的数字集。我们替换数字对置换表示它们的相对顺序,并替换数字用置换的。例如,考虑移动。就逆排列而言,它是。所以映射到π−1π−1BBAAAA{1,…,|A|}{1,…,|A|}BB{|A|+1,…,|A|+|B|}{|A|+1,…,|A|+|B|}62735814↦5162738462735814↦5162738472485136↦2468135772485136↦2468135775752121和被映射到。248136248136468357468357
仅当和,的下降才会丢失。相反,就,划分为和的分区对应于运行和运行;每次运行结束而运行开始时,都有下降。为了“杀死”下降,我们必须从运行切换到运行。如果我们杀死两次下降,我们将在中间从运行切换到运行,从而导致下降。…xy……xy…π−1π−1x∈Ax∈Ay∈By∈Bπ−1π−1AABABBAABBA
该参数可以形式化表示,如果是通过操作从的,则,其中是下降的次数。这等效于,因此证明了我的猜想的一个方向。另一个方向比较容易,并且已经在上面概述了:我们只需每隔一秒钟运行一次,然后将这些运行向右推动即可获得满足的置换。απd(α−1)≥⌊d(π−1)/2⌋d(⋅)r(α)≥⌈r(π)/2⌉αr(α)=⌈r(π/2)⌉