排列成本
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) 数组中的反转数。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么不;名字在地图上是按顺序排列的吗
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 找到具有最多子串栅栏的字符串排列
- 重新排列单线以形成闭合多边形?
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- 输入的 C++ 排列
- 公共/私有/受保护是否会更改内存中结构的排列?
- 如何在 C/C++ 中生成具有 n 组 5 个值(重复项)的所有可能排列的矩阵
- 在向量C++中排列奇数和偶数
- 如何进行排列?
- 矩阵行求和与 RowMajor 和 ColMajor 数据排列的奇怪性能差异
- 在 CPP 中打印具有重复项的选定长度字符的所有排列
- 如何在不使用 C++ 中的数组或函数的情况下查找 N 位数字的所有排列
- 调用参数排列不变函数 f(i++, i++)
- 以 C++ 为单位具有输出限制的排列
- 在C++中寻找排列和组合
- 在 std::map 中重新排列键
- 为什么我得到长度仅为 3 的字符串排列的输出?