是否可以在不使用队列的情况下进行广泛的首次搜索或广度优先遍历?

时间:2009-05-13 03:19:52

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

正如我记得并检查的那样,遍历树或首先抓取网络广度(BFS)的常用方法是使用队列。实际上有没有办法实现它而不使用队列?

4 个答案:

答案 0 :(得分:4)

我知道这个问题现在已经过时了,但我只想回答。您可以使用数组,链接列表(或任何其他线性容器)执行此操作,而无需递归。当您遍历old中的所有项目时,保留两个容器newold,并将newold交换。非常类似于队列的实现。

在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)。

答案 1 :(得分:2)

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

我看到这样做的唯一另一种方法是使用递归(更加困难,并且只使用或多或少的内存)。

答案 2 :(得分:0)

递归。但队列在堆栈中......

答案 3 :(得分:-1)

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

如果您不关心订购,可以使用任何设置实现。集合不保留这种排序。

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