当前位置: 首页 > 知识库问答 >
问题:

优先级队列--背后更新密钥的效果

东郭源
2023-03-14

我试图理解为什么我的A*搜索的实现似乎工作良好,尽管我似乎是在优先级队列后面更新键。

在表示映射的类中,我有以下数据结构来保存映射中的所有节点(例如从文件加载)。

// maps a latitude/longitude to a node in the map
HashMap<GeographicPoint, MapNode> nodes;

为了实现*搜索,我的MapNode类包含“从开始到开始的距离”和“从目标到启发式距离”属性。在搜索开始之前,我将映射中每个节点的距离初始化为无穷大。这一切都很好。

PriorityQueue<MapNode> toExplore = new PriorityQueue<MapNode>();
toExplore.add(startNode);

稍后,作为*实现的一部分,当我在node对象中重新计算和更新距离时,我将再次使用指向相同原始节点的引用来执行此操作。嗯,PQ也引用了相同的原始节点,所以效果是我只是改变了距离(即键)下的PQ!

这对PQ不可能有好处。但一切都还管用!--意思是我得到了正确的最短路径,并探索了正确的节点数等。

提供PQ正在使用的MapNode实现中的相关部分可能很有用:

public class MapNode implements Comparable<MapNode> {

// the location of the intersection in the world
private GeographicPoint location;


// NOTE: Equals method is based on comparing actual geographic point. 
// Whereas compareTo based on distances. 
// This implies a.equals(b) and a.compareTo(b) == 0 will return different result. 
// Is this OK? 

@Override
public boolean equals(Object obj) { 
    return this.location.equals(obj);
} 

// NOTE: Equals method is based on comparing actual geographic point. 
// Whereas compareTo based on distances. 
// This implies a.equals(b) and a.compareTo(b) == 0 will return different result. 
// Is this OK? 

@Override
public int compareTo(MapNode other) {
    // Comparison based on priorities
    return Double.compare(this.getTotalEstimatedDistance(), 
                          other.getTotalEstimatedDistance());
}
    null

共有1个答案

水麒
2023-03-14

我不明白当我出队时,优先级队列如何能够给我正确的最高优先级节点。我在背后弄它的钥匙。

虽然这是一个坏主意,但没有保证人,这将成为一个问题。PriorityQueue不是为所有条目排序的(只有第一个条目),所以更改另一个条目不一定是问题。在删除第一个之前,请尝试更改它。;)

我怎样才能设计得更好,这样我就不会有这种代码气味了?

Queue<MapNode> q = new PriorityQueue<>(
                               Comparator.comparing(MapNode::getTotalEstimatedDistance));
 类似资料:
  • 我一直在通过互联网进行广泛的搜索,寻找某种类型的答案来解决我的问题,但我没有运气找到任何可以帮助我的东西。基本上,我想知道的是是否可以将双精度转换为密钥,然后将其插入到优先级队列中。 这就是我正在努力使用的方法,它来自一个文件名。就是这个: 文件中的 insert 方法如下所示: 这是的插入方法.java 它们是相同的。现在问题出现了,因为来自.java不能更改。我必须接受一个双精度,然后将该双精

  • 我在这个问题上发现了一些类似的问题,但我想再问一遍,以便得到一个更明确的答案。我正在编写一个图匹配算法,其中图上的每个节点分配给一个优先级集,取决于其邻居的匹配。细节其实并不重要,但我使用了std::priority_queue以便首先匹配最高优先级的节点。这里有一个棘手的问题:每次引入一个新的匹配,匹配节点的邻居的优先级将被更新。 我的问题自然是,如何更新新匹配的顺序?我能强制执行吗?或者是否有

  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 我试图实现Dijkstra算法的一个版本,以找到公共汽车从起点到终点的最短路线。不幸的是,我似乎找不到swift提供优先级队列类型的库或其他方式,所以我似乎必须自己编写代码。 话虽如此,有人能指出我做这件事的正确方向吗? 目前我的想法如下: 到目前为止这是我的代码。似乎太短太残忍了...我一定是在概念上漏掉了什么。

  • 注意:我知道可以用比较器创建优先级队列,然后重复调用Add。

  • 考虑下面的优先级类声明<代码>类优先级队列 我的想法: 我能想到的一件事是,这将强制优先级队列使用对象比较器,并且不会提供实现其自定义比较器的能力,因为类的用户可能希望基于某个不同的比较器构建队列。