当前位置: 首页 > news >正文

C++初学者指南-5.标准库(第二部分)--二叉堆操作

C++初学者指南-5.标准库(第二部分)–二叉堆操作

文章目录

  • C++初学者指南-5.标准库(第二部分)--二叉堆操作
    • 背景
      • 什么是“堆”
      • 二叉最大堆
      • 二叉树的表示
    • 堆操作
      • C++标准库中的堆
      • 初始化堆
      • 收缩堆
      • 增长堆
    • 辅助操作
      • sort_heap (Heap → Sorted Array)
      • is_heap
      • is_heap_until
    • 相关内容

不熟悉 C++ 的标准库算法? ⇒ 简介

背景

什么是“堆”

  • 一组数据结构(不要和动态存储的内存分区搞混)
  • 它们包含可以排序的对象(键)
  • 它们根据排序被称为“最大堆”或“最小堆”
  • 它们通常用于实现优先队列

支持的操作通常包括:

通常在 O(1)(常数时间)内获取最大值
通常在 O(log N)(对数时间)内移除最大值
通常在 O(1) 或 O(log N) 的时间内插入新键
通常在 O(1) 或 O(log N) 的时间内增加/减少键的变化值

维基百科:“堆”数据结构

二叉最大堆

  • 键存储在二叉树的节点中
  • 键必须是可排序的,即可比较的。
  • 堆属性:父节点的所有子节点的键必须小于或等于父节点的键 P ⇒ 根节点具有最大值
    在这里插入图片描述
    操作的时间复杂度:
  • 获取最大值:O(1)(恒定时间)
  • 删除最大值:O(log N)(对数时间)
  • 插入:O(log N)
  • 增加键:O(log N)

二叉树的表示

几乎所有的完全二叉树都可以用数组来表示。

  • 树要么由一个节点组成,要么在所有内部层级上必须是完整的。
  • 可能没有最右边的叶节点。
    在这里插入图片描述
    在这里插入图片描述

堆操作

C++标准库中的堆

  • 二叉最大堆
  • 由一个类似数组的容器表示
  • 最大值 = 树根 = 数组中的第一个元素
  • 键必须可排序(默认使用运算符 <)
    在这里插入图片描述

堆操作 = 是重排(迭代器)范围内元素的算法

  • make_heap:将一串键值重新排序成二叉堆
  • push_heap:插入新键
  • pop_heap:删除最大值

注意:如果你只想要一个优先队列,可以使用专门的标准容器类型 std::priority_queue。

初始化堆

在这里插入图片描述
cppreference

std::vector<int> h {1,6,4,2,9,7,8};
// make max heap (default)
make_heap(begin(h), end(h));
for (int x : h) { cout << x << ' '; }  // 9 6 8 2 1 7 4
// make min heap
make_heap(begin(h), end(h), std::greater<>{});
for (int x : h) { cout << x << ' '; }  // 1 2 4 9 6 7 8

运行示例代码
在这里插入图片描述
cppreference

收缩堆

在这里插入图片描述
cppreference

std::vector<int> h {1,2,4,9,8,7,6};
make_heap(begin(h), end(h));  // 9 6 8 2 1 4 7
// remove element from heap:
pop_heap(begin(h), end(h));
auto oldmax = h.back();  // oldmax = 9
h.pop_back();
for (int x : h) { cout << x << ' '; }  // 8 6 7 2 1 4

运行示例代码
在这里插入图片描述
cppreference

示例:连续收缩
在这里插入图片描述

增长堆

在这里插入图片描述
cppreference

std::vector<int> h {1,2,4,8,6,7};
make_heap(begin(h), end(h));  // 8 6 7 2 1 4
// add new element to heap:
h.push_back(9);
push_heap(begin(h), end(h));
for (int x : h) { cout << x << ' '; }  // 9 6 8 2 1 4 7

运行示例代码
在这里插入图片描述
cppreference

示例:不断增长
在这里插入图片描述

辅助操作

sort_heap (Heap → Sorted Array)

在这里插入图片描述
cppreference
在这里插入图片描述
cppreference

is_heap

在这里插入图片描述
cppreference
在这里插入图片描述
cppreference

is_heap_until

在这里插入图片描述
cppreference
在这里插入图片描述
cppreference

相关内容

“堆”数据结构
标准算法概述
C++标准库算法介绍
标准序列容器(vector、deque、list、…)
标准关联容器(map、set、…)
标准序列视图
cppreference:算法库
cppreference:容器库
视频:什么是 C++ 标准库?
视频:一小时内掌握 105 个 STL 算法 (Jonathan Boccara,2018)
C++ 之旅:容器和算法
算法概述表:
在这里插入图片描述

附上原文链接
如果文章对您有用,请随手点个赞,谢谢!^_^

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • node 与 webhdfs 交互
  • IOC容器初始化流程
  • [大模型实战] DAMODEL云算力平台部署LLama3.1大语言模型
  • jmeter使用问题记录
  • 数据库篇--八股文学习第十九天| Redis的数据类型有哪些?;Redis是单线程的还是多线程的,为什么?;说一说Redis持久化机制有哪些
  • 2-61 基于matlab的光学干涉仿真系统
  • Nebula图数据库常用 nGQL命令
  • 《向量数据库指南》——选择、评估并优化索引
  • 谷粒商城实战笔记-126-全文检索-ElasticSearch-整合-测试保存
  • CentOS 安装Redis
  • QMI8658 - 运动唤醒(WOM)功能 - Ⅳ
  • 汽车电子中间件概述
  • LISA: Reasoning Segmentation via Large Language Model
  • 模板初阶(详解)
  • Linux驱动.之I2C,iic驱动层(二)
  • [译]Python中的类属性与实例属性的区别
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • Angular 4.x 动态创建组件
  • Angular 响应式表单 基础例子
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Druid 在有赞的实践
  • iOS编译提示和导航提示
  • linux安装openssl、swoole等扩展的具体步骤
  • nodejs:开发并发布一个nodejs包
  • Node项目之评分系统(二)- 数据库设计
  • python学习笔记 - ThreadLocal
  • SpringCloud集成分布式事务LCN (一)
  • webpack4 一点通
  • 初识 beanstalkd
  • 反思总结然后整装待发
  • 入口文件开始,分析Vue源码实现
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • Python 之网络式编程
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​ArcGIS Pro 如何批量删除字段
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #android不同版本废弃api,新api。
  • #define,static,const,三种常量的区别
  • #VERDI# 关于如何查看FSM状态机的方法
  • (06)Hive——正则表达式
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (三)c52学习之旅-点亮LED灯
  • (十三)MipMap
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)基于IDEA的JAVA基础12
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net 简单实现MD5
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET(C#) Internals: as a developer, .net framework in my eyes