有趣的排序问题


14

给定一个带有编号球的管(随机)。管子上有孔以移走球。考虑一个操作的以下步骤:

  1. 您可以从孔中拾取一个或多个球,并记住拾取球的顺序。
  2. 您需要将管道向左侧倾斜,以使管道中的剩余球向左移动,并占据移除球所产生的空白空间。
  3. 您不应更改从烟斗中拾取编号的球的顺序。现在,您可以使用由球的运动产生的空余空间将它们重新放回管道中。

步骤1至3被视为一项操作。

找出按升序对编号的球进行排序所需的最少操作。

例如:如果管包含:[ 1 4 2 3 5 6 ]     [1 4 2 3 5 6]

然后,我们可以取出和和,如果我们倾斜管的左侧,我们得到,和我们插入的顺序对管的端部以获得。4 5 6 [ 1 2 3 ] 4 5 6 [ 1 2 3 4 5 6 ]456  [1 2 3]  (4 5 6)     [1 2 3 4 5 6]

因此,所需的最小步骤数是1。我需要找到对管道进行排序的最少操作。

关于如何解决此问题的任何想法或提示?


如果它们以相反的顺序出现,则您必须按顺序取出2、3,...并最后添加,总共要进行运算。这显然是最坏的情况。ñn
vonbrand

2
8,7,6,5,4,3,2,1-> 75318642-> 51627384-> 12345678总是取出奇数个位置。
adrianN

总结一下我的答案:对排列进行排序所需的最小操作数是,其中是下降数。π π日志2d π - 1+ 1 d log2(d(π1)+1)d()
Yuval Filmus 2013年

我喜欢从消除反转的角度来考虑它。通过每次操作,您都可以删除任意一组和(其中是整个球体)之间的反转。因此,您只需要仔细选择套即可。X S X S XXSXSX
2013年

Answers:


10

使用以下过程定义一个置换的运行分区号,表示为。令为最大整数,以使数字在以递增顺序出现。从删除它们,然后重复该过程。消耗整个排列所需的回合数为。π - [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(π)Snn8

编辑:这是对运行分区号的另一种解释,它给出了计算时间的线性时间算法,并允许我绘制我的猜想的证明,从而验证公式。日志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|}627358145162738462735814516273847248513624681357724851362468135775752121和被映射到。248136248136468357468357

仅当和,的下降才会丢失。相反,就,划分为和的分区对应于运行和运行;每次运行结束而运行开始时,都有下降。为了“杀死”下降,我们必须从运行切换到运行。如果我们杀死两次下降,我们将在中间从运行切换到运行,从而导致下降。xyxyπ1π1xAxAyByBπ1π1AABABBAABBA

该参数可以形式化表示,如果是通过操作从的,则,其中是下降的次数。这等效于,因此证明了我的猜想的一个方向。另一个方向比较容易,并且已经在上面概述了:我们只需每隔一秒钟运行一次,然后将这些运行向右推动即可获得满足的置换。απd(α1)d(π1)/2d()r(α)r(π)/2αr(α)=r(π/2)


您一次要拿出几发球,我知道这是不允许的。
vonbrand

1
按照它们出现在排列中的顺序来处理它们。那是合法的。
Yuval Filmus 2013年

我有点困惑。能否请您说明排序[6 5 4 3 2 1]所需的最少操作数,并且您还提到了“每秒进行一次,即234,678,并将这些数字移到右侧以获得51627384”,请您解释一下细节,以及如何有效地计算r(π)?
user6709 2013年

1),所以您需要执行3次运算。例如,。r(654321)=6654321531|64251|62341234|56
Yuval Filmus

2)取所有属于这些游程的数字(以它们在排列中出现的顺序),然​​后将它们移到右侧。在这种情况下,您将并将其向右移动,将向左移动。62738451
Yuval Filmus 2013年
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.