arrays - 在没有任何两个元素以相同顺序排列的情况下,找到一个数组可以排列的所有排列的最快算法是什么?

标签 arrays algorithm sorting pseudocode

该算法的实际应用是为一组 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/

相关文章:

按总和顺序生成 k 个元素子集的算法

Java - 将不相关的对象与自定义顺序进行比较

ios - 如何编写谓词来过滤字典数组?

javascript - 将新键和一组值添加到 javascript 中的现有数组

java - 线程中出现异常 "main"java.lang.IndexOutOfBoundsException

algorithm - 如何计算 kruskal 算法的时间复杂度可能是 O(E log E) = O(E log V)。?

php - 更改数据库记录排序顺序以使用 PHP 在其他记录之间移动记录位置

c - 结构中的可变长度数组

algorithm - 给定一个时间复杂度为 O(n^2) 的算法,如果我将输入 n 增加三倍会发生什么?

java - 棋子表和绳子的时间复杂度