libevent最小堆图解

 

1:介绍之前先理解树的存储方式,参考图中的0-14的树结构,图片左下角,libevent使用的是顺序存储结构,一句话描述就是完全二叉树的顺序存储,仅需从根节点开始,按照层次依次将树中节点存储到数组即可

2:插入:图中列举了依次插入9,8,7,6,5,4的情况,与实验结果相符合

3:解释下代码中有段不太好理解的代码:

min_child -= min_child == s->n || min_heap_elem_greater(s->p[min_child], s->p[min_child - 1]);

这句换是为了取出子节点中较小的节点

运算优先级是:

min_child == s->n

min_heap_elem_greater(s->p[min_child], s->p[min_child - 1]);

min_child -=    (这里只有1或者0的情况,取决于上面的运算结果)

case:如果右节点已经是最后一个节点,那无需进行比较,直接取左节点,也就是-1

case:如果右节点大于左节点,那么min_child -=1,不然就取右节点

4:这不是二叉排序树,排序树中右节点大于根节点,左节点小于根节点,而libevent中的树的父节点永远小于子节点,2个子节点之间并没有固定大小之分,实现的是最小堆数据结构,因为只关心超时时间最小的时间

最大堆和最小堆是二叉堆的两种形式。

最大堆:根结点的键值是所有堆结点键值中最大者,且每个结点的值都比其孩子的值大

最小堆:根结点的键值是所有堆结点键值中最小者,且每个结点的值都比其孩子的值小

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libevent是一个事件驱动的网络库,它提供了定时器功能来处理定时事件libevent中有两种常用的定时器实现方式:二叉堆和双链队列。 1. 二叉堆:libevent默认使用二叉堆来实现定时器。二叉堆是一种完全二叉结构,可以分为大根堆和小根堆。libevent使用小根堆来管理定时器事件,最近的超时时间会被放在堆顶。添加和删除定时器的时间复杂度为O(logN),其中N是定时器的数量。 2. 双链队列:双链队列是另一种定时器实现方式。它的添加和删除操作的时间复杂度为O(1)。双链队列适用于具有大量相同超时值的情况。你可以使用函数event_base_init_common_timeout来设置双链队列的超时时间。 下面是一个使用libevent创建定时器的示例: ```c #include <event2/event.h> #include <stdio.h> void timer_cb(evutil_socket_t fd, short event, void *arg) { printf("Timer callback\n"); } int main() { struct event_base *base = event_base_new(); struct event *timer_event = evtimer_new(base, timer_cb, NULL); struct timeval tv; tv.tv_sec = 1; // 设置定时器超时时间为1秒 tv.tv_usec = 0; evtimer_add(timer_event, &tv); // 添加定时器事件 event_base_dispatch(base); // 进入事件循环 event_free(timer_event); event_base_free(base); return 0; } ``` 这个示例中,我们使用event_base_new函数创建了一个事件基础结构体,然后使用evtimer_new函数创建了一个定时器事件。接着,我们设置了定时器的超时时间为1秒,并使用evtimer_add函数将定时器事件添加到事件循环中。最后,我们调用event_base_dispatch函数进入事件循环,等待定时器超时并触发回调函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值