【发布时间】:2018-04-15 07:56:12
【问题描述】:
我正在尝试使用带有自定义比较器的 Priorityqueue 实现 MST,但是在 O(n) 时间内使用它构建最小堆时遇到了问题。问题是 Priorityqueue 只有一个构造函数允许在 O(n) 中创建 PriorityQueue,但它不接受任何比较器作为参数。我希望它使用我的自定义比较器。这个问题有解决方法吗? PriorityQueue.addAll() 将失去使用 MST 的最小堆的目的,因为它是 O(nlogn) 方法。这是我的代码。
ArrayList <edge>ar=new ArrayList<>();
for(int i=0;i<e;i++)
{
int u=ss.nextInt();
int v=ss.nextInt();
int w=ss.nextInt();
ar.add(new edge(u,v,w));
}
PriorityQueue <edge>pr=new PriorityQueue<edge>(ar);
还有我要使用的比较器:-
PriorityQueue <edge>ar=new PriorityQueue(11,new Comparator() {
@Override
public int compare(Object o1, Object o2) {
edge n1=(edge) o1;
edge n2=(edge) o2;
if(n1.w<n2.w)
{
return -1;
}
else if(n1.w==n2.w)
{
if((n1.u+n1.v+n1.w)<=(n2.u+n2.v+n2.w))
{
return -1;
}
else
{
return 1;
}
}
else
{
return 1;
}
}
});
【问题讨论】:
-
请展示你的作品
-
@Noixes 已更新。
-
PriorityQueue.addAll() ... 是 O(nlogn) 方法。你有这方面的证据吗?
-
实际上,我对这篇文章的公认答案感到困惑。 stackoverflow.com/questions/34693414/…
-
@jrook:
PriorityQueue从AbstractQueue继承addAll。它不会覆盖实现。AbstractQueue.addAll的文档说,此实现迭代指定的集合,并将迭代器返回的每个元素依次添加到此队列中。 那将是 O(n log n)。跨度>
标签: java priority-queue min-heap