顺序查找:
也称为线性查找,是一种最简单的查找方法。它的基本思想是从头开始,逐个比较待查找元素与数组中的元素,直到找到目标元素或遍历完所有元素为止
平均查找长度(ASL): (n+1)/2
在等概率情况下,即每个元素被查找的概率相同,为1/n,顺序查找成功的平均查找长度可以表示为 (1 + 2 + ... + n) / n,这个和式代表从第一个元素到第n个元素,每次查找成功时所需要比较的次数的平均值
时间复杂度:
最坏情况:在最坏的情况下,顺序查找需要遍历整个数据集,这时的时间复杂度为O(n),其中n为数据集的大小。
平均情况:即使在平均情况下,顺序查找也需要比较大约一半的数据集,其时间复杂度仍然是O(n)。
最好情况:在最好的情况下,目标元素位于数据集的开始位置,这时只需一次比较即可完成查找,时间复杂度为O(1)
空间复杂度:
顺序查找的空间复杂度为O(1),因为它不需要额外的存储空间,只需要一个变量来记录当前查找的位置
优缺点:
顺序查找的原理简单易懂,实现起来较为方便,适用于小型数据集或有序的情况。
对于大型数据集,顺序查找的效率较低,尤其是当数据集无序时,性能会大打折扣。
顺序查找对存储结构没有要求,适用于顺序存储或链接存储的线性表。
尽管可以引入“哨兵”等优化方法来避免边界检查,从而提高一些效率,但整体上仍然无法改变其O(n)的时间复杂度。
分块查找:
分块查找算法的过程包括两个主要步骤:首先在索引表中确定待查记录所属的分块,然后在这个分块内进行顺序查找。索引表通常采用二分查找或顺序查找方法,因为索引表是有序的,可以高效地定位到具体的块。一旦确定了具体的块,就在该块内进行逐元素的顺序查找。这种方法的优点在于,即使在块内的元素无序,也能通过索引表快速缩小查找范围
平均查找长度(ASL):
𝑆𝐿𝑏𝑙𝑘≈log2(𝑏+1)−1+(𝑠+1)/2ASLblk≈log2(b+1)−1+(s+1)/2
从时间复杂度来看,分块查找的平均查找长度(ASL)可以近似表示𝐴𝑆𝐿𝑏𝑙𝑘=𝐴𝑆𝐿𝑏𝑛+𝐴𝑆𝐿𝑠𝑞ASLblk=ASLbn+ASLsq,其中 𝐴𝑆𝐿𝑏𝑛ASLbn 是在索引表中采用二分查找的平均查找长度,𝐴𝑆𝐿𝑠𝑞ASLsq 是在块内进行顺序查找的平均查找长度。具体公式可以表示为 𝐴𝑆𝐿𝑏𝑙𝑘≈log2(𝑏+1)−1+(𝑠+1)/2ASLblk≈log2(b+1)−1+(s+1)/2,其中 b 是分块的数量,s 是每一块中元素的数量。这表明,分块查找的效率取决于块的数量和块的大小
时间复杂度:
时间复杂度在最坏情况下为O(n),但如果每一块内的元素数量相同,则在最好情况下可达到O(log n)。
空间复杂度:
分块查找需要额外的存储空间来存放索引表,这会带来一定的存储开销
优缺点:
优点:插入和删除比较容易,无需大量的移动。
缺点:要增加一个索引的储存空间并对初始索引表进行排序运算
折半查找:
折半查找仅适用于已排序的顺序表,通过不断将待查找区间分为两半来缩小查找范围,直到找到目标元素或区间长度为零为止。具体来说,该算法首先设置两个指针low和high,分别指向序列的首尾。然后计算中间位置mid = (low + high) / 2,并比较中间元素与目标值的大小。如果目标值大于中间元素,则在右半部分继续查找;如果小于中间元素,则在左半部分查找。这个过程会一直重复,直到找到目标元素或者low > high时停止,然而,折半查找也有其局限性。它要求数据结构为顺序存储且已排序,因此不适用于频繁插入或删除操作的动态数据集
平均查找长度(ASL):log₂(n+1)
折半查找(二分查找)的平均查找次数取决于数据结构的大小,具体为log₂(n+1)向上取整,其中n为数据集中元素的个数
时间复杂度:O(log n)
空间复杂度:O(1)
折半查找在时间效率上表现出色,但在空间使用上极为经济,几乎不需要额外的存储空间
优缺点:
优点:效率比顺序查找高
缺点:只适用于有序表,且限于顺序存储结构
二叉排序树:
也称为二叉搜索树(Binary Search Tree)或简称BST,是数据结构中的一种高效查找结构,二叉排序树是一种具有以下性质的二叉树:若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有节点的值均大于其根节点的值。任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。这意味着,二叉排序树通过递归地将数据集合分成更小的部分来提高查找效率,从而确保了树的有序性
查找效率:
二叉排序树(BST,Binary Sort Tree)查找效率取决于其树的高度。最好情况下是O(log n),最坏情况下是O(n)。具体分析如下:
- 最好情况:当二叉排序树高度平衡时,查找操作的时间复杂度为O(log n)。在这种情况下,二叉排序树的查找过程类似于折半查找,每次比较都能将搜索范围缩小一半。假设树的高度为h,并且每个层级都是完全填满的,则树的高度h = log₂(n+1),其中n是节点的数量。
- 最坏情况:如果二叉排序树完全不平衡,形成倾斜的单支树,那么查找操作的时间复杂度会退化为O(n)。这种情况下,二叉排序树的性能与顺序查找相同,因为需要依次访问每个节点才能找到目标节点。这种极端情况通常出现在插入的数据已经有序的情况下。
- 一般情况:在一般情况下,二叉排序树的查找效率介于O(log n)和O(n)之间。具体时间复杂度取决于树的形态。为了维持较高的查找性能,通常需要通过自平衡二叉搜索树(如AVL树或红黑树)来确保树保持一定的平衡度。
综上所述,二叉排序树的效率不仅依赖于数据结构本身,还受到数据插入顺序的影响。为了保持高效的查找性能,实际应用中通常使用自平衡二叉搜索树来避免最坏情况的发生。
时间复杂度:
查找操作:最好情况(平衡树)下为O(log n),最坏情况(倾斜树)下为O(n)。在平衡状态下,二叉排序树的查找效率最高,因为树的高度最小,每次比较都能将搜索范围缩小一半。而在最坏情况下,如果树完全不平衡,会形成倾斜的单支树,查找效率会退化为顺序查找的水平。
插入和删除操作:同样依据树的高度,时间复杂度在最好情况下为O(log n),最坏情况下为O(n)。插入操作首先需要查找插入点,然后修改节点指针。删除操作更复杂,不仅需要查找节点,还要进行节点的移除和子树的调整。
空间复杂度:
存储要求:二叉排序树需要树形结构,每个节点包含数据、指向左子树和右子树的指针,因此空间复杂度为O(n),n为节点数量。树的存储需要占用较多的空间,因为它不仅要存储节点的值,还要存储节点之间的逻辑关系。
优缺点:
-
- 快速查找:在平衡状态下,二叉排序树的查找操作时间复杂度为O(log n),比线性查找更快。
- 高效插入和删除:二叉排序树不仅查询快,而且增删速度也相对较快。
- 自动排序:二叉排序树在插入数据时能自动进行排序,使得树的中序遍历结果是升序的。
- 便利的极值查找:可以方便地查找最小值和最大值,最小值即为最左边的节点,最大值即为最右边的节点。
- 缺点
- 最坏情况效率低:如果插入的数据已经有序,二叉排序树会形成倾斜的单支树,查找效率会退化为O(n)。
- 稳定性问题:若树不平衡,则可能需要在查找、插入和删除操作中遍历多个层级,降低效率。
- 空间开销大:每个节点需要存储额外的指针信息,导致空间开销较大。
散列查找:
散列查找(Hash Search)是一种高效的数据检索方法,通过将键值映射到特定地址,并在该地址上进行查找操作。在记录的存储位置与它的关键字之间建立一个确定的对应关系h,以线性表中每个元素的关键字K为自变量,通过函数h(K)计算出该元素的存储位置。这个函数h称为散列函数(Hash Function),其值称为散列地址或哈希地址。例如,对于一组关键字,可以选择一个简单的散列函数如 h(K)=K%m,其中m是表的长度。这种计算方法可以确保关键字均匀地映射到不同的存储位置上
平均查找长度(ASL):
散列查找的平均查找长度(ASL)取决于具体的散列函数和冲突处理方法,理想情况下为O(1),最坏情况下接近O(n)。
时间复杂度:O(1)
空间复杂度:O(n)
注:内容有可能不完全或者遗漏