栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

在实际工作的过程中,遇到了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所示

参考链接
链接: 最大堆

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/353125.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号