排列成本

Permutation cost

本文关键字:排列      更新时间:2023-10-16

我得到了集合{1,2,...,n}的排列。我必须仅通过以最低的总成本交换位于成功位置上的数字来对这种排列进行排序。交换位于成功位置的元素 x,y 的成本为 min(x,y)。

例如,如果我有排列 3,1,2,4,则总最小成本为 3。因为我执行以下步骤( (x,y) 表示将 x 与 y 交换):

    (3,1
  • ),2,4 结果 1,3,2,4,最小成本 (1,3)=1
  • 1,(3,2
  • ),4 结果 1,2,3,4,成本最小值(2,3)=2

总费用为 3。

我尝试了蛮力,通过交换最低成本的未排序对,直到没有未排序的对,但这种方法显然不够快。

我的

问题是,根据我的条件,我如何找到最低的分拣成本?

对序列进行排序的成功数交换数等于倒序的对数。

例如

6 1 3 2 4 5

下面列出了按相反顺序排列的对:

(6,1) (6,3) (6,2) (6,4) (6,5) (3,2)

所以

对序列进行排序的操作包括:

swap(6,1) 1 6 3 2 4 5
swap(6,3) 1 3 6 2 4 5
swap(6,2) 1 3 2 6 4 5
swap(6,4) 1 3 2 4 6 5
swap(6,5) 1 3 2 4 5 6
swap(3,2) 1 2 3 4 5 6

所以操作是确定的(除非你做一些无用的操作)。

您只需要以相反的顺序计算所有对 (x,y),并将 min(x,y) 相加。

这个算法听起来像插入排序。基于消除排列中的反转的插入排序。您的任务是消除插入排序中的反转。正如您已经知道的那样,排序数组没有任何反转。

插入排序算法的时间复杂度为 O(n+d),其中 n 是元素数,d - 是反转数。

置换中的最大反转数为 n*(n-1)/2,最小值为 0。

您可以使用修改的合并排序来查找 O(n*lg n) 数组中的反转数。