提到排列,可能大家首先想到的是高中时被排列组合支配的恐惧,C和A傻傻分不清楚。我们今天所提到的全排列和排列组合有或多或少的关系。
全排列
从N个元素中取出M个元素,并按照一定的规则将取出元素排序,我们称之为从N个元素中取M个元素的一个排列。显然,选取的规则不同,排序的结果也不同,则可以得到不同的排列。当M=N时,即从N个元素中取出N个元素的排列我们称之为全排列。在计算机科学领域,我们习惯以ASCII码顺序作为排序规则(一个序列的标准顺序即为元素ASCII码为递增序列)
我们以集合A=为例,按顺序列举出其全排列:
A1=,A2=,A3=,A4=,A5=,A6=,
值得注意的是N个元素的全排列的个数为N!。这种全排列的列举方式有没有让你想起忘记行李箱密码时挨个试验的过程。
下一个全排列问题即为给定一个序列输出当前序列所构成全排列中的下一个,若无下一个全排列则输出字典序最小的序列。
程序思路
该算法本身思路其实比较简单,具体思路分为以下4步。
1、对给定的序列从后向前查找,寻找这个序列中的最长递减序列。既满足A[i]>A[j]的最长序列。(A[i]为A[j]的前一个元素),此时,序列从A[j]到End为降序;
2、从A[j]到End子序列中寻找最小的比A[i]大的数,记为A[k];
3、将A[i]与A[k]调换位置;
4、将此时的A[j]到End子序列逆置。
经由以上四步即可找到给定序列的下一个全排列。我们举个例子,给定序列42531,我们从后往前寻找最长递减序列,即有A[i]=2,、A[j]=5;随后我们在子序列中寻找最小的比A[i]大的数,得到A[k]=3;调换A[i]与A[k],得到43521;逆置A[j]到End子序列,得到下一个全排列43125。
问题
1、能否根据本次下一个全排列的算法思路编写上一个全排列算法?
2、Python语言中reversed函数的作用是什么?
领取专属 10元无门槛券
私享最新 技术干货