Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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_Sequence_Permutation_Swap - Fatal编程技术网

Algorithm 如何在两个不同排列之间找到最短的交换序列?

Algorithm 如何在两个不同排列之间找到最短的交换序列?,algorithm,sequence,permutation,swap,Algorithm,Sequence,Permutation,Swap,我正在寻找某种算法,可以帮助我解决摆在我面前的任务。我需要找到一种方法来查找(而不仅仅是计算)给定置换中的所有交换(两个元素的交换),这是将其转换为另一个给定置换所需的。如果该方法能够找到从一种排列到另一种排列的最小交换次数,那就太好了。 有谁能给我一个提示或完整的解决方案吗?首先确定每个值应该放在哪里。然后,您将找到移动的循环。以这些数据为例: source: [5, 3, 0, 7, 1, 6, 4, 8] target: [3, 1, 0, 4, 5, 7, 8, 6] (index:

我正在寻找某种算法,可以帮助我解决摆在我面前的任务。我需要找到一种方法来查找(而不仅仅是计算)给定置换中的所有交换(两个元素的交换),这是将其转换为另一个给定置换所需的。如果该方法能够找到从一种排列到另一种排列的最小交换次数,那就太好了。
有谁能给我一个提示或完整的解决方案吗?

首先确定每个值应该放在哪里。然后,您将找到移动的循环。以这些数据为例:

source: [5, 3, 0, 7, 1, 6, 4, 8]
target: [3, 1, 0, 4, 5, 7, 8, 6]
(index:  0  1  2  3  4  5  6  7  ) 
然后我们可以得出,索引0(即5)处的值应该到索引4,索引4处的值应该到索引1,索引1处的值应该到索引0,从而完成该循环。因此我们发现这些周期:

0 -> 4 -> 1 (and back to start)
2
3 -> 5 -> 7 -> 6 (and back to start) 
我们有三个周期。请注意,索引2处的值已经处于其正确的索引,因此它处于自己的循环中

第一个循环可通过以下交换执行,从最后一对开始,向后:

index 4 <-> index 1
index 0 <-> index 4 
索引4索引1
索引0索引4
索引2处的值不需要交换

第三个周期可通过以下互换执行:

index 7 <-> index 6
index 5 <-> index 7
index 3 <-> index 5 
索引7索引6
指数5指数7
指数3指数5
执行一个周期的掉期数量是其长度减去1


因此,在上面的示例中,交换的数量是(3-1)+(1-1)+(4-1)=2+0+3=5。

对您的方法更容易理解的解释:[5,3,0,7,1,6,4,8]->交换(0,4)->[1,3,0,7,5,6,6,4,8]->交换(0,1)->[3,1,0,7,5,6,4,8](第一个循环完成)->。。。在推理之前给出swap示例使其更容易理解。也许你想用这种方式编辑答案。。。