[学习][Math]康托展开和逆康托展开

一、康托展开

问题:{1,2,3,4,5}5个数的全排列中,{2,3,1,5,4}排字典序的第几位?

解决:计算{2,3,1,5,4}的康托展开值:x=a[1]*4!+a[2]*3!+a[3]*2!+a[4]*1!+a[5]*0!=1*24+1*6+0*2+1*1+0*0=31, 所以{2,3,1,5,4}排字典序第32位

解释:计算{2,3,1,5,4}排第几位,就要计算比{2,3,1,5,4}字典序小的排列有几个,而这个就是{2,3,1,5,4}的康托展开值,要如何计算呢,其实很简单:

首先看序列中第一个数2,1~5中比2小的数有1个,因此这就可以生成1*4!个比{2,3,1,5,4}小的序列,即{1,x,x,x,x}

再看第二个数3,1~5(除去2)中比3小的数有1个,因此又可以有1*3!个比{2,3,1,5,4}小的序列,即{2,2,x,x,x}

再看第三个数1,1~5(除去2,3)中比1小的数有0个,因此又有0*2!个比{2,3,1,5,4}小的序列

再看第四个数5,1~5(除去2,3,1)中比5小的数有1个,因此又有1*1!个比{2,3,1,5,4}小的序列,即{2,3,1,4,x}

最后一个数4,1~5(除去2,3,1,5)中比4小的数有0个,因此又有0*0!个比{2,3,1,5,4}小的序列

综上,比{2,3,1,5,4}小的序列共有x=1*4!+1*3!+0*2!+1*1!+0*0!=31个,所以{2,3,1,5,4}排字典序32位

二、逆康托展开

问题:{1,2,3,4,5}的全排列中,字典序排23位的排列是哪一个?

解决:由康托展开值x=a[1]*4!+a[2]*3!+a[3]*2!+a[4]*1!+a[5]*0!=22,逆推出a[1]=22/4!=0,a[2]=22/3!=3,a[3]=4/2!=2,a[4]=0/1!=0,a[5]=0/0!=0,可知,字典序排23位的排列是{1,5,4,2,3}

解释:首先由x=22求得a[1]=x/4!=0,那么第一个数必定是1;

再由x-a[1]*4!=22求得a[2]=22/3!=3,那么第二个数是必定是5;

再由x-a[1]*4!-a[2]*3!=4求得a[3]=4/2!=2,那么第三个数必定是4;

再由x-a[1]*4!-a[2]*3!-a[3]*2!=0求得a[4]=0/1!=0,那么第四个数必定是2;

最后a[5]=0,第五个数是3;

综上,字典序排23位的排列是{1,5,4,2,3}

三、应用

实现序列(全排列之一)到自然数的映射,实现自然数到序列的映射

例1:我排第几个http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=139

例2:第几是谁?http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=143

转载于:https://www.cnblogs.com/lllxq/p/9435881.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值