文章目录
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位在当前未出现的元素中是排在第几个(也可以理解为位置 i i i后面的数有多少个是小于第 i i i位的数)
1.3 举个例子
在 ( 1 , 2 , 3 , 4 ) (1, 2, 3, 4) (1,2,3,4)的全排列中,我们计算排列 ( 2 , 4 , 1 , 3 ) (2, 4, 1, 3)

康托展开是一种将全排列映射为自然数的双射方法,常用于空间压缩,如哈希表。逆康托展开则能根据排列的名次恢复原排列。本文详细介绍了康托展开的定义、运算、实现技巧,以及其在确定排列名次、压缩哈希空间和解决八数码问题等场景的应用。
9678

被折叠的 条评论
为什么被折叠?



