数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
查看: 4688|回复: 3

一固定数列如何翻转,让其按一定顺序排列,且翻转次数最少。

[复制链接]
发表于 2019-6-25 20:55 | 显示全部楼层 |阅读模式
固定数列为:10 5 6 2 1 8 9 3 4 7(数列项数为N)
翻转规则:可以从前面几个数翻转,也可以从后面几个数翻转,但是不能从中间翻转。
           比如就以上面的数列为例。可以从前面几个数翻转(到底翻转几个数,可以自己定,2个可以,3个也可以,最多翻转个数为N-1,这里N=10)关键是如何翻转,比如:
           从前面2个数翻转,指的是:将数列里的10和5翻转,翻转后就是5 10.数组变成了5 10 6 2 1 8 9 3 4 7
           从前面3个数翻转,指的是:将数列里的10 5 6 翻转,翻转后就是6 5 10.数组变成了6 5 10 2 1 8 9 3 4 7
           从前面4个数翻转,指的是:将数列里的10 5 6 2 翻转,翻转后就是2 6 5 10.数组变成了2 6 5 10 1 8 9 3 4 7
           从前面5个数翻转,指的是:将数列里的10 5 6 2 1 翻转,翻转后就是1 2 6 5 10.数组变成了1 2 6 5 10 8 9 3 4 7
           .。。。。。
          从后面2个数翻转,指的是:将数列里的4和7翻转,翻转后就是7 4.数组变成了10 5 6 2 1 8 9 3 7 4
          从后面3个数翻转,指的是:将数列里的3 4 7翻转,翻转后就是7 4.3数组变成了10 5 6 2 1 8 9 7 4 3
          从后面4个数翻转,指的是:将数列里的9 3 4 7翻转,翻转后就是7 4.3 9数组变成了10 5 6 2 1 8 7 4 3 9
          从后面5个数翻转,指的是:将数列里的8 9 3 4 7翻转,翻转后就是7 4.3 9 8数组变成了10 5 6 2 1 7 4 3 9 8
         .。。。。。
         但是不能从数列中间选择数来翻转,比如我要翻转2 1 8 这是不行的。
         还有就是可以混合翻转,也就是根据数列的具体情况,可以从前面的几个数翻转,也可以再从后面的几个数翻转,交叉翻转。这是要根据数列的具体情况而定。
         翻转到最后,数列要按顺序排列(从小到大或从大到小)。最后要计算的是按顺序排列后,总共翻转了多少次。要求就是这个次数要尽量是最少次数。
题目延伸:由10个数组成的全排列,那又该怎么计算这个翻转次数呢?
                 设由N个数组成的全排列,它们的最少翻转次数为J(N).试计算:J(N)(N>2)的值。
                显然J(3)=1.那么J(4)呢?J(5)呢?当N=n时计算   J(n)的值。
                请用数学知识解答,最好不用编程。
 楼主| 发表于 2019-6-29 23:39 | 显示全部楼层
将题目给出的数列来做一次翻转:
原始数列:   10 5 6 2 1 8 9 3 4 7
第一次翻转:1 2 6 5 10 8 9 3 4 7
第二次翻转:1 2 6 5 10 8 9 7 4 3
第三次翻转:1 2 3 4 7 9 8 10 5 6
第四次翻转:1 2 3 4 7 9 8 10 6 5
第五次翻转:1 2 3 4 5 6 10 8 9 7
第六次翻转1 2 3 4 5 6 7 9 8 10
第七次翻转:1 2 3 4 5 6 7 10 8 9
第八次翻转:1 2 3 4 5 6 7 10 9 8
第九次翻转:1 2 3 4 5 6 7 8 9 10
共9步完成。
9步是我实际完成的最少步数,但是从理论上我还无法证明这点,
理论证明如下:
设有n个数,分别为:a1.a2.a3.a4......ak.a(k+1).a(k+2)......an;在这n个数中,选取最大值,设为ak。第一次翻转为:将a1.a2.a3.a4......ak翻转。翻转后,数列变为:
   ak.a(k-1).a(k-2).a(k-3)......a3.a2.a1.a(k+1).a(k+2)......an;
此时数列第一个数ak为最大值,现在还是用a1.a2.a3.a4......ak.a(k+1).a(k+2)......an的形式来表示该数列(这是为了证明的方便需要)不过在变换后的数列a1.a2.a3.a4......ak.a(k+1).a(k+2)......an中,第一个数已经是最大值了,在剩下的n-1个数(a2.a3.a4......ak.a(k+1).a(k+2)......an)中,来找第二大的数,设为
ak(不过,这里的ak是变换后的数列里的数了)现在要将这个第二大的数翻转到数列最大值(a1)的后面.
      现在要进行第二次翻转。第二次翻转如下:将.ak.a(k+1).a(k+2)......an翻转,翻转后就变为了
a1.a2.a3.a4......a(k-1).an.a(n-1).a(n-2)...ak,次时a1是最大值,ak是第二大值。现在再将该数列翻转,翻转后变为了:a1.ak.a(k+1).a(k+2).a(k+3)......a(n-2).a(n-1).an.a(k-1).a(k-2)......a4.a3.a2.
     现在进行了三次翻转,说明如下:
    第一次翻转,将第一大的数固定在最左边,第二次和第三次翻转,将第二大的数固定在左边第二个数的位置,以此类推以后每二次翻转就可以将一个数固定在相应的位置上。
      那么总共要翻转的次数就计算出来了,那就是:1+(n-3)*2+1.
     本题目给出了10个数,从理论上证明了最少翻转次数就是:1+(10-3)*2+1=16.这和我实际翻转用到的9步就完成了任务用到的次数还有很大的出入,能不能从理论上证明再降低翻转次数呢?还是个问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-17 19:05 | 显示全部楼层
假设数列共有3个数,这三个数分别是1 2 3,它们的排列共有3*2*1=6种:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
因为按题目要求:顺序排列和倒序排列都可以,也就是说1 2 3和3 2 1是已经排好序的了,那就还剩6种排序里面的剩下的4种了,也就是:
1 3 2
2 1 3
2 3 1
3 1 2
在数列项数为3的情况下,按理论上计算如下:1+(3-3)*2+1=2,也就是说按理论上计算要翻转2次,但是从实际翻转次数上看,一次就可以完成。
回复 支持 反对

使用道具 举报

发表于 2019-7-17 19:22 | 显示全部楼层
翻转的定义太复杂了。你看,你为了说明翻转是什么,不得不举很多例子。
不如考虑最简单的操作:将位置 i 和 j 的两个数互换。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|数学中国 ( 京ICP备05040119号 )

GMT+8, 2025-7-31 22:39 , Processed in 0.076081 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表