本文介紹了優先級隊列與鏈表Java的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在解決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;
}
}
}
另外,當我使用鄰接列表而不是鄰接矩陣時,優先級隊列實現給出了正確的答案。
推薦答案
如documentation所說:
基于優先級堆的無界優先級隊列。的要素
優先級隊列根據其自然順序進行排序,或者
由隊列構造時提供的比較器執行,具體取決于
使用了哪個構造函數。
LinkedList保留插入順序,PriorityQueue不保留。因此,您的迭代順序發生了變化,這使得您使用PriorityQueue的實現不同于BFS。
這篇關于優先級隊列與鏈表Java的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,