我写了一个迷宫求解程序,该程序应该支持DFS、BFS、a*、Dijkstra和贪婪算法。无论如何,我选择PriorityQueue作为我的frontier数据结构,因为我认为优先级可以表现为队列、堆栈或优先级队列,这取决于比较器的实现。
这就是我如何实现比较器以将优先级队列转换为队列:
/由于优先级队列的“自然排序”在队列的头部具有最小的元素,并且当第一个元素小于第二个元素时,传统比较器返回-1,因此被黑客攻击的比较器总是返回1,以便当前(最后一个)方将被置于尾部(这应该递归工作)/
public int compare(Square square1, Square square2)
{
return 1;
}
然而,在我做了BFS之后,我对迷宫的解决方案并不是最优的。
迷宫从右上角的坐标(35,1)开始,我的程序检查左边,然后向上,然后向下,然后是右边。以下是我所做的打印:
民调结果(35,1)
添加(34,1)
添加(35,2)
民调结果(34,1)
增加(33,1)
添加(34,2)
民意测验(35,2)
增加(35,3)
民调结果(33,1)
增加(32,1)
增加(33,2)
民调结果(34,2)
加(34,3)
投票结果(32,1)
......
BFS(35,3)中的通知应该在(32,1)之前被轮询掉,因为前者是在后者之前添加到队列中的。真正让我困惑的是,数据结构表现得像一个队列——所有新成员都是从后面添加的——直到我添加(32,1),它被放在队列的前面。
我认为我的比较器应该强制优先级队列将新来者放在后面。更让我感到陌生的是,数据结构的性质从队列变成了中间的堆栈。
非常感谢你们前面的人,对我糟糕的英语感到抱歉,真诚的肖恩
您实现比较
的方式是错误的,并且只有在以您假设的非常特定的方式调用时才会起作用。但是,您不知道PriorityQueue
实际上在什么上下文中调用比较
。可以在数据结构中的现有元素上调用比较
函数,而不是在新元素上调用,反之亦然。
(即使您确实阅读了源代码并对其进行了跟踪,发现此特定实现以某种方式工作,但如果您希望代码可维护,也不应该依赖于此。至少,您需要解释其工作原理,从而使自己的工作更为繁重。)
您可以使用某种计数器并将其指定为每个添加项的值,然后根据该值正确执行compare
。
compare
的正确实现可能如下所示:
int compare(Object x, Object y){
return x.getSomeProperty() - y.getSomeProperty();
}
请注意,如果切换参数的顺序,答案也会改变。不,返回的int不一定来自{-1,0,1}。该规范调用0或负整数或正整数。只要符号正确,你可以用任何一个。
问题内容: 我编写了一个迷宫求解程序,该程序应该支持DFS,BFS,A *,Dijkstra和贪婪算法。无论如何,我选择了PriorityQueue作为我的边界数据结构,因为我认为优先级的行为就像队列,堆栈或优先级队列一样,取决于比较器的实现。 这是我实现比较器以将优先级队列转换为队列的方式: / 由于优先级队列的“自然排序”元素最少,并且常规比较器在第一个小于第二个时返回-1,因此被黑的比较器始
我正在实现一个应用程序,该应用程序根据曼哈顿距离查找(x,y)平面中给定位置的最近n个事件。我使用最大优先级队列来存储找到的事件,并使用曼哈顿距离比较器。这个队列应该总是有最大人距离事件作为它的窥视,但是我发现这不会一直发生。我在循环中使用pq.poll()打印了这个队列的结果,我发现队列在删除后没有重新排列,只是有时。 我的比较者: 以主方法打印: 输出: 如您所见,事件不是按降序排列的!然而,
注意:我知道可以用比较器创建优先级队列,然后重复调用Add。
我有一个,名为,其中包含类型的对象。 您可以在所有车辆上调用该方法。 我要做的是排序,这样车辆被赋予更高的优先级,并被放在队列的前面。 我假设我必须在这里使用一个比较器,但不知道怎么做。
考虑下面的优先级类声明<代码>类优先级队列 我的想法: 我能想到的一件事是,这将强制优先级队列使用对象比较器,并且不会提供实现其自定义比较器的能力,因为类的用户可能希望基于某个不同的比较器构建队列。
优先级队列(Priority Queue) 注:队列是一种特征为FIFO的数据结构,每次从队列中取出的是最早加入队列中的元素。但是,许多应用需要另一种队列,每次从队列中取出的应是具有最高优先权的元素,这种队列就是优先级队列(Priority Queue),也称为优先权队列。 1. 优先级队列的概念 1.1 优先级队列的定义 优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优