我正在解决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实现给出了正确的答案。
答案 0 :(得分:9)
正如documentation所说:
基于优先级堆的无界优先级队列。的要素 优先级队列按照其自然顺序排序,或 由比较器在队列建设时提供,具体取决于 使用哪个构造函数。
LinkedList保留了插入顺序,而PriorityQueue则没有。因此,您的迭代顺序会发生变化,这会使您使用PriorityQueue的实现不是BFS。
答案 1 :(得分:1)
你的问题基本上是:为什么你认为两个任意类很好,最后,不同的类......做同样的事情?!
换句话说:你今天的教训应该是:你不应该联系其他人来解释你的实验。更好的方法是:在那个时间点,当您编写代码时,最好确保理解代码的每一个细节。
含义:当您开始使用Java库中的新类时,转到并读取其javadoc!当你没有预先做到这一点但你直接开始实验;然后你会遇到惊喜:然后查找一些东西。
当然让其他人向您解释这一点很方便,但作为优秀程序员的本质是内在的动机,可以自己找出您的代码是什么(或将会)!
当然,您的问题的答案是:您的两个示例使用了不同的类型的列表,这些列表具有不同的行为;在相应的Javadoc(this与that)中指定。
答案 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]