基于这篇介绍我实现了基于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实现]相关推荐

  1. 生产排程系统_生产计划排程APS系统中排产算法的探讨

    点击上方 MES百科 关注我们 e-works鼓励原创,如需投稿请参看首页"原创投稿"说明. ✎导 读 生产计划排程既有相对简单的算法,例如,最短交货期算法,最短工序算法等,也有复 ...

  2. 生产排程系统_高级计划与排程的基本概念

    基于高级排程的供应链优化 高级计划与排程的基本概念 高级计划与排程(Advanced Planning and Scheduling,简称" APS" ),是解决生产排程和生产调度 ...

  3. 生产排程系统_高级计划排产系统APS,已成为提高企业生产效率的核心利器!

    一.ERP改变中国 几年前,金蝶董事局主席徐少春撰写了<ERP改变中国>. 的确,这本书出版之前的几年中,中国企业界开始认识并运用ERP(企业资源计划)提高企业的管理水平. 一时间,ERP ...

  4. java改写weka中的算法_用Eclipse在Weka中嵌入新算法

    本文介绍添加一个新算法到Weka集成环境中的过程,并能在GUI中运行并显示其结果.想做到这一点有两种方法,一是用ANT命令生成新的weka.jar(稍后写教程),二是用IDE(Eclipse或NetB ...

  5. java \t怎么从头开始_通过这些简单的步骤从头开始学习Java

    java \t怎么从头开始 Java是用于软件开发的最受欢迎的编程语言之一. 无论您的最终目标或技能水平如何,学习和掌握Java都将为您作为开发人员打开大门. 今天,我们将讨论一些原因,我们认为您应该 ...

  6. 两个矩阵是否相交的算法_刷透近200道数据结构与算法,成功加冕“题王”,挤进梦中的字节!...

    不管是学生还是已经工作的人,我想彼此都有一个相同的梦想:进大厂! 眼看着2020年还有个三十来天就要完美收尾了,那么如何才能在未来三个月弯道超车赶上"金三银四的春招",进入梦寐以求 ...

  7. 一致性hash算法_(图文案例)一致性哈希算法详解 一点课堂(多岸教育)

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  8. umap算法_生命科学中的 UMAP(降维算法)

    UMAP应该说是目前最好的降维算法了,能最大程度的保留原始数据的特征同时大幅度的降低特征维数. 这是<生命科学的数理统计和机器学习>的相关探讨,我试图介绍生物信息学.生物医学.遗传学等常见 ...

  9. java查看对象锁级别_对象级别锁 vs 类级别锁(Java)

    前言 对于多线程(并发)和Spring Boot这两块在同步进行学习中,在看到使用synchronized关键字使操作同步时,看到和C#中不一样的东西,所以这里呢,就深入学习了下,若有错误之处,还望指 ...

最新文章

  1. 用db-RDA进行微生物环境因子分析-“ggvegan“介绍
  2. c# java gt;gt;gt;,相同的字节数组=gt; Java和C#中的不同BigInteger值
  3. python 语言教程(3)变量之列表(List)
  4. spwm逆变器双极性matlab教程,三相逆变器双极性SPWM调制技术的仿真(论文资料).doc...
  5. java11创建项目_2019-04-11 使用IDEA创建SpringBoot项目
  6. mysql允许所有用户连接_Mysql权限控制 - 允许用户远程连接
  7. python中有那几种赋值_详解Python列表赋值复制深拷贝及5种浅拷贝
  8. React:Conditional Rendering(条件渲染)
  9. mysql function 事务_MySQL 事务
  10. 安卓一步一步搭建组件化
  11. Nacos高可用集群解决方案-Docker版本
  12. android 自定义唤醒词,星星1号语音升级 中兴语音助手实现可自定义唤醒词
  13. java实现求调和数列的和,即:1/1 + 1/2 + ... + 1/n
  14. 服务器网卡支持热插拔吗,HDMI接口能“热插拔”吗?这篇告诉你
  15. Java 获取、删除Word文本框中的表格
  16. 本人大三准备写计算机安全毕业设计求想法
  17. Oracle练习脚本
  18. sqlserver Sum求和float类型 数据不准问题
  19. Python学习手册--第二部分(数据类型)
  20. 【ADB 操作命令详解及用法大全(非常全)】

热门文章

  1. 用vector实现一个变长数组
  2. Aizu 0525 Osenbei(状压+贪心)
  3. QT中文显示乱码解决
  4. Linux服务器程序编程的几个坎
  5. 影响网站转化率的10大误区(上)
  6. Nebula3的Input系统
  7. 基于ARM的GCC编译器,各版本arm-gcc区别与安装
  8. 中汽协谈芯片短缺:芯片价格或上涨,部分车企在明年会受较大影响
  9. 编译原理三大经典书籍(龙书 虎书 鲸书)
  10. JAVA基础中容易踩坑的知识点