【问题标题】:While doing breadth first search, does it matter when you visit the node? [closed]在进行广度优先搜索时,访问节点是否重要? [关闭]
【发布时间】:2012-09-24 17:21:06
【问题描述】:

我用 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) 时(就运行时复杂性或其他因素而言)是否重要。我可以在将节点从队列中弹出之后访问该节点,也可以在将其放入队列之前访问它。

【问题讨论】:

  • 我觉得这个更适合codereview.stackexchange.com
  • 如果您一遇到该节点就访问它,您的搜索权重会比它本来就更偏向“左”(第一个孩子优先)。
  • 您的while 循环最好重述为do ... while (!nodesToVisit.isEmpty())。当然它在循环开始时永远不会为空,那么为什么要检查那个不可能的条件呢?
  • @seh 我使用普通的 while 循环来执行此操作,因为我觉得它增加了代码的可读性并且额外评估条件一次不会产生任何明显的影响(只有一些额外的机器指令) ....但是,我理解你的意思
  • 我相信你,但有一种不同的可读性处于危险之中:读者需要理解为什么会有保护条件,合理地预期可能会出现保护条件。如果这些条件似乎不能出现,那么您的程序受到过度约束并且接近于逻辑不一致。编写循环的另一种方法是不费心将根节点添加到队列中,并提前对其进行特殊处理。相反,您将其添加到队列中以避免重复循环主体的一部分。这很好,但不要做额外的工作以避免代码重复。

标签: java graph tree breadth-first-search


【解决方案1】:

不,没关系(很多)。

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

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

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

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

【讨论】:

    【解决方案2】:

    这有关系吗?这取决于你在做什么。

    如果树中有多个节点满足您的搜索条件,则在子节点之前访问父节点,而不是在父节点之前访问子节点,可能会更改搜索返回的节点。这真的会发生吗?这取决于您的应用程序的详细信息。

    无论哪种方式,big-O 复杂度都是相同的。根据树和搜索的特性,可能需要以一种或另一种方式进行更多操作。 (例如,如果 50% 的搜索是针对存储在根节点中的值,那么通过首先访问父节点,您的代码将运行得更快。)

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

    【讨论】:

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