文章目录
1 康托展开
1.1 定义
康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。
之所以说是空间压缩,是因为当我们进行哈希运算时,如果是一个正常的长度为 n n n数列,数的范围在 1 → n 1 \to n 1→n 的情况下,这个数列总共存在的情况有 n n n^n nn种,我们将数列映射为整数时,则至少需要 n n n^n nn这个数量级以上的空间
而 n n n的全排列很明显只有 n ! n! n!种情况,也就是说,会没有必要的浪费很多空间,如何将空间降低呢,我们就需要用到康托展开与逆康托展开
举个例子,当 n = = 9 n == 9 n==9时,普通哈希算法需要的空间为 9 9 = 387420489 9 ^ 9 = 387420489 99=387420489,而康托展开只需要 9 ! = 3682880 9! = 3682880 9!=3682880的空间即可
康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。
1.2 康托展开运算
X = a n ( n − 1 ) ! + a n − 1 ( n − 2 ) ! + ⋯ + a 1 × 0 ! X = a_n(n - 1)! + a_{n - 1}(n - 2)! + \cdots + a_1\times 0! X=an(n−1)!+an−1(n−2)!+⋯+a1×0!
其中 a i a_i ai为 0 ≤ a i < i 0 \le a_i < i 0≤ai<i的非负整数, 1 ≤ i ≤ n 1 \le i \le n 1≤i≤n
a i a_i ai 表示原数的第 i i i位在当前未出现的元素中是排在第几个(也可以理解为位置