【数据结构】堆的完整实现
堆的完整实现
- 堆的完整实现
- GitHub地址
- 前言
- 堆的核心功能实现
- 重温堆的定义
- 堆结构定义
- 1. 堆初始化与销毁
- 2. 元素交换函数
- 3. 堆化操作
- 向上调整(子→父)
- 向下调整(父→子)
- 4. 堆元素插入
- 5. 堆元素删除
- 6. 辅助功能函数
- 堆的判空
- 获取堆顶元素
- 获取堆的大小
- 结语
堆的完整实现
GitHub地址
有梦想的电信狗
前言
堆(Heap
)是一种特殊的完全二叉树数据结构,常用于实现优先级队列。本文基于C语言实现大跟堆,包含核心操作:插入元素、删除堆顶元素、堆化操作等。以下是完整实现及详细解析。
堆的核心功能实现
重温堆的定义
普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。
现实中我们通常把堆(一种特殊的二叉树)使用顺序结构的数组来存储。
需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段
二叉树的顺序存储,是堆的前身
在顺序存储的二叉树上加一些限定条件,定义为堆
- 小根堆 : 树中所有父结点都小于或等于子节点
- 大根堆 树中所有父结点都大于或等于子节点
- 堆可以用来排序,但堆并非是有序的!
堆的性质:
- 堆中某个节点的值总是不大于或不小于其父节点的值;
- 堆总是一棵完全二叉树。
堆结构定义
//实现大堆 这里以实现大根堆为例子
typedef int HeapDataType; //定义堆中存放的数据类型,方便修改
typedef struct HeapNode {HeapDataType* base; // 堆存储数组基地址int size; // 当前元素个数int capacity; // 堆容量
}Heap;
结构说明:
base
:动态数组基地址,用于存储堆元素,用数组来顺序存储size
:当前堆中元素数量capacity
:数组总容量
数组存储的二叉树的下标特性:
parent = (child - 1) / 2
lefichild = parent * 2 + 1
lefichild = parent * 2 + 2
功能一览:
//堆初始化与销毁
void HeapInit(Heap* pheap);
void HeapDestroy(Heap* pheap);//堆插入和删除
void HeapPush(Heap* pheap, HeapDataType data);
void HeapPop(Heap* pheap);
//堆的向上 向下调整
void AdjustUp(HeapDataType* arr, int child);
void AdjustDown(HeapDataType* arr, int size, int parent);//交换堆中的元素
void Swap(HeapDataType* left, HeapDataType* right);
//获取堆顶元素
HeapDataType HeapTop(Heap* pheap);
//判断堆是否为空
bool HeapEmpty(Heap* pheap);
//获取堆的size
int HeapSize(Heap* pheap);
1. 堆初始化与销毁
初始化:
//堆初始化
void HeapInit(Heap* pheap) {assert(pheap); pheap->base = (HeapDataType*)malloc(sizeof(HeapDataType) * 4);if (pheap->base == NULL) {perror("malloc failed\n");return;}pheap->size = 0;pheap->capacity = 4;
}
实现思路:
- 断言指针有效性,堆结构指针必须存在
- 为堆分配初始容量(暂设置为4个元素空间),申请空间失败时报错并返回
- 初始化
size
为0
表示空堆,capacity
初始化为申请的空间 - 时间复杂度:
O(1)
注意事项:
- 必须进行指针有效性断言检查
- 初始容量不宜过小(建议为
4
的倍数)
销毁:
//清理资源
void HeapDestroy(Heap* pheap) {assert(pheap);free(pheap->base);pheap->base = NULL;pheap->capacity = pheap->size = 0;
}
实现思路:
assert
断言堆结构指针不为空free
释放动态分配的存储空间
- 将指针置
NULL
防止野指针 - 将
size
和capacity
都置为0 - 时间复杂度:
O(1)
2. 元素交换函数
void Swap(HeapDataType* child, HeapDataType* parent) {HeapDataType temp = *child;*child = *parent;*parent = temp;
}
功能:交换父子节点数值
使用场景:堆化(向上调整/向下调整)时的元素位置调整
交换函数功能较为简单,此处不过多赘述。
3. 堆化操作
向上调整 或向下调整的条件是,左右子树 必须是 大堆 或者 小堆
向上调整(子→父)
// 插入数据向上调整, 删除数据向下调整
//向上调整 或向下调整的条件是,左右子树 必须是大堆 或者 小堆
void AdjustUp(HeapDataType* arr, int child) { //child是需要调整的节点的下标assert(arr);int parent = (child - 1) / 2;//while (parent >= 0) { // 个人建议while的循环条件内不要写太复杂的条件//写成 child > 0 会更好 因为 最坏时 child 为 0 ,此时parent = (child-1)/2 也为0//因此 实际上 parent 不会为 <= 0while (child > 0) { // child 等于 0 或小于 0 时就不用再调整了if (arr[child] > arr[parent]) {Swap(&arr[child], &arr[parent]);child = parent;parent = (child - 1) / 2;}//child <= parent 时else break;}
}
功能:将新插入堆的元素调整到合适位置 ,使其满足堆的性质
child
是新插入元素的下标,一般是size-1
(即通过尾插进入的最后一个元素的下标)arr
是待调整的数组指针,断言arr
非空- child 为子节点,向上调整思路:
- 通过
parent = (child - 1) / 2
,计算待调整结点的父节点的下标 child
下标为0时,代表最后一次交换(调整)已结束。因此循环结束条件为child == 0
- 比较父子结点的大小,子节点大于父节点时,交换,满足大根堆的逻辑,同时下标
child
和parent
进行更新 - 当前
child
结点 <parent
结点时,代表以满足大根堆,直接结束循环即可。
- 通过
- 时间复杂度为
O(logN)
终止条件:
- 以下条件满足其一,循环即可终止。
- 子节点值
≤
父节点值 - 到达堆顶(
child=0
)
- 子节点值
向下调整(父→子)
// 向下调整 到叶子结点结束,叶子结点的左孩子 的下标 大于 size size是数组的大小
void AdjustDown(HeapDataType* arr, int size, int parent) {assert(arr);assert(parent >= 0 && parent < size); //parent非负 且 不能越界int child = parent * 2 + 1;while (child < size) {//检查 child+1 是否越界 以及 找出左右孩子中更大的那个//child + 1 >= size 时,表示当前父节点只有左孩子if (child + 1 < size && arr[child + 1] > arr[child])++child;if (arr[child] > arr[parent]) {Swap(&arr[parent], &arr[child]);parent = child;child = parent * 2 + 1;}elsebreak;}
}
实现思路:
- 断言
arr
和parent >= 0 && parent < size
,保证arr
存在,parent
非负且不越界parent
一般是0
,从堆顶元素开始调整,尽可能地保持了堆的结构。
child = parent * 2 + 1
:计算左孩子的下标,右孩子的下标是左孩子下标+1child >= size
时,代表最后一个元素已完成交换,循环结束- 检查
child+1
是否越界以及 找出左右孩子中更大的那个,让较大者与parent
结点进行比较。 child
更大时,与parent
结点进行交换,child
和parent
接着移动。
实现要点:
- 总是与较大的子节点比较
- 循环终止条件(满足其一即终止):
parent
数据 ≥ 两个child
节点数据,此时已符合大根堆的条件,向下调整完成child
>size
时,所有的节点已完成交换,此时已符合大根堆的条件,向下调整完成
时间复杂度为 O(logN)
小根堆的调整:可与大根堆类比
4. 堆元素插入
- 向上调整的过程
// 插入,不能指定位置插入。
// 因为新元素插入后要进行调整使其满足堆的结构,指定的位置不一定是最终调整后的位置
void HeapPush(Heap* pheap, HeapDataType data) {assert(pheap); //空堆也可以push,但需保证结构体存在//插入检查是否需要扩容if (pheap->size == pheap->capacity) {HeapDataType* newSpace = (HeapDataType*)realloc(pheap->base, sizeof(HeapDataType) * pheap->capacity * 2);if (newSpace == NULL) {perror("realloc failed\n");return;}pheap->base = newSpace;pheap->capacity *= 2;}//更新pheap->base[pheap->size] = data;pheap->size++;//插入后需向上调整,保证插入后满足堆的特性AdjustUp(pheap->base, pheap->size - 1); //size++ 后,size-1 是新插入元素的下标
}
实现思路:
- 断言堆存在检查并扩容(2倍扩容策略)
- 扩容:
- 开空间,二倍扩容
- 判断是否开辟成功
- 更改指针和容积
- 扩容:
- 将新元素插入数组末尾,更新
size
,尽可能的保持原来堆的结构。 - 执行向上调整操作维护堆结构
时间复杂度:
- 最优:
O(logN)
(不需要扩容) - 最差:
O(N)
(触发扩容)
5. 堆元素删除
- 向下调整的过程
//堆的删除 应当删除堆顶的元素,删除堆尾的数据没有意义。
//删除最大的或最小的,可以选出第二大或第二小的
//挪动删除(直接删)的缺点: 1. 效率低下O(n) 2. 堆的父子关系全乱了
// 删堆顶的元素,将第一个元素和最后一个元素交换(最大限度的保持了原有的关系),再向下调整维持堆的大小关系
void HeapPop(Heap* pheap) {assert(pheap && pheap->size > 0);assert(!HeapEmpty(pheap));//删除堆顶元素 交换堆顶元素 和 堆尾元素Swap(&pheap->base[0], &pheap->base[pheap->size - 1]);pheap->size--; //删除数据,让size-1 size--之后,可能会为0// 仅当堆非空时进行向下调整if (pheap->size > 0) {AdjustDown(pheap->base, pheap->size, 0);}
}
实现思路:
- 断言堆存在并且确保堆为非空。
- 通过交换堆顶元素和堆尾元素,并更改
size--
来实现数组内元素的删除 - 通过
size--
的方式删除元素,向下调整时,要确保size
的值不为0
注意事项:
- 删除前必须检查堆是否为空
size
减至0时无需向下调整操作
6. 辅助功能函数
堆的判空
//判断堆是否为空
bool HeapEmpty(Heap* pheap) {assert(pheap);return pheap->size == 0;
}
获取堆顶元素
//获取堆顶元素
HeapDataType HeapTop(Heap* pheap) {assert(pheap);assert(pheap->base);return pheap->base[0];
}
- 0号元素就是堆顶元素
获取堆的大小
//获取堆的size
int HeapSize(Heap* pheap) {assert(pheap);return pheap->size;
}
功能说明:
HeapTop
:获取堆顶元素(极值)- 大根堆时是极大值
- 小跟堆时是极小值
HeapEmpty
:判断堆是否为空HeapSize
:获取当前元素个数
结语
本文完整实现了基于数组存储的大根堆结构,重点阐释了堆化过程中向上调整与向下调整的核心逻辑。通过动态数组管理、二倍扩容策略及父子节点下标计算,构建了插入元素时末尾上浮、删除堆顶时首尾交换后根节点下沉的高效操作,确保堆性质在
O(logN)
时间内得以维护。关键点在于理解完全二叉树顺序存储的特性,以及插入/删除时通过逐层比较交换维护父节点≥子节点的规则
。实际应用中可调整比较逻辑切换大小堆,适用于优先队列、堆排序等场景,注意边界处理避免空堆删除和扩容失败问题。
分享到此结束啦
一键三连,好运连连!
相关文章:
【数据结构】堆的完整实现
堆的完整实现 堆的完整实现GitHub地址前言堆的核心功能实现重温堆的定义堆结构定义1. 堆初始化与销毁2. 元素交换函数3. 堆化操作向上调整(子→父)向下调整(父→子) 4. 堆元素插入5. 堆元素删除6. 辅助功能函数堆的判空获取堆顶元…...
软考 系统架构设计师系列知识点之杂项集萃(51)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(50) 第80题 设三个煤场A1、A2、A3分别能供应煤7、12、11万吨,三个工厂B1、B2、B3分别需要10、10、10万吨,从各煤场到各工厂运煤的单价(百元/吨&…...
patch命令在代码管理中的应用
patch 是一个用于将差异文件(补丁)应用到源代码的工具,常用于修复 bug、添加功能或调整代码结构。在您提供的代码中,patch 命令通过一系列补丁文件(.patch)修改了 open-amp 库的源代码。 patch 命令的核心作…...
Qt结构体运算符重载指南
在 Qt 中,结构体(struct)或类(class)中重载运算符是一种常见的做法,用于实现自定义类型的逻辑操作(如比较、算术运算等)。以下是一些常见的运算符重载示例和注意事项: 1.…...
基于bert预训练模型的垃圾短信分类系统
文章目录 任务介绍数据说明注意事项数据处理数据准备数据集划分数据集类构建模型构建与训练模型构建模型训练模型推理附录任务介绍 随着移动通信技术的飞速发展,短信(Short Message Service, SMS)已成为人们日常生活中不可或缺的沟通方式之一。然而,垃圾短信(Spam SMS)的…...
[Android] 网易爆米花TV 2.0.0.0429(原网易Filmly,支持多网盘的TV版、电脑版带海报墙播放器)
[Android] 网易爆米花 链接:https://pan.xunlei.com/s/VOPDuQS9D7qixvAnoy7-he2PA1?pwdhzvh# [Android] 网易爆米花TV 2.0.0.0429(原网易Filmly,支持多网盘的TV版、电脑版带海报墙播放器) 详细介绍直接上主页截图,…...
# 前后端分离象棋对战项目开发记录
1. **结构清晰**:使用更直观的标题、分段和列表,增强可读性。 2. **视觉美观**:添加Markdown格式化(如代码块、加粗、斜体),并建议配色和排版风格。 3. **内容精炼**:精简冗余表述,突…...
Android Framework学习二:Activity创建及View绘制流程
文章目录 Window绘制流程Window Manager Service(WMS)SurfaceSurfaceFlinger 安卓View层次结构ActivityPhoneWindowActivity与PhoneWindow两者之间的关系ViewRootImplDecorViewDecorView 的作用DecorView 的结构总结 Activity创建流程View invalidate调用…...
文章五《卷积神经网络(CNN)与图像处理》
文章5:卷积神经网络(CNN)与图像处理——让AI学会"看图说话" 引言:你的AI宠物如何认出猫狗? 想象你的手机突然有了"眼睛",不仅能识别照片里的猫狗,还能告诉你它们的品种&am…...
Ubuntu系统下Firefox浏览器完整指南:故障修复、国内版安装与下载加速
Ubuntu系统下Firefox浏览器完整指南:故障修复、国内版安装与下载加速 一、Firefox无法启动问题修复二、替换国际版安装国内版完整流程准备工作操作步骤验证要点 三、下载延迟问题解决方案现象分析优化配置步骤注意事项 四、进阶技巧补充五、常见问题FAQ 一、Firefox…...
【论文阅读一】掌握高效阅读法,开启学术研究新旅程:S. Keshav教授论文阅读的三遍法
文章目录 一、三遍阅读法1. 初读:10分钟:宏观把握,快速筛选2. 第二遍:1个小时:更仔细的阅读,了解文中论点3. 第三遍:深入理解,注重细节,挑战假设 二、运用三遍阅读法进行…...
多线程编程的常见问题
目录 1. 线程安全和可重入函数问题 2. 死锁的理解 2.1 死锁的概念 2.2 死锁的四个必要条件 3. C中STL容器的线程安全问题 4. C中智能指针的线程安全问题 1. 线程安全和可重入函数问题 线程安全:线程安全是指在多线程环境下,一个函数或者一段代码可…...
算法篇(九)【滑动窗口】
如果在分析一道算法题的时候,发现使用的两个 ”双指针“ , 都是同向的 , 不回退的 , 且一直都在维护 “一段连续的区间” , 此时我们可以考虑使用 “滑动窗口” ! 一、长度最小的子数组 209. 长度最小的子…...
【AI面试准备】传统测试工程师Prompt Engineering转型指南
介绍技能转型:传统测试工程师需掌握Prompt Engineering优化AI输出。如何快速掌握,以及在实际工作中如何运用。 传统测试工程师向AI时代的技能转型,掌握Prompt Engineering(提示工程)已成为提升工作效率、适应智能化测…...
数字智慧方案6186丨智慧应急指挥解决方案(43页PPT)(文末有下载方式)
资料解读:智慧应急指挥解决方案 详细资料请看本解读文章的最后内容。 在当今社会,各类突发事件频发,应急管理工作面临着巨大挑战。智慧应急指挥解决方案应运而生,旨在提升应急管理的效率和水平,保障人民生命财产安全。…...
d202552-sql
一、184. 部门工资最高的员工 - 力扣(LeetCode) 要找到每个部门工资最高的 使用窗口函数 加排序函数 排序函数用rank dense_rank都行 把最高相同的找出来就行 select *, dense_rank() over(partition by departmentId order by Salary desc) as rank …...
cpper 转 java
快速上手 java 特性 文章目录 java 语言特点JVM工作过程组成 java 语言特点 Java 程序编译成字节码,然后由 Java 虚拟机(JVM)执行 不同平台适配相同的 JVM ,从而使得 Java 程序具备跨平台性 —— 一次编写,到处运行 …...
PostgreSQL常用函数
常用函数 数值函数 名称作用AVG(col)列的平均值COUNT(col)列的行数MAX(col)列的最大值MIN(col)列的最小值SUM(col)列值求和 字符串函数 名称作用LENGTH(str)计算字符串长度CONCAT(str1,str2)合并字符串LTRIM(col,str)从字串string的开头删除只包含str(默认空白LTRIM(col))R…...
P2196 [NOIP 1996 提高组] 挖地雷
P2196 [NOIP 1996 提高组] 挖地雷 - 洛谷 题目描述 在一个地图上有N(N ≤ 20)个地窖,每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷&#…...
截图软件、画图软件、左右分屏快捷键
截图软件 画图软件 画图时候按字母可以改变颜色:红色r,蓝色b,绿色g,粉色p,橙色o 左右分屏:...
小刚说C语言刷题—1018三角形类别
1.题目描述 输入三个整数,以这三个数为边长,判断是否构成三角形;若不能输出 no 。 若构成三角形,进一步判断它们构的是:锐角三角形或直角三角形或钝角三角形。 分别输出 ruijiao , zhijiao , dunjiao 。 输入 三个…...
【Linux】PetaLinux开发
使用Xilinx的PetaLinux工具编译用于Zynq7020的Linux. 部分图片和经验来源于网络,若有侵权麻烦联系我删除,主要是做笔记的时候忘记写来源了,做完笔记很久才写博客。 专栏目录:记录自己的嵌入式学习之路-CSDN博客 目录 1 一般开发流程 2 离线编译过程 3 系统根文…...
【计算机网络网络层深度解析】从IP协议到路由优化
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心实验实现实验1:IPv6地址配置实验2:OSPF路由配置实验3:NAT转换验证 运行…...
第 12 届蓝桥杯 C++ 青少组中 / 高级组省赛 2021 年真题
一、选择题 第 1 题 题目:下列符号中哪个在 C++ 中表示行注释 ( )。 A. ! B. # C. ] D. // 正确答案:D 答案解析: 在 C++ 中,//用于单行注释(行注释),从//开始到行末的内容会被编译器忽略。选项 A(!)、B(#)、C(])均无注释功能,其中#常用于预处理指令(如#inclu…...
【quantity】5 derive_more库 2.0 版介绍
derive_more 是一个 Rust 过程宏库,旨在通过派生宏自动生成常见 trait 的实现,减少样板代码。2.0 版本带来了多项改进和新特性。 主要特性 1. 支持的 Trait 派生 derive_more 2.0 支持派生以下 trait: 基本操作 trait: Display - 格式化显…...
Qt编译报错:Unexpected compiler version, expected Clang 18.0.0 or newer——Qt安装MSVC编译器
截止到本人所使用的Qt6.6.3为止,Qt尚不支持MSVC2022编译器的默认编译器配制。所以,在Qt构建套件中使用MSVC编译器的话,可能仍需要调整Visual Studio版本,或者手动设置MSVC编译器。 如果你的系统安装的是Visual Studio2022&#x…...
(转)角色与动画的性能优化 | UnrealFest演讲干货
八、蓝图 8.1. Tick 优化的重点关注对象——Tick事件。在不需要的情况下,请默认关闭Tick。 在蓝图中Actor上关掉还不行,Component也需要关掉。 在CPP中,我们可以从PrimaryActorTick或PrimaryComponentTick中关闭Tick。 如果需要Tick&…...
小程序云开发-环境配置
如果点 云开发 没有反应,需要修改软件安装目录不要有中文,但软件名可以是中文: 首次使用,会送1个月的云开发,配置后要等10分钟以后,才可以使用 如果不能选择环境,关掉重新打开一次。 然后记…...
【c++】【STL】priority_queue详解
目录 priority_queue的作用priority_queue的接口构造函数emptysizetoppushpopswap priority_queue的实现仿函数(函数对象)是什么?向上调整算法(adjustup)向下调整算法(adjustdown)迭代器构造pus…...
C语音中的三元运算符
一、三元运算符的基本语法 三元运算符,也被称为条件运算符,是 C 语言中唯一有三个操作数的运算符。它的语法格式为:condition ? expression1 : expression2。从语法结构可以看出,三元运算符由一个条件表达式和两个普通表达式组…...
C++模板知识
目录 引言 一、非类型模板参数 二、类模板的特化 (一)概念 (二)函数模板特化 (三)类模板特化 1. 全特化 2. 偏特化 (四)类模板特化应用示例 三、模板的分离编译 …...
MCP 探索:微软 Microsoft MarkItDown MCP ,可把 Word、Excel 等转换成 MarkDown 格式
简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 MCP 探索:微软 Microsoft MarkItDown MCP ,可把 Word、Excel 等转换成 MarkDown 格式…...
文本中地理位置提取方法—正则和NLP模型
这里写目录标题 一、提取地址列后12个字二、正则表达式删除不需要的文本三、保留关键字并删除之后的字四、相似度计算,查重五、去重 大量的文本中识别数据,要充分考虑效率和准确率。本文的方案是通过正则和NLP门址模型联合识别的方案。 首先利用现有粗略…...
AI大模型-RAG到底能做些什么?
RAG常见的应用场景,有以下几个方面: 1.智能客服系统:比如电商领域,对客户提出的常见问题,进行自动回复。减少人力成本。 2.人力资源管理:一个新的员工,入职一家大型公司,公司中有各…...
【算法基础】冒泡排序算法 - JAVA
一、算法基础 1.1 什么是冒泡排序 冒泡排序是一种简单直观的比较排序算法。它重复地走访待排序的数列,依次比较相邻两个元素,如果顺序错误就交换它们,直到没有元素需要交换为止。 1.2 基本思想 比较相邻元素:从头开始…...
Nginx搭建test服务器
创建test域名 进入阿里云添加解析 创建域名:test.xxxxx.com 服务器复制项目代码 新建目录,Git拉取项目代码,安装上插件包 修改配置文件,启动测试服务 修改配置文件“服务器接口” 开启服务pm2 start app.js --name "t…...
依赖倒置原则
当然可以!这次我们来详细讲解 依赖倒置原则(DIP: Dependency Inversion Principle),它是 SOLID 五大设计原则中的压轴,也是最关键的“架构型原则”。 我将从: 什么是依赖倒置原则(定义&#x…...
PostgreSQL 的 VACUUM 与 VACUUM FULL 详解
PostgreSQL 的 VACUUM 与 VACUUM FULL 详解 一、基本概念对比 特性VACUUMVACUUM FULL定义常规维护操作,清理死元组激进重组操作,完全重写表数据锁级别不阻塞读写(共享锁)排他锁(阻塞所有操作)空间回收只标记空间为可用,不返还OS空间返还操作…...
SQL面试题——留存分析之使用bitmap 计算留存
使用bitmap 计算留存 之前我们说过,留存分析其实在企业数据分析中,是很基础但是也很重要的,留存分析可以反映产品的发展是否健康,是否可持续发展,之前我们介绍过,可以看看之前的文章 SQL面试题——留存分析 因为使用工具的限制,所以我们实现方式也会有所不同,之前我们…...
P2415集合求和 题解
P2415 集合求和 题解 公式推导: 设集合有 n 个元素,记为 a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,…,an。 每个子集要么包含某个元素,要么不包含。 我们固定某个元素 a k a_k ak,再从剩下的 n − 1 n -…...
【2025年五一数学建模竞赛】C题 完整论文 模型建立与求解
目录 2025年五一数学建模竞赛 C题完整论文:建模与求解 Matlab代码一、问题重述二、模型假设与符号说明2.1 模型基本假设2.2 符号说明 问题一:预测博主新增关注数问题二:预测用户的新关注行为问题三:预测用户在线状态及互动博主问题…...
wpf 输入框 在输入时去除水印
wpf ScrollViewer 在输入数据时去除水印 在WPF(Windows Presentation Foundation)中,ScrollViewer控件通常用于显示滚动内容。如果你想在ScrollViewer中使用数据输入(例如文本输入),并且希望在输入时去除水…...
数字智慧方案5857丨智慧机场解决方案与应用(53页PPT)(文末有下载方式)
资料解读:智慧机场解决方案与应用 详细资料请看本解读文章的最后内容。 随着科技的飞速发展,智慧机场的建设已成为现代机场发展的重要方向。智慧机场不仅提升了旅客的出行体验,还极大地提高了机场的运营效率。本文将详细解读沃土数字平台在…...
C语言-指针(二)
一级指针 一级指针指的是存储了变量地址的指针 一级指针的变量类型是 类型 * 一级指针的类型与变量的类型有些不同 例:int * p 前面的int * 是该地址的类型 int a 0; int * p a; 这里的指针 p 就是一级指针 二级指针 指针变量也是变量因此也会有地…...
React 组件prop添加类型
给函数的props做注解 import { useState } from reacttype Props { className:string,title?:string } // 自定义一个Button组件 function Button(props:Props){// 解构出classname\const {className} propsreturn <button className{className}>点击我</button&g…...
Spring Boot中集成Guava Cache或者Caffeine
一、在Spring Boot(1.x版本)中集成Guava Cache 注意: Spring Boot 2.x用户:优先使用Caffeine,性能更优且维护活跃。 1. 添加依赖 在pom.xml中添加Guava依赖: <dependency><groupId>com.google.guava</groupId&…...
全感官交互革命:当 AI 大模型学会 “看、听、说、创”
引言:从 “文字对话” 到 “全感官体验”,AI 正在重塑人类认知边界 当 AI 不再局限于文本对话,而是能 “看懂” 图像、“听懂” 语音、“生成” 视频,并将这些模态无缝融合时,一场关于人机交互的革命已然开启。DeepSe…...
Linux 库文件详解
Linux 库文件详解 一、库文件概述 库文件是预先编译好的方法的集合,它为程序员提供了一种方便的方式来复用代码。在 Linux 系统中,主要有两种类型的库文件:静态库和共享库。 静态库(.a 文件) 使用静态库࿰…...
蒙特卡罗方法(Monte Carlo Method):基于随机采样的数值计算与模拟技术
核心思想 蒙特卡罗方法通过随机采样和统计模拟解决数学、物理、工程等领域的复杂问题,其核心是利用大数定律——当样本量足够大时,样本均值会收敛于期望值。 关键特点: 无维度诅咒&#x…...
HTTPS协议:更安全的HTTP
目录 1. 前言 2. HTTP 与 HTTPS:安全的分水岭 2.1 HTTP 的安全隐患 2.2 HTTPS 的安全提升 3. HTTPS 的核心概念 3.1 加密三剑客:对称加密、非对称加密与哈希算法 3.2 SSL/TLS 握手过程:建立安全通道的关键步骤 3.3 数字证书ÿ…...