整理六个不同物品时,如果一次操作允许交换任意两个位置,所需次数与只能交换相邻位置很不一样。可以把每个元素指向它应该去的位置,观察形成的循环。
目标顺序固定为零至五,当前排列中每个编号恰好出现一次。把位置i连到当前位置存放的编号,分解成若干循环;长度L的循环需要L减一次任意交换,单元素循环无需处理。
初始六个位置依次存放[1, 2, 4, 0, 5, 3];目标为零、一、二、三、四、五。
置换循环:[[0, 1, 2, 4, 5, 3]] 循环数量1,理论最少交换5次。 依次交换的位置及交换后排列: [0, 3] | [0, 2, 4, 1, 5, 3] [1, 3] | [0, 1, 4, 2, 5, 3] [2, 3] | [0, 1, 2, 4, 5, 3] [3, 5] | [0, 1, 2, 3, 5, 4] [4, 5] | [0, 1, 2, 3, 4, 5] 完成后每个位置的编号与位置编号相同。
阅读记录时先确认编号代表的是格子、对象、时间还是数组位置,再逐项对应输入与输出。中间状态提供了定位差异的依据,最后的一个合计数字不能替代全部步骤;没有对象的集合与数值零也应区别看待。
所有循环长度合计为六,最少次数等于六减循环数量。实际演示每次找到一个尚未归位的元素,把它与当前位置应该放的编号交换;最终必须完整恢复目标顺序。
这个最少次数结论依赖任意两位置都可交换,且每次交换成本相同。若只能相邻交换、部分格子锁定或交换成本不同,应换用相应规则,不能把同一个答案直接迁移过去。
可以遮住结果表先按规则复算第一步,再选择一个边界输入重复操作。若更换规则中的任一前提,应重新推导结果,不要只调整最后答案。这样既能理解本例为何成立,也能看清它在哪些情况下不再适用。