您的位置:首页 > 其它

dfs 和 bfs 解析

2014-08-03 16:55 239 查看

dfs 和 bfs 解析

最近一直在看DFS和BFS

DFS思想:

一直往深处走,直到找到解或者走不下去为止

DFS框架:

//dep代表目前DFS的深度
dfs(dep,…) {
    if ( 找到解 || 走不下去了) {
        …
        return;
    }
    枚举下一种情况,
    DFS(dep+1,…);
}


BFS思想:

1.从初始状态S开始,利用规则,生成下一层的状态。

2.顺序检查下一层的所有状态,看是否出现目标状态G。

否则就对该层所有状态节点,分别利用规则。生成再下一层的所有状态节点。

3.继续按上面思想生成再下一层的所有状态节点,这样一层一层往下展开。直到出现目标状态为止。

按层次的顺序来遍历搜索树

BFS框架

通常用队列(先进先出)实现

//s代表初始节点
bfs(Node s) {
    初始化队列Q;
    Q.push(起点s);
    标记s为己访问;
    while (Q非空) {
        取Q队首元素u;
        u出队;
        if (u == 目标状态) {
            …
        }
        所有与u相邻且未被访问的点进入队列;
        标记u为已访问;
    }
}


DFS:使用栈保存未被检测的结点,结点按照深度优先的次序被访问并依次被压入栈中,并以相反的次序出栈进行新的检测。

类似于树的先根遍历

深搜例子:走迷宫,你没有办法用分身术来站在每个走过的位置。不撞南山不回头。

BFS:使用队列保存未被检测的结点。结点按照宽度优先的次序被访问和进、出队列。

类似于树的按层次遍历的过程

广搜例子:你的眼镜掉在地上以后,你趴在地板上找。你总是先摸最接近你的地方,如果没有,再摸远一点的地方……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: