堆
完全二叉树,大根堆的根节点的值大于子节点的值,小根堆根节点的值小于子节点的值
堆插入操作(大根堆为例):插入新的节点,然后沿着新节点到根节点的路径执行一趟起泡操作,交换其与根节点的值;时间复杂度O(logn)
堆删除操作:只能删除堆顶元素,删除堆顶之后,再将最后一个叶子结点删除,执行一次从根节点到叶子结点的操作,寻找最后一个叶子节点应该存放的位置;时间复杂度O(logn)
建堆操作:对每个节点都执行一次堆插入操作;时间复杂度O(nlogn)
堆初始化操作:从最后一个非叶子节点开始调整,时间复杂度为非叶子节点的节点数量
二叉搜索树
查找操作:二分法,时间复杂度O(h)
插入操作:类似查找操作,找到需要插入的位置,时间复杂度O(h)
删除操作:基于查找,时间复杂度O(h)
- 情况1:删除叶子节点,直接删除
- 情况2:要删除的节点只有一个子树,如果要删除的节点是根节点,则将子树变为根节点,否则让该节点的父节点指向该节点
- 情况3:要删除的节点有两个子树,则用左子树最大节点或右子树最小节点替换该节点,左子树最大节点是左子树的最右节点,右子树最小节点是右子树的最小节点
红黑树:平衡二叉搜索树
二叉搜索树问题:查找、插入和删除的时间复杂度与树高有关,最坏情况下为O(n),最好情况为O(logn)
红黑树:高度平衡的二叉搜索树,时刻维持树高为logn,可以保证查找性能为O(logn),在插入或删除操作时通过“旋转”维持树高
B树&B+树
用于外部存储,磁盘I/O读写较慢,如果使用二叉搜索树树太深,查找效率较低
B树&B+树:多路平衡查找树;每个节点可以有多个关键字,是一棵多叉树
B树:父节点的关键字不包括在子节点当中,提供层次查找的方式;与B+树相比,如果经常访问的节点离根节点更近,那么检索速度会更快,因为非叶子节点存储了叶子结点的指针
B+树:父节点的关键字包括在子节点中,非叶子节点不存储叶子结点的指针,因此可以存储更多的关键字,提高效率;提供层次查找和顺序查找两种查找方式;叶子结点按顺序存储,查找指定区间的数据效率更高,数据紧密性好,缓存命中率更高,有助于数据库的整表检索
红黑树和AVL树用于内部存储,B-树和B+树用于外部存储