1.康拓展开和康拓展开逆运算

1.康拓展开定义及公式

康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。
——百度百科

康拓展开运算:

X=An×(n1)!+An×(n2)!++Ai×(i1)!++A1×0! X = A n × ( n − 1 ) ! + A n × ( n − 2 ) ! + ⋯ + A i × ( i − 1 ) ! + ⋯ + A 1 × 0 !

其中 Ai A i 为整数,表示在这个排列里第 i 个数字之后有多少个比这个数字小的数字,并且 0Aii,1in 0 ≤ A i ≤ i , 1 ≤ i ≤ n

举个栗子

有一个5个数的数组 {1,2,3,4,5} { 1 , 2 , 3 , 4 , 5 } ,从它的全排列组合中,计算出34152的康拓展开值。

  • 第一位是3,后边小于3的数字有2个,因此 A[5]=2 A [ 5 ] = 2 ,则第一位小于3的所有排列组合为 A[5]×(51)! A [ 5 ] × ( 5 − 1 ) !
  • 第二位是4,后边小于4的数字有2个,因此 A[4]=2 A [ 4 ] = 2 ,所以有 A[4]×(41)! A [ 4 ] × ( 4 − 1 ) !
  • 第三位是1,后边小于1的数字为0,因此 A[3]=0 A [ 3 ] = 0 ,所以有 A[3]×(31)! A [ 3 ] × ( 3 − 1 ) !
  • 第四位是5,后边小于5的数字有1个,因此 A[2]=1 A [ 2 ] = 1 ,所以有 A[2]×(21)! A [ 2 ] × ( 2 − 1 ) !
  • 最后一位后边没数了,所以 a[1]=0 a [ 1 ] = 0

综上所述

X=2×4!+2×3!+0×2!+1×1!+0×0!=61 X = 2 × 4 ! + 2 × 3 ! + 0 × 2 ! + 1 × 1 ! + 0 × 0 ! = 61

所以可得到,比34152小的组合有61个,34152排在第62位。

2.康拓展开的逆运算

康托展开是一个全排列到一个自然数的双射,因此是可逆的。

正向运算是求一个排列在全排列中的位置 n,那么逆运算就可以求在全排列中的第 n 个排列。

  • 首先要将 n1 n − 1 ,因为根据上边的正向计算可以知道,我们要算的是比 n 小的排列
  • 求第62位的排列, 621=61 62 − 1 = 61
  • 61÷4!=213 61 ÷ 4 ! = 2 ⋯ 13 ,则 A[5]=2 A [ 5 ] = 2 ,说明后边比第一位小的数字有2个,所以第一位是3
  • 13÷3!=21 13 ÷ 3 ! = 2 ⋯ 1 ,则 A[4]=2 A [ 4 ] = 2 ,说明后边比第二位小的数字有2个,因为3已经取过,所以是4
  • 1÷2!=01 1 ÷ 2 ! = 0 ⋯ 1 ,则 A[3]=0 A [ 3 ] = 0 ,说明后边比第三位小的数字有0个,所以为1
  • 1÷1!=10 1 ÷ 1 ! = 1 ⋯ 0 ,则 A[2]=1 A [ 2 ] = 1 ,说明后边比第四位小的数字有1个,所以为5
  • 0÷0!=0 0 ÷ 0 ! = 0 恒成立,最后一位就是剩下的数字2
  • 综上所属,所求排列为34152
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值