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