
PriorityQueue介绍
Coding的哔哔叨叨

上图中,我们对每个元素进行了编号,认真观察可以 发现,父节点和子节点的编号存在一定关系,具体关系如下:
leftNo = parentNo*2+1 rightNo = parentNo*2+2 parentNo = (nodeNo-1)/2
通过上面三个公式,可以很轻易计算出某个节点的父节点及子节点在数组中的下标,这也是为什么可以用数组来存储堆的原因。
PriorityQueue重点方法
Coding的哔哔叨叨
PriorityQueue的peek()和element()操作是常数时间,add()、offer(),无参数的remove()以及poll()方法的时间复杂度都是log(N)。
add()和offer()
add(E e)和offer(E e)两个方法语义相同,都是向优先队列中插入元素,只是Queue接口规定二者对插入失败时的处理不同,前者在插入失败时抛出异常,后者会返回false。对于PriorityQueue这两个方法其实没什么差别。


element()和peek()

remove()和poll()
remove()和poll()方法的语义也完全相同,都是获取并删除队首元素,区别是当方法失败时前者抛出异常,后者返回null;而且java8以后remove()方法已经去掉了。
由于删除操作会改变队列的结构,为维护小顶堆的性质,需要进行必要的调整。


remove(Object o)
remove(Object o)方法用于删除队列中跟o相等的某一个元素(如果有多个相等,只删除一个),该方法不是Queue接口内的方法,而是Collection接口的方法。由于删除操作会改变队列结构,所以要进行调整;又由于删除元素的位置可能是任意的,所以调整过程比其它函数稍加繁琐。具体来说,remove(Object o)可以分为2种情况:1. 删除的是最后一个元素。直接删除即可,不需要调整。2. 删除的不是最后一个元素,从删除点开始以最后一个元素为参照调用一次siftDown()即可。此处不再赘述。




不积跬步,无以至千里。
文章有帮助的话,点个转发、在看呗
。
谢谢支持哟 (*^__^*)
END
👇

文章转载自Coding的哔哔叨叨,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。







。