康托展开与逆康托展开

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

1 康托展开

1.1 定义

康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。

之所以说是空间压缩,是因为当我们进行哈希运算时,如果是一个正常的长度为 n n n数列,数的范围在 1 → n 1 \to n 1n 的情况下,这个数列总共存在的情况有 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(n1)!+an1(n2)!++a1×0!

其中 a i a_i ai 0 ≤ a i &lt; i 0 \le a_i &lt; i 0ai<i的非负整数, 1 ≤ i ≤ n 1 \le i \le n 1in

a i a_i ai 表示原数的第 i i i位在当前未出现的元素中是排在第几个(也可以理解为位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值