时间复杂度:匀称环境下,二叉排序树的高度为 O ( l o g n ) O(log n) O(logn)(此中 n n n 是树中节点的数目),搜索操纵的时间复杂度为 O ( l o g n ) O(log n) O(logn)。但在最坏环境下,即二叉排序树退化为链表(例如插入的节点值是有序的),树的高度为 O ( n ) O(n) O(n),搜索操纵的时间复杂度会变为 O ( n ) O(n) O(n)。
空间复杂度:主要取决于递归调用栈的深度,匀称环境下为 O ( l o g n ) O(log n) O(logn),最坏环境下为 O ( n ) O(n) O(n)。如果使用迭代方式实现搜索,空间复杂度可以优化到 O ( 1 ) O(1) O(1)。
定义
平衡二叉树(AVL树)是一种自平衡的二叉搜索树。它满足二叉搜索树的根天性质:对于树中的恣意节点,其左子树中所有节点的值都小于该节点的值,右子树中所有节点的值都大于该节点的值。同时,AVL树还额外要求每个节点的左右子树的高度差(平衡因子)的绝对值不超过 1。平衡因子定义为该节点的左子树高度减去右子树高度。 平衡的重要性
通过保持树的平衡,AVL树可以或许保证在进行插入、删除和查找操纵时的时间复杂度始终为 O ( l o g n ) O(log n) O(logn),此中 n n n 是树中节点的数目。如果不进行平衡操纵,二叉搜索树可能会退化为链表,此时这些操纵的时间复杂度会变为 O ( n ) O(n) O(n)。 平衡二叉树查找过程
平衡二叉树的查找过程与普通二叉搜索树的查找过程根本同等:
匀称环境:在平衡二叉树(AVL树)中,由于它始终保持着左右子树高度差不超过 1 的平衡特性,树的高度 h h h 始终维持在 O ( log n ) O(\log n) O(logn) 级别,此中 n n n 是树中节点的数目。而查找操纵需要从根节点开始,沿着一条路径向下搜索,颠末的节点数最多为树的高度。因此,匀称环境下平衡二叉树查找操纵的时间复杂度为 O ( log n ) O(\log n) O(logn)。例如,当树中有 1024 个节点时,树的高度约莫为 log 2 1024 = 10 \log_2{1024}=10 log21024=10,查找操纵最多只需比较 10 次。
最坏环境:由于平衡二叉树严格保证了树的平衡性,即使在最坏环境下,树的高度依然是 O ( log n ) O(\log n) O(logn),所以查找操纵的时间复杂度仍然是 O ( log n ) O(\log n) O(logn)。这与普通二叉搜索树不同,普通二叉搜索树在最坏环境下(退化为链表)查找时间复杂度会达到 O ( n ) O(n) O(n)。
空间复杂度
平衡二叉树查找操纵的空间复杂度主要取决于递归调用栈的深度。在递归查找过程中,每次递归调用会在栈上分配肯定的空间。由于查找路径的长度最长为树的高度,而树的高度为 O ( log n ) O(\log n) O(logn),所以查找操纵的空间复杂度为 O ( log n ) O(\log n) O(logn)。如果采用迭代方式实现查找,空间复杂度可以优化到 O ( 1 ) O(1) O(1),由于只需要使用常数级的额外空间来记载当前节点的位置。
适合使用的场景
当数据聚集需要频仍进行插入、删除和查找操纵时,平衡二叉树是一个不错的选择。例如,在数据库的索引系统中,数据会不断地被插入和删除,同时也需要快速地查找特定的数据记载。平衡二叉树可以或许在保证插入和删除操纵相对高效的同时,确保查找操纵的时间复杂度始终为 O ( log n ) O(\log n) O(logn)。
时间复杂度:由于红黑树是接近平衡的,其高度始终保持在 O ( l o g n ) O(log n) O(logn) 级别(此中 n n n 是树中节点的数目),因此查找操纵的时间复杂度为 O ( l o g n ) O(log n) O(logn)。这意味着在大规模数据聚会集,红黑树查找可以或许保持较高的效率。
空间复杂度:主要取决于递归调用栈的深度,匀称环境下为 O ( l o g n ) O(log n) O(logn),最坏环境下也为 O ( l o g n ) O(log n) O(logn)。如果使用迭代方式实现查找,空间复杂度可以优化到 O ( 1 ) O(1) O(1)。
时间复杂度:B 树的高度 h h h 与节点数目 n n n 的关系为 h = O ( log ⌈ m / 2 ⌉ n ) h = O(\log_{\lceil m/2 \rceil} n) h=O(log⌈m/2⌉n),此中 m m m 是 B 树的阶数。因此,B 树查找操纵的时间复杂度为 O ( log ⌈ m / 2 ⌉ n ) O(\log_{\lceil m/2 \rceil} n) O(log⌈m/2⌉n),在现实应用中,由于 m m m 通常较大,查找效率较高。
空间复杂度:主要取决于树中节点的数目,空间复杂度为 O ( n ) O(n) O(n)。
应用场景
B 树常用于文件系统和数据库系统中,由于它可以有用减少磁盘 I/O 次数。在这些系统中,数据通常存储在磁盘上,磁盘 I/O 操纵的时间开销较大,B 树的多路特性使得每次磁盘 I/O 可以读取或写入多个键值,从而提高了系统的性能。
B + 树
定义
B + 树是 B 树的一种变体,它与 B 树的主要区别在于:
所有的数据都存储在叶子节点中,非叶子节点只存储索引信息。
叶子节点之间通过指针相连,形成一个有序链表。
示例
以下是一个简单的 B + 树示例:
[30, 60]
/ \
[10, 20] [40, 50, 70, 80]
| / | \
10 40 50 70 - 80 (叶子节点相连)
复制代码
在这个 B + 树中,非叶子节点只包含索引键值 30 和 60,所有的数据(10、20、40、50、70、80)都存储在叶子节点中,并且叶子节点通过指针形成了有序链表。 B + 树查找过程
准确查找:从根节点开始,按照与 B 树雷同的方式,将待查找的值与非叶子节点中的键值进行比较,确定进入哪个子节点继续查找,直到到达叶子节点。在叶子节点中线性查找目标键值。
时间复杂度:与 B 树雷同,B + 树的查找操纵时间复杂度也为 O ( log ⌈ m / 2 ⌉ n ) O(\log_{\lceil m/2 \rceil} n) O(log⌈m/2⌉n)。对于范围查找,由于叶子节点之间有指针相连,时间复杂度为 O ( k + log ⌈ m / 2 ⌉ n ) O(k + \log_{\lceil m/2 \rceil} n) O(k+log⌈m/2⌉n),此中 k k k 是范围内键值的数目。
空间复杂度:同样为 O ( n ) O(n) O(n),主要用于存储树中的节点。
应用场景
B + 树在数据库系统中应用广泛,如 MySQL 的 InnoDB 存储引擎默认使用 B + 树作为索引布局。由于 B + 树的布局非常适合范围查询,并且由于所有数据都存储在叶子节点,使得数据库的插入、删除和查找操纵更加高效和稳固。同时,叶子节点的有序链表布局也方便进行顺序访问,提高了数据的读取效率。
分块查找
时间复杂度:设线性表长度为 n n n,分成 b b b 个块,每个块有 s s s 个元素( n = b × s n = b \times s n=b×s)。在索引表中查找块的时间复杂度,如果使用顺序查找为 O ( b ) O(b) O(b),使用二分查找为 O ( log 2 b ) O(\log_2b) O(log2b);在块内进行顺序查找的时间复杂度为 O ( s ) O(s) O(s)。所以,分块查找的匀称时间复杂度为 O ( b + s ) O(b + s) O(b+s) 或 O ( log 2 b + s ) O(\log_2b + s) O(log2b+s)。当 s = n s = \sqrt{n} s=n 时,时间复杂度达到最优,为 O ( n ) O(\sqrt{n}) O(n )。
空间复杂度:主要是索引表占用的额外空间,为 O ( b ) O(b) O(b),此中 b b b 是块的数目。