数据结构——7.1&7.2 查找的基本概念、顺序查找和折半查找

7.1&7.2 查找的基本概念、顺序查找和折半查找

1. 基本概念

1.  关键字:数据元素中标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的。

2.  查找表的常见操作

    1.  查找符合条件的数据元素:查得快即可

    2.  插入、删除某个数据元素:兼顾查找速度和操作便捷

3.  查找算法的评价指标

    1.  查找长度——在查找运算中,需要对比关键字的次数称为查找长度

    2.  平均查找长度(ASL,Average Search Length)——所有查找过程中进行关键字的比较次数的平均值

2. 顺序查找

也称:线性查找,即遍历,常用于线性表(顺序、链表)

顺序查找,是一种简单的查找方式。这种查找方法从列表的一端开始,顺序搜索直到找到所需的元素为止。

顺序查找的基本思想是:从列表的第一个元素开始,逐个检查每个元素,直到找到所需的元素或搜索到列表的末尾为止。

顺序查找的步骤如下:
  1. 从列表的第一个元素开始,与所要查找的元素进行比较。
  2. 如果相等,则查找成功,返回该元素在列表中的位置。
  3. 如果不相等,则继续向后查找下一个元素。
  4. 重复以上步骤,直到找到所需元素或搜索到列表的末尾。

顺序查找的时间复杂度是O(n),其中n是列表中元素的数量。这是因为在最坏的情况下,可能需要检查列表中的每个元素。虽然顺序查找在某些情况下可能不是最高效的查找方法,但它简单易懂,适用于小型列表或对效率要求不高的场景。

优化思路:将大概率要被查询的值放到前面来;该方法适用于经常需要查询的情况

顺序查找虽然简单易懂,但在处理大型数据集时效率较低。为了优化顺序查找的性能,可以考虑以下几种方法:

  1. 减少比较次数

    • 预处理数据:在搜索前对数据进行排序,可以减少平均情况下的比较次数。虽然排序本身需要时间,但对于多次查找的情况,排序可能是一个值得的预处理步骤。
    • 利用数据的特性:如果数据具有某种模式或分布,可以设计更高效的查找策略。
  2. 使用哨兵或标记

    • 在列表的末尾添加一个哨兵值或标记,这样当查找的元素不存在时,可以更快地停止查找。
  3. 分块查找

    • 将列表分成多个块,每个块内部可以是无序的,但块之间是有序的。首先确定目标元素可能存在的块,然后在该块内进行顺序查找。这种方法结合了顺序查找和索引查找的优点。
  4. 使用更好的数据结构

    • 如果可能的话,使用更高效的数据结构(如哈希表、二分查找树等)来存储和查找数据。这些数据结构提供了更快的查找时间复杂度。
  5. 并行化

    • 在多核处理器或多计算机环境下,可以并行地进行查找操作。将数据分割成多个部分,每个部分由一个处理单元同时搜索。
  6. 缓存优化

    • 对于顺序访问的列表,确保数据在物理内存中是连续的,以减少缓存未命中的次数。
  7. 算法层面的优化

    • 使用更高效的比较算法,比如对于大型整数或浮点数,可以使用更快速的比较方法。

需要注意的是,优化顺序查找的性能通常需要根据具体的应用场景和数据特点来选择合适的方法。在某些情况下,优化可能并不总是值得的,因为可能会增加代码的复杂性和维护成本。因此,在进行优化之前,需要仔细评估需求和性能要求,并确定最合适的优化策略。

3. 折半查找

折半查找,又称“二分查找”,仅适用于有序的顺序表,这是因为顺序表具有随机存储的特性,而链表没有

折半查找,是一种在有序数组中查找某一特定元素的搜索算法。其基本原理是从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或小于中间元素,则在数组大于或小于中间元素的那一半中继续查找,每次查找都从中间元素开始比较。这样,每一次比较都能使搜索范围缩小一半,因此它是一种效率较高的查找方法。

使用折半查找的前提是对有序数组进行查找,其主要应用场景是查找数组中某个切实存在的数字,也可以稍微变化一些应用场景,如查找有序的字符数组中的某个字符,或者是查找某个数值所在的区间。

折半查找的过程包括建立要查找的有序数组,定义起点、中间点、终点变量和要查找的常量,然后进入查找循环,编写查找逻辑。如果在某一步骤数组为空,则代表找不到目标元素。

折半查找的效率

折半查找(二分查找)的效率非常高,其时间复杂度为O(log n),其中n是数组中的元素数量。这是因为每次查找都能将搜索范围缩小一半,所以查找次数与数组大小的对数成正比。这种高效的查找效率使得折半查找在处理大型有序数组时特别有用。

然而,值得注意的是,折半查找的前提是数组必须是有序的。如果数组无序,那么折半查找将无法进行,此时需要使用其他查找算法,如顺序查找。此外,虽然折半查找的查找效率很高,但其插入和删除操作的效率却相对较低,因为需要保持数组的有序性。

在实际应用中,如果数据量大且经常需要进行查找操作,且可以预先对数据进行排序,那么使用折半查找将是非常合适的选择。然而,如果数据量较小,或者数据的插入和删除操作频繁,那么可能需要考虑使用其他数据结构或算法来平衡查找和更新操作的效率。

4. 分块查找

分块查找,也称为块查找或索引顺序查找,是一种查找算法。它是折半查找和顺序查找的一种改进方法,特别适合于节点动态变化的情况。

分块查找的基本思想是将数据划分为多个块,并对每个块进行排序。每个块内的数据元素有序排列,而块与块之间是有序的,即第i+1块的所有记录关键字均大于(或小于)第i块记录关键字。在查找时,首先确定待查记录所在块,再在块内进行顺序查找。

分块查找的优点在于,由于只要求索引表是有序的,对块内节点没有排序要求,因此可以跳过一些不必要的块,从而提高查找效率。然而,由于需要预处理数据集,因此在数据集经常变化的情况下,它的效率可能会降低。因此,分块查找更适用于数据较多但数据不会发生变化的情况。

总之,分块查找结合了顺序查找和二分查找的优点,使得在大规模数据集中进行查找更加高效。

- 理解

  1. 折半查找过程对应的判定树一定是一棵平衡二叉树

  2. 折半查找和二叉排序树的性能比较

    1. 折半查找是二叉排序树最好的情况,复杂度O(log₂n)

    2. 二叉排序树如果形成单树,则与顺序查找相似,复杂度O(n)

  3. 对于一个长度为n的有序顺序表,如果采用折半查找一个不存在的元素,比较次数最多即为树高【log₂(n+1)】,最少即为树高减去1

  4. 计算折半查找平均失败查找时间,每个失败点的比较次数即为该点父节点的高度,即为该结点高度减一

  5. 判断空白二叉树是否是折半二叉树的办法

    1. 按照排序二叉树规则,从小到大为各空白结点标上数字

    2. 根据折半规则,判断每个树是向上折半取整还是向下折半取整、

    3. 判断各根节点是否符合折半规则、取整规则

      1. 向上取整都是优先排在左边,左子树比右子树最多多一个结点

      2. 向下取整都是优先排在右边,右子树比左子树最多多一个结点

- 技巧

  1. 顺序查找,无论是有序表还是无序表,平均查找时间相同

  2. 折半查找的判定树是一棵二叉排序树,因此,给出一定的比较值序列,如果不满足二叉排序树的规则(左<根<右)则不是折半的比较序列

相关推荐

  1. 查找——顺序查找折半查找

    2024-04-21 10:24:04       7 阅读
  2. 数据结构--查找基本概念

    2024-04-21 10:24:04       14 阅读
  3. 折半查找(数据结构实训)

    2024-04-21 10:24:04       41 阅读
  4. 顺序查找(数据结构实训)

    2024-04-21 10:24:04       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-21 10:24:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-21 10:24:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-21 10:24:04       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-21 10:24:04       20 阅读

热门阅读

  1. React-RTK

    React-RTK

    2024-04-21 10:24:04      16 阅读
  2. 基于微信小程序的房屋租赁管理系统

    2024-04-21 10:24:04       16 阅读
  3. 迁移学习入门

    2024-04-21 10:24:04       15 阅读
  4. TensorFlow 的基本概念和使用场景

    2024-04-21 10:24:04       16 阅读
  5. 【微服务】Gateway的基本配置详解

    2024-04-21 10:24:04       17 阅读
  6. pytorch中torch.roll用法说明

    2024-04-21 10:24:04       17 阅读
  7. web server apache tomcat11-03-deploy 如何部署

    2024-04-21 10:24:04       17 阅读