Java中基于Map排序的PriorityQueue修改Map值后优先级不更新问题
Dijkstra算法中PriorityQueue优先级不自动更新的原因
Java PriorityQueue的堆实现逻辑限制:Java的
PriorityQueue基于二叉小顶堆实现,堆结构的维护仅在**元素插入(offer)、删除(poll/remove)**操作触发时执行。它完全不会监听外部数据的变化——你的比较器依赖distances哈希表里的距离值,当这个值被更新后,队列根本感知不到,自然不会调整元素的优先级顺序。比较器的生效时机有限:PriorityQueue仅在元素刚入队,或队列因删除操作需要重构堆时,才会用Comparator判断元素优先级。一旦元素已在队列中,哪怕用来比较的外部条件(即
distances里的距离)发生变化,队列也不会重新计算该元素的位置,它没有追踪外部依赖变化的机制。堆结构的特性决定无法动态调整:元素入队时,堆就已根据当时的优先级确定了它的位置。除非执行移除指定元素(
remove)或弹出堆顶(poll)这类会触发堆重构的操作,否则已入队元素的相对顺序不会因外部比较值的改变而自动更新。这就是为什么你必须先把节点从队列中删掉,再重新加入,才能让队列用新的距离值计算它的优先级。
内容的提问来源于stack exchange,提问作者Kaloyan
相关产品推荐
相关产品推荐

