算法:康托展开式——实现全排列序列与序号的映射

康托展开式实现了由1到n组成的全排列序列到其编号之间的一种映射,下面会给出例子,虽然这个公式应用不是很多,但这种思想值得学习,首先给出其公式:

X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0!


一.公式的说明

由1到n这n个数组成的全排列,共n!个,按每个全排列组成的数从小到大进行排列,并对每个序列进行编号(从0开始),并记为X;比如说1到4组成的全排列中,1234对应编号0,1243对应编号1。

对于ai的解释需要用例子来说明:

对1到4的全排列中,我们来考察3214,则

1. a4={3在集合(3,2,1,4)中是第几大的元素}=2

2. a3={2在集合(2,1,4)中是第几大的元素}=1

3. a2={1在集合(1,4)中是第几大的元素}=0

4. a1=0(最后只剩下一项)

也就是说康托公式中的每一项依次对应全排列序列中的每个元素,并按上述规则映射;

则X=2*3!+1*2!+0*1!+0*0!=14,即3214对应的编号为14。


二.公式的证明

某一全排列序列的编号即等于排在它前面的全排列的个数,而由编号定义可知,其前面的全排列组成数都小于该全排列组成的数。

还是用例子来说明吧,更易于理解,考察3214,我们要求出比它小的全排列的个数,可以这样计算:

1. 千位取1或2,后三位由剩下的3个元素全排列,共2*3!种;

2. 千位取3,百位取小于2的元素,只能为1,后两位由剩下的2个元素全排列,共1*2!种;

3. 千位取3,百位取2,十位取小于1的元素,不存在;

4. 最后一项一定为0;


. 康托公式的逆向运用

康托公式可以根据排列的序号来求出该排列,即通过X的值求出ai(i大于等于1小于等于n)的值,运用辗转相除的方法即可实现,现在已知一个编号14(注意该编号是从0开始的,如果是从1开始,此处要减1),求其对应的全排列序列:
14 / (3!) = 2 余 2
  2 / (2!) = 1 余 0
  0 / (1!) = 0 余 0
  0 / (0!) = 0 余 0
故得到:a4=2,a3=1,a2=0,a1=0,由ai的定义即可确定14对应的全排列为3214。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                  2. http://www.tuicool.com/articles/BbUrI3

  • 2
    点赞
  • 2
    收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 3

打赏作者

疯狂的指针

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值