mol*_*bel 8 arrays sorting algorithm reverse
现在我最近看到了这个问题(不记得在哪里)关于通过专门反转子列表对数字列表进行排序需要多少操作。
这是一个示例:
未排序的输入: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 个数字 <2 秒,14 个数字超过 10 分钟)。重新调整任何现有的排序算法也不起作用,因为它们被构建为一次只交换单个元素(并且通过反转子列表来交换 2 个数字将需要 1-2 次操作,这根本不是最佳的)。我也尝试过对网络进行排序,因为在运行程序之前已经确定了最大大小,但是我也没有太多运气(它们也依赖于交换,当您能够一次交换多个时,这是低效的)。我还尝试制作一个可以“优化”一系列操作的函数,以尝试使现有的排序算法可行,但这些答案也比最佳答案长得多(想想 16 对 6)。
因此,在花了相当多的时间之后,我找不到更好的方法来找到最短的解决方案,而不是强制执行它。作为一名学生,我在排序、算法和其他数学“魔法”方面没有太多经验,但我想知道这里是否有人可以尝试一下。最好的答案当然只是给出一个提示,因为我不介意尝试通过 StackOverflow 周围漂浮的更聪明的思想的一些提示来解决它。
假设所有数字都是唯一的,并且在 0 - 100 的范围内(两者都是独占的)。数组的长度类似于3 < N < 15
,因为我似乎记得原来的问题也不使用大数组。
没有什么是最佳的,只是在一些类似情况下使用的想法。
\n\n一个想法是使用递归并保留之前遇到的“最佳”分数,以避免探索进一步无用的组合。
\n\n对于长度为 n 的列表,第一个限制显然是 n-1:任何“路径”都不应该比 n-1 长,因为存在得分为 n-1 的简单解决方案。
\n\n然后让排序函数多次调用自身,参数为:
\n\n每次调用该函数(单独)时,它可以执行大约 n\xc2\xb2 操作,并通过将路径长度加 1 来再次调用自身(当然也修复其他参数),但前提是此增量长度保持不变低于最好成绩。
\n\n由于使用递归或多或少类似于探索树,因此如果您足够幸运能够尽快找到“好的”解决方案,您将避免探索某些分支。
\n\n它应该适用于尺寸3 < N < 15
,但您肯定可以找到更好的。