您的位置:首页 > 其它

为什么libevent 放弃红黑树选择小根堆

2015-02-13 16:36 911 查看
最近学习libevent,发现libevent1.2版本对Timer事件用的是红黑树,但是libevent2.0版本就放弃了红黑树的使用,使用小根堆。于是搜集了部分资料,以下内容来自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=22906954&id=4376535

首先什么是小根堆:

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

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

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

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

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

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

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

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

首先来看节点的插入:

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

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

接下来来看节点的删除:

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

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

如果有比自己小的子节点,那么与这个子节点交换,然后递归的对刚刚交换下去的子节点进行向下浮动,(如果当前两个子节点都比自己小,那么就与最小的那个交换)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: