java:使用ArrayDeque或LinkedList或LinkedBlockingDeque的非递归深度优先搜索?

时间:2011-10-30 04:46:23

标签: java depth-first-search non-recursive

public void traverse(Node root){
    ArrayDeque<Node> queue = new ArrayDeque<Node>();
        queue.add(root);

    while(!queue.isEmpty()){
        Node currentNode = queue.pollFirst();   
        List<Node> nl = getChildrenfromDB(currentNode);
        queue.addAll(nl);
    }

我应该使用ArrayDequeLinkedList还是LinkedBlockingDeque?当我设置int值为10时会发生什么?这是否意味着队列一次只能容纳10个?如果从DB的大小中检索的Collection大于10,该怎么办?此绑定值是否定义队列的“快照”?

public void traverse(Node root){
    LinkedBlockingDeque<Node> queue = new LinkedBlockingDeque<Node>(10);
        queue.add(root);

    while(!queue.isEmpty()){
        Node currentNode = queue.pollFirst();   
        List<Node> nl = getChildrenfromDB(currentNode);
        queue.addAll(nl);
    }

3 个答案:

答案 0 :(得分:1)

不要使用ArrayList - 使用Deque接口的其中一个实现。例如,使用专为此类事物设计的LinkedBlockingDeque。根据需要使用addFirst()addLast()pollFirst()pollLast()方法。

如果出于某种原因,您确实需要使用List,请使用LinkedList - 添加到ArrayList的前面是非常低效的,因为所有元素都需要感动。

答案 1 :(得分:1)

您可以阅读ArrayList

的javadoc
  

public void add(int index,E element)

     

将指定元素插入此列表中的指定位置。将当前位置的元素(如果有)和右侧的任何后续元素移位(将其添加到索引中)。

queue.add(0,myObject);

JavaDocs是您的朋友

正如其他人所说的那样;不是最好的数据结构。如果您不需要随机访问列表,则LinkedList或ArrayDeque更有效。

答案 2 :(得分:0)

为什么不使用Stacks。堆栈是DFS的方法。请参阅this文章,了解为什么Stack会解决问题。请参阅此有用的tutorial:)