1. 概述

堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。

2. 堆的基本操作

堆是一棵完全二叉树,高度为O(lg n),其基本操作至多与树的高度成正比。在介绍堆的基本操作之前,先介绍几个基本术语:

A:用于表示堆的数组,下标从1开始,一直到n

PARENT(t):节点t的父节点,即floor(t/2)

RIGHT(t):节点t的左孩子节点,即:2*t

LEFT(t):节点t的右孩子节点,即:2*t+1

HEAP_SIZE(A):堆A当前的元素数目

下面给出其主要的四个操作(以大顶堆为例):

2.1 Heapify(A,n,t)

该操作主要用于维持堆的基本性质。假定以RIGHT(t)和LEFT(t)为根的子树都已经是堆,然后调整以t为根的子树,使之成为堆。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void Heapify(int A[], int n, int t)
{
  int left = LEFT(t);
  int right = RIGHT(t);
  int max = t;
  if(left <= n)     max = A[left] > A[max] ? left : max;
  if(right <= n)     max = A[right] > A[max] ? right : max;
  if(max != A[t])
  {
    swap(A, max, t);
    Heapify(A, n, max);
  }
}

2.2  BuildHeap(A,n)

该操作主要是将数组A转化成一个大顶堆。思想是,先找到堆的最后一个非叶子节点(即为第n/2个节点),然后从该节点开始,从后往前逐个调整每个子树,使之称为堆,最终整个数组便是一个堆。

1
2
3
4
5
6
7
8
9
10
11
void BuildHeap(int A[], int n)
{
  int i;
  for(i = n/2; i<=n; i++)
  Heapify(A, n, i);
}

2.3 GetMaximum(A,n)

该操作主要是获取堆中最大的元素,同时保持堆的基本性质。堆的最大元素即为第一个元素,将其保存下来,同时将最后一个元素放到A[1]位置,之后从上往下调整A,使之成为一个堆。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void GetMaximum(int A[], int n)
{
  int max = A[1];
  A[1] = A[n];
  n--;
  Heapify(A, n, 1);
  return max;
}

2.4  Insert(A, n, t)

向堆中添加一个元素t,同时保持堆的性质。算法思想是,将t放到A的最后,然后从该元素开始,自下向上调整,直至A成为一个大顶堆。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void Insert(int A[], int n, int t)
{
  n++;
  A[n] = t;
  int p = n;
  while(p >1 && A[PARENT(p)] < t)
  {
    A[p] = A[PARENT(p)];
    p = PARENT(p);
  }
  A[p] = t;
  return max;
}

3.  堆的应用

3.1  堆排序

堆的最常见应用是堆排序,时间复杂度为O(N lg N)。如果是从小到大排序,用大顶堆;从大到小排序,用小顶堆。

3.2  在O(n lg k)时间内,将k个排序表合并成一个排序表,n为所有有序表中元素个数。

【解析】取前100 万个整数,构造成了一棵数组方式存储的具有小顶堆,然后接着依次取下一个整数,如果它大于最小元素亦即堆顶元素,则将其赋予堆顶元素,然后用Heapify调整整个堆,如此下去,则最后留在堆中的100万个整数即为所求 100万个数字。该方法可大大节约内存。

3.3 一个文件中包含了1亿个随机整数,如何快速的找到最大(小)的100万个数字?(时间复杂度:O(n lg k))

4. 总结

堆是一种非常基础但很实用的数据结构,很多复杂算法或者数据结构的基础就是堆,因而,了解和掌握堆这种数据结构显得尤为重要。

5. 参考资料

(1)经典算法教程《算法导论》

———————————————————————————————

更多关于数据结构和算法的介绍,请查看:数据结构与算法汇总

———————————————————————————————-

原创文章,转载请注明: 转载自董的博客

本文链接地址: http://dongxicheng.org/structure/heap/

数据结构之堆Heap相关推荐

  1. codeforces 贪心+优先队列_算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)...

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值:

  2. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  3. 数据结构之堆(Heap)及其用途

    本文采用图文码结合的方式介绍堆来实现优先队列 什么是优先队列? 队列是一种先进先出(FIFO)的数据结构.虽然,优先队列中含有队列两个字,但是,他一点也不像队列了.个人感觉,应该叫他优先群.怎么说那, ...

  4. Java数据结构之堆(Heap)

    文章目录 一.基本概念 二.上浮操作(siftUp) 三.下沉操作(siftDown) 四.数组堆化 五.实现大根堆 提示:以下是本篇文章正文内容,Java系列学习将会持续更新 一.基本概念 堆在逻辑 ...

  5. 数据结构-堆(Heap)

    数据结构-堆(Heap) 我认识的堆: 1.建立在完全二叉树的基础上 2.排序算法的一种,也是稳定效率最高的一种 3.可用于实现STL中的优先队列(priority_queue)  优先队列:一种特殊 ...

  6. 数据结构--堆Heap

    数据结构:堆(Heap) 堆就是用数组实现的二叉树,所以它没有使用父指针或者子指针.堆根据"堆属性"来排序,"堆属性"决定了树中节点的位置. 堆的常用方法: 构 ...

  7. 数据结构之——堆(Heap)

    堆(Heap) 堆(Heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵完全二叉树的数组对象.同时堆是一种特殊的"队列" 完全二叉树 既然说堆是完全二叉树, ...

  8. heap python_数据结构-堆(Heap) Python实现

    堆(Heap)可以看成近似完全二叉树的数组,树中每个节点对应数组中一个元素.除了最底层之外,该树是完全充满的,最底层是从左到右填充的. 堆包括最大堆和最小堆:最大堆的每一个节点(除了根结点)的值不大于 ...

  9. 数据结构--堆(Heap)

    堆(Heap) 本文主要介绍以下内容: Heap的实现 HeapSort(堆排序) 完善各种堆的函数接口 TopK经典问题 堆就是一棵完全二叉树.因为它的某些性质,我们可以用数组存储. 堆的性质 1 ...

最新文章

  1. 高效职场人不得不懂的“脑”知识
  2. 【Python】 linecache模块读取文件
  3. Error: No controllers detected :问题解决
  4. canvas基础-绘制矩形(1)
  5. jQuery的概念、用法、常见面试题详解
  6. 【渝粤题库】陕西师范大学164202 市场营销学 作业(专升本)
  7. 第九十四期:GitHub 发布 2019 年年度报告
  8. android打包工具多渠道批量打包,Android 快速渠道批量打包详解教程-美团多渠道打包方案...
  9. 怎么表示一个PHP语句块,php switch语句多个值匹配同一代码块应用示例
  10. python脚本转换成apk_apktool反编译apk并回编译
  11. 20200224:跳跃游戏(leetcode55)
  12. 【机器学习】基于GBDT的数据回归及python实现
  13. Hadoop概述--四大组件架构及其关系
  14. js读取excel文件
  15. java 浏览器 pdf_使用Java Servlet在浏览器中显示Pdf
  16. Win10下如何清理优化C盘
  17. 2.3 OverFeat
  18. jquery左侧图片与右侧图片以及放大镜和图片的放大的图片和产品的隐藏的效果
  19. wordpress 菜单_如何在WordPress主题中添加菜单说明
  20. 802.1x准入控制技术

热门文章

  1. springboot简易集成mybatisPlus+多数据源
  2. 总结:详细讲解MapReduce过程(整理补充)
  3. EOS节点之争已开始 准备好欣赏了么?
  4. 谷歌发布TensorFlow 1.4与TensorFlow Lattice:利用先验知识提升模型准确度 搜狐科技 10-12 15:29 选自:Google Research Blog 参与:李泽南、
  5. 像疯狗一般,你就具备了向上的资格
  6. 58同城创始人姚劲波:未来十年是中国创业最好机会
  7. jvm性能调优实战 - 40 百万级数据误处理导致的频繁Full GC问题优化
  8. Linux-sort排序
  9. Imageloader6-mUIHandler的初始化
  10. Java实现List中某个对象属性中的字符串参数首字母进行排序