小根堆

首先什么是小根堆:

(1)它是一颗完全二叉树

(2)任意一个节点均小于或等于其左右子节点的关键码(大根堆相反就是了)

因此可以得知,当前树形结构的根节点就是当前整个树形结构最小的节点。。。


至于说这种堆结构有什么作用:

(1)以前本科的时候上数据结构课的时候就有讲过堆排序,好像还不错,O(nlogn)的复杂度

(2)可以用来构造优先权队列。。。。

(3)在libevent库中,定时是采用小根堆来维护(nginx是红黑树)


好了,下面来看看小根堆的插入和删除吧,其实感觉 非常简单诶,比红黑树简单,只需要向上向下浮动就好了,没有红黑树那种左旋右旋,还得染色什么的。。

首先来看节点的插入:

(1)将要插入的节点按照完全二叉树的形式插入到当前树形结构的最末尾

(2)对这个刚刚插入的节点进行向上浮动,浮动的原理是:比较当前的节点和其父节点,如果比父节点小,那么与父节点交换,然后递归的进行,直到浮动不动了或者到了根节点


接下来来看节点的删除:

(1)小根堆的删除是删除当前的根节点,也就是返回当前根节点的值,然后用当前树形结构的最后一个节点来代替根节点

(2)从当前属性结构的最后一个非叶节点开始,向下浮动,浮动的原理是:

   如果有比自己小的子节点,那么与这个子节点交换,然后递归的对刚刚交换下去的子节点进行向下浮动,(如果当前两个子节点都比自己小,那么就与最小的那个交换)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为您讲解一下结构体小根堆的实现。 首先,我们需要定义一个结构体来表示堆中的元素。假设我们需要维护一个包含学生姓名和分数的小根堆,那么结构体可以定义如下: ```c++ struct Student { std::string name; int score; // 重载小于运算符,用于比较结构体对象大小 bool operator<(const Student& other) const { return score > other.score; // 注意这里是小于号,因为要实现小根堆 } }; ``` 接下来,我们可以使用 STL 中的 priority_queue 来实现小根堆。 ```c++ #include <queue> using namespace std; priority_queue<Student> q; // 创建一个空的小根堆 // 往小根堆中插入一个元素 Student s1 = {"Tom", 80}; q.push(s1); // 从小根堆中取出堆顶元素(即分数最低的学生) Student top_student = q.top(); q.pop(); ``` 在上面的代码中,我们使用 priority_queue 来创建一个空的小根堆,并使用结构体 Student 来表示堆中的元素。往堆中插入一个元素时,只需要调用 push 函数即可。从堆中取出堆顶元素时,只需要调用 top 函数获取堆顶元素,再调用 pop 函数将其从堆中删除即可。 需要注意的是,我们需要在结构体中重载小于运算符,以便 priority_queue 可以正确比较结构体对象的大小。在上面的代码中,重载的小于运算符返回的是分数较低的学生应该排在前面。 希望这个简单的例子可以帮助您理解结构体小根堆的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值