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

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

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

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;}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

减治法在生成组合对象问题中的应用 生成子集问题&#xff1a;经典的背包问题就是求解一个最优子集的问题&#xff0c;这里我们来讨论一个更简单的问题。对于任意一个集合来说&#xff0c;它都存在2^n个子集&#xff08;一个集合所有的子集集合称为幂集&#xff09;。 1&…

【第九课】MriaDB密码重置和慢查询日志

目录 1、如何进行修改MariaDB的密码2、Mariadb的慢查询日志1、如何进行修改MariaDB的密码 记得root密码的修改方式&#xff1a; [rootlocalhost ~]# mysqladmin -uroot -p123456 password "123123" [rootlocalhost ~]# mysql -uroot -p Enter password: ERROR 1045 …

减治法解决俄式乘法问题(JAVA)

以上是在《算法设计与分析基础》一书中给出的定义。 这种算法只包括折半、加倍、相加这几个操作&#xff0c;在计算时&#xff0c;不需要用九九乘法表 。 同时&#xff0c;这个方法每次都会将计算的规模减少&#xff0c;运用了减治的思想 public class Main {public static…

1.需要对txt存放的测试数据做去重处理,代码如下

采用集合去重&#xff0c;在新文件里逐行写入&#xff0c;达成目的 old_file "D:/testdata/memberId.txt" #old result_file "D:/testdata/memberId_new.txt" #new lines_seen set() out_file open(result_file, "w") f open(old_file, &q…

减治法解决尼姆(Nim)游戏/拈游戏问题(JAVA)

尼姆游戏是一种两个人玩的回合制数学策略游戏。游戏者轮流从一堆棋子&#xff08;一共有好几堆&#xff0c;一次只能从其中一堆拿。&#xff09;&#xff08;或者任何道具&#xff09;中取走一个或者多个&#xff0c;最后不能再取的就是输家。当指定相应数量时&#xff0c;一堆…

jquery中$(document).ready()和window.onload的区别

在Jquery里面&#xff0c;我们可以看到两种写法:$(function(){}) 和$(document).ready(function(){}) 这两个方法的效果都是一样的&#xff0c;都是在dom文档树加载完之后执行一个函数&#xff08;注意&#xff0c;这里面的文档树加载完不代表全部文件加载完&#xff09;。 $(d…

蛮力法在排序算法中的应用(JAVA)--选择排序、冒泡排序

蛮力法在排序算法中的应用 对于一个排序问题&#xff0c;我们能想到的最简单的排序方法就是选择和冒泡 1、选择排序&#xff1a;时间复杂度O(n^2) public class Main {public static void main(String[] args) {int[] a {89, 45, 68, 90, 29, 34, 17};int min;for (int i 0…

PyCherm的常用快捷键总结

、Ctrl Enter&#xff1a;在下方新建行但不移动光标&#xff1b; 2、Shift Enter&#xff1a;在下方新建行并移到新行行首&#xff1b; 3、Ctrl /&#xff1a;注释(取消注释)选择的行&#xff1b; 4、Ctrl Alt L&#xff1a;格式化代码(与QQ锁定热键冲突&#xff0c;关闭Q…

蛮力法在查找算法中的应用(JAVA)--顺序查找

蛮力法在查找算法中的应用 对于查找算法来说&#xff0c;最简单的一个思路就是逐个匹配&#xff0c;直到找到目标元素 顺序查找&#xff1a; public class Main {public static void main(String[] args) {int[] a {89, 45, 68, 90, 29, 34, 17, 0};int k 45;int i 0;a[a.…

Xshell报错“The remote SSH server rejected X11 forwarding request.”

xshell连接centos7&#xff0c;报错&#xff1a;“The remote SSH server rejected X11 forwarding request.” 打开文件/etc/ssh/sshd_config,修改下面的参数 X11Forwarding yes 如果有&#xff0c;那就不用修改 修改xshell连接属性 把勾选去掉即可&#xff01; 参考&#xff…

蛮力法在字符串匹配问题中的应用(JAVA)--朴素模式匹配算法

蛮力法在字符串匹配问题中的应用字符串匹配问题通常是给定一个n个字符组成的串&#xff08;称为文本&#xff09;&#xff0c;一个m&#xff08;m<n&#xff09;个字符的串&#xff08;称为模式&#xff09;&#xff0c;从文本中寻找匹配模式的子串。显然我们需要逐个匹配&a…

蛮力法在求解“最近对”问题中的应用(JAVA)

最近对问题是在计算几何问题中最简单的&#xff0c;是指在一个包含n个点的集合中&#xff0c;找到距离最近的两个点&#xff0c;我们这里只研究二维空间中的版本&#xff0c;高维计算基本类似&#xff0c;区别只在于计算两点之间距离的公式略有不同&#xff0c;下面是标准的欧几…

测试框架有哪些

自动化测试最近几年都是大热&#xff0c;这里结合网上以及自己的经验整理了一些&#xff0c;自动化测试必问的一些题目&#xff0c;为想进入软件测试行业的同学一点帮助。一、如何理解自动化测试&#xff1f; 每个面试自动化测试的&#xff0c;80%会被问到这个。不用太宽泛&…

蛮力法在求解凸包问题中的应用(JAVA)

凸包问题向来是计算几何中最重要的问题之一&#xff0c;许多各式各样的应用大多要么本身就是图凸包问题要么其中一部分需要按照凸包问题解决。 凸集合定义&#xff1a;对于平面上一个点集合&#xff0c;如果集合中的任意两点p和q为端点的线段都属于该集合&#xff0c;那么称这…

人生路上对我影响最大的三位老师

在我的人生路上对我影响最大的三位老师第一位那便可能是我小学一年级到五年级的数学老师&#xff0c;他对我的影响确实是挺大但都是负面的那个老师不怎么负责人经常进来上课都是一身酒味在他四年的教导下以至于我到了五年级了两位数的乘除法都忘的差不多了&#xff0c;其实这也…

蛮力法在求解最优解问题中的应用(JAVA)--旅行家问题、背包问题、分配问题

蛮力法在求解最优解问题中的应用 1、TSP&#xff08;旅行商问题&#xff09;要求我们找出一条n个给定城市之间的最短路径&#xff0c;使我们再回到出发的城市之前&#xff0c;对欧每个城市都只访问一次。我们可以用赋权图来描述这个问题&#xff0c;那么算法的目的就是求解一个…

分治法在排序算法中的应用(JAVA)--归并排序

分治法最常用的就是将规模为n的实例划分成两个n规模为n/2的实例 。推广到一般的情况&#xff0c;我们可以将规模为n的实例划分为b个规模为n/b的实例。这样对于算法的运行时间存在递推式&#xff1a;T(n) aT&#xff08;n/b&#xff09;f&#xff08;n&#xff09;&#xff0c;…

ant design Modal关闭时清除数据的解决方案

背景&#xff1a;modal组件关闭时不清除数据&#xff0c;原来输入的数据还存在 解决方案&#xff1a; 1、modal的api&#xff1a;destroyOnClose 2、手动控制modal的销毁 this.state {destroy:true //设一开始为不显示状态 }{this.state.isDestroy? : <Modal classNam…

分治法在排序算法中的应用(JAVA)--快速排序(Lomuto划分、Hoare划分、随机化快排)

分治法在排序算法中的应用--快速排序 时间复杂度&#xff1a;平均O(nlogn)&#xff0c;最坏O(n^2) 如果说归并排序是按照元素在数组中的位置划分的话&#xff0c;那么快速排序就是按照元素的值进行划分。划分方法由两种&#xff0c;本节将主要介绍Huare划分&#xff0c;这也是…

分治法在二叉树遍历中的应用(JAVA)--二叉查找树高度、前序遍历、中序遍历、后序遍

分治法在二叉树遍历中的应用 二叉树本身就是由两个更小的部分组成--左子树和右子树&#xff0c;所以二叉树的问题非常适合用分治法来解决。 二叉树的高度&#xff1a;从叶子到根之间的最长路径。我们可以理解为根的左子树高度和右子树高度加1&#xff08;加1代表根所在的层&a…