【问题标题】:is breadth first search or breadth first traversal possible without using a queue?不使用队列是否可以进行广度优先搜索或广度优先遍历?
【发布时间】:2010-10-25 17:58:13
【问题描述】:

我记得并检查过,遍历树或首先抓取网络广度 (BFS) 的常用方法是使用队列。实际上有没有一种方法可以不使用队列来实现它?

【问题讨论】:

  • 不使用队列的目的是什么?
  • 只是为了了解不同的实现方式
  • 也许我的评论已经过时了,但确实有办法做到这一点。 stackoverflow.com/a/2549825/2198656

标签: queue web-crawler breadth-first-search


【解决方案1】:

我知道这个问题现在很老了,但我只是想回答一下。您可以使用数组、链表(或任何其他线性容器)来执行此操作,而无需递归。保留两个容器oldnew,并在遍历old 中的所有项目时将oldnew 交换。与队列的实现非常相似。

在 Python 中它看起来像:

def breadth_first(root):
    if not root:
        return
    old = []
    new = []
    old.append(root)
    while old:
        for n in old:
            process(n)  # Do something
            if n.left:
                new.append(n.left)
            if n.right:
                new.append(n.right)
        old = new
        new = []

运行时复杂度与队列实现相同,O(n)。

【讨论】:

    【解决方案2】:

    您确实应该使用队列,因为它更容易实现。此外,队列允许多台机器一起工作(一个队列站点,而另一个从队列中弹出站点以进行遍历)。

    我看到的唯一其他方法是使用递归(要困难得多,并且只使用少量或多或少的内存)。

    【讨论】:

    【解决方案3】:

    使用递归。但是队列在栈中……

    【讨论】:

    • 有没有像简单的伪代码一样可以使用递归实现 BFS 的地方?
    • 我也想知道这个。您想如何使用调用堆栈有效地替换队列?
    【解决方案4】:

    如果您关心排序,请使用队列。 queue 保留插入顺序。或者您可以使用列表的实现,例如两个数组列表来交替。但从根本上说,列表也保留了顺序。

    如果您不关心排序,您可以使用任何集合实现。 sets 不保留此顺序。

    例如,在 BFS 实现中,如果你不关心节点的顺序,你可以使用两个集合,旧的和新的来交替,而不是一个队列。

    【讨论】:

      猜你喜欢
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多