目录
1.给定n个不同的数字(如1-n),请打印出m(m<=n)个数的排列,数量为A(n,m)。
2.给定n个不同的数字(如1-n),请打印出m(m<=n)个数的组合,数量为C(n,m)。
1.什么是DFS?
DFS(Depth First Search,中文:深度优先算法):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。
2.基本思路
深度优先遍历图的方法是,从图中某顶点v出发:
(1)访问顶点v;
(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。 当然,当人们刚刚掌握深度优先搜索的时候常常用它来走迷宫.事实上我们还有别的方法,那就是广度优先搜索(BFS).
搜索算法简而言之就是穷举所有可能情况并找到合适的答案,所以最基本的问题就是罗列出所有可能的情况。
从根开始计算,到找到位于某个节点的解,回溯法(深度优先搜索)作为最基本的搜索算法,其采用了一种“一只向下走,走不通就掉头”的思想(体会“回溯”二字),相当于采用了先根遍历的方法来构造搜索树。
3.DFS算法模板
定义三个数据集,分别用于数据的填充、已有的数据集和要输出的结果集。
当数据在填充过程中满足要求时,不再对后续的数据进行填充,所以清除index位置以及后续位置的数据
import java.util.ArrayList;
import java.util.List;
/*
* DFS基类
*/
public abstract class DFS<T> {
//填充空间
protected List<T> buffer=new ArrayList<>();
//数据集
protected List<T> datalist=new ArrayList<>();
//结果集,用于输出结果
protected List<String> resultlist=new ArrayList<>();
protected abstract void dfs(int index);
/*
*清除index位置以及后续位置的数据
* @param index
*/
protected void clearNextData(int index){
for (int i=index ;i<buffer.size();i++){
buffer.set(i,null);
}
}
}