分析数据结构中——顺序查找 分块查找 折半查找 二叉排序树 散列查找

顺序查找

       也称为线性查找,是一种最简单的查找方法。它的基本思想是从头开始,逐个比较待查找元素与数组中的元素,直到找到目标元素或遍历完所有元素为止

平均查找长度(ASL) (n+1)/2

在等概率情况下,即每个元素被查找的概率相同,为1/n,顺序查找成功的平均查找长度可以表示为 (1 + 2 + ... + n) / n,这个和式代表从第一个元素到第n个元素,每次查找成功时所需要比较的次数的平均值

时间复杂度:

最坏情况:在最坏的情况下,顺序查找需要遍历整个数据集,这时的时间复杂度为O(n),其中n为数据集的大小。

平均情况:即使在平均情况下,顺序查找也需要比较大约一半的数据集,其时间复杂度仍然是O(n)。

最好情况:在最好的情况下,目标元素位于数据集的开始位置,这时只需一次比较即可完成查找,时间复杂度为O(1)

空间复杂度:

顺序查找的空间复杂度为O(1),因为它不需要额外的存储空间,只需要一个变量来记录当前查找的位置

优缺点:

顺序查找的原理简单易懂,实现起来较为方便,适用于小型数据集或有序的情况。

对于大型数据集,顺序查找的效率较低,尤其是当数据集无序时,性能会大打折扣。

顺序查找对存储结构没有要求,适用于顺序存储或链接存储的线性表。

尽管可以引入“哨兵”等优化方法来避免边界检查,从而提高一些效率,但整体上仍然无法改变其O(n)的时间复杂度。

分块查找:

分块查找算法的过程包括两个主要步骤:首先在索引表中确定待查记录所属的分块,然后在这个分块内进行顺序查找。索引表通常采用二分查找或顺序查找方法,因为索引表是有序的,可以高效地定位到具体的块。一旦确定了具体的块,就在该块内进行逐元素的顺序查找。这种方法的优点在于,即使在块内的元素无序,也能通过索引表快速缩小查找范围

平均查找长度(ASL):

𝑆𝐿𝑏𝑙𝑘≈log⁡2(𝑏+1)−1+(𝑠+1)/2ASLblk​≈log2​(b+1)−1+(s+1)/2

从时间复杂度来看,分块查找的平均查找长度(ASL)可以近似表示𝐴𝑆𝐿𝑏𝑙𝑘=𝐴𝑆𝐿𝑏𝑛+𝐴𝑆𝐿𝑠𝑞ASLblk​=ASLbn​+ASLsq​,其中 𝐴𝑆𝐿𝑏𝑛ASLbn​ 是在索引表中采用二分查找的平均查找长度,𝐴𝑆𝐿𝑠𝑞ASLsq​ 是在块内进行顺序查找的平均查找长度。具体公式可以表示为 𝐴𝑆𝐿𝑏𝑙𝑘≈log⁡2(𝑏+1)−1+(𝑠+1)/2ASLblk​≈log2​(b+1)−1+(s+1)/2,其中 b 是分块的数量,s 是每一块中元素的数量。这表明,分块查找的效率取决于块的数量和块的大小

时间复杂度:

时间复杂度在最坏情况下为O(n),但如果每一块内的元素数量相同,则在最好情况下可达到O(log n)。

空间复杂度:

分块查找需要额外的存储空间来存放索引表,这会带来一定的存储开销

优缺点:

优点:插入和删除比较容易,无需大量的移动。

缺点:要增加一个索引的储存空间并对初始索引表进行排序运算

折半查找:

折半查找仅适用于已排序的顺序表,通过不断将待查找区间分为两半来缩小查找范围,直到找到目标元素或区间长度为零为止。具体来说,该算法首先设置两个指针lowhigh,分别指向序列的首尾。然后计算中间位置mid = (low + high) / 2,并比较中间元素与目标值的大小。如果目标值大于中间元素,则在右半部分继续查找;如果小于中间元素,则在左半部分查找。这个过程会一直重复,直到找到目标元素或者low > high时停止,然而,折半查找也有其局限性。它要求数据结构为顺序存储且已排序,因此不适用于频繁插入或删除操作的动态数据集

平均查找长度(ASL):log₂(n+1)

折半查找(二分查找)的平均查找次数取决于数据结构的大小,具体为log₂(n+1)向上取整,其中n为数据集中元素的个数

时间复杂度:O(log n)

空间复杂度:O(1)

折半查找在时间效率上表现出色,但在空间使用上极为经济,几乎不需要额外的存储空间

优缺点:

优点:效率比顺序查找高

缺点:只适用于有序表,且限于顺序存储结构

二叉排序树:

也称为二叉搜索树(Binary Search Tree)或简称BST,是数据结构中的一种高效查找结构,二叉排序树是一种具有以下性质的二叉树:若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有节点的值均大于其根节点的值。任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。这意味着,二叉排序树通过递归地将数据集合分成更小的部分来提高查找效率,从而确保了树的有序性

查找效率:

二叉排序树(BSTBinary Sort Tree)查找效率取决于其树的高度。最好情况下是O(log n),最坏情况下是O(n)。具体分析如下:

  1. 最好情况:当二叉排序树高度平衡时,查找操作的时间复杂度为O(log n)。在这种情况下,二叉排序树的查找过程类似于折半查找,每次比较都能将搜索范围缩小一半。假设树的高度为h,并且每个层级都是完全填满的,则树的高度h = log₂(n+1),其中n是节点的数量。
  2. 最坏情况:如果二叉排序树完全不平衡,形成倾斜的单支树,那么查找操作的时间复杂度会退化为O(n)。这种情况下,二叉排序树的性能与顺序查找相同,因为需要依次访问每个节点才能找到目标节点。这种极端情况通常出现在插入的数据已经有序的情况下。
  3. 一般情况:在一般情况下,二叉排序树的查找效率介于O(log n)和O(n)之间。具体时间复杂度取决于树的形态。为了维持较高的查找性能,通常需要通过自平衡二叉搜索树(如AVL树或红黑树)来确保树保持一定的平衡度。

综上所述,二叉排序树的效率不仅依赖于数据结构本身,还受到数据插入顺序的影响。为了保持高效的查找性能,实际应用中通常使用自平衡二叉搜索树来避免最坏情况的发生。

时间复杂度:

查找操作:最好情况(平衡树)下为O(log n),最坏情况(倾斜树)下为O(n)。在平衡状态下,二叉排序树的查找效率最高,因为树的高度最小,每次比较都能将搜索范围缩小一半。而在最坏情况下,如果树完全不平衡,会形成倾斜的单支树,查找效率会退化为顺序查找的水平。​​​​​​

插入和删除操作:同样依据树的高度,时间复杂度在最好情况下为O(log n),最坏情况下为O(n)。插入操作首先需要查找插入点,然后修改节点指针。删除操作更复杂,不仅需要查找节点,还要进行节点的移除和子树的调整。

空间复杂度:

​​​​​​​存储要求:二叉排序树需要树形结构,每个节点包含数据、指向左子树和右子树的指针,因此空间复杂度为O(n),n为节点数量。树的存储需要占用较多的空间,因为它不仅要存储节点的值,还要存储节点之间的逻辑关系。

优缺点:

    • 快速查找:在平衡状态下,二叉排序树的查找操作时间复杂度为O(log n),比线性查找更快。
    • 高效插入和删除:二叉排序树不仅查询快,而且增删速度也相对较快。
    • 自动排序:二叉排序树在插入数据时能自动进行排序,使得树的中序遍历结果是升序的。
    • 便利的极值查找:可以方便地查找最小值和最大值,最小值即为最左边的节点,最大值即为最右边的节点。
  1. 缺点
    • 最坏情况效率低:如果插入的数据已经有序,二叉排序树会形成倾斜的单支树,查找效率会退化为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)

注:内容有可能不完全或者遗漏

  • 52
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值