c++堆的数据结构研究1--最大堆

本文介绍了堆数据结构在Linux任务调度中的作用,特别是最大堆和最小堆的概念。堆通常表现为完全二叉树,通过`make_heap()`函数可以构造堆。比较函数可以根据需求定制,比如关注任务的触发时间和优先级。在插入元素时,堆的结构会相应调整以保持最大堆或最小堆的特性。文中还展示了插入元素如何影响堆的结构,并给出了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际工作的过程中,遇到了linux的任务调度,接触到了堆的建立、排序、插入、删除,本文谈谈对于堆这个数据结构的个人理解。

堆的数据结构

堆在实际应用的过程中,一般有最大堆和最小堆,其实质为一种完全二叉树的结构。下图中的图a为一种最大堆的数据结构,其每个父节点都大于或者等于子节点。

创建命令

make_heap() //构造堆
void make_heap(first_pointer,end_pointer,compare_function);

函数的作用是将[begin,end)内的元素按照compare function处理成堆的结构
比较函数:compare_function
默认比较函数是(<),即最大堆。其可以根据需要重新修改你关心的比较的内容,例如schedule列表你关心task heap的触发时间或者是priority,都可以写在compare函数里面。
一个典型的写法为:

//最大堆
struct MaxHeapCmp
{
    inline bool operator()(const int &x,const int &y)
    {
        return x < y;
    }
};

//最小堆
struct MinHeapCmp
{
    inline bool operator()(const int &x, const int &y)
    {
        return x > y;
    }
};

std::make_heap(data.begin(), data.end(), MinHeapCmp());

//或者使用
//假设已经定义好了一个array数组
bool compare(int a, int b)
{
	return array[a].second < array[b].second ||
		   array[a].first > array[b].first;
}
std::make_heap(data.begin(), data.end(), compare);
//可以使用上述方法来调用compare function

如下图所示,我们已经有了一个最大堆,如图a所示

如果插入一个新的元素,由于树的结构,其位置必定如图b所示,为2的子节点:

  • 如果插入的元素小于等于2,其结构保持不变;
  • 如果插入的元素大于2,由于最大堆的特性,其必定要改变各个元素的位置
    • 如果插入的元素为5,5>2 &&5<20 故其满足树结构,如图c所示
    • 如果插入的元素为21,21>20, 其将放入根节点,如图d所示
      最大堆的插入

参考链接
链接: 最大堆

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值