参考博客:https://blog.csdn.net/Hi_KER/article/details/81263889

康托展开解决的两个问题:

  • 正康托展开:给出一个全排列的序列,求该序列是第几个全排列的序列。

如初始序列1234,那么3214是第15个全排列的序列

  • 逆康托展开:给出数字k,求全排列序列中的第k个序列是什么。

如初始序列1234,第15个全排列的序列为3214

康托展开是为了解决全排列和序号之间的映射问题,对于全排列,可以通过next_permutation(a,a+n)(或者pre_permutation(a,a+n))去求解,当然也可以自己写一个递归回溯函数求解。

正康托展开


给定n=4,序列:3214,求该排列字典序?

第一位为3,则当第一位为1,2时生成的排列比目标排列小,有所以2*3!种;

第二位为2,当第二位为1是生成的排列更小,有1*2!种;

第三位为1,没有比1更小的排列方法,有0*1!种

第四位为4,由于1,2,3,在前面已经使用了,使用没有比4更小的了,有0*0!种

使用总共有2*3!+1*2!+0*1!+0*0!=14种排列方法比目标排列字典序小,则目标排列字典序为15(不要忘记加一)

公式:

其中k[i]表示对于第i位的a[i],a[i+1]到a[n]种比a[i]小的数字的个数

实现代码:

 cin>>n;fac[0]=1;for(int i=1;i<=n;i++)//预处理阶乘 fac[i]=fac[i-1]*i;int ans=1;//注意 for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++){int k=0;//统计比a[i]小且没有用过的数字 for(int j=i+1;j<=n;j++) if(a[j]<a[i]) k++;ans+=k*fac[n-i];}cout<<ans;

逆康托展开


求有4位的全排列中,字典序序数为15的序列?

先把15减1,表示有14个排列比目标序列字典序小

考虑第一位:14 / 3!  = 2 ... ... 2 说明比第一位小的数有2个(算式第一个2表示的意义),所以第一位为3

考虑第二位:2  / 2!  = 1 ... ... 0  说明在第二位之后且小于第二位的数有1个,所以第二位为:2

考虑第三位: 0 / 1!  = 0 ... ... 0 说明在第三位之后且小于第三位的数没有,所以第三位为:1

考虑第四位:1,2,3,都使用了所以为4

实现代码:

 bool vis[maxn];//表示数字是否使用了memset(vis,0,sizeof(vis)); cin>>n>>k; fac[0]=1;for(int i=1;i<n;i++)//预处理阶乘 fac[i]=fac[i-1]*i;k--;//注意 int q,j,cnt; for(int i=1;i<=n;i++){q=k/fac[n-i];k=k%fac[n-i];cnt=0;for(j=1;;j++){if(!vis[j]) cnt++;//统计 if(cnt>q) break;}a[i]=j;vis[j]=true;}for(int i=1;i<=n;i++) cout<<a[i]<<' ';

【算法笔记】数论基础:康托展开(全排列和序号之间的映射)相关推荐

  1. 《算法笔记》——基础篇习题选择结构

    <算法笔记>--基础篇习题 第二章 C/C++快速入门--2.3选择结构 [习题A] 一元二次方程求根 Problem Description Thinking Notes Code Im ...

  2. 你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)

    摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过.同时数论基础也是 Hash 算法,RS ...

  3. 关于数论【康托展开及其逆运算】

    表示这个东西背了很多次,但是次次忘,希望这次能够记住吧. 康托展开: 问45231是n=5的全排列中第几个排列? ans:= 3*4! + 3*3! + 1*2! + 1*1! + 0*0! =93 ...

  4. 左程云算法笔记总结-基础提升篇

    提升01(哈希) 认识哈希函数 哈希函数的输入一般需要是无穷尽的,没有限制:输出可以有一定的范围,比如MD5加密后产生的字符串可以有2的32次方-1种,用十六进制表示需要16个字符. 相同的输入对应相 ...

  5. 左程云算法笔记总结-基础篇

    基础01(复杂度.基本排序) 认识复杂度和简单排序算法 时间复杂度 big O 即 O(f(n)) 常数操作的数量写出来,不要低阶项,只要最高项,并且不要最高项的系数 一个操作如果和样本的数据量没有关 ...

  6. 判断是否为二叉排序树的递归算法_左神直通BAT算法笔记(基础篇)

    时间复杂度 空间复杂度 经典例题 找出B中不属于A的数 荷兰国旗问题 矩阵打印问题 岛问题 经典结构和算法 字符串 KMP算法 前缀树 数组 冒泡排序 选择排序 插入排序 归并排序 快速排序 堆排序 ...

  7. 前端算法笔记-数据结构基础

    前言 打算从0开始,用JavaScript刷题. 买了修言老师的小册子:前端算法与数据结构面试:底层逻辑解读与大厂真题训练 希望每天下班之后可以看一篇,争取早日上岸吧~ 数据结构 我的想法:不同语言对 ...

  8. [算法笔记]二叉树基础

    前言:部分资料引自极客大学<数据结构与算法之美>,感谢王争老师! 参考链接: https://visualgo.net/en/bst?slide=1 https://zh.wikipedi ...

  9. 【有营养的算法笔记】基础算法 —— 推导证明前缀和与差分

  10. java实现排程算法_康托展开算法和逆康托展开算法[Java实现]

    基于这篇介绍我实现了基于Java的算法 都能看懂的康托展开_ltrbless的博客-CSDN博客​blog.csdn.net 条件 一个数组:[1, 2, 3, 4, 5] 康托展开算法 找出 524 ...

最新文章

  1. 5月,我面试了60多号人,写了些总结
  2. iOS开发那些事-故事板实现标签导航
  3. The Guy Who Ran Microsoft And Google In China Clones US Startups
  4. 五十二、微信小程序云开发中的云存储
  5. CodeForces - 1354E Graph Coloring(dfs判断二分图+dp)
  6. 蓝桥杯 - 连号区间数(暴力)
  7. byte数组存的是什么_结构体内存对齐是什么鬼?
  8. vue.js踩坑之ref引用细节点
  9. 拦截器ConnectInterceptor
  10. xenCenter创建镜像库和挂载硬盘
  11. java学生管理系统(简单版)
  12. 关于网页数据导入excel问题
  13. 使用Pyecharts进行全国水质TDS地图可视化全过程8:绘制中国地图,使用timeline把多个值放在一个地图上
  14. Cortex-M3/M4内核处理器一次中断事件可能产生两次中断问题
  15. Unity射线检测指定Layer的物体
  16. centos怎么把计算机调到桌面,CentOS下命令行和桌面模式的切换方法
  17. [附源码]计算机毕业设计Python+uniapp智能公交查询APP59sm2(程序+lw+APP+远程部署)
  18. DDR3的学习笔记(一)
  19. 苹果疑似抄袭小米和锤子,其实这几年它一直都在模仿安卓
  20. c2000 电阻采样_采样电阻选型

热门文章

  1. WSS 3.0与MOSS 2007重要更新
  2. oracle数据库sga用途_oracle数据库的SGA和PGA,及分配指导
  3. c语言side输出空心正方形,回溯法--正方形(蛋糕切分)问题
  4. 转:Git: 对象原理
  5. IE6 position:fixed bug (固定窗口方法)
  6. Java开发面试题汇总 -- 精选版(附答案)
  7. Qt笔记——MOC(莫克)
  8. plc算法相关论文参考
  9. 2017年初BAT的JAVA面试题汇集
  10. 如何在打开谷歌的时候强制跳转google.com