定义:

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

原理:

  • 代表在位置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]呢?

  1. 82/(4!),商为3,余数为10:商为3说明在第一位后面有3个比当前位置小的数,那么我们在这一位填充第4大的数,即4
  2. 10/(3!),商为1,余数为4:商为1说明在第二位后面有1个比当前位置小的数,那么我们在这一位填充除了4以外(4已经用过了),第2大的数,即2
  3. 4/(2!),商为2,余数为0:商为2说明在第三位后面有2个比当前位置大的数,那么我们在这一位填充剩余三个数中第三大的数,即5
  4. 0/(1!),商为0,余数为0:商为0说明在第四位后面没有比当前位置大的数,那么我们在这一位填充剩余数中最小的数,即1
  5. 最后将未填充的数(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;
}

康托展开与逆展开(原理+模板)相关推荐

  1. 康拓展开以及逆展开 板子

    讲的很好的一篇博客, 原理之类的 康托展开: (板子) fac是存的阶乘数, s是当前我们需要求的这个排列. 返回值为康托值+1, 即第几排列. ll fac[15]; int kang(string ...

  2. CodeForces - 504B Misha and Permutations Summation(线段树模拟康托展开与逆展开)

    题目链接:点击查看 题目大意:给出两个排列 ppp 和 qqq,现在要求输出 Perm((Ord(p)+Ord(q))modn!)Perm((Ord(p)+Ord(q)) \bmod n!) Perm ...

  3. 康托展开和逆康托展开

    简述 康托展开是一个全排列到一个自然数的双射,常用于构建hash表时的空间压缩.设有n个数(1,2,3,4,-,n),可以有组成不同(n!种)的排列组合,康托展开表示的就是是当前排列组合在n个不同元素 ...

  4. 通过康托逆展开生成全排列

    康托展开的公式是:X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! 其中,ai为当前未出现的元素中是排在第几个(从0开始).   例如,有一个 ...

  5. 康托展开与逆康托展开详解

    文章目录 康拓展开 运用 板子 逆康托展开 板子 康拓展开 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩. 康托展开的实质是计算当前排列在所有由小到大全排列中的名次,因此是可逆 ...

  6. 康托展开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)! + ...

  7. 康拓展开与逆康拓展开

    康托展开与逆康托展开   康托展开据我所理解,应该便是给你一个已知的排列,然后这个排列在全排列中是第几小或者第几大的,一般都是按字典序计算,即为第几小的.康托展开的公式为:X=a[n]*(n-1)!+ ...

  8. 康拓展开和逆康拓展开

    康托展开 公式:X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! ,其中a[i]为当前未出现的元素中(即后面的所有元素中)是排在第几个(从 ...

  9. tekla相贯线展开CAD相贯线展开弧形管展开弯管展开理想3V

    本文介绍:tekla相贯线展开CAD相贯线展开弧形管展开弯管展开技术原理 展开原理:在CAD里获得管子实体相贯线图形信息(端点 中点等),然后到平面展开画图. 要求:cad模型可以直接展开.tekla ...

最新文章

  1. Django博客系统(详情页面展示)
  2. openssl私有ca创建
  3. finereport 登录界面的代码文件_Confluence 6 自定义登录界面
  4. 开发日记-20190402
  5. 【控制】傅里叶系列(一)傅里叶级数 (Fourier series) 的推导
  6. golang go语言_在7小时内学习快速简单的Go编程语言(Golang)
  7. linux6添加chkconfig管理,10、14 Linux系统服务管理工具-chkconfig
  8. 引导linux的工具下载,多系统引导工具(BootThink)下载_多系统引导工具(BootThink)官方下载-太平洋下载中心...
  9. java this 代替_关于JAVA中this的使用方法小结
  10. Python——7列表生成式
  11. 黑苹果alc269声卡仿冒id_黑苹果定制声卡驱动(ALC892为例)
  12. smtp服务器发送邮件的工作原理,SMTP协议工作原理及服务.doc
  13. Adobe Photoshop CC2014 安装过程
  14. H5如何调用手机摄像头?
  15. 软件著作权-说明书范本
  16. 定位(一):扩展卡尔曼滤波
  17. 微信小程序实现全局登陆状态
  18. 不定积分问题:1/x^3+1的不定积分求法
  19. Createjs的控件 BitMap、MovieClip、Sprite
  20. 1150 Travelling Salesman Problem (25 分)(分析题目,细节处理)

热门文章

  1. 什么是protobuf
  2. Nginx的SSL相关指令
  3. Nginx反向代理的系统优化
  4. Java 网关-Servlet Gateway
  5. Maven软件的下载安装
  6. mysql日期/时间转换为字符串
  7. SpringBoot高级-消息-RabbitMQ安装测试
  8. 使用Github(创建仓库、仓库主页说明)
  9. Linux 查看显存带宽,Vega 20规格与Vega 10相近,显存带宽翻倍,但目前只能跑Linux - 超能网 - IT帮...
  10. IDEA使用技巧整理