zoukankan      html  css  js  c++  java
  • DFS

    1 数岛个数

    1 1 1 0 1  

    1 1 0 0 1

    1 0 1 0 0

    0 0 0 0 0

    结果为3

    DFS:深度优先搜索,使用递归的遍历

    class Solution {
    public:
        
        int numIslands(vector<vector<char>>& grid) {
            if(grid.size()==0)
                return 0;
            int IslandsCount = 0; 
            for(int i = 0;i<grid.size();++i)
            {
                for(int j =0;j<grid[0].size();++j)
                {
                    if(grid[i][j]==1)
                    {
                        IslandsCount++;
                        dfs(grid,i,j);//标记出当前岛屿涉及的所有的网格
                    }
                }
            }
            return IslandsCount;
        }
    private:
        vector<pair<int,int>> dir{{1,0},{-1,0},{0,1},{0,-1}};//<row,column>
        int dfs(vector<vector<char>> &grid, int row,int col)
        {
            grid[row][col]='2';
            for(auto d:dir)
            {
                int next_row = row+d.first;
                int next_col = col+d.second;
                if(next_row>=0 && next_row<grid.size() && next_col>=0 && next_col<grid[0].size() && grid[next_row][next_col]=='1')
                    dfs(grid,next_row,next_col);
            }
            return 0;
        }
    };

    BFS:广度优先遍历,使用队列记录

    遍历:按照某种顺序访问“图”中所有的节点

    顺序:深度优先(找最深的):栈

               广度优先(找最近的):队列

    时间复杂度 O(n+m), n是点。m是边

    广度优先找出的路径,经过的节点数最少

    广度优先找到的结果是距离出发点最近的节点,深度优先找到的可能是最优解。

    图的存储方式

    邻接矩阵

    邻接表

    深度优先的伪代码:

    void DFS(int v)

           visited[v] = true;

           for (v的每一个邻接点w)

                 if(!visited[w])

                        DFS(w)

    /*
    N皇后问题
    */
    
    回溯法(暴力算法):深度优先做隐式图搜索
    时间复杂度 O(N^N) (状态空间)
    剪枝

    广度优先的伪代码

    /*种子填充法
    
     
    
    
    
    */

    8数码问题:最少步数恢复

    1 3 5
    4 7 6
    2 8  

     -->

    1 2 3
    4 5 6
    7 8  
    • 深度优先 or 广度优先
    • 判重(hash)

    双向搜索:

    • 起始点和目标点,轮流扩展
    • Hash表判断相遇
    • 复杂度

    启发式:

    • 价值函数(启发函数)
    • 优先队列(堆)

    DFS vs BFS

    • 都为暴力搜索,搜索顺序不同
    • 栈 vs 队列
    • 可行解 vs 最优解
    • 递归 vs 非递归
    • 空间占用,BFS需要存储状态,DFS无需
  • 相关阅读:
    springboot ueditor 使用心得
    利用github和git命令,将本地项目共享到服务器上——第二章
    利用github和git命令,将本地项目共享到服务器上
    如何打造亚秒级加载的网页3——用户体验 总结
    如何打造亚秒级加载的网页2——网络性能 过程解读
    如何打造亚秒级加载的网页1——前端性能
    什么是跨域?怎么解决跨域?
    Vue生命周期
    利用JS实现vue中的双向绑定
    按照vue文档使用JavaScript钩子但是却不能执行动画?
  • 原文地址:https://www.cnblogs.com/wzhao-cn/p/11370757.html
Copyright © 2011-2022 走看看