搜索:DFS、BFS

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Albert_Bolt/article/details/82385407

基本概念

  • 状态:对问题在某一时刻的进展情况的数学描述

  • 状态转移:从一个状态扩展出其他状态的过程

  • 搜索树:由若干状态和状态转移形成的树形结构

  • 判重:已经搜索过的状态不再进行搜索

  • 剪枝:去掉搜索树中不需要的状态和转移


深度优先搜索 DFS

  • 以递归的方式寻找路径,走不通就返回上一层。

  • 时间复杂度:O(xnm),x为可扩展方式的种数

  • 空间复杂度:O(n*m)

伪代码框架
void dfs(当前状态)
{
    if(达到目标状态) 
    {
        ...
        return; 
    }
    for(遍历下一层状态)
    {
        ...
        dfs(下一层状态);
        ...
    }
}


广度优先搜索 BFS

  • 按状态的层次扩展,距根结点越近的状态越先扩展

  • 第一次到达某结点状态所需步数一定为最少步数

  • 由于只需知道第一次到达某状态的情况,需要判重

  • 实现方法:队列

  • 时间复杂度:O(n*m)

  • 空间复杂度:O(n*m)

伪代码框架
void bfs(初始状态st)
{
    定义当前和下一个状态;//node cur,nex;
    初始化操作(vis数组及其他初始化);
    新建队列q;//queue<node>q;
    步数清零;//cur.step=0;
    初始状态st入队;//q.push(st);
    标记访问;//vis[]=1;
    while(!q.empty()) 
    {
        取出队首状态;//cur=q.front();
        出队;//q.pop();
        if(到达目标状态) {跳出循环;}
        for(遍历下一层状态)
        {
            if(该状态未被访问) 入队;
            //if(!vis[]) vis[]=1;q.push(nex);
            ...
        }
    }
}

猜你喜欢

转载自blog.csdn.net/Albert_Bolt/article/details/82385407