数据结构之优先队列
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() 会进行删除操作。
参考文章:
http://blog.csdn.net/dy5623405/article/details/51487390
SiftUp方法主要讲述:
优先队列顾名思义,就是优先权最大的排在队列的头部,而优先权的判断是根据对象的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方法主要讲述:
相关文章推荐
- 【数据结构——优先队列】优先队列的各种运用
- Javascript数据结构与算法--队列(顺序队列、优先队列、循环队列)的实现与用法
- LeetCode 102. Binary Tree Level Order Traversal 树的广度优先遍历 辅助数据结构队列
- 【数据结构】—— 优先队列
- 数据结构之图(深度优先搜索和广度优先搜索使用的队列和栈)
- 数据结构之优先队列--二叉堆(Java实现)
- 优先队列的实现 Java数据结构与算法
- 数据结构之优先队列--二叉堆(Java实现)
- 数据结构之优先队列-Java PriorityQueue使用(3)
- 数据结构与算法--优先队列和堆排序
- 数据结构之优先队列(二叉堆)
- 数据结构与算法之优先队列<九>
- 数据结构1:栈、队列、优先队列相关的算法题
- 【数据结构——优先队列】 运用:查找最大的M个数
- 优先队列 - 数据结构 (二叉堆)
- 数据结构之广度优先搜索(队列实现)问题
- 数据结构之优先队列
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- 数据结构之队列 C++实现
- 数据结构——栈与队列进制转换