具有基于元素字段的元素唯一性的优先级队列的数据结构

时间:2015-08-05 01:00:32

标签: java data-structures

我现在用Java编写Basic Theta *路径规划算法的实现。我有一个名为Vertex的类,它实际上是空间中的3D点(location),指向另一个顶点(parent)的指针,一个到目标顶点的直接距离的浮点数( distanceToGoalVertex)和沿着从顶点到起始顶点(distanceToStartVertex的路径的距离的浮点数,通过跟随连续的父指针并计算总距离来找到。

在另一个课程中,我在有障碍的环境中操纵顶点,以找到从起始顶点到目标顶点的路径。名为open的数据结构用于保存已标记为展开但尚未展开的顶点。扩展顶点意味着查看8个周围顶点(在网格上)并将它们添加到open。这里的问题是,当我展开顶点时,我将得到一个顶点集合,其中此集合中的至少一个顶点在展开时将返回原始顶点。这将导致无限循环,因此是不可接受的。为了解决这个问题,我需要一种方法来仅向open添加之前未访问过的顶点。问题是我不能依赖equals() Vertex distanceToStartVertex方法,因为open随着到达起始点的路径的增长而随每次迭代而变化。似乎唯一的选择是使用顶点的位置。

最终我需要一个PriorityQueue的集合,它允许我使用比较器(我已经做过,没有问题)对元素进行排序,并且可以完全基于位置拒绝重复。数据结构还需要具有返回元素的方法,从而最小化比较器。我已经考虑过扩展{{1}}并覆盖添加元素的方法,以便在添加之前检查所有元素的位置,但这看起来效率非常低。我应该如何以不会影响效率的方式制作数据结构?

1 个答案:

答案 0 :(得分:0)

对于TreeSet,您的问题似乎非常理想,除了条件

  

请注意,如果要正确实现Set接口,则由set维护的排序(无论是否提供显式比较器)必须与equals一致。 (有关与equals一致的精确定义,请参阅Comparable或Comparator。)这是因为Set接口是根据equals操作定义的,但TreeSet实例使用compareTo(或compare)方法执行所有元素比较,因此从集合的角度来看,通过这种方法被认为相等的元素是相等的。

这意味着您仅根据位置排除方法的条件不起作用。

一种选择是围绕TreeMap创建一个瘦包装类。

public class VertexSet {
  private TreeMap<Location, Vertex> treeMap; //todo: instantiate w/ comparator in constructor

  public void add(Vertex v){
    treeMap.putIfAbsent(v.getLocation(), v);
  }

 public Vertex pop() {
    treeMap.get(treeMap.firstKey());  
  }
}

此解决方案:

  1. 您在构造函数中传递的Comparator订单
  2. 如果密钥(Location)不存在,只会添加到地图中,以避免重复