该算法的实际应用是为一组 2..N 人中的每个人分配同一组人中的每个人不同的目标人,以进行尽可能多的连续轮次。 p>
我将这群人表示为一个数组。该数组将人的标识符保存为数字,例如,5 个人将创建一个数组 [1, 2, 3, 4, 5]。然后可以得出每个人的目标:
- 人 1 将人 2 作为目标
- 第 2 个人将拥有第 3 个人
- 3 => 4
- 4 => 5
- 5 => 1(数组会循环)
数组 [1, 2, 3, 4, 5] 然后可以以缩写形式产生以下目标:1 => 2, 2 => 3, 3 => 4, 4 => 5, 5 = 1
我需要找到一种算法,找出具有不同连续元素的所有排列(数组元素可以排序的不同顺序)。
例如,对于给定的数组,result [2, 4, 3, 1, 5] 是一个,因为你找不到 2 before 4, 4 before 3, 3 before 1, 1 before 5 和 5 before 2(注意我将数组作为循环处理)来自原始数组 [1, 2, 3, 4, 5]。
具有 2 个元素(或人)的数组将始终将彼此作为目标。这意味着具有输入 [1, 2] 的算法将只有一个结果:[1, 2]。将数组元素重新排序为 [2, 1] 并不重要,因为我们考虑数组循环:2 -> 1、1 -> 2。
For [1, 2, 3] it's possible to find two permutations:
[1, 2, 3] (1 -> 2, 2 -> 3, 3 -> 1) and [2, 1, 3] (2 -> 1, 1 -> 3, 3 -> 2)
该算法应返回数组的所有排列,如下所示:
algorithm([1, 2, 3, 4, 5]) => [[1, 2, 3, 4, 5], [2, 4, 3, 1, 5], ...]
最佳答案
根据您的评论,我们可以得到输出,其中 1 和 2 相互定位,3 和 4 相互定位。 (这些输出不能用您选择的输出格式表示。)
在那种情况下,在从 1 到 N-1 的每一轮 i
中,让每个人都瞄准他们前面的人 i
。
关于arrays - 在没有任何两个元素以相同顺序排列的情况下,找到一个数组可以排列的所有排列的最快算法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36847847/