排列成本

时间:2012-05-11 14:46:31

标签: c++ algorithm

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

例如,如果我有排列3,1,2,4,则总最低成本为3。 因为我执行这些步骤((x,y)意味着用y交换x):

  • (3,1),2,4结果1,3,2,4,成本min(1,3)= 1
  • 1,(3,2),4结果1,2,3,4,成本min(2,3)= 2

总费用为3。

我尝试通过交换最小成本未排序对来进行暴力破解,直到没有未排序的对,但这种方法显然不够快。

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

2 个答案:

答案 0 :(得分:5)

对序列进行排序的连续数量交换次数等于逆序次数的对数。

例如

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)。

答案 1 :(得分:1)

这个算法听起来像insertion sort。插入排序基于消除排列中的反转。你的任务是消除插入排序中的反转。正如您所知,排序数组没有任何反转。

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

排列的最大倒置数为n *(n-1)/ 2,最小值为0.

您可以使用修改后的merge sort在O(n * lg n)中查找数组中的反转次数。

相关问题