在进行广度优先搜索时,访问节点时是否重要?

时间:2012-09-24 17:21:07

标签: java graph tree breadth-first-search

我在Java中为树创建了以下BFS:

public class Node
{
    public int value;
    public ArrayList<Node> myChildren = new ArrayList<Node>();

    public Node(int v)
    {
        value = v;
    }
}

public Node breadthFirstSearch(Node root, int value)
{
    if(root == null) return null;
    Queue<Node> nodesToVisit = new LinkedList<Node>();
    nodesToVisit.add(root);
    while(nodesToVisit.size() > 0)
    {
        Node currentNode = nodesToVisit.remove();
        if(currentNode.value == value) return currentNode;
        nodesToVisit.addAll(currentNode.myChildren);
    }

    return null;
}

我的问题是,当我“访问”节点if(currentNode.value == value)时,它是否重要(在运行时复杂性或其他因素方面)。我可以在我将其从队列中弹出后,或者在我将其放入队列之前访问该节点。

2 个答案:

答案 0 :(得分:1)

重要吗?这取决于你在做什么。

如果树中有多个节点符合您的搜索条件,则在子节点之前访问父节点而不是父节点之前的子节点可以更改搜索返回的节点。这会发生吗?这取决于您的申请细节。

大O的复杂性将是相同的。根据树木和搜索的特征,可能需要以这种或那种方式进行更多操作。 (例如,如果50%的搜索是针对存储在根节点中的值,则首先访问父节点将使代码运行得更快。)

当搜索“失败”时(在树中找不到该值),无论您访问节点的顺序如何,执行的操作数都是相同的。

答案 1 :(得分:1)

不,(多)没关系。

你基本上是在谈论这两行的顺序:

if (currentNode.value == value) return currentNode;
nodesToVisit.addAll(currentNode.myChildren);

为了提高性能和代码清晰度,提前返回总是一件好事,所以我会保留你的代码。

如果您颠倒了这些行的顺序,则会产生addAll()调用的额外费用,但这可能会忽略不计。