在实际工作的过程中,遇到了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所示
参考链接
链接: 最大堆