- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为大学研究 Dijkstra 算法,使用 PriorityQueue 来存储图的剩余顶点,按最短遍历距离排序。我使用的比较器:
class DistanceComparator implements Comparator<Integer> {
int[] dist;
public DistanceComparator(int[] d) {
dist = d;
}
@Override
public int compare(Integer i, Integer j)
{
if((dist[i]-dist[j]) < 0) {
return -1;
}
if((dist[i]-dist[j]) > 0) {
return 1;
}
return 0;
}
}
现在我面临的问题是距离正在变化,因此我的队列的比较器需要经常更新。
static PriorityQueue<Integer> refreshQueue(int[] d) {
Comparator<Integer> comp = new DistanceComparator(d);
PriorityQueue<Integer> q = new PriorityQueue<Integer>(adj.length, comp);
for(int i = 0; i < adj.length; i++) {
q.add(i);
}
return q;
}
这确实有效,但是它也会使所需的运行时间O(num Edges*log(num Vertices))
变得紧张。
如何消除每次调整比较器的需要?
最佳答案
在 Java 中实现 Dijkstra 算法的传统方法是创建一个包含节点和距离的单独类:
class Dist implements Comparable<Dist> {
final int vertex;
final int distance;
public int compareTo(Dist other) {
return Integer.compare(distance, other.distance);
}
}
并将那些放入您的优先级队列中。
您最终会得到反射(reflect)次优路径的过时 Dist
对象,但只有在您已经看到“最佳”路径之后,所以只需忽略您已经见过的顶点从优先级队列中取出。
基本上,不要更改Comparator
:更改正在比较的对象。
关于java - PriorityQueue 经常需要调整比较器 - 我该如何最好地处理这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11076286/
当运行 scala.util.Random().nextInt(3) 81 次时,我看到如下结果(Java 开发人员,请参阅 edit 了解这之间的关系): 200010202002112102222
在使用 native 应用程序在混合模式 C++/CLI 中调试时,我遇到了进程挂起问题。这是无法忍受的,我的调试几乎 70% 都会发生这种情况,我需要一次又一次地重新启动该过程。 是否有任何修补程序
我不知道这是一个错误还是某种误用/错误配置。希望有人能帮忙。谢谢! 如果我更改模块或 list 目录中的文件,通常会导致错误,大部分是以下类型 无法找到节点上的类 在节点上找不到定义类 当 Puppe
我是一名优秀的程序员,十分优秀!