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示例使其更容易理解。也许你想用这种方式编辑答案。。。