树
二叉搜索树
根节点值大于左孩子,小于右孩子
AVL
- 特殊的二叉搜索树
- 每个节点的左右子树高度差小于等于一
红黑树
自平衡的BST,比维护AVL开销小。
- 每个节点要么是黑色,要么是红色。
- 根节点是黑色。
- 每个叶子节点(NIL)是黑色。
- 每个红色结点的两个子结点一定都是黑色。
- 任意一结点到每个叶子结点的路径都包含数量相同的黑结点。
应用场景 C++ STL Map和set
Java TreeMap
多路搜索树
复杂度:O(log n)
应用场景 数据库索引【局部性原理】
对比分析
- 不同于B树只适合随机检索,B+树同时支持随机检索和顺序检索;
- B+树的磁盘读写代价更低。B+树的内部结点并没有指向关键字具体信息的指针,其内部结点比B树小,盘块能容纳的结点中关键字数量更多,一次性读入内存中可以查找的关键字也就越多,相对的,IO读写次数也就降低了。而IO读写次数是影响索引检索效率的最大因素。
- B+树更适合于文件和数据库索引,因为IO次数低,)增删文件(节点)时,效率更高,因为B+树的叶子节点包含所有关键字,并以有序的链表结构存储,这样可很好提高增删效率。
B树
B树的每一个节点都包含key和value,因此经常访问的元素可能离根节点更近,因此访问也更迅速。
B+树
B+树的非叶子结点只包含导航信息,不包含实际的值,所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历。
堆
数组实现的完全二叉树 建堆是O(n)复杂度,堆排序是O(nlog2n)
最小堆
父节点的值比每一个子节点的值都要小
应用 10w个数字选前20大数字,先乱序选前20构建最小堆,然后更新,若大于堆顶,则插入,则不大于则丢弃。
最大堆
父结点的值比每一个子节点都要大