数据结构之优先队列

1、什么是优先队列

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

2、java之PriorityQueue分析

     1、存储:java底层采用数据数组Object[] queue来存储队里的数据 默认初始大小为11,最大长度为 Integer.MAX_VALUE - 8

                     优先队列代表平衡二叉堆,数组中元素的关系:the two  children of queue[n] 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方法主要讲述:

猜你喜欢

转载自blog.csdn.net/u011220648/article/details/78740010