优先级队列与链表java

时间:2016-10-21 11:16:31

标签: java algorithm data-structures graph graph-algorithm

我正在解决BFS问题。我使用的是PriorityQueue,但我得到了错误的答案,然后我使用LinkedList,我得到了正确的答案。我无法找到它们之间的区别。这是两个代码。为什么答案都不同?

Code1:    
        LinkedList q=new LinkedList();
        q.add(src);
        dist[src]=0;
        visited[src]=1;
        while(!q.isEmpty()){
            u=(int)(Integer) q.remove(0);
            for (int k = 0; k < n; k++) {
                if(a[u][k]==1 && visited[k]==0)
                {
                    dist[k]=dist[u]+1;
                    q.add(k);
                    visited[k]=1;
                }   
            }
        }

Code 2: 
    PriorityQueue<Integer> q= new PriorityQueue<>();
        q.add(src);            
        dist[src]=0;
        visited[src]=1;
        while(!q.isEmpty()){
            u=q.remove();               
            for (int k = 0; k < n; k++) {
                if(a[u][k]==1 && visited[k]==0)
                {
                    dist[k]=dist[u]+1;
                    q.add(k);
                    visited[k]=1;
                }   
            }
        }

当我使用Adjacency List而不是Adjacency矩阵时,Priority Queue实现给出了正确的答案。

3 个答案:

答案 0 :(得分:9)

正如documentation所说:

  

基于优先级堆的无界优先级队列。的要素   优先级队列按照其自然顺序排序,或   由比较器在队列建设时提供,具体取决于   使用哪个构造函数。

LinkedList保留了插入顺序,而PriorityQueue则没有。因此,您的迭代顺序会发生变化,这会使您使用PriorityQueue的实现不是BFS。

答案 1 :(得分:1)

你的问题基本上是:为什么你认为两个任意类很好,最后,不同的类......做同样的事情?!

换句话说:你今天的教训应该是:你不应该联系其他人来解释你的实验。更好的方法是:在那个时间点,当您编写代码时,最好确保理解代码的每一个细节。

含义:当您开始使用Java库中的新类时,转到并读取其javadoc!当你没有预先做到这一点但你直接开始实验;然后你会遇到惊喜:然后查找一些东西。

当然让其他人向您解释这一点很方便,但作为优秀程序员的本质内在的动机,可以自己找出您的代码是什么(或将会)!

当然,您的问题的答案是:您的两个示例使用了不同的类型的列表,这些列表具有不同的行为;在相应的Javadoc(thisthat)中指定。

答案 2 :(得分:0)

PriortiyQueue以及Linkedlist实现队列接口并执行与队列操作(FIFO)相同的操作。 PriorityQueue和Linkedlist之间的区别在于插入时PriorityQueue将按自然顺序排序和排序,但我们也可以添加Commparator以定义记录的特定排序顺序,而LinkedList将是刚刚订购。 因此,当您尝试在PriorityQueue中添加元素时,它们将根据其自然顺序或根据比较器函数进行排序。

import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;

public class QueueInJava {

public static void main(String[] args) {
    Queue<String> queue = new LinkedList<String>(); 
    queue.add("Ishfaq");
    queue.add("Ramzan");
    queue.add("Nagoo");
    queue.add("Bangalore");

    System.out.println("Linked List Queue is:"+ queue);
    System.out.println("Linked List Queue Peek is :"+queue.peek());

    queue.poll();
    System.out.println("Linked List Queue after remove is:"+ queue);


    Queue<Integer> queuenew = new PriorityQueue<Integer>();


    queuenew.add(2);
    queuenew.add(3);
    queuenew.add(1);
    queuenew.add(0);
    queuenew.add(4);

    System.out.println("Priority Queue is:"+ queuenew);
    System.out.println("Priority Queue Peek is :"+queuenew.peek());

    int ieleFirst=queuenew.remove();
    System.out.println("Priority Queue Element Removed is:"+ ieleFirst);
    int ieleSecond=queuenew.remove();
    System.out.println("Priority Queue Element Removed is:"+ ieleSecond);
    System.out.println("Priority Queue after remove is:"+ queuenew);
  }

}

输出:

Linked List Queue is:[Ishfaq, Ramzan, Nagoo, Bangalore]

Linked List Queue Peek is :Ishfaq

Linked List Queue after remove is:[Ramzan, Nagoo, Bangalore]

Priority Queue is:[0, 1, 2, 3, 4]

Priority Queue Peek is :0

Priority Queue Element Removed is:0

Priority Queue Element Removed is:1

Priority Queue after remove is:[2, 3, 4]