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

本文深入讲解康托展开的定义、公式及其应用。康托展开是一种将全排列转换为自然数的双射方法,广泛应用于哈希表空间压缩。文章详细介绍了正向运算,即计算一个排列在全排列中的位置,以及逆运算,即根据位置找到对应的排列。

1.康拓展开定义及公式

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

康拓展开运算:

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

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

举个栗子

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

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

综上所述

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

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

2.康拓展开的逆运算

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

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

  • 首先要将 n1n−1,因为根据上边的正向计算可以知道,我们要算的是比 n 小的排列
  • 求第62位的排列,621=6162−1=61
  • 61÷4!=21361÷4!=2⋯13,则A[5]=2A[5]=2,说明后边比第一位小的数字有2个,所以第一位是3
  • 13÷3!=2113÷3!=2⋯1,则A[4]=2A[4]=2,说明后边比第二位小的数字有2个,因为3已经取过,所以是4
  • 1÷2!=011÷2!=0⋯1,则A[3]=0A[3]=0,说明后边比第三位小的数字有0个,所以为1
  • 1÷1!=101÷1!=1⋯0,则A[2]=1A[2]=1,说明后边比第四位小的数字有1个,所以为5
  • 0÷0!=00÷0!=0恒成立,最后一位就是剩下的数字2
  • 综上所属,所求排列为34152
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值