`

数据结构与算法08 之堆

阅读更多

        优先级队列可以用有序数组来实现,这种做法的问题是,尽管删除最大数据项的时间复杂度为O(1),但是插入还是需要较长的O(N)时间,这是因为必须移动数组中平均一半的数据项以插入新数据项,并在完成插入后,数组依然有序。

        这里介绍实现优先级队列的另一种结构:堆。堆是一种树,并非java和C++等编译语言里的“堆”。由它实现的优先级队列的插入和删除的时间复杂度都是O(logN)。尽管这样删除的时间变慢了一些,但是插入的时间快的多了。当速度非常重要,且有很多插入操作是,可以选择堆来实现优先级队列。堆有如下特点:

        ·它是完全二叉树。即除了树的最后一层节点不需要是满的外,其他的每一层从左到右都完全是满的。

        ·它常常用一个数组实现。用数组实现的完全二叉树中,节点的索引有如下特点(设该节点的索引为x):

             它的父节点的索引为 (x-1) / 2;

             它的左子节点索引为 2*x + 1;

             它的右子节点索引为 2*x + 2。

        ·堆中每个节点的关键字都大于(或等于)这个节点的子节点的关键字。这也是堆中每个节点必须满足的条件。所以堆和二叉搜索树相比,是弱序的。

        向堆中插入数据,首先将数据项存放到叶节点中(即存到数组的最后一项),然后从该节点开始,逐级向上调整,直到满足堆中节点关键字的条件为止。

        从堆中删除数据与插入不同,删除时永远删除根节点的数据,因为根节点的数据最大,删除完后,将最后一个叶节点移到根的位置,然后从根开始,逐级向下调整,直到满足堆中节点关键字的条件为止。具体的看下面的代码:

 

  1. public class Heap {  
  2.       
  3.     private Node[] heapArray;  
  4.     private int maxSize;  
  5.     private int currentSize;  
  6.       
  7.     public Heap(int mx) {  
  8.         maxSize = mx;  
  9.         currentSize = 0;  
  10.         heapArray = new Node[maxSize];  
  11.     }  
  12.       
  13.     public boolean isEmpty() {  
  14.         return (currentSize == 0)? true : false;  
  15.     }  
  16.       
  17.     public boolean isFull() {  
  18.         return (currentSize == maxSize)? true : false;  
  19.     }  
  20.       
  21.     public boolean insert(int key) {  
  22.         if(isFull()) {  
  23.             return false;  
  24.         }  
  25.         Node newNode = new Node(key);  
  26.         heapArray[currentSize] = newNode;  
  27.         trickleUp(currentSize++);  
  28.         return true;  
  29.     }  
  30.     //向上调整  
  31.     public void trickleUp(int index) {  
  32.         int parent = (index - 1) / 2//父节点的索引  
  33.         Node bottom = heapArray[index]; //将新加的尾节点存在bottom中  
  34.         while(index > 0 && heapArray[parent].getKey() < bottom.getKey()) {  
  35.             heapArray[index] = heapArray[parent];  
  36.             index = parent;  
  37.             parent = (parent - 1) / 2;  
  38.         }  
  39.         heapArray[index] = bottom;  
  40.     }  
  41.       
  42.     public Node remove() {  
  43.         Node root = heapArray[0];  
  44.         heapArray[0] = heapArray[--currentSize];  
  45.         trickleDown(0);  
  46.         return root;  
  47.     }  
  48.     //向下调整  
  49.     public void trickleDown(int index) {  
  50.         Node top = heapArray[index];  
  51.         int largeChildIndex;  
  52.         while(index < currentSize/2) { //while node has at least one child  
  53.             int leftChildIndex = 2 * index + 1;  
  54.             int rightChildIndex = leftChildIndex + 1;  
  55.             //find larger child  
  56.             if(rightChildIndex < currentSize &&  //rightChild exists?  
  57.                     heapArray[leftChildIndex].getKey() < heapArray[rightChildIndex].getKey()) {  
  58.                 largeChildIndex = rightChildIndex;  
  59.             }  
  60.             else {  
  61.                 largeChildIndex = leftChildIndex;  
  62.             }  
  63.             if(top.getKey() >= heapArray[largeChildIndex].getKey()) {  
  64.                 break;  
  65.             }  
  66.             heapArray[index] = heapArray[largeChildIndex];  
  67.             index = largeChildIndex;  
  68.         }  
  69.         heapArray[index] = top;  
  70.     }  
  71.     //根据索引改变堆中某个数据  
  72.     public boolean change(int index, int newValue) {  
  73.         if(index < 0 || index >= currentSize) {  
  74.             return false;  
  75.         }  
  76.         int oldValue = heapArray[index].getKey();  
  77.         heapArray[index].setKey(newValue);  
  78.         if(oldValue < newValue) {  
  79.             trickleUp(index);  
  80.         }  
  81.         else {  
  82.             trickleDown(index);  
  83.         }  
  84.         return true;  
  85.     }  
  86.       
  87.     public void displayHeap() {  
  88.         System.out.println("heapArray(array format): ");  
  89.         for(int i = 0; i < currentSize; i++) {  
  90.             if(heapArray[i] != null) {  
  91.                 System.out.print(heapArray[i].getKey() + " ");  
  92.             }  
  93.             else {  
  94.                 System.out.print("--");  
  95.             }  
  96.         }  
  97.     }  
  98. }  
  99. class Node {  
  100.     private int iData;  
  101.     public Node(int key) {  
  102.         iData = key;  
  103.     }  
  104.       
  105.     public int getKey() {  
  106.         return iData;  
  107.     }  
  108.       
  109.     public void setKey(int key) {  
  110.         iData = key;  
  111.     }  
  112. }  

 

 

http://blog.csdn.net/eson_15/article/details/51105955

分享到:
评论

相关推荐

    数据结构与算法之美

    数据结构与算法是计算机科学领域的两大基石,它们几乎无处不在地影响着我们的日常生活和工作。尽管很多人可能会有这样的误解,认为数据结构和算法是高深且脱离实际工作的理论知识,只在面试或者特定情况下才会用到。...

    数据结构与算法 数据结构与算法课后习题答案

    数据结构与算法是计算机科学的基础,它涉及到如何有效地组织和管理数据,以便进行高效地查找、存储和处理。本资源包含的数据结构与算法课后习题答案,是学习这一领域的重要辅助材料,可以帮助学生深入理解和巩固所学...

    数据结构与算法 课后答案

    以下是对标题“数据结构与算法 课后答案”以及描述“数据结构与算法(C++版)参考答案、 数据结构、算法”的详细解释和相关知识点的阐述。 首先,我们来谈谈数据结构。数据结构是组织、存储和管理数据的方式,它...

    武汉大学 C#数据结构与算法

    5. **课程内容**:可能包括基础数据结构的实现、算法设计与分析、复杂度理论、高级数据结构(如堆、B树等)、图算法、排序与查找算法的C#实现、动态规划和贪心策略等。 6. **学习资源**:“C#数据结构与算法_武汉...

    java数据结构与算法.pdf

    在编程领域,数据结构与算法是核心组成部分,它们直接影响到程序的效率和性能。Java作为广泛应用的编程语言,其在实现数据结构和算法时有着丰富的库支持和优秀的可读性。下面将对标题和描述中提到的一些关键知识点...

    数据结构与算法分析—c语言描述

    《数据结构与算法分析—C语言描述》是一本深度探讨数据结构和算法的书籍,它以C语言作为实现工具,为读者提供了丰富的编程实践指导。这本书涵盖了数据结构的基础理论、设计方法以及C语言的实现技巧,是计算机科学...

    数据结构与算法 Java版

    数据结构与算法是计算机科学的基础,对于任何编程语言来说,理解和掌握它们都是至关重要的,特别是对于Java这样的高级语言。在Java中实现数据结构和算法,能够帮助开发者更高效地解决问题,提升程序性能。 数据结构...

    Java数据结构与算法第二版源代码

    《Java数据结构与算法第二版源代码》是一个深入学习Java编程和算法的重要资源,它包含了丰富的实例和程序,旨在帮助开发者提升对数据结构和算法的理解与应用能力。在这个压缩包中,有两个主要的子文件:...

    数据结构与算法-PPT课件

    数据结构与算法是计算机科学中的核心课程,它探讨如何有效地组织和处理数据,以及如何设计和分析解决问题的算法。这份“数据结构与算法-PPT课件”提供了丰富的学习材料,涵盖了多个关键主题。 首先,我们要了解数据...

    数据结构与算法分析C++描述(附源码)

    数据结构与算法分析是计算机科学中的核心课程,它关乎如何高效地存储和处理数据,以及设计和实现高效的计算过程。C++作为一种强大的编程语言,常用于实现这些数据结构和算法,因为它提供了丰富的库支持和面向对象的...

    C++数据结构与算法 (第4版)

    根据提供的文件信息,这里主要关注的是“C++数据结构与算法(第4版)”这一主题,虽然实际内容并未给出具体章节或知识点,但我们可以基于标题、描述以及部分已知内容来推测书中可能涵盖的关键知识点。 ### C++数据...

    数据结构与算法代码详解JAVA版

    在IT领域,数据结构与算法是编程基础的重要组成部分,它们直接影响到程序的效率和优化能力。本资源"数据结构与算法代码详解JAVA版"聚焦于使用Java语言来理解和实现这些核心概念。 首先,数据结构是组织和存储数据的...

    数据结构与算法分析C++语言描述第四版参考答案

    《数据结构与算法分析C++语言描述第四版》是一本深度探讨数据结构和算法的经典教材。这本书由Mark Allen Weiss撰写,旨在帮助读者理解和掌握如何在C++编程环境中有效地设计和实现数据结构及算法。第四版更新了内容,...

    数据结构与算法分析java版

    全书共分为六个部分,分别涵盖了数据结构的基本概念、数组、简单的排序算法、栈与队列、链表、递归等内容,并深入探讨了高级排序算法、二叉树、红黑树、2-3-4树以及外部存储、哈希表、堆、图和加权图等高级主题。...

    数据结构与算法分析C++描述(第三版)_数据开发_数据结构与算法分析第三版C++_

    《数据结构与算法分析C++描述(第三版)》是一本深入探讨数据结构和算法的专著,由Mark Allen Weiss撰写。这本书以C++编程语言为载体,详细阐述了数据组织方式和解决问题的有效方法,是计算机科学教育领域的重要教材...

    数据结构与算法分析C++描述

    《数据结构与算法分析C++描述》是一本深入探讨数据结构和算法的书籍,主要针对C++编程语言进行讲解。本书旨在帮助读者理解和掌握如何在实际编程中有效地使用各种数据结构和算法,从而提高程序的效率和性能。下面将...

    数据结构与算法分析_java语言描述

    本书从讲解什么是数据结构开始,延伸至高级数据结构和算法分析,强调数据结构和问题求解技术。本书的目的是从抽象思维和问题求解的观点提供对数据结构的实用介绍,试图包含有关数据结构、算法分析及其Java实现的所有...

    恋上数据结构与算法第二季课件pdf

    数据结构与算法是计算机科学的基础,对于理解和设计高效的软件至关重要。在"恋上数据结构与算法第二季"的课程中,我们深入探讨了这个领域的核心概念。本课程旨在通过丰富的实例和详细的解释,帮助学习者掌握这些关键...

Global site tag (gtag.js) - Google Analytics