数据结构 (28)基于线性表的查找法

前言

数据结构中的线性表是一种基础且重要的数据结构,它由一系列具有相同数据类型的元素组成,这些元素在内存中连续存放。

一、顺序查找(Sequential Search)

顺序查找,也称线性查找,是一种简单直观的查找算法。其查找过程为:从表的一端开始,依次将记录的关键字和给定值进行比较,若某个记录的关键字和给定值相等,则查找成功;反之,若扫描整个表后仍未找到关键字和给定值相等的记录,则查找失败。

顺序查找不仅适用于线性表的顺序存储结构,也适用于线性表的链式存储结构。

  1. 算法实现

    • 顺序表:从表的最后一个元素起,依次比较元素值和给定值,若找到值与给定值相等的元素,则查找成功,返回该元素的序号。若查遍整个顺序表都没有找到,则查找失败,返回0。
    • 链表:通过指针next来依次扫描每个元素,逐个检查每个节点的数据域,直到找到目标值或遍历完所有节点。
  2. 算法分析

    • 时间复杂度:O(n),其中n为线性表的长度。因为顺序查找需要扫描整个表,所以时间复杂度与表的长度成正比。
    • 空间复杂度:O(1),只需要一个辅助空间来存储当前查找的位置。
  3. 优缺点

    • 优点:算法简单,对表结构无任何要求,既适用于顺序结构,也适用于链式结构,无论记录是否按关键字有序均可应用。
    • 缺点:平均查找长度较大,查找效率较低,所以当n很大时,不宜采用顺序查找。

二、折半查找(Binary Search)

折半查找,也称二分查找,是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素要按关键字有序排列。

  1. 查找过程

    • 从表的中间记录开始,将给定值和中间记录的关键字进行比较。
    • 如果给定值和中间记录的关键字相等,则查找成功。
    • 如果给定值大于或者小于中间记录的关键字,则在表中大于或小于中间记录的那一半中查找。
    • 重复以上操作,直到查找成功,或者在某一步中查找区间为空(即low>high),则代表查找失败。
  2. 算法实现

    • 初始化查找区间的初值,low为1,high为表长。
    • 当low小于等于high时,循环执行以下操作:
      • 计算mid为low和high的中间值。
      • 将给定值key与中间位置记录的关键字进行比较。
        • 若相等则查找成功,返回中间位置mid。
        • 若不相等则利用中间位置记录将表对分成前、后两个子表。(如果key比中间位置记录的关键字小,则high取为mid-1,否则low取为mid+1)
    • 循环结束,说明查找区间为空,则查找失败,返回0。
  3. 算法分析

    • 时间复杂度:O(logn),其中n为线性表的长度。因为折半查找每一次查找比较都使查找范围缩小一半,所以时间复杂度与表的长度成对数关系。
    • 空间复杂度:O(1),只需要几个辅助变量来存储当前查找的位置和区间。
  4. 优缺点

    • 优点:查找效率高,适用于大规模数据的查找。
    • 缺点:要求线性表必须采用顺序存储结构,且表中元素要按关键字有序排列。

三、分块查找(Blocking Search)

分块查找又称索引顺序查找,它吸取了顺序查找和折半查找各自的优点,将线性表分成若干块,块内的元素可以无序,但块间是有序的。即第一个块中的最大元素小于第二个块中的所有元素,第二个块中的最大元素小于第三个块中的所有元素,依此类推。

  1. 查找过程

    • 先确定待查元素所在的块,可以顺序查找或折半查找块间元素(即索引表)。
    • 在确定的块内再顺序查找待查元素。
  2. 算法分析

    • 分块查找的时间复杂度取决于块间查找和块内查找的时间复杂度。
    • 如果块间采用顺序查找,时间复杂度为O(s+t),其中s为块间查找的比较次数,t为块内查找的比较次数。
    • 如果块间采用折半查找,时间复杂度可以降低到O(logb+(t/b)),其中b为块数,t为线性表的长度。
  3. 优缺点

    • 优点:结合了顺序查找和折半查找的优点,适用于元素较多且块内元素无序的情况。
    • 缺点:需要额外的空间来存储索引表,且块的大小和分割方式会影响查找效率。

总结

综上所述,基于线性表的查找法有顺序查找、折半查找和分块查找三种。每种查找方法都有其适用的场景和优缺点,在实际应用中应根据具体需求和数据特点选择合适的查找方法。

结语

想多了全是问题

做多了都是答案

!!!

相关推荐
郝学胜-神的一滴6 小时前
深度学习优化核心:梯度下降与网络训练全解析
数据结构·人工智能·python·深度学习·算法·机器学习
Je1lyfish7 小时前
CMU15-445 (2025 Fall/2026 Spring) Project#3 - QueryExecution
linux·c语言·开发语言·数据结构·数据库·c++·算法
会编程的土豆12 小时前
【数据结构与算法】空间复杂度从入门到面试:不仅会算,还要会解释
数据结构·c++·算法·面试·职场和发展
RH23121115 小时前
2026.4.29数据结构 直接插入排序&&希尔排序
数据结构·算法·排序算法
khalil102019 小时前
代码随想录算法训练营Day-41动态规划08 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III
数据结构·c++·算法·leetcode·动态规划
无限进步_19 小时前
【C++】AVL树完全解析:从平衡因子到四种旋转
c语言·开发语言·数据结构·c++·后端·算法·github
浅念-20 小时前
LeetCode最短路必看:BFS算法原理+经典题解
数据结构·c++·算法·leetcode·职场和发展·bfs·宽度优先
流年如夢21 小时前
顺序表的应用 --> 简单通讯录的实现
c语言·数据结构
如君愿21 小时前
考研复习 Day 31 | 习题--计算机网络 第五章(运输层 中)、数据结构 图 (中)
数据结构·计算机网络·课后习题
代码地平线21 小时前
【数据结构】二叉树详解:全代码逐行解析+6道LeetCode高频OJ题图解
数据结构·算法·leetcode