优先级队列可以用有序数组来实现,这种做法的问题是,尽管删除最大数据项的时间复杂度为O(1),但是插入还是需要较长的O(N)时间,这是因为必须移动数组中平均一半的数据项以插入新数据项,并在完成插入后,数组依然有序。
这里介绍实现优先级队列的另一种结构:堆。堆是一种树,并非java和C++等编译语言里的“堆”。由它实现的优先级队列的插入和删除的时间复杂度都是O(logN)。尽管这样删除的时间变慢了一些,但是插入的时间快的多了。当速度非常重要,且有很多插入操作是,可以选择堆来实现优先级队列。堆有如下特点:
·它是完全二叉树。即除了树的最后一层节点不需要是满的外,其他的每一层从左到右都完全是满的。
·它常常用一个数组实现。用数组实现的完全二叉树中,节点的索引有如下特点(设该节点的索引为x):
它的父节点的索引为 (x-1) / 2;
它的左子节点索引为 2*x + 1;
它的右子节点索引为 2*x + 2。
·堆中每个节点的关键字都大于(或等于)这个节点的子节点的关键字。这也是堆中每个节点必须满足的条件。所以堆和二叉搜索树相比,是弱序的。
向堆中插入数据,首先将数据项存放到叶节点中(即存到数组的最后一项),然后从该节点开始,逐级向上调整,直到满足堆中节点关键字的条件为止。
从堆中删除数据与插入不同,删除时永远删除根节点的数据,因为根节点的数据最大,删除完后,将最后一个叶节点移到根的位置,然后从根开始,逐级向下调整,直到满足堆中节点关键字的条件为止。具体的看下面的代码:
- public class Heap {
- private Node[] heapArray;
- private int maxSize;
- private int currentSize;
- public Heap(int mx) {
- maxSize = mx;
- currentSize = 0;
- heapArray = new Node[maxSize];
- }
- public boolean isEmpty() {
- return (currentSize == 0)? true : false;
- }
- public boolean isFull() {
- return (currentSize == maxSize)? true : false;
- }
- public boolean insert(int key) {
- if(isFull()) {
- return false;
- }
- Node newNode = new Node(key);
- heapArray[currentSize] = newNode;
- trickleUp(currentSize++);
- return true;
- }
- //向上调整
- public void trickleUp(int index) {
- int parent = (index - 1) / 2; //父节点的索引
- Node bottom = heapArray[index]; //将新加的尾节点存在bottom中
- while(index > 0 && heapArray[parent].getKey() < bottom.getKey()) {
- heapArray[index] = heapArray[parent];
- index = parent;
- parent = (parent - 1) / 2;
- }
- heapArray[index] = bottom;
- }
- public Node remove() {
- Node root = heapArray[0];
- heapArray[0] = heapArray[--currentSize];
- trickleDown(0);
- return root;
- }
- //向下调整
- public void trickleDown(int index) {
- Node top = heapArray[index];
- int largeChildIndex;
- while(index < currentSize/2) { //while node has at least one child
- int leftChildIndex = 2 * index + 1;
- int rightChildIndex = leftChildIndex + 1;
- //find larger child
- if(rightChildIndex < currentSize && //rightChild exists?
- heapArray[leftChildIndex].getKey() < heapArray[rightChildIndex].getKey()) {
- largeChildIndex = rightChildIndex;
- }
- else {
- largeChildIndex = leftChildIndex;
- }
- if(top.getKey() >= heapArray[largeChildIndex].getKey()) {
- break;
- }
- heapArray[index] = heapArray[largeChildIndex];
- index = largeChildIndex;
- }
- heapArray[index] = top;
- }
- //根据索引改变堆中某个数据
- public boolean change(int index, int newValue) {
- if(index < 0 || index >= currentSize) {
- return false;
- }
- int oldValue = heapArray[index].getKey();
- heapArray[index].setKey(newValue);
- if(oldValue < newValue) {
- trickleUp(index);
- }
- else {
- trickleDown(index);
- }
- return true;
- }
- public void displayHeap() {
- System.out.println("heapArray(array format): ");
- for(int i = 0; i < currentSize; i++) {
- if(heapArray[i] != null) {
- System.out.print(heapArray[i].getKey() + " ");
- }
- else {
- System.out.print("--");
- }
- }
- }
- }
- class Node {
- private int iData;
- public Node(int key) {
- iData = key;
- }
- public int getKey() {
- return iData;
- }
- public void setKey(int key) {
- iData = key;
- }
- }
相关推荐
数据结构与算法是计算机科学领域的两大基石,它们几乎无处不在地影响着我们的日常生活和工作。尽管很多人可能会有这样的误解,认为数据结构和算法是高深且脱离实际工作的理论知识,只在面试或者特定情况下才会用到。...
数据结构与算法是计算机科学的基础,它涉及到如何有效地组织和管理数据,以便进行高效地查找、存储和处理。本资源包含的数据结构与算法课后习题答案,是学习这一领域的重要辅助材料,可以帮助学生深入理解和巩固所学...
以下是对标题“数据结构与算法 课后答案”以及描述“数据结构与算法(C++版)参考答案、 数据结构、算法”的详细解释和相关知识点的阐述。 首先,我们来谈谈数据结构。数据结构是组织、存储和管理数据的方式,它...
在编程领域,数据结构与算法是核心组成部分,它们直接影响到程序的效率和性能。Java作为广泛应用的编程语言,其在实现数据结构和算法时有着丰富的库支持和优秀的可读性。下面将对标题和描述中提到的一些关键知识点...
5. **课程内容**:可能包括基础数据结构的实现、算法设计与分析、复杂度理论、高级数据结构(如堆、B树等)、图算法、排序与查找算法的C#实现、动态规划和贪心策略等。 6. **学习资源**:“C#数据结构与算法_武汉...
根据提供的文件信息,这里主要关注的是“C++数据结构与算法(第4版)”这一主题,虽然实际内容并未给出具体章节或知识点,但我们可以基于标题、描述以及部分已知内容来推测书中可能涵盖的关键知识点。 ### C++数据...
数据结构与算法是计算机科学中的核心课程,它探讨如何有效地组织和处理数据,以及如何设计和分析解决问题的算法。这份“数据结构与算法-PPT课件”提供了丰富的学习材料,涵盖了多个关键主题。 首先,我们要了解数据...
在IT领域,数据结构与算法是编程基础的重要组成部分,它们直接影响到程序的效率和优化能力。本资源"数据结构与算法代码详解JAVA版"聚焦于使用Java语言来理解和实现这些核心概念。 首先,数据结构是组织和存储数据的...
《数据结构与算法分析C++语言描述第四版》是一本深度探讨数据结构和算法的经典教材。这本书由Mark Allen Weiss撰写,旨在帮助读者理解和掌握如何在C++编程环境中有效地设计和实现数据结构及算法。第四版更新了内容,...
《数据结构与算法分析C++描述(第三版)》是一本深入探讨数据结构和算法的专著,由Mark Allen Weiss撰写。这本书以C++编程语言为载体,详细阐述了数据组织方式和解决问题的有效方法,是计算机科学教育领域的重要教材...
数据结构与算法是计算机科学的基础,对于理解和设计高效的软件至关重要。在"恋上数据结构与算法第二季"的课程中,我们深入探讨了这个领域的核心概念。本课程旨在通过丰富的实例和详细的解释,帮助学习者掌握这些关键...
《数据结构与算法 Python语言描述》是裘宗燕教授撰写的一本专著,主要面向希望深入理解数据结构和算法,并且希望通过Python语言实现这些概念的读者。这本书是北京大学的教学资源,因其深入浅出的讲解方式而备受推崇...
数据结构与算法紧密相连,因为算法通常需要在特定的数据结构之上执行。例如,二分查找需要数组或有序列表这样的数据结构,而链表则不适合此类算法。这是因为不同的数据结构提供了不同的操作特性和效率,影响了算法的...
《数据结构与算法 Python语言描述》是裘宗燕编著的一本专著,它深入浅出地介绍了数据结构和算法的基础知识,特别是如何利用Python语言进行实现。这本书以高清且带有目录的形式,使得读者能够方便地查找和学习相关...
数据结构与算法分析是计算机科学中的核心课程,它主要研究如何高效地组织和处理数据,以及设计和分析用于解决问题的算法。在这个主题中,我们涵盖了数组、链表、栈、队列、树、图、哈希表等基本数据结构,以及排序、...
数据结构与算法是计算机科学的基础,对于理解和解决复杂问题至关重要。哈工大的这门课程《数据结构与算法(第5版)》显然旨在深入探讨这些关键概念。PPT材料通常包含课程的核心要点、实例和练习,帮助学生系统地学习...
在数据结构与算法设计领域,有若干核心概念与知识点,包括线性结构、树形结构、图结构、查找与排序等。以下是对这些主题的深入分析与解释。 ### 线性结构 在数据结构中,线性结构是最基本的一种数据组织形式。它...
《数据结构、算法与应用 C++语言描述》第二版是一本深入探讨数据结构、算法及其在C++编程中的实现的经典著作。这本书旨在帮助读者理解和掌握数据结构和算法的基础知识,并通过C++语言来实践这些概念,提升编程能力。...
数据结构与算法是计算机科学的基础,对于理解和解决复杂问题至关重要。Python作为一种易读性强、语法简洁的编程语言,被广泛用于教学和实践数据结构与算法。裘宗燕编著的《数据结构与算法 Python语言描述》一书,...