排列组合,相关算法

排列序数

以4个数字排列为例,1 2 3 4是0号排列,1 2 4 3是1号排列,4 3 2 1是4!-1=23号排列。下面给出已知排列求序数的算法。
第一步,数一数每一位右侧有几个数字比它小。以2 4 3 1为例,2的右侧只有1个数字比它小,这一位记1;4的右侧有2个数比它小,记2;3的右侧有1个数比它小,记1;1这一位记0。结果就是1 2 1 0
第二步,加权求和。各位的权是3! 2! 1! 0!,计算公式为1×3!+2×2!+1×1!+0×0!,计算结果为6+4+1+0=11。
答:4个数字排列,2431的排列序数为11。

由排列序数反求排列

4个数进行排列,求出排列序数为11的那个排列。
解:既然是4个数进行排列,就准备3! 2! 1! 0!作为位权,然后:

11÷3!=1...5
 5÷2!=2...1
 1÷1!=1...0
 0÷0!=0...0

得到1210。
下一步,令数组a={1234},由1210最左一位,即1,求得a[1]=2,提取它,得到数组b={2???};
现在a={134},由210最左一位,即2,求得a[2]=4,提取它,得到b={24??};
现在a={13},由10最左一位,即1,求得a[1]=3,提取它,得到b={243?};
现在a={1},由0最左一位,即0,求得a[0]=1,提取它,得到b={2431};
a为空,算法停止,b为所求。

下一个排列

1、从后向前查找第一个相邻升序元素对(i, j),满足A[i] 2、在[j, end)中从后向前查找第一个大于A[i]的A[k]。
3、交换A[i]与A[k],给[j, end)排序,使其升序。
4、如果在步骤1找不到符合条件的元素对,说明此时[begin, end)是降序的,输出n!-1即可。
以2431为例,第一步i指向2,第二步在431中从后向前找到3,第三步交换2和3得到3421,给421排序得到3124。
答:2431的下一个排列是3124。

随机择优算法

这个算法尚不成熟,是掌握更复杂、更专业的最优算法之前的一个临时方法。
对每一个排列P,都有一个衡量它好坏的分数F。
从升序排列P0开始,计算它的分数F0
对P0洗牌,得到P1,计算分数F1
比较F0和F1,选出更好的,并记录相应的P
重复上述过程许多次,得到一个较好的排列方案

你可能感兴趣的:(算法)