概要
这是参加阿里云的云计算7天实践训练营的第五天的笔记,老规矩,参加活动前的同学,可以前去白嫖近一年的云服务器,详情戳这里
笔记汇总
今日笔记
**采取的算法**
编程过程所需要的算法是深度优先算法(Depth-First-Search)简称DFS算法,它可以很好的实现一个排列枚举。这里用一个123的排列来看看暴力的枚举算法是怎么实现的:
// 枚举全排列算法
public static void allArray(){
// 求123 的全排列组合
int i =0;
for (int a = 1; a <=3; a++) {
for (int b = 1; b <= 3 ; b++) {
for (int c = 1; c <= 3 ; c++) {
if(a != b && a !=c & b!=c){
i++;
System.out.println("第"+i+"种组合:"+a+b+c);
}
}
}
}
}
结果:
第1种组合:123
第2种组合:132
第3种组合:213
第4种组合:231
第5种组合:312
第6种组合:321
貌似看起来也不复杂嘛,但是如果排列的数多起来了,过程就变得繁琐起来,这里我们来看看DFS算法是怎么实现的:
public class DfsSearch {
//深度优先算法的算123的全排列(思想基于枚举)
static int[] a = new int[10]; //代表123中的某个数
static int[] book = new int[10]; // 标记数字已经被选过
static int n = 3; //代表要求1到n直接的全排列
static int total = 0;
public static void allArray(int step){
//1.step表示当前出现在第几个位置
if(step == n+1){
//当step等于n+1时说明,前面n个位置已经排列好了数字
System.out.print("第"+(total+1)+"种组合:");
for (int i = 1; i <=n ; i++) {
System.out.print(a[i]);
}
total++;
System.out.println("n-------------------");
return;
}
//2.当前第step位置还没到n+1,此时需要排列数字
// 按照1.2.3...n的顺序依次尝试
for (int i = 1; i <= n; i++) {
//判断当前数字是否已经放入过了
if(book[i] ==0){
//表示当前数字可以使用
a[step]=i;
//标记为已使用,不能再次被使用
book[i]=1;
//第step位置已经放好数字,接下来需要放step+1
allArray(step+1);
book[i]=0;
}
}
return;
}
public static void main(String[] args) {
// 表示从第1个位置开始进行
allArray(1);
System.out.println("共计排列组合种数:"+total);
}
}
结果:
第1种组合:123
第2种组合:132
第3种组合:213
第4种组合:231
第5种组合:312
第6种组合:321
共计排列组合种数:6
基本模型:
public void dfs(int step){
判断边界
尝试每一种可能
for (int i = 0; i <=n ; i++) {
继续下一步
dfs(step+1);
}
}
以上就是DFS算法的一个介绍