十天学完基础数据结构-第九天(堆(Heap))

在这里插入图片描述

堆的基本概念

是一种特殊的树形数据结构,通常用于实现优先级队列。堆具有以下两个主要特点:

  1. 父节点的值始终大于或等于其子节点的值(最大堆),或者父节点的值始终小于或等于其子节点的值(最小堆)

  2. 堆是一棵完全二叉树,这意味着所有层级除了最后一层都是完全填满的,最后一层从左到右填充。

最大堆和最小堆的定义

  • 最大堆(Max Heap):在最大堆中,父节点的值始终大于或等于其子节点的值,这意味着根节点是堆中的最大元素。

  • 最小堆(Min Heap):在最小堆中,父节点的值始终小于或等于其子节点的值,这意味着根节点是堆中的最小元素。

堆的常见操作

堆支持一些常见的操作,包括:

  • 插入(Insertion):将新元素插入堆中,然后重新调整堆,以维护堆的性质。

  • 删除(Deletion):删除堆中的根节点,然后重新调整堆,以维护堆的性质。

  • 堆排序(Heap Sort):使用堆进行排序,将堆顶元素(最大或最小元素)与最后一个元素交换,然后减小堆的大小,并重新调整堆,重复此过程直到排序完成。

任务

堆在许多算法中都有广泛应用,包括Dijkstra算法、优先级队列等。掌握堆排序算法,这是一种高效的排序算法。

示例代码 - 使用C++创建最大堆和进行堆排序:

#include <iostream>
#include <vector>
#include <algorithm>class MaxHeap {
public:MaxHeap() {}// 插入元素void insert(int value) {heap.push_back(value);int index = heap.size() - 1;heapifyUp(index);}// 删除最大元素void removeMax() {if (isEmpty()) {return;}std::swap(heap[0], heap.back());heap.pop_back();heapifyDown(0);}// 堆排序void heapSort() {int n = heap.size();for (int i = n / 2 - 1; i >= 0; i--) {heapifyDown(i);}for (int i = n - 1; i > 0; i--) {std::swap(heap[0], heap[i]);heapifyDown(0, i);}}// 判断堆是否为空bool isEmpty() {return heap.empty();}private:std::vector<int> heap;void heapifyUp(int index) {while (index > 0) {int parent = (index - 1) / 2;if (heap[index] <= heap[parent]) {break;}std::swap(heap[index], heap[parent]);index = parent;}}void heapifyDown(int index, int size = -1) {if (size == -1) {size = heap.size();}while (true) {int leftChild = 2 * index + 1;int rightChild = 2 * index + 2;int largest = index;if (leftChild < size && heap[leftChild] > heap[largest]) {largest = leftChild;}if (rightChild < size && heap[rightChild] > heap[largest]) {largest = rightChild;}if (largest == index) {break;}std::swap(heap[index], heap[largest]);index = largest;}}
};int main() {MaxHeap maxHeap;maxHeap.insert(5);maxHeap.insert(10);maxHeap.insert(3);maxHeap.insert(8);maxHeap.insert(1);std::cout << "堆排序前:";for (int num : maxHeap) {std::cout << num << " ";}maxHeap.heapSort();std::cout << "\n堆排序后:";for (int num : maxHeap) {std::cout << num << " ";}return 0;
}

练习题

  1. 解释堆的基本概念中的最大堆和最小堆的定义。

  2. 描述堆排序的步骤。

  3. 为什么堆可以用于高效的优先级队列实现?

  4. 在给定的一组元素中,如何创建一个最大堆?使用C++编写相应的代码。

  5. 在给定的一组元素中,如何使用堆排序进行排序?使用C++

解释堆的基本概念中的最大堆和最小堆的定义。

  • 最大堆(Max Heap):在最大堆中,每个父节点的值都大于或等于其子节点的值。这意味着根节点包含堆中的最大元素。

  • 最小堆(Min Heap):在最小堆中,每个父节点的值都小于或等于其子节点的值。这意味着根节点包含堆中的最小元素。

描述堆排序的步骤。

堆排序是一种原地、稳定的排序算法,它的步骤如下:

  • 构建一个最大堆或最小堆,将数组视为堆。

  • 不断从堆顶(最大值或最小值)移除元素,并将其放入已排序部分的末尾。

  • 重复第二步,直到堆为空。

这个过程保证了每次移除的元素都是当前堆中的最大(最小)值,因此最终得到一个有序的数组。

为什么堆可以用于高效的优先级队列实现?

堆可以用于高效的优先级队列实现,因为堆的结构允许我们快速找到并删除最大(最小)元素,以及迅速插入新元素。这在许多算法和数据结构中都非常有用,如Dijkstra算法、Prim算法、任务调度等。堆的时间复杂度为O(log n),其中n是堆的大小,这使得优先级队列的操作非常高效。

在给定的一组元素中,如何创建一个最大堆?使用C++编写相应的代码。

创建最大堆的关键是从数组构建一个满足最大堆性质的堆。以下是使用C++创建最大堆的示例代码:

#include <iostream>
#include <vector>void maxHeapify(std::vector<int>& arr, int size, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < size && arr[left] > arr[largest]) {largest = left;}if (right < size && arr[right] > arr[largest]) {largest = right;}if (largest != i) {std::swap(arr[i], arr[largest]);maxHeapify(arr, size, largest);}
}void buildMaxHeap(std::vector<int>& arr) {int size = arr.size();for (int i = size / 2 - 1; i >= 0; i--) {maxHeapify(arr, size, i);}
}int main() {std::vector<int> arr = {4, 10, 3, 5, 1};int size = arr.size();buildMaxHeap(arr);std::cout << "最大堆:";for (int num : arr) {std::cout << num << " ";}return 0;
}

运行结果:在这里插入图片描述

在给定的一组元素中,如何使用堆排序进行排序?使用C++编写相应的代码。

堆排序的关键是将堆顶元素与数组末尾元素交换,然后减小堆的大小并重新调整堆。以下是使用C++进行堆排序的示例代码:

#include <iostream>
#include <vector>void maxHeapify(std::vector<int>& arr, int size, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < size && arr[left] > arr[largest]) {largest = left;}if (right < size && arr[right] > arr[largest]) {largest = right;}if (largest != i) {std::swap(arr[i], arr[largest]);maxHeapify(arr, size, largest);}
}void heapSort(std::vector<int>& arr) {int size = arr.size();for (int i = size / 2 - 1; i >= 0; i--) {maxHeapify(arr, size, i);}for (int i = size - 1; i > 0; i--) {std::swap(arr[0], arr[i]);maxHeapify(arr, i, 0);}
}int main() {std::vector<int> arr = {4, 10, 3, 5, 1};int size = arr.size();heapSort(arr);std::cout << "堆排序结果:";for (int num : arr) {std::cout << num << " ";}return 0;
}

运行结果:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

qml保姆级教程五:视图组件

&#x1f482; 个人主页:pp不会算法v &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 QML系列教程 QML教程一&#xff1a;布局组件 文章目录 列表视图ListVi…

2023/10/4 QT实现TCP服务器客户端搭建

服务器端&#xff1a; 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QMessageBox> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { cla…

《计算机视觉中的多视图几何》笔记(13)

13 Scene planes and homographies 本章主要讲述两个摄像机和一个世界平面之间的射影几何关系。 我们假设空间有一平面 π \pi π&#xff0c;平面上的一点为 x π x_{\pi} xπ​。 x π x_{\pi} xπ​分别在两幅图像 P , P ′ P, P P,P′上形成了 x , x ′ x, x x,x′。 那…

Pikachu靶场——PHP反序列化漏洞

文章目录 1. PHP反序列化1.1 反序列化代码审计1.2 漏洞防御 1. PHP反序列化 可参考我写的另一篇博客&#xff1a;反序列化漏洞及漏洞复现。 序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串&#xff0c;比如下面是一个对象&#xff1a; class S{publi…

《向量数据库指南》——用Milvus cloud搭建聊天机器人

作为向量数据库的佼佼者&#xff0c;Milvus 适用于各种需要借助高效和可扩展向量搜索功能的 AI 应用。 举个例子&#xff0c;如果想要搭建一个聊天机器人&#xff0c;Milvus 一定是其进行数据管理的首选。那么&#xff0c;如何让这个应用程序开发变得易于管理及更好理解&#x…

使用python-opencv检测图片中的人像

最简单的方法进行图片中的人像检测 使用python-opencv配合yolov3模型进行图片中的人像检测 1、安装python-opencv、numpy pip install opencv-python pip install numpy 2、下载yolo模型文件和配置文件&#xff1a; 下载地址&#xff1a; https://download.csdn.net/down…

计算机网络——计算机网络的性能指标(上)-速率、带宽、吞吐量、时延

目录 速率 比特 速率 例1 带宽 带宽在模拟信号系统中的意义 带宽在计算机网络中的意义 吞吐量 时延 发送时延 传播时延 处理时延 例2 例3 速率 了解速率之前&#xff0c;先详细了解一下比特&#xff1a; 比特 计算机中数据量的单位&#xff0c;也是信息论中信…

创建django文件

1、在指定目录里打开终端&#xff0c;输入D:\Softwares\Anaconda3\envs\pytorch\Scripts\django-admin .exe startproject 名称 &#xff0c;即可在对应目录里创建django文件。

【C语言】动态通讯录(超详细)

通讯录是一个可以很好锻炼我们对结构体的使用&#xff0c;加深对结构体的理解&#xff0c;在为以后学习数据结构打下结实的基础 这里我们想设计一个有添加联系人&#xff0c;删除联系人&#xff0c;查找联系人&#xff0c;修改联系人&#xff0c;展示联系人&#xff0c;排序这几…

力扣第226翻转二叉数 c++三种方法 +注释

题目 226. 翻转二叉树 简单 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&am…

Linux shell编程学习笔记8:使用字符串

一、前言 字符串是大多数编程语言中最常用最有用的数据类型&#xff0c;这在Linux shell编程中也不例外。 本文讨论了Linux Shell编程中的字符串的三种定义方式的差别&#xff0c;以及字符串拼接、取字符串长度、提取字符串、查找子字符串等常用字符串操作,&#xff0c;以及反…

【Java】微服务——Ribbon负载均衡(跟进源码分析原理)

添加LoadBalanced注解&#xff0c;即可实现负载均衡功能&#xff0c;这是什么原理 1.负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件&#xff0c;来实现负载均衡功能的。 2.源码跟踪 为什么我们只输入了service名称就可以访问了呢&#xff1f;之前还要获取…

论文阅读——Pyramid Grafting Network for One-Stage High Resolution Saliency Detection

目录 基本信息标题目前存在的问题改进网络结构CMGM模块解答为什么要用这两个编码器进行编码 另一个写的好的参考 基本信息 期刊CVPR年份2022论文地址https://arxiv.org/pdf/2204.05041.pdf代码地址https://github.com/iCVTEAM/PGNet 标题 金字塔嫁接网络的一级高分辨率显著性…

java做个qq机器人

前置的条件 机器人是基于mirai框架实现的。根据官方的文档&#xff0c;建议使用openjdk11。 我这里使用的编辑工具是idea2023 在idea中新建一个maven项目&#xff0c;虽然可以使用gradle进行构建&#xff0c;不过我这里由于网络问题没有跑通。 pom.xml <dependency>&l…

克服网络安全压力:如何掌控无限的云数据

管理云中的数字风险比以往任何时候都更加重要。数字化转型引发的云数据呈指数级增长&#xff0c;为安全分析师创造了一个更大的威胁环境。随着威胁行为者继续危害组织最敏感的数据&#xff0c;这一挑战将会加剧。 预计未来五年全球网络犯罪成本将激增&#xff0c;从 2022 年的…

数值分析学习笔记——误差【华科B站教程版本】

误差 误差&#xff1a;一个物理量的真实值与计算值之间的误差 误差来源与分类 模型误差&#xff1a;对问题所抽象出来的数学/物理模型是误差的&#xff0c;比如要有一些假设条件才进行理论的推导观测误差&#xff1a;测量得到的模型的参数的值的误差方法误差&#xff08;截断…

【网络安全---sql注入(2)】如何通过SQL注入getshell?如何通过SQL注入读取文件或者数据库数据?一篇文章告诉你过程和原理。

前言 本篇博客主要是通过piakchu靶场来讲解如何通过SQL注入漏洞来写入文件&#xff0c;读取文件。通过SQL输入来注入木马来getshell等&#xff0c;讲解了比较详细的过程&#xff1b; 如果想要学习SQL注入原理以及如何进行SQL注入&#xff0c;我也写了一篇详细的SQL注入方法及…

JMeter性能测试

性能测试前言 老师开局一句话&#xff1a;性能测试和你会不会JMeter一点关系没有…… 作者坚持技多不压身的原则&#xff0c;还是多学一点JMeter吧&#xff0c;看老师到底要怎么讲下去&#xff0c;什么并发量、吞吐量啥的…… 性能测试的核心思想&#xff1a;在于创造大量并发去…

[NSSRound#1 Basic]sql_by_sql - 二次注入+布尔盲注||sqlmap

进入注册界面后   假设sql&#xff1a;update user set password ‘’ where username ‘’ and password ‘’     此时如果我们注册的用户名是admin’–、admin’#、admin’–的话   update user set password ‘123’ where username ‘admin’#’ and passwor…

Hive SQL初级练习(30题)

前言 Hive 的重要性不必多说&#xff0c;离线批处理的王者&#xff0c;Hive 用来做数据分析&#xff0c;SQL 基础必须十分牢固。 环境准备 建表语句 这里建4张表&#xff0c;下面的练习题都用这些数据。 -- 创建学生表 create table if not exists student_info(stu_id st…