深度优化搜索
深度优化遍历( Depth First Search ),也有称为 深度优化搜索 ,简称为 DFS 。事实上,我
们在树的遍历中早已涉及DFS,前序遍历、中序遍历和后序遍历都属于深度优先遍历的⽅式,因为这些遍历⽅式本质上都归结于栈
步骤:
- 任选一个结点开始,标记已访问结点
- 向下搜索并标记
- 全部被标记就返回,退栈
优点
不需要保存搜素中的状态,空间优化。适合搜索全部的解
缺点
因为递归,时间慢。如果不给递归限制深度,很容易超出时间限制。
广度优先搜素
⼴度优先遍历(Breadth First Search),⼜称为⼴度优先搜索,简称BFS。树的层序遍历⽅
式便是⼀种⼴度优先搜索⽅式。
步骤:
- 将初始点入队
- 从队列取出头结点,判断初始点的周围结点,将符合条件的结点入队
- 重复步骤2直至队列为空
缺点
要保持搜素中的状态,大量判重
优点
适合用来找最优解(最短路径)
public void bfs(){
Queue<Integer> queue = new PriorityQueue<>();
//标记数组初始化
for (int i = 0;i<mGraph.vNums;i++){
visited[i] = false;
}
for (int i = 0; i < mGraph.vNums; i++) {
//如果当前结点没有访问过
if(!visited[i]){
System.out.println(mGraph.v[i]);
//1.将初始点入队
queue.add(i);
visited[i] = true;
while(!queue.isEmpty()){
//2.从队列取出第一个结点
int v = queue.remove();
for (int j = v; j < mGraph.vNums; j++) {
//2.判断初始结点周围结点是否符合条件
if(mGraph.arcs[v][j]==1&&!visited[j]){
visited[j] = true;
System.out.println(mGraph.v[j]);
//2.将符合条件的结点入队
queue.add(j);
}
}
}
}
}
}
/**
* 递归进行遍历
* @param i 开始结点
*/
public void dfs(int i){
//任选一个结点开始,并标记该结点
visited[i] = true;
System.out.println(mGraph.v[i]);
for (int j = 0;j<mGraph.vNums;j++){
//向下搜索
if(mGraph.arcs[i][j]==1&&!visited[j]){
dfs(j);
}
}
//全部被标记退栈
}
public void dfsTraverse(){
// 初始化所有顶点状态都是未访问过状态
for(int i=0; i < mGraph.vNums; i++ )
{
visited[i] = false;
}
for (int i = 0;i< mGraph.vNums;i++){
if(!visited[i]){
dfs(i);
}
}
}