数组 – 通过反转子列表对列表进行排序的最佳方法

现在我最近看到了这个问题(不能完全记住在哪里),关于通过专门反转子列表对数字列表进行排序需要多少操作.

这是一个例子:
未排序的输入:3,1,2,5,4

其中一个可能的答案是:
1.反向索引0到3,给出5,2,1,3,4
2.反转索引0到4,给出4,3,1,2,5
3.反向索引0到3,给出2,1,3,4,5
4.反转索引0到1,给出1,2,3,4,5

然而,在尝试解决这个问题之后,对于没有经验算法的人来说,实际上创建一段能够找到最佳解决方案的代码是非常困难的.上面提到的答案只是通过强制执行所有可能的组合来完成,但是当列表长于10个数字时(10次需要<2s,14次花费超过10分钟),这变得无法忍受.重新安装任何现有的排序算法都不起作用,因为它们被构建为一次只交换单个元素(并且通过反转子列表交换2个数字将需要1-2次操作,这根本不是最佳的).我也试过排序网络,因为在运行程序之前已经确定了最大大小,但是我也没有太多运气(它们也依赖于交换,当你有能力一次交换多个时效率很低) ).我还尝试制作一个“优化”操作列表的函数,作为尝试使现有的排序算法可行,但这些答案也远远超过最佳答案(想想16对6). 因此,在花了相当长的一段时间后,我根本找不到更好的方法来找到最短的解决方案,而不是强制它.由于我是一名学生,我在排序,算法和其他数学“魔法”方面没有太多经验,但我想知道这里是否有人可能会尝试.当然,最好的答案就是给出一个提示,因为我不介意尝试用一些漂浮在StackOverflow周围的聪明头脑来解决它. 让我们说所有数字都是唯一的,在0 – 100范围内(均为独家).阵列的长度类似于3< N< 15,因为我似乎记得原来的问题也没有使用大数组.

最佳答案 没有什么是最佳的,但在某些类似情况下使用的想法.

一个想法是使用递归并保持先前​​遇到的“最佳”分数,以避免探索进一步无用的组合.

对于长度为n的列表,第一限制显然是n-1:没有“路径”应该比n-1长,因为存在具有得分n-1的普通解决方案.

然后让排序函数多次调用自身,参数为:

>列表的当前状态
>当前状态的路径长度(1,然后是2,然后是3,……)
>某些元组列表是对当前状态路径的描述
>找到最佳分数(最初为n-1)
>找到最佳解决方案的描述(列表)

每次调用该函数(单独)时,它可以执行大约n²次操作,并通过在路径长度上加1(当然也固定其他参数)再次调用自身,但前提是此增加的长度仍然低于最佳值.得分了.

由于使用递归或多或少类似于探索树,如果您足够幸运,很快就能找到“好”的解决方案,那么您将避免探索一些分支.

它适用于尺寸3< N< 15但你肯定能找到更好的.

点赞