HW 华为 校招#内推#算法专题:BFS/DFS(内附模板)

开始的开始~~~,有意愿了解华为23届校招岗位信息的欢迎私信!!!贴心HR小姐姐真诚期待!!!

然后的然后~~~,校招投递已经火热期啦,快快联系了解详细信息哦!!!

重点的重点:

什么是广度/深度算法?

  • 广度优先搜索算法(英语:Breadth-First-Search,缩写为BFS),又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。
       简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。广度优先搜索的实现一般采用open-closed表。
  • 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。
       当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。
       如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
    (就是一条道走到黑,直到走不通了就往回走,直到走到目的地或者走完整个连通图)


解体方法和算法模板
广度优先搜索使用队列(queue)来实现,整个过程可以看做一个倒立的树形:
  • 把根节点放到队列的末尾。
  • 每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱。
  • 找到所要找的元素时结束程序。
  • 如果遍历整个树还没有找到,结束程序。
#define MAX 100000

int front = 0;/* 头指针 */
int rear = 0;/* 尾指针 */
int round = 0;/* 轮次 */
int queue[MAX] = {0};/* 初始化队列 定义类型根据节点类型指定 */

/* 头节点入队 */
queue[rear] = root;
rear++;

while(front != rear) {
    int step = rear - front;  /* 每一轮要遍历的节点数 */
    for (int i = 0; i < step; i++) {
        /* 新节点入队,可能不止一个节点 */
        queue[rear] = XXX;
        rear++;

        front++;/* 当前节点出队 */
    }
    round++;/* 轮数+1 */
}
深度优先搜索用栈(stack)来实现,整个过程也可以想象成一个倒立的树形:
  • 把根节点压入栈中。
  • 每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。
  • 找到所要找的元素时结束程序。
  • 如果遍历整个树还没有找到,结束程序。
int dfs(int stat...) {
    if (is ending) { // 注意搜索的边界状态
        return xx;
    }
    ...//枚举可能的状态
    int result = dfs(stat...); //搜索下一步空间
    ...
    return result;
}
注:一般可能会超时,可以采用一个数据记录搜索过的状态,当搜索过直接返回值,而不是继续搜索,也称为记忆化搜索。

经典联系题目
广搜:被围绕的区域(************) 单词接龙(************)
深搜:被围绕的区域(************) 岛屿的数量(************)

最后的最后~~~,欢迎关注,欢迎私信!!!


全部评论

相关推荐

比亚迪汽车新技术研究院 硬件工程师 总包21左右 硕士
点赞 评论 收藏
分享
去B座二楼砸水泥地:不过也可以理解,这种应该没参加过秋招
点赞 评论 收藏
分享
斑驳不同:还为啥暴躁 假的不骂你骂谁啊
点赞 评论 收藏
分享
点赞 2 评论
分享
牛客网
牛客企业服务