您的位置:首页 > 理论基础 > 数据结构算法

数据结构之优先队列

2017-12-07 12:33 302 查看
1、什么是优先队列

       优先队列顾名思义,就是优先权最大的排在队列的头部,而优先权的判断是根据对象的compare方法比较获取的,保证根节点的优先级一定比子节点的优先级大。所以放入到优先队列的元素要么实现了Comparable接口,要么在创造这个优先队列时,指定一个比较器。

2、java之PriorityQueue分析
     1、存储:java底层采用数据数组Object[] queue来存储队里的数据 默认初始大小为11,最大长度为 Integer.MAX_VALUE
- 8
                     优先队列代表平衡二叉堆,数组中元素的关系:the two  children
of queue
are queue[2*n+1] and queue[2*(n+1)]
         初始化优先队列的方式有两种:
                a.不指定比较器:比较器默认为null 此时队列中的元素需要实现Comparable接口,重写compareTo方法。
                        如果不指定比较器 而且元素类型也不实现Comparable方法 会抛出
  java.lang.ClassCastException: com.hyj.priorityque.Dog cannot be cast to java.lang.Comparable
                b.指定比较器
                  


       2、添加

           


   SiftUp方法主要讲述:



如果插入元素的位置k>0  则寻找k处元素的父亲节点的位置 也就是(k-1)>>>1 比较父节点和插入元素的优先级,如果插入元素的优先级小于父节点的,将父节点插入k所在的位置,k=parent再从此处进行判断 直到k不大于0 则将key值插入queue[k]中。
简单说来 就是不断通过比较跟父元素的优先级 确定插入元素的位置
       3、删除元素
           


 
通过indexOf查询



如果删除的不是最后一个元素:从删除点开始以最后一个元素为参照进行siftDown
4、队列头部的元素
peek() poll() 都可以获取头部的元素 区别就是poll() 会进行删除操作。



siftDown(int k, E x)
方法,该方法的作用是从
k
指定的位置开始,将
x
逐层向下与当前点的左右孩子中较小的那个交换,直到
x
小于或等于左右孩子中的任何一个为止。



参考文章:
http://blog.csdn.net/dy5623405/article/details/51487390
                
SiftUp方法主要讲述:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 优先队列