搜索:DFS、BFS

7 篇文章 0 订阅

基本概念

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

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

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

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

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


深度优先搜索 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);
            ...
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值