码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【考研】数据结构考点——顺序查找


     前言

    本文内容源于对《数据结构(C语言版)》(第2版)、王道讲解、博主一只小山猪的专栏内容的学习所得心得、笔记整理和总结。

    可结合以下链接搭配学习:

    一文学懂经典算法系列之:顺序查找(附讲解视频)_一头小山猪的博客-CSDN博客_算法学习顺序

    (上面的链接的所用算法是 java,本文是用 C++ 以顺序表作为存储结构实现的顺序查找算法) 

    【考研复习:数据结构】查找(不含代码篇)_住在阳光的心里的博客-CSDN博客

    本文已参加活动,其地址:CSDN21天学习挑战赛


    一、基本概念

    1、顺序查找:适用于线性表的顺序存储结构和链式存储结构。通常分为对一般的无序线性表的顺序查找和对按关键字有序的线性表的顺序查找。(注意:对线性的链表只能进行顺序查找)

    2、顺序查找的过程:从表的一端开始,依次将记录的关键字和给定值进行比较,若某个记录的关键字和给定值相等,则查找成功;反之,若扫描整个表后,仍未找到关键字和给定值相等的记录,则查找失败。

    3、优点:算法简单,对表结构无任何要求,既适用于顺序结构,也适用于链式结构,无论记录是否按关键字有序均可应用。

    4、缺点:平均查找长度较大,查找效率较低,所以当 n 很大时, 不宜采用顺序查找。

    5、有序表和无序表的顺序查找:

    查找成功的平均查找长度,为 ASL_{s}

     查找不成功的平均查找长度,为ASL_f

    每个元素的查找概率相同ASL_{s}ASL_f
    无序表\frac{n+1}{2}n+1
    有序表\frac{n}{2}+\frac{n}{n+1}

     
    二、数据元素类型定义

    1. typedef struct{
    2. KeyType key; //关键字域
    3. InfoType otherinfo; //其他域
    4. }ElemType;
    5. typedef struct{
    6. ElemType *R; //存储空间基地址,建表时按实际长度分配,0号单元留空
    7. int length; //当前长度
    8. }SSTable;

    三、算法描述

    1. //在顺序表ST中顺序查找其关键字等于key的数据元素。
    2. //若找到,则函数值为该元素在表中的位置,否则为0
    3. int Search_Seq (SSTable ST, KeyType key)
    4. {
    5. for(int i = ST.length; i >= 1; --i)
    6. if(ST.R[i].key == key)
    7. return i; //从后往前找
    8. return 0;
    9. }

    在查找过程中每步都要检测整个表是否查找完毕,即每步都要有循环变量是否满足条件 i >= 1的检测。改进这个程序,可以免去这个检测过程。改进方法是查找之前先对 ST.R[0] 的关键字赋值 key,在此, ST.R[0] 起到了监视哨的作用,如下面的算法所示。

    1. // 改进版(通过设置监视哨,免去查找过程中每一步都要检测整个表是否查找完毕。)
    2. //在顺序表ST中顺序查找其关键字等于key的数据元素。
    3. //若找到,则函数值为该元素在表中的位置,否则为0
    4. int Search_Seq (SSTable ST, KeyType key)
    5. {
    6. ST.R[0].key = key; //“哨兵”
    7. for(int i = ST.length; ST.R[i].key != key; --i); //从后往前找
    8. return i;
    9. }

    两个算法的时间复杂度相同,都为 O(n) 。

     

    四、练习

    1、对 n 个元素的表做顺序查找时,若查找每个元素的概率相同,则总查找次数 N = 1 + 2 + . . . + n = \frac{n(n+1)}{2},可得平均查找长度为  \frac{n+1}{2} 。

    2、对长度为3的顺序表进行查找,若查找的第一个元素的概率为1/2,第二个元素的概率为1/3,第三个元素的概率为1/6,则查找任一元素的平均查找长度为_____5/3_____。

    解:ASL = \frac{1}{2} * 1 + \frac{1}{3} * 2 +\frac{1}{6}* 3 =\frac{5}{3}

    ​

  • 相关阅读:
    javaweb-SMBMS
    Blazor前后端框架Known-V1.2.3
    【AGC】App Linking服务隐私合规问题
    FPGA:什么是半加器?什么是全加器?多比特数据相加怎么求?如何用面积换速度?
    Vue单文件组件的创建及三种暴露(分别、统一、默认)方式
    Windows10专业版系统安装Hyper-V虚拟机软件
    【进阶版】机器学习之特征工程介绍及优化方法引入(03)
    AI+低代码:开启普惠人工智能时代的新篇章
    【每日一题】 和为 K 的子数组
    计算机竞赛 深度学习实现行人重识别 - python opencv yolo Reid
  • 原文地址:https://blog.csdn.net/qq_34438969/article/details/126149332
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号