Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何找到对已知列表排序的最小交换集?_Algorithm_Sorting_Data Structures_Language Agnostic - Fatal编程技术网

Algorithm 如何找到对已知列表排序的最小交换集?

Algorithm 如何找到对已知列表排序的最小交换集?,algorithm,sorting,data-structures,language-agnostic,Algorithm,Sorting,Data Structures,Language Agnostic,众所周知,对未知列表进行排序的问题平均不能在N*log(N)步数内完成。但是,如何为已知列表找到最佳排序呢?也就是说,假设您有以下列表: [1,3,2,7,4] 在这种情况下,只有2笔掉期交易保持排序: swap 1 2 swap 3 4 这比5*log5小得多。如何找到使特定列表保持排序的最小互换集 注意:这个问题与非常相似,只是没有堆栈机器 一旦你把排列变成一个简单的问题,这个问题就变得容易多了 例如,使用基于零的索引的循环分解为(0)(2 1)(4 3)。长度为k的每个循环都需要k-1

众所周知,对未知列表进行排序的问题平均不能在
N*log(N)
步数内完成。但是,如何为已知列表找到最佳排序呢?也就是说,假设您有以下列表:

[1,3,2,7,4]
在这种情况下,只有2笔掉期交易保持排序:

swap 1 2
swap 3 4
这比
5*log5
小得多。如何找到使特定列表保持排序的最小互换集


注意:这个问题与非常相似,只是没有堆栈机器

一旦你把排列变成一个简单的问题,这个问题就变得容易多了

例如,使用基于零的索引的循环分解为(0)(2 1)(4 3)。长度为k的每个循环都需要k-1交换以正确的顺序排列,因此最小交换集的答案是每个循环的(循环长度-1)之和,而交换的精确集合是通过识别循环并将循环中的每个元素与循环中的下一个元素进行切换来确定的

这种方法的复杂度是O(nlogn)求每个元素的秩加O(n)求循环分解

这个答案假设您可以交换任意一对元素


如果只能交换相邻元素,则需要计算数组中的反转数,请参见。

什么是已知列表???您应该指定符号<代码>交换1 2交换3 4可以理解为产生
[2,4,1,7,3]