java实现排程算法_康托展开算法和逆康托展开算法[Java实现]
基于这篇介绍我实现了基于Java的算法
都能看懂的康托展开_ltrbless的博客-CSDN博客blog.csdn.net
条件
一个数组:[1, 2, 3, 4, 5]
康托展开算法
找出 52413 是这个数组的全排列中的第几个
算法详解:
5 作为第一个数,比它小的数有四个,5 的后面有4个位置可待排序使用,则这四个数的全排列有 4 * 4! 种2 作为第二个数,比它小的数只有一个,2 后面只有3个位置可用来做全排列使用,全排列的个数是 1 * 3!4 作为第三个数,比它小的数有3个,但是2已经使用过了,所以只能用2个,全排列的个数是 2 * 2!同理可得 1 有 0 * 1!种,3 有 0 * 0!种把上面提到的全排列的种数相加就得到了 106
因为这种算法是从 0 开始计算的,所以 52413 是第 106+1 个排列
Java源码
/*** 输入一个整数,返回它是该数组全排列里面的第几个数** @param n* @return*/public static int cantorExpansion(int n) {int position = 0;String number = String.valueOf(n);for (int i = 0; i < number.length(); i++) {position += (getMinCount(number.charAt(i), number, i) * getFactorial(number.length()-i-1));}return position + 1;}// 求小于等于 x 的数有几个,且排除已经处理过的数public static int getMinCount(char x, String number, int index) {Integer num = Integer.valueOf(String.valueOf(x));for (int i = 0; i < index; i++) {Integer tmp = Integer.valueOf(String.valueOf(number.charAt(i)));if (tmp < num) {num--;}}return num - 1;}// 求x的阶乘public static int getFactorial(int x) {if (x == 0)return 1;int res = x;for (int i = 1; i < x; i++) {res *= i;}return res;}public static void main(String[] args) {System.out.println(cantorExpansion(52413)); // 107System.out.println(cantorExpansion(312)); // 5System.out.println(cantorExpansion(34125)); // 61}
逆康托算法
该数组的全排列中的第 107 个排列是什么数找到
算法详解:n = 5, k = 107
上面提到过,康托展开是从 0 开始计算的,所以求 107 个排列数的时候应该求的是 10612345 作为第一个排列数,每一个数字可以排列的次数是 4!,3!,2!,1!,0!用 106 / 24 = 4 ... 10 可以得到第106个排列的第一个数字应该是 array[4] = 5第一个数找到之后更新 k 为上一次计算的余数,同时把上一次在数组中找到的数删除,重复以上过程最终得到一个数字序列,该序列就是第 107 个排列对应的数据
Java源码
public static void main(String[] args) {System.out.println(inverseCantorExpansion(5, 107));//52413System.out.println(inverseCantorExpansion(8, 27));// 12354768}/*** 给出 [1,2,3,...,n] 数组以及该数组全排列的第 K 个序列编号,求第 K 个数是啥** @param n 数组的最大值* @param k 序号* @return 第K个数的值*/public static String inverseCantorExpansion(int n, int k) {// 先搞一个1~n的数组,用来在里面选择合适的数字加入 ans 中ArrayList<Integer> array = new ArrayList<>(n);for (int i = 0; i < n; i++) {array.add(i + 1);}StringBuilder ans = new StringBuilder();k -= 1;// 执行 n 次循环得到 n 个数,组合成一个答案for (int i = 0; i < n; i++) {// 计算从 (n-1)! 开始的阶乘int Xfactorial = getFactorial(n - i - 1);// 计算获取数组的那一个位置的数字int index = k / Xfactorial;// 获取该数字ans.append(array.get(index));// 更新 k 为上一次除法计算的余数k %= Xfactorial;// 同时更新数组,删除已经获得过的数字array.remove(index);}return ans.toString();}// 求x的阶乘public static int getFactorial(int x) {if (x == 0)return 1;int res = x;for (int i = 1; i < x; i++) {res *= i;}return res;}
本文算法文字解释很简洁,看不明白的话可以看我开头引用的CSDN博客的介绍。
看完他的介绍再看我的就十分清晰了。
java实现排程算法_康托展开算法和逆康托展开算法[Java实现]相关推荐
- 生产排程系统_生产计划排程APS系统中排产算法的探讨
点击上方 MES百科 关注我们 e-works鼓励原创,如需投稿请参看首页"原创投稿"说明. ✎导 读 生产计划排程既有相对简单的算法,例如,最短交货期算法,最短工序算法等,也有复 ...
- 生产排程系统_高级计划与排程的基本概念
基于高级排程的供应链优化 高级计划与排程的基本概念 高级计划与排程(Advanced Planning and Scheduling,简称" APS" ),是解决生产排程和生产调度 ...
- 生产排程系统_高级计划排产系统APS,已成为提高企业生产效率的核心利器!
一.ERP改变中国 几年前,金蝶董事局主席徐少春撰写了<ERP改变中国>. 的确,这本书出版之前的几年中,中国企业界开始认识并运用ERP(企业资源计划)提高企业的管理水平. 一时间,ERP ...
- java改写weka中的算法_用Eclipse在Weka中嵌入新算法
本文介绍添加一个新算法到Weka集成环境中的过程,并能在GUI中运行并显示其结果.想做到这一点有两种方法,一是用ANT命令生成新的weka.jar(稍后写教程),二是用IDE(Eclipse或NetB ...
- java \t怎么从头开始_通过这些简单的步骤从头开始学习Java
java \t怎么从头开始 Java是用于软件开发的最受欢迎的编程语言之一. 无论您的最终目标或技能水平如何,学习和掌握Java都将为您作为开发人员打开大门. 今天,我们将讨论一些原因,我们认为您应该 ...
- 两个矩阵是否相交的算法_刷透近200道数据结构与算法,成功加冕“题王”,挤进梦中的字节!...
不管是学生还是已经工作的人,我想彼此都有一个相同的梦想:进大厂! 眼看着2020年还有个三十来天就要完美收尾了,那么如何才能在未来三个月弯道超车赶上"金三银四的春招",进入梦寐以求 ...
- 一致性hash算法_(图文案例)一致性哈希算法详解 一点课堂(多岸教育)
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- umap算法_生命科学中的 UMAP(降维算法)
UMAP应该说是目前最好的降维算法了,能最大程度的保留原始数据的特征同时大幅度的降低特征维数. 这是<生命科学的数理统计和机器学习>的相关探讨,我试图介绍生物信息学.生物医学.遗传学等常见 ...
- java查看对象锁级别_对象级别锁 vs 类级别锁(Java)
前言 对于多线程(并发)和Spring Boot这两块在同步进行学习中,在看到使用synchronized关键字使操作同步时,看到和C#中不一样的东西,所以这里呢,就深入学习了下,若有错误之处,还望指 ...
最新文章
- 用db-RDA进行微生物环境因子分析-“ggvegan“介绍
- c# java gt;gt;gt;,相同的字节数组=gt; Java和C#中的不同BigInteger值
- python 语言教程(3)变量之列表(List)
- spwm逆变器双极性matlab教程,三相逆变器双极性SPWM调制技术的仿真(论文资料).doc...
- java11创建项目_2019-04-11 使用IDEA创建SpringBoot项目
- mysql允许所有用户连接_Mysql权限控制 - 允许用户远程连接
- python中有那几种赋值_详解Python列表赋值复制深拷贝及5种浅拷贝
- React:Conditional Rendering(条件渲染)
- mysql function 事务_MySQL 事务
- 安卓一步一步搭建组件化
- Nacos高可用集群解决方案-Docker版本
- android 自定义唤醒词,星星1号语音升级 中兴语音助手实现可自定义唤醒词
- java实现求调和数列的和,即:1/1 + 1/2 + ... + 1/n
- 服务器网卡支持热插拔吗,HDMI接口能“热插拔”吗?这篇告诉你
- Java 获取、删除Word文本框中的表格
- 本人大三准备写计算机安全毕业设计求想法
- Oracle练习脚本
- sqlserver Sum求和float类型 数据不准问题
- Python学习手册--第二部分(数据类型)
- 【ADB 操作命令详解及用法大全(非常全)】