【算法笔记】数论基础:康托展开(全排列和序号之间的映射)
参考博客: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]<<' ';
【算法笔记】数论基础:康托展开(全排列和序号之间的映射)相关推荐
- 《算法笔记》——基础篇习题选择结构
<算法笔记>--基础篇习题 第二章 C/C++快速入门--2.3选择结构 [习题A] 一元二次方程求根 Problem Description Thinking Notes Code Im ...
- 你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)
摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过.同时数论基础也是 Hash 算法,RS ...
- 关于数论【康托展开及其逆运算】
表示这个东西背了很多次,但是次次忘,希望这次能够记住吧. 康托展开: 问45231是n=5的全排列中第几个排列? ans:= 3*4! + 3*3! + 1*2! + 1*1! + 0*0! =93 ...
- 左程云算法笔记总结-基础提升篇
提升01(哈希) 认识哈希函数 哈希函数的输入一般需要是无穷尽的,没有限制:输出可以有一定的范围,比如MD5加密后产生的字符串可以有2的32次方-1种,用十六进制表示需要16个字符. 相同的输入对应相 ...
- 左程云算法笔记总结-基础篇
基础01(复杂度.基本排序) 认识复杂度和简单排序算法 时间复杂度 big O 即 O(f(n)) 常数操作的数量写出来,不要低阶项,只要最高项,并且不要最高项的系数 一个操作如果和样本的数据量没有关 ...
- 判断是否为二叉排序树的递归算法_左神直通BAT算法笔记(基础篇)
时间复杂度 空间复杂度 经典例题 找出B中不属于A的数 荷兰国旗问题 矩阵打印问题 岛问题 经典结构和算法 字符串 KMP算法 前缀树 数组 冒泡排序 选择排序 插入排序 归并排序 快速排序 堆排序 ...
- 前端算法笔记-数据结构基础
前言 打算从0开始,用JavaScript刷题. 买了修言老师的小册子:前端算法与数据结构面试:底层逻辑解读与大厂真题训练 希望每天下班之后可以看一篇,争取早日上岸吧~ 数据结构 我的想法:不同语言对 ...
- [算法笔记]二叉树基础
前言:部分资料引自极客大学<数据结构与算法之美>,感谢王争老师! 参考链接: https://visualgo.net/en/bst?slide=1 https://zh.wikipedi ...
- 【有营养的算法笔记】基础算法 —— 推导证明前缀和与差分
- java实现排程算法_康托展开算法和逆康托展开算法[Java实现]
基于这篇介绍我实现了基于Java的算法 都能看懂的康托展开_ltrbless的博客-CSDN博客blog.csdn.net 条件 一个数组:[1, 2, 3, 4, 5] 康托展开算法 找出 524 ...
最新文章
- 5月,我面试了60多号人,写了些总结
- iOS开发那些事-故事板实现标签导航
- The Guy Who Ran Microsoft And Google In China Clones US Startups
- 五十二、微信小程序云开发中的云存储
- CodeForces - 1354E Graph Coloring(dfs判断二分图+dp)
- 蓝桥杯 - 连号区间数(暴力)
- byte数组存的是什么_结构体内存对齐是什么鬼?
- vue.js踩坑之ref引用细节点
- 拦截器ConnectInterceptor
- xenCenter创建镜像库和挂载硬盘
- java学生管理系统(简单版)
- 关于网页数据导入excel问题
- 使用Pyecharts进行全国水质TDS地图可视化全过程8:绘制中国地图,使用timeline把多个值放在一个地图上
- Cortex-M3/M4内核处理器一次中断事件可能产生两次中断问题
- Unity射线检测指定Layer的物体
- centos怎么把计算机调到桌面,CentOS下命令行和桌面模式的切换方法
- [附源码]计算机毕业设计Python+uniapp智能公交查询APP59sm2(程序+lw+APP+远程部署)
- DDR3的学习笔记(一)
- 苹果疑似抄袭小米和锤子,其实这几年它一直都在模仿安卓
- c2000 电阻采样_采样电阻选型