C++数据结构之:堆Heap

摘要:

  it人员无论是使用哪种高级语言开发东东,想要更高效有层次的开发程序的话都躲不开三件套:数据结构,算法和设计模式。数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结构。
  此系列专注讲解数据结构数组、链表、队列、栈、树、哈希表、图,通过介绍概念以及提及一些可能适用的场景,并以C++代码简易实现,多方面认识数据结构,最后为避免重复造轮子会浅提对应的STL容器。本文介绍的是堆Heap。

(开发环境:VScode,C++17)

关键词C++数据结构Heap

声明:本文作者原创,转载请附上文章出处与本文链接。

文章目录

      • 摘要:
      • 正文:
        • 介绍:
          • 特性:
          • 应用:
        • 代码实现:
        • 对应STL:
      • 推荐阅读

正文:

介绍:

  堆比较特殊,通常被看作一棵完全二叉树的数组对象。被用于实现“优先队列”(priority queues),优先队列是一种数据结构,可以自由添加数据,但取出数据时要从最小值开始按顺 序取出。在堆的树形结构中,各个顶点被称为“结点”(node),数据就存储在这些结点中。
在这里插入图片描述

  上面叫大顶堆,如果每一个节点小于子树中每个节点的值,那就叫小顶堆。

特性:

只要满足下面两个特点的树形结构就是堆:

  • 堆是一个完全二叉树(所谓完全二叉树就是除了最后一层其他层的节点个数都是满的)。
  • 堆中每一个节点的值都必须大于(大顶堆/最大堆)等于或者小于(小顶堆/最小堆)其子树中每一个节点的值。
应用:
  • 堆排序:堆排序是一种基于堆的排序算法,利用最大堆(或最小堆)的性质来排序数据,时间复杂度为O(n log n),且不需要额外的存储空间,是一种非常高效的排序方法。
  • 图算法:在许多图算法中,如计算最短路径的Dijkstra算法和构建最小生成树的Prim算法,堆被用作优先队列来选择下一个要处理的顶点。
  • 动态数据流的中值查找:堆可以用来快速计算动态数据流的中值或其他顺序统计量。
  • 带权调度问题:在处理带权任务调度问题时,可以使用最小堆来安排任务的执行顺序,以最小化等待时间或优化其他指标。
  • Top K问题:堆经常用于解决Top K问题,即从一组数据中找到最大或最小的K个元素。
  • 频率统计和数据压缩:在频率统计和数据压缩领域,如Huffman编码算法,使用最小堆来构建Huffman树,以实现高效的编码方案。
代码实现:
#ifndef CHEAP_H
#define CHEAP_H
#include <iostream>
#include <algorithm>
#include <vector>
#include <cassert>using namespace std;
template <typename T>
class MaxHeap
{
public:void heapify(int i);							// 辅助函数:调整堆  void push(const T& element); 					// 添加元素到堆中T pop();										// 移除并返回堆顶元素  T top() const; 									// 返回堆顶元素bool empty() const { return heap.empty(); }  	// 检查堆是否为空  size_t size() const { return heap.size(); }   	// 返回堆的大小  private:vector<T> heap;
};template <typename T>
inline void MaxHeap<T>::heapify(int i)
{int left = 2 * i + 1;int right = 2 * i + 2;int largest = i;if (left < heap.size() && heap[left] > heap[largest]) {largest = left;}if (right < heap.size() && heap[right] > heap[largest]) {largest = right;}if (largest != i) {swap(heap[i], heap[largest]);heapify(largest); // 递归调整子堆}
}template <typename T>
inline void MaxHeap<T>::push(const T &element)
{heap.push_back(element);// 从新添加的节点开始向上调整堆int i = heap.size() - 1;while (i > 0 && heap[(i - 1) / 2] < heap[i]) { swap(heap[i], heap[(i - 1) / 2]);i = (i - 1) / 2;}
}template <typename T>
inline T MaxHeap<T>::pop()
{if(heap.empty())return T();T top = heap[0];heap[0] = heap.back();heap.pop_back();// 从堆顶开始向下调整堆heapify(0);return top;
}template <typename T>
inline T MaxHeap<T>::top() const
{if(heap.empty())return T();return heap[0];
}#endif // !CHEAP_H
#include "cheap.h"
using namespace std;int main() 
{MaxHeap<int> maxHeap;maxHeap.push(20);maxHeap.push(18);maxHeap.push(15);maxHeap.push(8);maxHeap.push(10);maxHeap.push(5);maxHeap.push(3);cout << "Top element: " << maxHeap.top() << endl;maxHeap.pop();cout << "Top element after pop: " << maxHeap.top() << endl;return 0;
};

在这里插入图片描述

对应STL:
  • priority_queue:

    priority_queue 默认在 vector 上使用堆算法将 vector 中元素构造成大顶堆的结构,用户也可以通过自定义模板参数中的 class Compare 来实现一个小顶堆。因此 priority_queue 就是堆 ,所有需要用到堆的位置,都可以考虑使用 priority_queue。

推荐阅读

C/C++专栏:https://blog.csdn.net/weixin_45068267/category_12268204.html
(内含其它数据结构及对应STL容器使用)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/21596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt】win10,QTableWidget表头下无分隔线的问题

1. 现象 2. 原因 win10系统的UI样式默认是这样的。 3. 解决 - 方法1 //横向表头ui->table->horizontalHeader()->setStyleSheet("QHeaderView::section{""border-top:0px solid #E5E5E5;""border-left:0px solid #E5E5E5;""bord…

Python与Excel的完美结合:操作技巧与自动化应用

本文全面探讨了使用Python进行Excel操作的各种技巧和自动化应用&#xff0c;包括基础操作、高级数据处理、图表创建、自动化任务等。通过详细介绍Python在Excel中的应用&#xff0c;结合实际案例&#xff0c;帮助读者深入理解并掌握Python处理Excel文件的强大功能。 文章目录 P…

Matlab|【重磅】配电网故障重构/孤岛划分

目录 1 主要内容 1.1 背景 1.2 流程图 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序主要复现《基于GA_BFGS算法的配电网故障恢复性重构研究_郑海广》&#xff0c;采用matlab编程软件实现&#xff0c;依据网络结构和DG供电方式对配电网进行孤岛划分&#xff0c;将含…

政府窗口服务第三方评估报告如何写

撰写政府窗口服务第三方评估报告需要结构清晰、内容详实&#xff0c;并包含对评估过程和结果的详细描述以及改进建议。以下是第三方评估机构民安智库&#xff08;第三方社会评估调研公司&#xff09;给出的一个政府窗口服务第三方评估报告简单的示例&#xff1a; 一、封面 报…

【算法训练记录——Day24】

Day24——回溯算法Ⅰ 77.组合 今日内容&#xff1a; ● 理论基础 ● 77. 组合 理论&#xff1a;代码随想录 77.组合 思路&#xff1a;k层for循环&#xff0c;不会 回溯&#xff0c;将组合问题抽象成n叉树&#xff0c;for循环控制宽度&#xff0c;递归的深度控制二叉树的深度 …

CSS学习笔记之高级教程(五)

23、CSS 媒体查询 - 实例 /* 如果屏幕尺寸超过 600 像素&#xff0c;把 <div> 的字体大小设置为 80 像素 */ media screen and (min-width: 600px) {div.example {font-size: 80px;} }/* 如果屏幕大小为 600px 或更小&#xff0c;把 <div> 的字体大小设置为 30px …

c++面试(数位物联)

1.const 关健字的作用 定义常量&#xff0c;防止变量被意外修改&#xff0c;增强程序的可读性和维护性。 可以用于指针&#xff0c;声明指向常量的指针或常量指针。 2.static关健字的作用 (1)在函数内&#xff0c;用于修饰局部变量&#xff0c;使其生命周期延长到整个程序运行期…

程序员的五大职业素养,你知道吗?

程序员职业生涯的挑战与机遇 在当今这个科技日新月异的时代&#xff0c;程序员作为技术行业的中坚力量&#xff0c;其职业生涯无疑充满了无数挑战与机遇。技术的快速迭代要求他们必须不断学习新知识、掌握新技能&#xff0c;以跟上时代的步伐。同时&#xff0c;云计算、人工智…

Flask、uWSGI和Nginx在Web服务器架构中的职责

Flask、uWSGI和Nginx在Web服务器架构中的职责 Flask自带的开发服务器 当你启动一个基础版的Flask应用时&#xff1a; Flask自带一个基于Werkzeug的开发服务器。(默认监听的端口是 5000)这个服务器适用于开发和调试环境&#xff0c;但不适合用于生产环境&#xff0c;因为它在…

新能源汽车企业的图纸防泄密解决方案

今年新能源汽车行业在现在国内的发展已经趋于成熟化&#xff0c;随着小米雷军宣布进入造车行业&#xff0c;互联网大的企业都在互联网汽车中布局&#xff0c;为了给汽车消费者提供更新的安全驾驶体验&#xff0c;很多自动驾驶技术也在不断的更新换代。新能源自动驾驶汽车很显然…

学习经验分享篇(1)——怎样将示波器数据(.CSV数据)导入Matlab/Simulink中并进行FFT分析(电机控制/电力电子方向必备技能)

最近比较忙&#xff0c;没怎么更新&#xff0c;后续打算不断出一些学习贴。 1.为什么要出这篇文章&#xff1f; &#xff08;1&#xff09;我当时第一次导示波器数据进入Matlab里面的时候&#xff0c;一直疯狂报错&#xff0c;搞了好久。 &#xff08;2&#xff09;好多同学现…

一点连接千家银行,YonSuite让“银行回单”一键获取

在当今日益复杂多变的商业环境中&#xff0c;企业的资金管理变得尤为重要。传统的银行回单管理方式&#xff0c;如手动登录网银、逐一下载回单、核对信息等&#xff0c;不仅效率低下&#xff0c;而且容易出错&#xff0c;给企业的财务管理带来了极大的挑战。 然而&#xff0c;…

【Pytorch】深入Pytorch模型的训练、log、可视化

文章目录 模型训练的模板综合案例-Pytorch 官网demo优化记录日志解析日志增加tensorboard数据记录保存训练曲线模型参数可视化增加wandb数据记录模型训练的模板 综合案例-Pytorch 官网demo pytorch 官网tutorial-quickstart https://blog.csdn.net/weixin_39107270/article/de…

C# 反射为什么慢?深入解析反射性能问题

在C#编程中&#xff0c;反射&#xff08;Reflection&#xff09;是一个强大的工具&#xff0c;它允许程序在运行时获取类型信息并动态地调用类型的方法、属性等。然而&#xff0c;尽管反射提供了很高的灵活性&#xff0c;但它也带来了一个显著的性能开销。本文将深入探讨反射为…

安装 Android Studio 2024.1.1.6(Koala SDK35)和过程问题解决

记录更新Android Studio版本及适配Android V应用配置的一些过程问题。 安装包&#xff1a;android-studio-2024.1.1.6-windows.exe原版本&#xff1a;Android Studio23.2.1.23 Koala 安装过程 Uninstall old version 不会删除原本配置&#xff08;左下角提示&#xff09; Un…

LeetCode hot100-64-Y

74. 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a;每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;…

YOLOv5改进 | 主干网络 | 将主干网络替换为轻量化的ShuffleNetv2【原理 + 完整代码】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 目标检测是计算机视觉中一个重要的下游任务。对于边缘盒子的计算平台来说&#xff0c;一个大型模型很难实现实时检测的要求。基于一系列消融…

MQ之初识kafka

1. MQ简介 1.1 MQ的诞生背景 以前网络上的计算机&#xff08;或者说不同的进程&#xff09;传递数据&#xff0c;通信都是点对点的&#xff0c;而且要实现相同的协议&#xff08;HTTP、 TCP、WebService&#xff09;。1983 年的时候&#xff0c;有个在 MIT 工作的印度小伙突发…

前端开发记录

一.Node相关 镜像&#xff1a;registry "https://registry.npmmirror.com" 二.Eslint格式检查 关闭语法格式检查

【MySQL03】【 Buffer Pool】

文章目录 一、前言二、缓冲池&#xff08;Buffer Pool &#xff09;1. 缓冲池的概念2. LRU List、Free List 和 Flush List2.1 Free 链表2.1.1 缓冲页的哈希处理 2.2 Flush 链表2.3 LRU 链表2.3.1 简单 LRU 链表2.3.2 优化后的 LRU 列表2.3.3 更进一步的优化 3. 脏页的刷新4. 多…