1.康拓展开定义及公式
康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。
——百度百科
康拓展开运算:
X=An×(n−1)!+An×(n−2)!+⋯+Ai×(i−1)!+⋯+A1×0!X=An×(n−1)!+An×(n−2)!+⋯+Ai×(i−1)!+⋯+A1×0!
其中AiAi为整数,表示在这个排列里第 i 个数字之后有多少个比这个数字小的数字,并且 0≤Ai≤i,1≤i≤n0≤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]×(5−1)!A[5]×(5−1)!
- 第二位是4,后边小于4的数字有2个,因此A[4]=2A[4]=2,所以有A[4]×(4−1)!A[4]×(4−1)!
- 第三位是1,后边小于1的数字为0,因此A[3]=0A[3]=0,所以有A[3]×(3−1)!A[3]×(3−1)!
- 第四位是5,后边小于5的数字有1个,因此A[2]=1A[2]=1,所以有A[2]×(2−1)!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 个排列。
- 首先要将 n−1n−1,因为根据上边的正向计算可以知道,我们要算的是比 n 小的排列
- 求第62位的排列,62−1=6162−1=61
- 用61÷4!=2⋯1361÷4!=2⋯13,则A[5]=2A[5]=2,说明后边比第一位小的数字有2个,所以第一位是3
- 用13÷3!=2⋯113÷3!=2⋯1,则A[4]=2A[4]=2,说明后边比第二位小的数字有2个,因为3已经取过,所以是4
- 用1÷2!=0⋯11÷2!=0⋯1,则A[3]=0A[3]=0,说明后边比第三位小的数字有0个,所以为1
- 用1÷1!=1⋯01÷1!=1⋯0,则A[2]=1A[2]=1,说明后边比第四位小的数字有1个,所以为5
- 用0÷0!=00÷0!=0恒成立,最后一位就是剩下的数字2
- 综上所属,所求排列为34152
本文深入讲解康托展开的定义、公式及其应用。康托展开是一种将全排列转换为自然数的双射方法,广泛应用于哈希表空间压缩。文章详细介绍了正向运算,即计算一个排列在全排列中的位置,以及逆运算,即根据位置找到对应的排列。
408





