本笔记是对《王道数据结构》中各章节涉及的基础知识进行整理。本笔记主要用以应对夏令营面试中可能会问到的数据结构方面的问题,比较泛泛而谈,如果您对这些内容感兴趣,建议参考原书。大佬可自行绕路
更多章节内容请参见:保研复习——数据结构篇-CSDN博客
目录
知识框架:
查找的基本概念:
查找的分类:
各个查找方法的指标:
线性结构查找:
顺序查找:
折半(二分)查找:
插值查找:
插值查找(Interpolation Search)是一种改进的二分查找算法,主要用于在有序数组中查找特定元素。插值查找通过估算待查找元素在数组中的位置,使得查找效率在某些情况下优于二分查找。
插值查找的核心思想是根据待查找元素的值来估计其在数组中的位置,而不是直接取中间位置。这个估计位置通常使用线性插值公式来计算。
可以看到插值查找和二分查找的不同之处便在于将mid的取值公式进行了调整,使mid值的变化更靠近待查找元素key,可以间接地减少了比较次数。
斐波那契查找:
斐波那契查找原理与二分查找相似,仅仅改变了中间结点(mid)的位置,mid不再是中间或插值得到,而是位于黄金分割点附近。
我们知道,斐波那契数列 F(k)={1,1,2,3,5,8,13,21…},(从第三个数开始,后边每一个数都是前两个数的和)。
F[k] = F[k-1] + F[k-2]
恰巧斐波那契数列前一项/后一项的值越来越接近黄金比例,即0.618。
分块查找:
由索引项组成的索引表按关键字有序,则确定块的查找可以用顺序查找,亦可用折半查找。而块中记录是任意排序的,则在块中只能是顺序查找。(块间有序,块内无序)
可以认为其时间复杂度为,介于折半查找O(logn)与顺序查找O(n)之间。
树型查找:
常考结论:
二叉排序树BST:
时间复杂度为O(logn),近似于折半查找,但是不平衡的二叉排序树的时间复杂度接近O(n)。
平衡二叉树AVL:
平衡二叉树是一种特殊的二叉排序树,其树中任意结点的左右子树的高度差不超过1。
平衡二叉树因为其良好的平衡性,所以其时间复杂度是毫无疑问的O(logn)。
红黑树:
红黑树的提出背景:
对于二叉搜索树,如果插入的数据是随机的,那么它就是接近平衡的二叉树,平衡的二叉树,它的操作效率(查询,插入,删除)效率较高,时间复杂度是O(logN)。但是可能会出现一种极端的情况,那就是插入的数据是有序的(递增或者递减),那么所有的节点都会在根节点的右侧或左侧,此时,二叉搜索树就变为了一个链表,它的操作效率就降低了,时间复杂度为O(N),所以可以认为二叉搜索树的时间复杂度介于O(logN)和O(N)之间,视情况而定。那么为了应对这种极端情况,红黑树就出现了,它是具备了某些特性的二叉搜索树,能解决非平衡树问题,红黑树是一种接近平衡的二叉树(说它是接近平衡因为它并没有像AVL树的平衡因子的概念,它只是靠着满足红黑节点的5条性质来维持一种接近平衡的结构,进而提升整体的性能,并没有严格的卡定某个平衡因子来维持绝对平衡)。
原文链接:https://blog.csdn.net/cy973071263/article/details/122543826
首先,红黑树是一个二叉搜索树,它在每个节点增加了一个存储位记录节点的颜色,可以是RED,也可以是BLACK;通过任意一条从根到叶子简单路径上颜色的约束,红黑树保证最长路径不超过最短路径的二倍,因而近似平衡(最短路径就是全黑节点,最长路径就是一个红节点一个黑节点,当从根节点到叶子节点的路径上黑色节点相同时,最长路径刚好是最短路径的两倍)。它同时满足以下特性:
1)节点是红色或黑色;
2)根是黑色;
3)叶子节点(外部节点,空节点)都是黑色,这里的叶子节点指的是最底层的空节点(外部节点),下图中的那些null节点才是叶子节点,null节点的父节点在红黑树里不将其看作叶子节点;
4)红色节点的子节点都是黑色,红色节点的父节点都是黑色,从根节点到叶子节点的所有路径上不能有 2 个连续的红色节点;
5)从任一节点到叶子节点的所有路径都包含相同数目的黑色节点。
红黑树的查找,插入和删除操作,时间复杂度都是O(logN)。
红黑树和AVL树的比较:
- AVL树的时间复杂度虽然优于红黑树,但是对于现在的计算机,cpu太快,可以忽略性能差异
- 红黑树的插入删除比AVL树更便于控制操作
- 红黑树整体性能略优于AVL树(红黑树旋转情况少于AVL树)
B树:
B树(B-Tree)之所以被提出,是为了满足特定应用场景中对数据存储和检索的效率需求,特别是在磁盘存储和数据库管理系统中。以下是引入B树的主要原因:
1. 解决大数据量下的效率问题
当数据量非常大时,无法将所有数据都存储在内存中,需要将数据存储在磁盘上。由于磁盘的访问速度比内存慢得多,因此减少磁盘I/O操作的次数变得至关重要。
- 磁盘访问的代价高:磁盘的读取速度比内存慢得多,每次读取需要的时间较长,因此需要一种数据结构来最小化磁盘访问次数。
- 局部性原理:B树利用局部性原理,将多个键存储在一个节点中,使得每次磁盘读取可以获取更多数据,减少磁盘I/O次数。
2. 提高插入、删除和搜索的性能
传统的二叉搜索树(BST)在最坏情况下会退化为线性结构(如链表),导致操作的时间复杂度变为 O(n)O(n)O(n)。自平衡的树(如红黑树和AVL树)虽然能保持对数时间复杂度,但其每个节点只包含一个键,在磁盘存储上并不高效。
- 保持平衡:B树通过自平衡机制,确保树的高度始终保持在 O(logn)O(\log n)O(logn) 级别。
- 多键节点:每个节点可以包含多个键,这样可以减少树的高度,从而减少搜索、插入和删除操作的复杂度。
3. 高效的范围查询
在数据库和文件系统中,范围查询是一种常见操作。B树因为键是有序存储的,因此能够高效地进行范围查询。
- 顺序存储:B树的节点按顺序存储键,适合范围查询操作。
- 连贯性:B树的叶子节点在同一层,可以通过顺序遍历叶子节点高效地进行范围查询。
B树(B-Tree)是一种自平衡的树数据结构,广泛用于数据库和文件系统中以保持数据有序并支持高效的插入、删除和搜索操作。B树的所有操作都能在对数时间内完成,是一类通用的多叉搜索树。
B+树:
B+树(B+ Tree)是B树的一种变种,广泛用于数据库和文件系统中。B+树在B树的基础上进行了改进,进一步提高了查找和范围查询的效率。以下是B+树的定义、结构、操作及其优点和应用场景的介绍。B+树各项操作的时间复杂度也是log(n),特别适合带有范围的查找
B+树与B树的主要区别在于:
- 所有实际数据都存储在叶子节点:内部节点仅用于索引,所有键和值都存储在叶子节点中。
- 叶子节点通过链表相连:所有叶子节点形成一个有序的双向链表,便于范围查询。
- 内部节点只存储键,不存储值:内部节点用于引导搜索,不直接存储实际数据。
散列结构(散列表):
开放定址法:
线性探测:
平方探测:
随机探测法:
是一个随机数列
再散列函数法:
这里的就是不同的散列函数,每当发生散列地址冲突时,就换一个散列函数计算。