`
Simone_chou
  • 浏览: 192894 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

堆(Heap)

 
阅读更多

概念:

堆通常是一个可以被看作一棵树的数组对象,一个堆是一个几乎完全的二叉树,将根节点最大的堆叫做最大堆,根节点最小的堆叫做最小堆

堆总是有以下性质:

1.堆中某个节点的值总是不大于(最大堆)或不小于(最小堆)其父节点的值;

2.堆总是一棵完全树。

由以上的定义就可以得知,堆顶元素必为序列中n个元素的最小值或者最大值。

 

算法思想:

不必将值一个个地插入堆中,而是通过对比交换形成堆。

假设:以最大堆为例,根的左右子树都已是堆,他们的根结点设为R,那么R与左右儿子的值有两种情况:

1.R同时大于或者等于左右儿子,这时候符合堆的特性,所以这时候堆已完成;

2.R可能小于某一个儿子,或者同时大于左右儿子,那么则R应该与左右儿子中较大的一个进行交换,再用同样的方法进行对比交换,直到满足第一个条件,R同时大于或者等于左右儿子为止。

 

堆的调整:

一.输出堆顶元素后调整剩余元素为一个新堆:

   1.输出堆顶元素并以最后一个元素代替;

   2.比较左右儿子值的大小;

   3.对比后交换;

   4.重复步骤直到满足形成新堆的要求为止。

二.加入元素时向上调整:

   1.先将堆的总共元素+1;

   2.然后将R添加到堆的尾部;

   3.根据需要,将R上移,直到满足新堆特性为止。

三.删除元素时向下调整:

   1.先将堆的总共元素-1;

   2.用堆底元素替代;

   3.根据需要,将R下移,直到满足新堆特性为止。

 

建堆:

给出一个有n个元素的数组,创建一个堆,可以这样进行:

1.从空的堆开始,不断插入一个元素,直到完全转化为堆为止,这种方法创建堆的时间复杂度是O(n logn)。

2.自底向上创建堆:

   把一棵n个节点的几乎完全的二叉树转化成堆,从最后一个节点开始到根节点,逐个扫描所有的节点,根据需要,每一次将以当前节点为根节点的子树转化成堆;这种方法创建堆的时间复杂度是O(n)。

 

堆排序(Heapsort):

    由于堆中的各项最大值存储在堆顶元素中,所以每次将A[1](堆顶元素)与A[N](堆底元素)交换,使A[N]成为最大值,最后通过对比交换,形成一个新堆A[1……N-1]。交换元素和调整堆的元素一直重复,知道堆的大小变成1为止。这种方法的时间复杂度为O(n logn)。而如果对n个元素的数组排序,用线性搜索选择排序或者冒泡排序的话,时间复杂度需要O(n^2)时间。

相关资料:

http://www.cnblogs.com/Jason-Damon/archive/2012/04/18/2454649.html

分享到:
评论
2 楼 Simone_chou 2013-08-14  
沙茶敏 写道
会不会用STL库的堆呀~

不会……
1 楼 沙茶敏 2013-08-13  
会不会用STL库的堆呀~

相关推荐

    c语言实现 小根堆heap

    以上就是关于C语言实现小根堆heap的主要知识点。在minheap这个压缩包文件中,很可能包含了实现这些功能的源代码,通过阅读和理解这些代码,你可以深入学习如何在实际项目中应用这些概念和算法。

    优先队列PriorityQueue, 堆Heap【数据结构和算法入门8】

    优先队列PriorityQueue,_堆Heap【数据结构和算法入门8】

    java堆heapdump分析工具Heap Analzer V4

    15年7月最新版的工具Heap Analzer V4。 分析java内存堆快照的利器,拥有直觉性的判断溢出对象是什么,一目了然。支持上下左右键,免去鼠标点击的痛苦。 对象显示也比较详细,数量,大小都包含,支持对象树的复制。

    基于python的数据结构代码实现-堆Heap

    堆(Heap)是一种特殊类型的数据结构,通常用于实现优先队列。在这个基于Python的数据结构实现中,我们将深入探讨堆的概念、用途以及如何用Python来实现。 堆是一个完全二叉树,其中每个父节点的值都大于或等于...

    MaxHeap 最大堆

    最大堆是一种特殊的树形数据结构,它满足堆的特性:每个节点的值都大于或等于其子节点的值。在最大堆中,根节点总是所有元素中的最大值。这种数据结构在计算机科学中有广泛的应用,比如优先队列、排序算法(如...

    jmap+EclipseMAT:排查内存泄漏的好工具.pdf

    3. 使用 EclipseMAT 工具来分析输出的堆 heap 信息,例如:File -> Load Heap Dump -> 选择输出的堆 heap 文件。 4. 在 EclipseMAT 中,可以看到详细的内存使用情况,包括对象的数量、大小、引用关系等信息。 5. ...

    java中堆(heap)和堆栈(stack)有什么区别

    "Java 中堆(heap)和堆栈(stack)的区别" Java 中堆(heap)和堆栈(stack)是两个不同的内存区域,分别用于存储不同的数据类型和对象。堆栈(stack)是 Java 中的一种内存区域,用于存储基本类型的变量和对象的...

    python算法数据结构课程视频含代码之堆2G

    ### Python算法数据结构课程视频含代码之堆2G #### 数据结构与算法基础:堆的概念 堆是一种特殊的树形数据结构,通常实现为二叉堆。堆被广泛应用于优先队列、排序算法(如堆排序)等场景。堆有两种基本类型:最大...

    heapdump-tool工具

    Heapdump-tool工具是专为Java开发者设计的,用于生成和分析堆转储(Heap Dump)文件的强大工具。堆转储文件记录了Java虚拟机(JVM)在某一时刻的内存状态,包括对象、类、垃圾收集器信息等,这对于诊断内存泄漏、...

    最大堆MaxHeap排序 C++代码

    最大堆排序(MaxHeap Sort)是一种基于比较的排序算法,它利用了数据结构中的最大堆特性来实现排序。最大堆是一种特殊的二叉堆,每个父节点的值都大于或等于其子节点的值,通常以数组的形式存储。下面将详细介绍最大...

    IBM的HeapAnalyzer

    它能帮助开发者深入理解Java虚拟机(JVM)的堆内存状态,通过分析heap dump文件,找出那些占用内存过大的对象,以及这些对象的引用路径,从而定位可能导致问题的代码。 Heap dump是在JVM运行时捕获的一份内存快照,...

    斐波那契堆(Fibonacci Heap)

    斐波那契堆(Fibonacci Heap)是一种高级的数据结构,主要用于解决图的最短路径问题、优先队列等需要高效插入、删除和查找最小元素的操作。它由计算机科学家Michael L. Fredman和Robert E. Tarjan在1984年提出,其...

    ibm-java-堆内存分析工具-heapanalyzer

    IBM Java堆内存分析工具——HeapAnalyzer,是一款专为IBM J9 VM设计的强大内存分析工具,它可以帮助开发者深入理解Java应用程序的内存使用情况,检测并解决内存泄漏问题,从而提升应用性能。本文将详细介绍Heap...

    heapdump分析工具

    当遇到应用程序运行缓慢,频繁出现Full GC,甚至出现OutOfMemoryError等问题时,我们通常需要对堆内存进行深入分析,这就是heapdump工具的作用所在。heapdump工具可以帮助开发者诊断Java应用的内存泄漏、过度对象...

    大堆的应用,MAXheap,删除与插入

    标题中的“大堆的应用,MAXheap,删除与插入”指的是在计算机科学中处理大量数据时常用的优先队列数据结构——最大堆(Max Heap)。最大堆是一种完全二叉树,其中每个父节点的值都大于或等于其子节点的值,确保了堆...

    堆(heap)与栈(stack)的区别

    堆(heap)与栈(stack)是计算机内存管理中的两种基本数据结构,用于存储程序运行时产生的临时变量。在C语言中,这两种内存区域有非常明确的区分,对于理解程序的内存分配和回收具有重要意义。 首先,栈是一种特殊...

    数据结构-堆(Heap)介绍和Java示例代码

    堆(Heap)是一种特殊的数据结构,它以完全二叉树的形式存在,分为最大堆和最小堆。在最大堆中,每个父节点的值都大于或等于其子节点的值;相反,在最小堆中,父节点的值小于或等于其子节点的值。这种特性使得堆在...

    ibm的heap analyzer.zip

    标签"IBMheapanalyze"是对工具功能的简短概括,表明这是与IBM相关的内存分析工具,主要功能是分析heap(堆内存)。 在压缩包内的文件"ibm的heap analyzer"可能是该工具的主程序或者启动脚本,用户运行这个文件就...

    二项堆python实现——eager binomial heap

    eager binomial heaps python实现。使用双向链表,make_heap, insert, merge, find_min, extractMin.

    MaxHeap堆排序建堆类

    总结起来,"MaxHeap堆排序建堆类"是一个实现了最大堆概念的类,它可能包含了建堆、下沉、交换和排序等关键操作。通过测试类如"TinyTest",我们可以验证这个实现是否正确并符合预期。理解和掌握堆排序及其相关算法...

Global site tag (gtag.js) - Google Analytics