查看: 1504| 回复: 7
跳转到指定楼层
上一主题 下一主题
收起左侧

[高频题] 关于bfs的一点疑问

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
我有个疑问,请问大家知道对于bfs什么时候该在while loop里加for loop,什么时候该用一个新的queue来记录下一层search 吗,还是说这是可有可无的。比方说
while queue:
            cur=queue.popleft()


while queue:
            for _ in range(len(queue)):
                cur=queue.popleft()

while queue:
            next_queue=collections.deque()
            for _ in range(len(queue)):
                cur=queue.popleft()


上一篇:问问大家都刷了多少道LC?
下一篇:九月leetcode高频150题 java刷题记录贴

本帖被以下淘专辑推荐:

推荐
zea7ot 2020-9-1 07:58:09 | 只看该作者
全局:
本帖最后由 zea7ot 于 2020-9-1 08:46 编辑

BFS通常会在while循环里面加for循环,目的是层级处理。通常情况下这里是不需要新创建第二个Queue来承接下一层的。
  1. while(!queue.isEmpty()){
  2.     final int SIZE = queue.size();
  3.     // 层级处理
  4.     for(int i = 0; i < SIZE; ++i){
  5.         
  6.     }
  7. }
复制代码



也有情况是不需要的,往往发生在不需要层级处理的时候(一下子想不起来什么题目了)。不需要层级处理指的是:只需要把Queue里面的nodes处理掉就好,究竟哪一层无所谓(既然没有层级的概念了,这可能也就不算是严格意义上的BFS了,可能更多侧重在使用Queue的先进先出的处理次序上)。
BFS在while里面再创建新的Queue,印象里只见到过一次,就是双向BFS的时候,典型的题目是Word Ladder i, ii。也是层级处理,但是起点和终点同时BFS(而不是只由一个点出发)。不过Word Ladder i, ii使用的是Set,效果胜过Queue:remove/contains操作都是O(1)。

常规BFS用于处理edge weight相等的图(有向或者无向)。如果edge weight不相等,则需要用Djikstra's Algorithm, Bellman Ford, FloydWarshall等算法解决。


补充内容 (2020-9-2 04:59):
发现了一道在While里面创建Queue题目: LC358。原因是需要在层级里面集中处理多(k)个数据,可以使用list,但Queue会方便一些。

补充内容 (2020-9-5 05:05):
发现一道可以使用BFS解决但并不十分强调层级概念的题目LC572。
https://github.com/zea7ot/leetco ... onApproach0BFS.java

补充内容 (2020-9-6 01:53):
又发现一道BFS不强调是必须是层级处理的题目: LC404
https://github.com/zea7ot/leetco ... eetcode/lvl2/lc0404

评分

参与人数 4大米 +5 收起 理由
Dido94 + 1 赞一个
PandasPan + 1 赞一个
sanmao0715 + 1 赞一个
14417335 + 2

查看全部评分

回复

使用道具 举报

推荐
WWWWGWWWW 2020-9-1 07:54:38 | 只看该作者
全局:
queue里套for循环一般都是要对树里的每一层进行一些操作的,比如计算每层的和,没有for循环的话层与层之间就没有分界了。我还没刷到过queue里套queue的(也可能我忘了),你在哪一题里见过这样的呀?
回复

使用道具 举报

🔗
hjy 2020-9-1 07:47:45 | 只看该作者
全局:
如果你需要对同一层的结果进行处理的时候,里面就得再加个for loop。 比如说你要用bfs找最短路径之类的,同一层的节点距离是一样的,这样你就需要按每一层的结果来处理,这个时候就加一个for loop。
回复

使用道具 举报

🔗
ahbbzong 2020-9-1 07:58:54 | 只看该作者
全局:
 看你在遍历完一层以后,还需不需要操作,比如算height,将这一层遍历的结果copy到数组里之类的。如果需要的话,要双重循环,否则,那么一个循环也可以。
回复

使用道具 举报

🔗
 楼主| Dido94 2020-9-4 07:05:18 | 只看该作者
全局:
zea7ot 发表于 2020-9-1 07:58
BFS通常会在while循环里面加for循环,目的是层级处理。通常情况下这里是不需要新创建第二个Queue来承接下一 ...

感谢层主回答,昨天在做web crawler这道题也发现用了第二个queue来承接,感觉还是不太理解,是因为这个新queue可以集中存处理后的url吗
回复

使用道具 举报

🔗
zea7ot 2020-9-4 14:50:54 | 只看该作者
全局:
Dido94 发表于 2020-9-4 07:05
感谢层主回答,昨天在做web crawler这道题也发现用了第二个queue来承接,感觉还是不太理解,是因为这个新 ...

你说的是LC1236吗?
如果是的话,这是我的解法,BFS的解法没有特别需要在while循环里创建队列的要求啊。
回复

使用道具 举报

无效楼层,该帖已经被删除
无效楼层,该帖已经被删除
🔗
landshark 2020-9-6 07:21:07 | 只看该作者
全局:
一般的BFS只有一个while就可以。
只有涉及到level order的travesal的时候,需要两层的loop。
至于用for还是while,就看个人爱好和语言,哪个写的漂亮就用哪个。
参考leetcode
https://leetcode.com/problems/word-ladder/
https://leetcode.com/problems/binary-tree-level-order-traversal/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表