Java 全排列输出算法,执行效率对比
来源:互联网 发布:ifconfig 修改mac 编辑:程序博客网 时间:2024/06/16 11:46
Java 全排列输出算法,比如“ABCD”进行全排列:
ABCD ABDC ACBD ACDB ADBC ADCB BACD BADC BCAD BCDA BDAC BDCA CABD CADB CBAD CBDA CDAB CDBA DABC DACB DBAC DBCA DCAB DCBA
一下试两种思路:
一、代码看着有点懵懵的,一步一步的,太伤脑筋了。。
思路:以ABCD为例,先取出A,然后对BCD进行排列,然后再取出B,对CD进行排列,得到ABCD,ABDC
依次下去....ACBD ACDB.....
import java.util.Date;/** * 递归实现全排列 * @author yx * * 2017-6-30 */public class Test2 {public static void main(String[] args) {Date d1 = new Date();String str = "ABCD";new Test2().printStr(str);Date d2 = new Date(); System.out.println(d2.getTime() - d1.getTime());}public void printStr(String str) { int len = str.length(); for (int i=0; i<len; i++) { String s = String.valueOf(str.charAt(i)); StringBuffer buffer = new StringBuffer(str); buffer.deleteCharAt(i); System.out.println(s + buffer); printStr(s, buffer.toString()); } } public void printStr(String start, String str) { int len = str.length(); for (int i=0; i<len; i++) { String s = String.valueOf(str.charAt(i)); StringBuffer buffer = new StringBuffer(str); buffer.deleteCharAt(i); if (i != 0) System.out.println(start + s + buffer); printStr(start + s, buffer.toString()); } } }二、
import java.util.Date;public class Test {public static void main(String[] args) {Date d1 = new Date();String str = "ABCDEFHGI";char[] chars = str.toCharArray(); permutation(chars); Date d2 = new Date(); System.out.println(d2.getTime() - d1.getTime());}/** 数组元素的全排列 */ static void permutation(char[] chars) { permutation(chars, 0, chars.length - 1); } /** 数组中从索引begin到索引end之间的子数组参与到全排列 */ static void permutation(char[] chars, int begin, int end) { if (begin == end) { //只剩最后一个字符时为出口 for (int i = 0; i < chars.length; ++i) { System.out.print(chars[i]); } System.out.println(); } else { for (int i = begin; i <= end; ++i) { //每个字符依次固定到数组或子数组的第一个 if (canSwap(chars, begin, i)) { //去重 swap(chars, begin, i); //交换 permutation(chars, begin + 1, end); //递归求子数组的全排列 swap(chars, begin, i); //还原 } } } } static void swap(char[] chars, int from, int to) { char temp = chars[from]; chars[from] = chars[to]; chars[to] = temp; } static boolean canSwap(char[] chars, int begin, int end) { for (int i = begin; i < end; ++i) { if (chars[i] == chars[end]) { return false; } } return true; }}
方法一不能排除重复的,比如“ABCDA”,就会出现重复的情况
方法二可以排除这种情况
方法二执行效率不如方法一,当字符串长度为7、8的时候,方法一的速率是方法二的4倍左右
阅读全文
0 0
- Java 全排列输出算法,执行效率对比
- java 全排列算法
- java全排列算法
- 全排列算法-Java
- JAVA全排列算法
- JAVA全排列算法
- 疯狂java 输出全排列
- java实现全排列输出
- 算法问题(2)输出全排列
- 全排列算法(Java实现)
- 全排列算法【java实现】
- 全排列算法java实现
- Java 实现全排列算法
- java算法字符串全排列
- JAVA全排列递归算法
- 算法训练 全排列 JAVA
- 全排列算法Java实现
- java算法全排列Demo
- 本地视频播放器
- 使用jquery.more.js来实现点击底部更多后, 底部加载出新的数据
- Node如何处理模块之间的关系
- 错误: symbol lookup error: /usr/local/lib/libreadline.so.6: undefined&
- 数据库优化
- Java 全排列输出算法,执行效率对比
- CentOS下Tomcat服务器宕机自动启动方法
- Entity Framework Code First添加修改及删除外键关联实体
- 成功的背后!(给所有IT人)
- 即时通讯——详解音视频同步技术
- Java多线程几个方法的简单介绍
- Hibernate hql 查询指定字段并获取结果集
- Lua:函数闭包的方式实现面向对象
- windows10+matlab2014a+faster-rcnn