宽度优先搜索算法总结

宽度优先搜索能够处理的问题

宽度优先搜索的对象一般是二叉树、图、矩阵,这三种其实都可以归类为图,使用宽度优先搜索的情况有以下三种:

  1. 按层遍历。(level order traversal)

    计算简单图的最短路径长度,简单图——边的权值为1的无向图。

  2. 由点及面。(connected component)

    计算扩散、传播、感染的最短时间问题。

  3. 拓扑排序。(topological sorting)

    节点之间存在相互依赖关系的有向图的拓扑问题。

代码注意事项

宽度优先搜索需要用到数据结构queue(队列),代码要点如下:

  1. 如果宽搜过程中需要进行层级遍历,需要提前记录queue的长度。

    int size = queue.size();
    for (int i = 0; i < size; i++)
    {
        ……
    }
    
  2. 图的两种代码表示方式:邻接表、邻接矩阵。

    map<XXX *, set<XXX *>> adjacentMap; // 邻接表
    vector<vector<bool>> adjacentMatrix; // 邻接矩阵
    

时间复杂度分析

二叉树上的宽度优先搜索的时间复杂度:
算法会将所有的节点和边都遍历一遍,耗时为O(n + (n - 1)),总的时间复杂度为O(n)

图上的宽度优先搜索的时间复杂度:
图上的节点个数如果为n,边的数量为m,则复杂图中的m最极端的情况最大可以到达n^2,所以图上的宽度优先搜索的时间复杂度为O(n + m) = O(n^2)

矩阵上的宽度优先搜索的时间复杂度:
矩阵可以看成图的一种,如果矩阵的行数为R,列数为C,其中节点数为R*C,边数为((R-1)*C) + (R*(C-1)) = 2R*C-R-C,所以矩阵上的宽度优先搜索的时间复杂度为O(R * C)

题目汇总

  1. 二叉树的层级遍历(Binary Tree Level Order Traversal)https://blog.csdn.net/SeeDoubleU/article/details/124395566
  2. 将二叉树按照层级转化为链表(Convert Binary Tree to Linked Lists by Depth)https://blog.csdn.net/SeeDoubleU/article/details/124395634
  3. 验证给定的图是否构成有效的树(Graph Valid Tree)https://blog.csdn.net/SeeDoubleU/article/details/124395644
  4. 克隆图(Clone Graph)https://blog.csdn.net/SeeDoubleU/article/details/124395647
  5. 拓扑排序(Topological Sorting)https://blog.csdn.net/SeeDoubleU/article/details/124395653
  6. 计算岛屿的个数(Number of Islands)https://blog.csdn.net/SeeDoubleU/article/details/124395659
  7. 僵尸矩阵(Zombie In Matrix)https://blog.csdn.net/SeeDoubleU/article/details/124395667
  8. 骑士的最短路线(Knight Shortest Path)https://blog.csdn.net/SeeDoubleU/article/details/124395672
  9. 单词接龙(Word Ladder)https://blog.csdn.net/SeeDoubleU/article/details/124395674
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值