堆与优先级队列
来源:互联网 发布:延时摄影制作软件 编辑:程序博客网 时间:2024/06/05 15:14
优先级队列是一种数据结构,其中能被访问和删除的是仅具有最高优先级的元素。所谓优先级是通过一些方法对元素进行比较得出的。基本的思路是队列中存在等待服务的元素。对元素的选取不再严格基于先来先服务原则。 Heap类是对PriorityQueue接口的一种高效实现。堆是一种完全二叉树。由于使用基于数组的完全二叉树的表示,可以根据子节点的索引快速计算出你父节点的索引,反之亦然,所以,使用数组来表示堆,它是利用了数组可以根据给定索引随机访问元素的特性。 基于四叉堆优先级队列及逆邻接表的改进型Dijkstra 算法
摘 要:
在深入分析传统Dijkstra算法的基础上,提出了利用基于k叉堆的优先级队列对算法进行改进的思想,并对3种可合并替进行了比较,从理论上证明了四叉堆在k叉堆中的最优性,设计了基于四叉堆优先级队列及逆领接表,顾及路段方向阻抗的改进型Dijkstra最短径算法,将Dijstra算法复杂度降为O(nlogn)。堆与优先级队列
文章分类:综合技术
定义如下:优先级队列是这样的一种数据结构,对它的访问或者删除操作只能对集合中通过指定优先级方法得出的最高优先级元素进行。
优先级队列是公平的,对于任何两个具有相同优先级的元素,首先被删除的是那个在队列中存在时间最长的元素。如果元素是Integer类型且按照其排列的顺序进行比较,那么具有最高优先级的元素就是优先级队列中相应的int值最小的那个元素。如果元素是Integer类型,但是比较方法与原排列顺序相反,那么具有最高优先级的元素就是优先级队列中相应的int值最大的元素。到底是最小的还是最大的元素优先,具体的优先比较算法由实现PriorityQueue接口的程序员来决定。
那么堆与优先级队列又有什么关系呢,实质上堆可用来实现优先级队列,或者说堆就是一种优先级队列。由于堆的添加元素与删除元素时都会破坏堆结构,所以添加与删除进都要进行结构调整。一般普通的队列添加是在最后加入,但优先级队列却不一定添加到最后,他会按照优先级算法把它插入到队列当中去,出队时还是从第一个(也即最小元素,优先级最高)开始,即取根元素,这样保证了队列中优先级高的先服务,而不是先来先服务了。 package priorityqueue;/** * 优先级队列接口 * * @author jzj * @data 2010-1-5 * @param <E> */public interface PriorityQueue<E extends Comparable<E>> {int size();boolean isEmpty();//向队列加入元素,添加时会按照优先级别排序void add(E elem);//取优先高的元素E getMin();//从优先级队列中删除优先级最高的元素E removeMin();}
package priorityqueue;import java.util.Comparator;import java.util.LinkedList;import java.util.ListIterator;/** * 基于 LinkedList 优先级队列的实现 * * @author jzj * @data 2010-1-5 * @param <E> */public class LinkedListPriorityQueue<E extends Comparable<E>> implements PriorityQueue<E> {//LinkedList只用来存储,并不排序,排序操作由外界实现private LinkedList<E> list;private Comparator<E> comp;public LinkedListPriorityQueue() {list = new LinkedList<E>();}public LinkedListPriorityQueue(Comparator<E> c) {this();comp = c;}private int compare(E elem1, E elem2) {return comp == null ? elem1.compareTo(elem2) : comp.compare(elem1, elem2);}/** * 插队优先级实现 * @param elem */public void add(E elem) {/* * 如果list本身为空,或者元素的值大于等于list中最后一个元素的值,add方法就把元素对象 * 追加到list的末尾。否则,从头部逐个访问直到找到某个元素,该元素的值大于新增元素的值, * 然后将给定的元素插入到该元素的前面。 */if (list.isEmpty() || compare(elem, list.get(list.size() - 1)) >= 0) {list.addLast(elem);//或 list.add(elem),add方法其实就是在循环链最后即header头节点前添加元素} else {ListIterator<E> itr = list.listIterator();//找到第一个比它大的元素while (itr.hasNext() && compare(elem, itr.next()) >= 0);itr.previous();//因为迭代器的next方法取之后会下移,所以要后移一位itr.add(elem);//在比新元素大的节点前插入元素}}public E getMin() {return list.getFirst();}public boolean isEmpty() {return list.isEmpty();}public E removeMin() {return list.removeFirst();}public int size() {return list.size();}}
- 堆与优先级队列
- 堆与优先级队列
- 优先级队列与堆排序
- 优先级队列与堆排序
- 堆与优先级队列实现
- 堆与优先级队列研究(C++)
- 堆与优先级队列的研究
- 优先级队列与堆的关系
- 堆优先级队列
- 优先级队列+堆
- 堆构造优先级队列
- hdu1509堆 优先级队列
- 最大堆优先级队列
- 堆和优先级队列
- 二叉堆&&优先级队列
- 堆(优先级队列)
- 【数据结构】堆&优先级队列
- 堆&优先级队列
- ajax通过get方式发送请求
- java读取配置文件
- 几个javascript函数
- 设置EditText不弹出软件的方法
- ajax 发送方式
- 堆与优先级队列
- 在非process context中,不能做什么
- New concept English 2 -- Note of lesson 7-2
- 内部类的使用2--链接到外部类
- SIFT算法学习:特征提取函数的使用
- 使用jrtplib写的一个简单服务器和客户端程序
- postgresql,oracle,mysql通过数据字典获取表结构
- Android界面Rotation
- 哈夫曼编码后的感悟