Scala PriorityQueue 冲突解决?
Posted
技术标签:
【中文标题】Scala PriorityQueue 冲突解决?【英文标题】:Scala PriorityQueue conflict resolution? 【发布时间】:2015-02-23 21:55:33 【问题描述】:我正在开发一个使用 PriorityQueue 和 A* 的项目。在挖掘了一吨之后,我认为我在搜索试图解决我的问题时遇到的部分问题在 PriorityQueue 中。我猜,当它生成得分相等的节点时(例如一个较早和一个较晚),它会从较早的节点中选择一个,而不是最近生成的节点。
如果分数相同,有谁知道 PriorityQueue 是否优先考虑最新节点?如果没有,我怎样才能做到这一点?
谢谢!
【问题讨论】:
你试过测试这个吗?如果您创建一个PriorityQueue
并插入多个具有相同重量的项目会发生什么?应该很容易确认。
@dimo414:它可能会产生一个反例,但实际上并不能证实任何事情。这可能是巧合。
如果它生成一个反例,它会回答你的问题(PriorityQueue 是否优先考虑最新的节点?不会。)即使你正在寻找概念上的答案,花时间去探索实际的答案是值得,对于您自己和可能会看到您的帖子的其他人,以及可能试图回答您的问题的人。你在一个问题上付出的努力越多,其他人就越愿意帮助你。
在这种情况下,只需查看PriorityQueue
documentation 就会告诉您它是由堆支持的,您可以很容易地验证它是“not a sorted structure”。
您可能对我的项目scala-prioritymap 感兴趣,它为您提供了一个不可变的优先级队列变体。
【参考方案1】:
PriorityQueue
使用堆来选择下一个元素。除此之外,它不保证元素的排序方式。如果节点按添加顺序排序对您很重要,您应该计算添加的项目数并按元组(priority, -order)
优先级。
如果您执行其他任何操作,即使它现在可以正常工作,它也可能随时中断,因为 API 不保证它如何从相等的元素中进行选择。
【讨论】:
以上是关于Scala PriorityQueue 冲突解决?的主要内容,如果未能解决你的问题,请参考以下文章
Scala :: PriorityQueue => 更新特定项目的优先级
scala.collection.mutable.PriorityQueue:与案例类的 2 个或更多属性进行比较
Scala 问题对 Stack[A] 使用 PriorityQueue 非默认排序