深度优先搜索、广度优先搜索DFS/BFS(含代码)

深度优化搜索

深度优化遍历( Depth First Search ),也有称为 深度优化搜索 ,简称为 DFS 。事实上,我
们在树的遍历中早已涉及DFS,前序遍历、中序遍历和后序遍历都属于深度优先遍历的⽅式,因为这些遍历⽅式本质上都归结于
步骤:
  1. 任选一个结点开始,标记已访问结点
  2. 向下搜索并标记
  3. 全部被标记就返回,退栈

优点

不需要保存搜素中的状态,空间优化。适合搜索全部的解

缺点

因为递归,时间慢。如果不给递归限制深度,很容易超出时间限制。

广度优先搜素

⼴度优先遍历(Breadth First Search),⼜称为⼴度优先搜索,简称BFS。树的层序遍历⽅
式便是⼀种⼴度优先搜索⽅式。
步骤:
  1. 将初始点入队
  2. 从队列取出头结点,判断初始点的周围结点,将符合条件的结点入队
  3. 重复步骤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);
            }
        }
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值