Java:由优先级队列组成的奇怪的队列顺序

时间:2012-10-04 04:32:01

标签: java priority-queue

我写了一个迷宫解决程序,它应该支持DFS,BFS,A *,Dijkstra和贪婪算法。无论如何,我选择PriorityQueue作为我的前沿数据结构,因为我认为优先级可以像队列,堆栈或优先级队列一样取决于比较器的实现。

这是我实现比较器以将优先级队列转换为队列的方式:

/ 由于优先级队列的“自然排序”头部元素最少而传统比较器在第一个小于第二个时返回-1,因此被黑客攻击的比较器总是返回1以便当前(最后)square将被放置在尾部(这应该递归地工作) /

public int compare(Square square1, Square square2)
{
    return 1;
}

然而,在我做了BFS之后,我对迷宫的解决方案并不是最佳的。

迷宫从右上角开始,坐标为(35,1),我的程序检查左边,然后是向上,然后向下,然后是右邻居。 这是我做的println:

民意调查(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),它被放置在队列的头部。

我认为我的比较器应该强制优先级队列将新来的人放在后面。对我来说更奇怪的是,数据结构在中间将其性质从队列改为堆栈。

非常感谢你们前方,对不起我的英语不好, 此致 肖恩

1 个答案:

答案 0 :(得分:4)

你实现compare的方式是错误的,并且只有在你假设的非常具体的方式调用它时才会起作用。但是,您不知道PriorityQueue实际调用compare的上下文。 compare函数可能会在数据结构中的现有元素上调用,而不是在新元素上调用,反之亦然。

(即使您确实阅读了源代码并对其进行了跟踪,并发现此特定实现以某种方式工作,如果您希望代码可维护,则不应依赖于此。至少,您应该通过解释它为什么有用来让自己做更多工作。)

您可以使用某种计数器并将其指定为每个添加项的值,然后根据值正确实现compare

compare的正确实现可能如下所示:

int compare(Object x, Object y){
    return x.getSomeProperty() - y.getSomeProperty();
}

请注意,如果切换参数的顺序,答案也会改变。不,返回的int not 必须来自{-1,0,1}。规范要求0,或负整数或正整数。你可以使用任何你想要的,只要它是正确的标志。