康托展开与逆展开(原理+模板)
定义:
康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大全排列中的名次,因此是可逆的。
原理:
- 代表在位置i后面且小于的值得个数
- (n-k)!代表阶乘
康托展开代码:
const int fact[10]={1,1,2,6,24,120,720,5040,40320,362880};int cantor(int a[],int n)
{int ans=0;for(int i=1;i<=n;i++){int cnt=0;for(int j=i+1;j<=n;j++)if(a[j]<a[i])cnt++;ans+=cnt*fact[n-i];}return ans;
}
康托逆展开:
我们以[4,2,5,1,3]为例,计算出来的康托值为82,我们该怎么用37回到序列[4,2,5,1,3]呢?
- 82/(4!),商为3,余数为10:商为3说明在第一位后面有3个比当前位置小的数,那么我们在这一位填充第4大的数,即4
- 10/(3!),商为1,余数为4:商为1说明在第二位后面有1个比当前位置小的数,那么我们在这一位填充除了4以外(4已经用过了),第2大的数,即2
- 4/(2!),商为2,余数为0:商为2说明在第三位后面有2个比当前位置大的数,那么我们在这一位填充剩余三个数中第三大的数,即5
- 0/(1!),商为0,余数为0:商为0说明在第四位后面没有比当前位置大的数,那么我们在这一位填充剩余数中最小的数,即1
- 最后将未填充的数(3)填到最后一位即可
康托逆展开代码:
const int fact[10]={1,1,2,6,24,120,720,5040,40320,362880};vector<int> decontor(int x,int n)
{vector<int>ans;vector<int>num;for(int i=1;i<=n;i++)num.push_back(i);for(int i=n;i>=1;i--){int pos=x/fact[i-1];x%=fact[i-1];ans.push_back(num[pos]);num.erase(num.begin()+pos);}return ans;
}
康托展开与逆展开(原理+模板)相关推荐
- 康拓展开以及逆展开 板子
讲的很好的一篇博客, 原理之类的 康托展开: (板子) fac是存的阶乘数, s是当前我们需要求的这个排列. 返回值为康托值+1, 即第几排列. ll fac[15]; int kang(string ...
- CodeForces - 504B Misha and Permutations Summation(线段树模拟康托展开与逆展开)
题目链接:点击查看 题目大意:给出两个排列 ppp 和 qqq,现在要求输出 Perm((Ord(p)+Ord(q))modn!)Perm((Ord(p)+Ord(q)) \bmod n!) Perm ...
- 康托展开和逆康托展开
简述 康托展开是一个全排列到一个自然数的双射,常用于构建hash表时的空间压缩.设有n个数(1,2,3,4,-,n),可以有组成不同(n!种)的排列组合,康托展开表示的就是是当前排列组合在n个不同元素 ...
- 通过康托逆展开生成全排列
康托展开的公式是:X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! 其中,ai为当前未出现的元素中是排在第几个(从0开始). 例如,有一个 ...
- 康托展开与逆康托展开详解
文章目录 康拓展开 运用 板子 逆康托展开 板子 康拓展开 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩. 康托展开的实质是计算当前排列在所有由小到大全排列中的名次,因此是可逆 ...
- 康托展开Cantor expansion 康托逆展开
康托展开 定义 对于n位数的某个排列s[0,n-1],有 X=a[n]∗(n−1)!+a[n−1]∗(n−2)!+...+a[i]∗(i−1)!+...+a[1]∗0! X=a[n]*(n-1)! + ...
- 康拓展开与逆康拓展开
康托展开与逆康托展开 康托展开据我所理解,应该便是给你一个已知的排列,然后这个排列在全排列中是第几小或者第几大的,一般都是按字典序计算,即为第几小的.康托展开的公式为:X=a[n]*(n-1)!+ ...
- 康拓展开和逆康拓展开
康托展开 公式:X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! ,其中a[i]为当前未出现的元素中(即后面的所有元素中)是排在第几个(从 ...
- tekla相贯线展开CAD相贯线展开弧形管展开弯管展开理想3V
本文介绍:tekla相贯线展开CAD相贯线展开弧形管展开弯管展开技术原理 展开原理:在CAD里获得管子实体相贯线图形信息(端点 中点等),然后到平面展开画图. 要求:cad模型可以直接展开.tekla ...
最新文章
- Django博客系统(详情页面展示)
- openssl私有ca创建
- finereport 登录界面的代码文件_Confluence 6 自定义登录界面
- 开发日记-20190402
- 【控制】傅里叶系列(一)傅里叶级数 (Fourier series) 的推导
- golang go语言_在7小时内学习快速简单的Go编程语言(Golang)
- linux6添加chkconfig管理,10、14 Linux系统服务管理工具-chkconfig
- 引导linux的工具下载,多系统引导工具(BootThink)下载_多系统引导工具(BootThink)官方下载-太平洋下载中心...
- java this 代替_关于JAVA中this的使用方法小结
- Python——7列表生成式
- 黑苹果alc269声卡仿冒id_黑苹果定制声卡驱动(ALC892为例)
- smtp服务器发送邮件的工作原理,SMTP协议工作原理及服务.doc
- Adobe Photoshop CC2014 安装过程
- H5如何调用手机摄像头?
- 软件著作权-说明书范本
- 定位(一):扩展卡尔曼滤波
- 微信小程序实现全局登陆状态
- 不定积分问题:1/x^3+1的不定积分求法
- Createjs的控件 BitMap、MovieClip、Sprite
- 1150 Travelling Salesman Problem (25 分)(分析题目,细节处理)