数据结构之优先队列

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方法主要讲述:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值