关于二叉堆、优先级队列、AVL TREE和RB TREE的总结

来源:互联网 发布:linux touch cat 命令 编辑:程序博客网 时间:2024/04/28 08:30

1. 从一个大牛博客里摘了一段对AVL的评论

AVL树的插入和删除操作是它很普遍的操作,我从一些文章上看到都说它的删除操作机及其复杂,但是这个世界上难道还有比毁灭更简单的事情吗?avl删除的善后处理真的比插入一个节点还要复杂吗?经过我的百般蹂躏,avl树终于向我展示了冰山的下面到底隐藏着什么。 

AVL树要求的平衡条件是左右子树的高度差不能大于1,于是为了跟踪平衡性,引入了一个平衡因子的概念,平衡因子就是左右子树的高度差,但是如果一个节点 X有一个左孩子而没有右孩子,而且其做孩子没有任何子树,那么这个左孩子作为X一个子树根节点,高度为0,而X没有右孩子,因此根本谈不上右子树的高度, 这种情况咋办呢?实际上这种情况下X的平衡因子为1,于是乎,平衡因子并不是严格意义上的高度差,而应该遵循以下定义:一个节点X的平衡因子就是一个路径 差。

2.二 叉堆是实现优先级队列的一种绝佳的数据结构。如果每次都取优先级最高的话(也就是取树根),但是要想到删除或查找特定的结点的情况,这样堆本身就不好调整了,因为对于删除,默认的二叉堆中并没有删除任意节点的操作,因此可扩展性会受到很大影响,对于查找,二叉堆并不是一颗查找树,只是保证最值在根,对于孩子节点的大小顺序没有任何规定。于是想一下红黑树还有avl树,这棵树是自调整的,总会将权值最小的置于树的最左边最下边,这样我们取最左下的节点就可以 得到一个极值,完成了二叉堆的功能,考虑删除,红黑树定义了删除,插入,查找等一系列动作,扩展性好于二叉堆。所以可以说二叉堆仅仅适用于完全的优先级队列管理,一旦涉及别的操作就麻烦了,而红黑树等平衡树在可以胜任二叉堆的任务的情况下还可以采取更多的动作。avl树和红黑树都是平衡二叉搜索树(某种意义上红黑树并不平衡),它们的意义有两个:1.搜索树,这决定了它们的功能;2.平衡树,这决定了它们的效率。对于红黑树还有一点,就是不那么平衡,减少了限制条件总会使事情变得简单,在这个世界,只要有限制,那么就要有一定的开销来维护这个限制,毕竟,世间万物都是趋向自由的,无约束的(呵呵,题外 话)。所以姑且不从统计学上分析,仅仅从上面的哲学意义上,红黑树就比avl树要高效,实际上确实高效,但是有个前提,就是必须是综合应用(查找,插入, 删除)而不是仅仅查找,要是只有查找操作的话,avl要好,因为它严格用平衡因子来限制平衡,相同节点的avl树的最大高度要低于红黑树的最大高度,而查找的效率直接和最大高度相关联。

3.STL中,priority_queue就是用堆(最大堆)实现的,具体是用一个vector实现的二叉堆,set和map是用RB树实现的,会自动排序。 set和multiset的区别是:set插入的元素不能相同,但是multiset可以相同。Set和multiset都是引用<set>头文件,复杂度都是logn

map与set的最大区别在于map是一种特殊的set,它的所有元素都是pair<key,value>

一键对应一个实例就是map,当一个key对应多个value,则用multimap
multimap的操作与map大致一样,不同在于multimap允许有相同的key在容器中存在。
map不能有重复的键值对,即如果插入键相同的键值对,则将覆盖掉同键值的键值对。multimap则不会覆盖。
map之能一一对应 multimap能一对多 比如:
1->a
2->b
1->c
就只能用multimap

0 0
原创粉丝点击