本文目录

一、优先队列的基本概念

二、优先队列的实现原理

三、优先队列的代码实现

1、优先队列的结构

2、初始化优先队列

3、插入元素

4、删除最小元素

End


一、优先队列的基本概念

对于可以实现以下两种操作的数据结构:

1、Insert:插入新元素

2、DeleteMin:(快速)找到、返回并删除一个元素

我们称之为优先队列(Priority Queues),也可以说是堆的一种。

二、优先队列的实现原理

我们一般通过二叉堆(Binary Heaps)来实现优先队列。

  • 堆是一颗完全二叉树,通过数组实现。
  • 堆重要的性质:父节点一定是其所有子孙节点的最值
  • 堆中任意一棵子树仍然是堆

根据我们的需要,我们可以用大根堆或者小根堆实现优先队列。

如果每棵子树的根节点都是最大值,那么它就是大根堆;每棵子树的根节点都是最小值,那么它就是小根堆

注意,下面我们均以小根堆为例讲解。


我们理解堆,可以将它的外形理解为一棵完全二叉树,但是其数据本质均是存储在一个一维数组中的。存储的顺序是:对于完全二叉树,从1开始按照层次编号,和数组的下标一一对应。2

下图是一个堆的实现模型:

▲需要注意是:数组的储存从1开始,0的位置留作哨兵元素,具体作用后面再说。


那么这样编写堆,又如何实现二叉树的特点,从父节点迅速找到两个儿子节点呢?

我们很容易找到父子对应数组下标的数学关系:

对于一个下标为 i 的节点,它的父亲下标为 i / 2(整数部分),左儿子下标为 2*i,右儿子下标为 2*i + 1:

三、优先队列的代码实现

1、优先队列的结构

typedef struct HeapStruct{int Capacity;  //容积int Size;  //当前大小int *Elements;  //数据域,数组指针
} *PRIORITY_HEAP, priority_heap;

2、初始化优先队列

/* 传入参数:所需优先队列的容积* 返回:初始化好的堆 */
PRIORITY_HEAP Initialize(int MaxElements) {PRIORITY_HEAP H = (PRIORITY_HEAP)malloc(sizeof(priority_heap));H->Elements = (int*)malloc((MaxElements + 1) * sizeof(int));H->Capacity = MaxElements;H->Size = 0;H->Elements[0] = MinData;   //设置哨兵元素,必须是堆中的最小值return H;
}

3、插入元素

可以说,堆的建立也是在插入的基础上的。和二叉查找树一样,堆的最终模样和我们输入的数据相关,就算是一样的数据,每个数的输入先后顺序不同,最终也很有可能是不一样的优先队列,当然啦,功能还是不变的。

堆的插入算法并不难实现:

Heaps | 优先队列相关推荐

  1. 【纯干货】清晰易懂!数据结构学霸笔记!此文实在!(收藏!备忘!复习!)

    写在前面: 大家好,我是贝贝.昵称 "贝贝今天AC了吗" 是为了督促自己码题,相信圈子里的大家伙都懂喇.我热爱技术.热爱开源.热爱编程. 我始终相信:技术是开源的,知识是共享的. ...

  2. DS实验题 融合软泥怪-2 Heap实现

    题目和STL实现:DS实验题 融合软泥怪-1 用堆实现优先队列 引言和堆的介绍摘自:Priority Queue(Heaps)--优先队列(堆) 引言: 优先队列是一个至少能够提供插入(Insert) ...

  3. heaps 和 priority queue堆和优先队列的定义和数据结构表示

    heaps 堆:并非一对杂乱无章的结构, 堆是一种存在特殊关系的树. 是一种半排序的树, 所有的父节点大于子节点(max heaps) 或 所有的父节点小于子节点(min heaps).上图为max ...

  4. 优先队列与Heap的小结

    优先队列是一种使用比较广泛的数据结构.不同于一般的队列,优先队列的元素都具有优先级,优先级高的元素会被优先选取.利用这个特点,我们可以根据元素值的大小来设置优先级,值最大/最小的拥有最高的优先级.这样 ...

  5. 优先队列的应用 C++实现

    优先队列的应用 C++实现 优先队列可以用堆来实现, 堆底层可以用数组表示, 通过索引关系,可以表示成一颗二叉完全树 C++的STL提供了相应的容器适配器 包含在queue头文件中 下面通过一道题来看 ...

  6. ccf 交通规划(迪杰斯特拉优先队列模板)

    什么跟什么就是刘汝佳小白书迪杰斯特拉队列的优先队列法 #include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f ...

  7. c++ std::priority_queue优先队列

    template <class T, class Container = vector<T>,class Compare = less<typename Container:: ...

  8. 《程序设计解题策略》——1.6 利用左偏树实现优先队列的合并

    本节书摘来自华章计算机<程序设计解题策略>一书中的第1章,第1.6节,作者:吴永辉 王建德 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 1.6 利用左偏树实 ...

  9. 排序(一)归并、快排、优先队列等(图文具体解释)

    排序(一) 0基础排序算法 选择排序 思想:首先,找到数组中最小的那个元素.其次,将它和数组的第一个元素交换位置.再次.在剩下的元素中找到最小的元素.将它与数组的第二个元素交换位置. 如此往复,直到将 ...

  10. MYSQL实现ORDER BY LIMIT的方法以及优先队列(堆排序)

    一.MYSQL中的LIMIT和ORACLE中的分页 在MYSQL官方文档中描述limit是在结果集中返回你需要的数据,它可以尽快的返回需要的行而不用管剩下的行, 在ORACLE中也有相关的语法比如 1 ...

最新文章

  1. LeetCode实战:删除链表中的节点
  2. 【深度好文】我们的未来在哪里?
  3. python中with的用法
  4. web前端三大主流框架_小猿圈web前端之前端的主流框架都有哪些?
  5. 《Redis 设计与实现》读书笔记-Redis 对象
  6. MongoDB Shell操作
  7. eclipse中不能找到dubbo.xsd报错”cvc-complex-type.2.4.c“的 两种解决方法
  8. 微信小程序 | 来自小程序开发者的实例教程 ①
  9. VMware中linux硬盘空间不足的解决方法
  10. 你以为写小说就只有一种签约方式?
  11. Android 下拉刷新用法
  12. 我个人的未来5年IT学习计划
  13. AltiumDesigner VS 立创EDA —— PCB绘图软件选择
  14. js实现图片放大镜效果——简单方法
  15. Quartus-II实现D触发器的三种方式
  16. 【企业】如何将零和博弈转换为正和博弈
  17. Linux命令之logrotate命令
  18. MATLAB代码:基于Stackelberg博弈的光伏用户群优化定价模型
  19. 简写的最大公约数写法(不能再忘了)
  20. 关于字符集GB2312/GBK/GB18030的区别

热门文章

  1. 计算机处理系统比人工的优势,人工智能技术的优势及其在计算机网络中的应用...
  2. Python 刷题笔记:背包问题
  3. 计算机空格键作用,笔记本电脑键盘上的空格键和Enter键不起作用. 怎么办?
  4. Linux命令详解之 cat
  5. redis读缓存超时故障处理
  6. 机器学习之层次聚类及代码示例
  7. Java程序员年薪40W是什么水平?税前还是税后?
  8. java程序猿面试问缺点怎么回答_面试程序员被问“你的缺点是什么”,我该怎么回答?...
  9. redis常见面试题和答案
  10. 【Python-二分法-查找重复值】