为什么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)从当前属性结构的最后一个非叶节点开始,向下浮动,浮动的原理是:
如果有比自己小的子节点,那么与这个子节点交换,然后递归的对刚刚交换下去的子节点进行向下浮动,(如果当前两个子节点都比自己小,那么就与最小的那个交换)
首先什么是小根堆:
(1)它是一颗完全二叉树
(2)任意一个节点均小于或等于其左右子节点的关键码(大根堆相反就是了)
因此可以得知,当前树形结构的根节点就是当前整个树形结构最小的节点。。。
至于说这种堆结构有什么作用:
(1)以前本科的时候上数据结构课的时候就有讲过堆排序,好像还不错,O(nlogn)的复杂度
(2)可以用来构造优先权队列。。。。
(3)在libevent库中,定时是采用小根堆来维护(nginx是红黑树)
好了,下面来看看小根堆的插入和删除吧,其实感觉 非常简单诶,比红黑树简单,只需要向上向下浮动就好了,没有红黑树那种左旋右旋,还得染色什么的。。
首先来看节点的插入:
(1)将要插入的节点按照完全二叉树的形式插入到当前树形结构的最末尾
(2)对这个刚刚插入的节点进行向上浮动,浮动的原理是:比较当前的节点和其父节点,如果比父节点小,那么与父节点交换,然后递归的进行,直到浮动不动了或者到了根节点
接下来来看节点的删除:
(1)小根堆的删除是删除当前的根节点,也就是返回当前根节点的值,然后用当前树形结构的最后一个节点来代替根节点
(2)从当前属性结构的最后一个非叶节点开始,向下浮动,浮动的原理是:
如果有比自己小的子节点,那么与这个子节点交换,然后递归的对刚刚交换下去的子节点进行向下浮动,(如果当前两个子节点都比自己小,那么就与最小的那个交换)
相关文章推荐
- 在RB-INSERT的第16行中,假设新插入的结点z是红色的。注意如果将z着为黑色,则在红黑树的性质4)就不会被破坏。那么我们为什么没有选择将z着为黑色呢?
- java 开发为什么选择freemarker 放弃jsp
- 我为什么放弃了 Python ,选择了 Go?
- 我为什么放弃了 Python ,选择了 Go?
- 为什么选择放弃recyclerView
- 为什么你应该放弃 Windows10 而选择 Linux
- 为什么很多程序员都选择跳槽
- 类(class)和结构(struct)的区别是什么?它们对性能有影响吗?.NET BCL里有哪些是类(结构),为什么它们不是结构(类)?在自定义类型时,您如何选择是类还是结构?
- 人生是需要随时面临选择与放弃
- 放弃,也是一种选择--Leo谈应届生求职(5)
- 为什么很多程序员都选择跳槽?
- 为什么很多程序员都选择跳槽?
- node.js都应用在什么项目上?这些项目为什么选择node.js
- 嵌入式为什么选择用C语言开发?
- easyui的accordion为动态生成,accordion的onSelect方法中又动态生成tree,为什么要第二次选择accordion,tree才生成出来
- 磁盘和内存选择B树和红黑树的原因
- 为什么我要放弃javaScript数据结构与算法(第三章)—— 栈
- 为什么排队时你似乎总会选择最慢的队伍
- 为什么我要放弃javaScript数据结构与算法(第九章)—— 图
- 为什么很多程序员都选择跳槽?