[组合数学]康托展开

本文介绍了康托展开的概念,它是一种全排列到自然数的双射,常用于空间压缩。康托展开通过计算排列在所有排列中的顺序得到自然数。文章通过公式和举例说明了康托展开的计算过程,并讲解了逆康托展开,即如何从自然数还原回全排列。此外,还提供了康托展开和逆康托展开的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

康托展开 是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。

通俗一点来说就是 每一个排列 都代表 一个自然数
表示他在 所有排列中 的 排名

很明显可以用暴力搜索,此处不过多阐述

正文

主要讲解康托展开的实现以及逆康托展开的实现,推荐习题 P1088【火星人】

公式

康托展开 :
X = a n ( n − 1 ) ! + a n − 1 ( n − 2 ) ! + . . . + a 1 ⋅ 0 X = a_n(n - 1)! + a_{n - 1}(n - 2)! +... + a_1 · 0 X=an(n1)!+an1(n2)!+...+a10
其中, a i a_i ai 为整数,并且 0 < a i < i , 1 < i < n 0 < a_i < i ,1 < i < n 0<ai<i,1<i<n
a i a_i ai 表示原数的第i位在当前未出现的元素中是排在第几个

举个例子

康托展开

就举个例子吧
n = 5 n = 5 n=5
{ 1 , 4 , 2 , 5 , 3 1, 4, 2, 5, 3 14253} 是一个排列

第一位有 n n n 种选择,然而第二位只有 n − 1 n - 1 n1 种选择,第三位有 n − 2 n - 2 n2 种选择,第四位有 n − 3 n - 3 n3 种选择,第五位只有 n − 4 n - 4 n4 种选择
乘起来刚好是 n ! n! n!
于是每一位都对应一个进制, 第一位是 n n n 进制,第二位是 n − 1 n - 1 n1 进制, . . . ... ... ,第五位是 n − 4 n - 4 n4 进制,于是得到规律: i i i 位的进制 n − i + 1 n - i + 1 ni+1

这时我们使用康托展开即可得到一个 u n k n o w n unknown unknown 进制数(因为每一位的进制不一样)

流程如下 :
         ~~~~~~~~         第五位 :1 在 剩下的数 {1 ,2 ,3 ,4 ,5} 里排名为 : 0 ,第一位为 0
         ~~~~~~~~         第四位 :4 在 剩下的数 {2 ,3 ,4 ,5} 里排名为 : 2 ,第二位为 2
         ~~~~~~~~         第三位 :2 在 剩下的数 {2 ,3 ,5} 里排名为 : 0 ,第三位为 0
         ~~~~~~~~         第二位 :5 在 剩下的数 {3 ,5} 里排名为 : 1 ,第四位为 1
         ~~~~~~~~         第一位 :第五位为 0
可得 { 02010 } u n k n o w n {\{02010\}}_{unknown} {02010}unknown,也可以算出来自然数 X X X

逆康托展开

原理 : 一开始已经提过了,康托展开是一个全排列到一个自然数的双射,因此是可逆的。

假如有这么一个数 { 23010 } u n k n o w n {\{23010\}}_{unknown} {23010}unknown ,求他映射的全排列

流程倒着来即可,自然数的话见康托展开
         ~~~~~~~~         第一位 : {1 ,2 ,3 ,4 ,5} 里排名为 2 的是 3 ,第一位为 3
         ~~~~~~~~         第一位 : {1 ,2 ,4 ,5} 里排名为 3 的是 5 ,第二位为 5
         ~~~~~~~~         第一位 : {1 ,2 ,4} 里排名为 0 的是 1 ,第三位为 1
         ~~~~~~~~         第一位 : {2 ,4} 里排名为 1 的是 4 ,第四位为 4
         ~~~~~~~~         第一位 : {2} 里排名为 0 的是 2 ,第五位为 2

可得排列 3    5    1    4    2 {3~~5~~1~~4~~2} 3  5  1  4  2

后记

错误请帮忙指出
谢谢大家

——2020.9.13

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值