标签:公式 问题: 顺序 问题 先后 哈希 相同 说明 自然数
额,好像鸽了太久了。为了找回手感,不管是什么先写一点
康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的顺序,因此是可逆的。
——摘自百度百科
虽然解释得比较规范,但也比较容易理解
康拓展开就是对全排列排序,以此解决空间过大的问题
现在我们面对着这样一个问题:在特定情境下,我们需要为全排列数赋值,那我们怎么处理?
一种做法就是直接用Long Long存,但缺点显而易见:空间招架不住
另外一种做法是用map存。说实话我不知道有什么太大的问题,貌似是可以的。不过STL这种东西,能不用就不用 真香
先上公式:
定义:
\(a[x]=位置x后的数字中,小于位置x上数字的个数\)
公式:
\(f=\sum_{i=1}^{n} a[i]*(n-i)!\)
公式比较抽象,但胜在美观嘛
怎么去理解呢?我们用34152这个例子来理解
结果:
\(f=2*4!+2*3!+0*2!+1*1!+0*0!=61\)
顾名思义,康托展开解决的是用全排列数到排名,那么康托逆展开就用排名还原出全排列数
思考一下康托展开是怎么实现的,它有点类似于一个特殊进制数,每\(n\)位的意义是\(n!\),那么只要除回去即可
依旧以34152为例,康托值为61
还原出来34152
事实上,做题过程中,还是康托展开用的多,康托逆展开实际用处并不是很大
code:
思路简单,代码易写,懒得复制粘贴ˋ( ° ▽、° )
标签:公式 问题: 顺序 问题 先后 哈希 相同 说明 自然数
原文地址:https://www.cnblogs.com/ticmis/p/13210752.html