减治法在生成组合对象问题中的应用

在深入浅出讲算法思想--蛮力法思想分析及应用这篇文章的最优解问题中中已经初步讲解了这类应用,下面我们将使用减治法再次思考这类问题。

1、全排列问题,在数学中求解一个n个数组合的全排列问题会产生n!个组合的情况。暴力枚举的确是个方法,但是除非n非常的小,不然这个时间复杂度是非常庞大的,但是如果运用减治思想就可以解决这种问题,我们便可以将我们可以将生成n!个排雷的问题变为求解(n-1)!个全排列的问题,之后再将n插入n-1个元素每种排列中n可能的位置中去。因为n*(n-1)!=n!,所以这就是该算法的可行性分析。

1)简单回溯实现:

public class Main {static int[] a = new int[4];static int[] visit = new int[4];public static void main(String[] args) {int n = 3;f(0, n);}private static void f(int cur, int n) {if (cur == n) {for (int i = 0; i < n; i++) {if ((i+1) % 3 == 0) {System.out.print(a[i] + " ");System.out.println();} else {System.out.print(a[i] + " ");}}}for (int i = 1; i <= n; i++) {if (visit[i] == 0) {visit[i] = 1;a[cur] = i;f(cur+1, n);visit[i] = 0;}}}
}

2)Johnson-Trotter算法实现:参考 johnson_trotter(生成排列算法)

3)字典序实现:第二种算法实现的结果输出是从最后一个开始的,不过,按照习惯上的写法,我们总是希望结果是按照升序排列的,而字典序可以实现这种即高效又是升序的效果。

public class Main {public static void main(String[] args) {int arr[] = new int[]{1,2,3};sort(arr);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]);}System.out.println();while(nextPermutation(arr)){for(int value : arr)System.out.print(value);System.out.println();}}public static boolean nextPermutation(int[] arr){int pos1 = 0;int pos2 = 0;/*** 找到使得a[i] < a[i+1]的最大的i,赋给pos1* 用于将123变为132这样的情况* */int flag = 0;for(int i = arr.length - 2;i >= 0;i--) {if(arr[i] < arr[i + 1]) {pos1 = i;flag = 1;break;}}if(flag == 0) {return false;}/*** 找到使得a[i]<a[j]的最大的j,赋给pos2* 用于362541变为364125这样的情况* */for(int j = pos1 + 1;j < arr.length;j++) {if(arr[j] > arr[pos1]) {pos2 = j;}}/*** 交换a[pos1]与a[pos2]* */int temp = arr[pos1];arr[pos1] = arr[pos2];arr[pos2] = temp;/*** 对a[i+1]到a[n]逆序* */for (int i = pos1+1; i < arr.length; i++) {for (int j = arr.length-1; j > i ; j--) {temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}return true;}/*** 冒泡* */public static void sort(int[] arr) {for(int i = 0;i < arr.length - 2;i++) {for(int j = 0;j < arr.length - i - 1;j++) {if(arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}
}

减治法在生成全排列中的应用(JAVA)--回溯、Johnson-Trotter算法、自字典序相关推荐

  1. 减治法在组合问题中的应用 ——8枚硬币问题

    实验题目 在8枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重.可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测这枚假币. 实验要求 1) ...

  2. 减治法解决八枚硬币问题/假币问题(JAVA)----二分,三分,不知轻重的情况

    八枚硬币问题 在八枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重.可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测出这枚假币. 我们先假 ...

  3. 减治法在生成子集问题中的应用(JAVA)--递归、二进制反射格雷码

    减治法在生成组合对象问题中的应用 生成子集问题:经典的背包问题就是求解一个最优子集的问题,这里我们来讨论一个更简单的问题.对于任意一个集合来说,它都存在2^n个子集(一个集合所有的子集集合称为幂集). ...

  4. 减治法在求解拓扑排序问题中的应用(JAVA)--有向无环图

    减治法在求解拓扑排序问题中的应用 拓扑排序:对于一个有向无环图来说,如果我们能够按照次序列出顶点,使得对于每条边来说,边的起始顶点总是排在边的结束顶点之前,那么这个过程就称为拓扑排序,拓扑排序有解是一 ...

  5. 减治法在排序算法中的应用(JAVA)--插入排序

    一.减治法在排序算法中的应用 插入排序:时间复杂度O(n^2),虽然和选择.冒泡在最坏的情况下时间复杂度相同,但是插排平均性能在比自身的最差性能快一倍,所以相比选择.冒泡来说,插排要领先于二者. pu ...

  6. 减治法在查找算法中的应用(JAVA)--二叉查找树的查找、插入、删除

    减治法在查找算法中的应用 二叉查找树的查找与插入: 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于或等于它的根节点的值: (2)若右子树不空, ...

  7. 减治法在查找算法中的应用(JAVA)--快速查找

    减治法在查找算法中的应用 快速查找:选择问题是求一个n个数列表的第k个最小元素的问题,这个数k被称为顺序统计量.对于k=1或k=n来说,这并没有什么意义,我们通常会要找出这样的元素:该元素比列表中一半 ...

  8. 减治法在查找算法中的应用(JAVA)--折半查找

    减治法在查找算法中的应用 折半查找:(时间复杂度O(log以2为底n的对数)) 对于有序数组的查找来说,折半查找是一种非常高效的算法,其基本原理为:比较查找键k和数组中间元素a[m],如果相等,算法结 ...

  9. 减治法(Decrease and Conquer)

    减治法 减治法是一种一般性的算法设计技术,它利用了一个问题给定实例的解和同样问题较小实例的解之间的关系.一旦建立了这样一种关系,我们既可以自顶至下(递归)也可以自底至上地运用它(非递归). 减治法有3 ...

最新文章

  1. 假如AI也会diss人类,他们会这样.....
  2. synchronized(class)、synchronized(this)与synchronized(object)的区别分析
  3. 第 2 章 常量、变量和表达式
  4. 盘点Kubernetes网络问题的4种解决方案
  5. 数据产品通用复合指标查询计算的实践
  6. Lync Server外部访问系列PART6:启用外部访问
  7. Mac OS 在远程主机(Linux 系统)上使用命令执行 sql 脚本文件(使用的是 MySQL 数据库)
  8. Tony的口胡呼呼(。-ω-)zzz
  9. 九度OJ 1340:小A的计算器 (进制转换)
  10. linux c获取网卡ip,linux c获取IP地址
  11. 图片不存放文件夹,直接存在数据库中,
  12. 字体的基础知识:中文字体的特征
  13. 网络流行简笔画图片大全,互联网图标简笔画
  14. android陀螺仪方向,获得陀螺仪传感器Android的输出
  15. 邮箱邮件安全问题有哪些?如何做邮件安全宣传?
  16. mysql脏数据_mysql的刷脏
  17. 百度网盘打不开的问题的解决
  18. 安卓手机安装软件提示存储空间不足的解决方法
  19. Python 报错 Fatal Python error: PyFrame_BlockPop: block stack underflow 如何解决?
  20. linux磁盘管理相关命令

热门文章

  1. 电脑向linux服务器传输文件,windows如何通过ssh工具向linux服务器上传和下载文件?...
  2. python给js变量赋值_python 之 前端开发( JavaScript变量、数据类型、内置对象、运算符、流程控制、函数)...
  3. 域控服务器取消验证_记一次域控服务器应急
  4. 经典sql语句50题_SQL面试经典50题:带你从建表开始
  5. linux进程运行队列,Linux进程调度中队列的使用
  6. oracle导出有分区表的用户,分区表导出导入
  7. Java 在指定目录下查找文件
  8. python平方数迭代器_Python三大神器之迭代器详解
  9. 【OpenCV 例程 200篇】98. 统计排序滤波器
  10. MXNet的Model API