当前位置: 首页 > news >正文

算法【线性表的查找-顺序查找】

线性表的查找-顺序查找

    • 顺序查找
      • 基本思想
      • 应用范围
      • 顺序表的表示
        • 数据元素类型定义
        • 查找算法示例分析
      • 时间效率分析
      • 顺序查找的特点
      • 如何提高查找效率

顺序查找

基本思想

在表的多种结构定义方式中,线性表是最简单的一种。而顺序查找是线性表查找中最简单的一种。
顺序查找的基本思想:
从表的一端开始,顺序扫描线性表,将依次扫描到的结点关键字和给定的K值相比较,若当前扫描到的结点关键字与K相等,则查找成功,若扫描结束后,仍未找到关键字等于 K的结点,则查找失败。

应用范围

顺序表或者线性链式表表示的静态查找表;
表内元素之间无序;

顺序表的表示

数据元素类型定义
typedef struct{keyType key; //关键字域...         //其他域
}ElemType;typedef struct{//顺序表结构类型定义ElemType *R; //表地址int length;   //表长
}SSTable;   //Sequential Search Table
SStable ST;  //定义顺序表ST
查找算法示例分析

在顺序表ST中查找值为key的数据元素
从最后一个元素开始查找:
在这里插入图片描述
其他形式:
在这里插入图片描述
在这里插入图片描述
改进:
把待查找的关键字key存入表头(“哨兵”,“监视哨”)从后往前逐个比较,可以免去查找过程中每一步都要检测是否查找完毕,加快查找速度。
在这里插入图片描述

时间效率分析

在这里插入图片描述
顺序查找需要从头开始不断地按顺序检查数据,因此在数据量大且目标数据靠后或者目标数据不存在的情况下,比较的次数就会更多,并且也更为耗时。若数据量为 n,线性查找的时间复杂度便为 O(n)。
所以虽然顺序查找比较简单,且对表的结构没有任何要求,但是其查询效率较低,所以当n较大时不宜采用顺序查找。

时间复杂度: O(n)
查找成功时的平均查找长度,设表中各记录查找概率相等

ASL(n)=(1+2+ … +n)/=n(n+1)/2

空间复杂度: 一个辅助空间一O(1);

顺序查找的特点

优点:算法简单,逻辑次数无要求,且不用的存储结构都适用
缺点:ASL太长,时间效率太低

需要注意的是,顺序查找是一种简单且广泛使用的查找方法,但它并不适合所有情况。例如,当线性表中的元素分布不均匀,或者元素按关键字有序排列时,顺序查找的性能可能会受到影响。

如何提高查找效率

1、记录的查找概率不相等时如何提高查找效率?
查找表存储记录原则:按查找概率高低存储:
1)查找概率越高,比较次数越少
2)查找概率越低,比较次数较多

2、记录的查找概率无法测定时如何提高查找效率?
方法:按查找概率动态调整记录顺序:
1)在每记录中设一不访问频度域
2)始终保持记录按非递增有序的次序排列
3)每次查找后均将刚查到的记录直接移至表头

参考资料:数据结构与算法基础-王卓老师

相关文章:

  • 4核8g服务器能支持多少人访问?
  • 二次供水物联网:HiWoo Cloud助力城市水务管理升级
  • 七、ChatGPT为什么会被热炒?
  • Elasticsearch从入门到精通-01认识Elasticsearch
  • 东芝工控机维修东芝电脑PC机维修FA3100A
  • R语言在数据分析中的应用案例
  • Python数据处理(三)-txt文件指定数据提取并可视化作图
  • Java架构师之路八、安全技术:Web安全、网络安全、系统安全、数据安全等
  • 为什么ChatGPT预训练能非常好地捕捉语言的普遍特征和模式
  • vue中component is和keepAlive组合使用
  • HC32F460 是否有 RTC?在电池供电方案中该如何使用?
  • SpringMVC了解
  • 13.云原生之常用研发中间件部署
  • Groovy(第九节) Groovy 之单元测试
  • 第102讲:MySQL多实例与Mycat分布式读写分离的架构实践
  • CSS实用技巧
  • es6要点
  • express如何解决request entity too large问题
  • Linux gpio口使用方法
  • php中curl和soap方式请求服务超时问题
  • Python 反序列化安全问题(二)
  • Python_OOP
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Spark RDD学习: aggregate函数
  • Spring Boot MyBatis配置多种数据库
  • Tornado学习笔记(1)
  • - 概述 - 《设计模式(极简c++版)》
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 机器学习中为什么要做归一化normalization
  • 老板让我十分钟上手nx-admin
  • 免费小说阅读小程序
  • 那些被忽略的 JavaScript 数组方法细节
  • 设计模式走一遍---观察者模式
  • 使用 QuickBI 搭建酷炫可视化分析
  • 正则学习笔记
  • 阿里云重庆大学大数据训练营落地分享
  • 正则表达式-基础知识Review
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #NOIP 2014#Day.2 T3 解方程
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • ${factoryList }后面有空格不影响
  • (145)光线追踪距离场柔和阴影
  • (C语言)字符分类函数
  • (libusb) usb口自动刷新
  • (Python第六天)文件处理
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (剑指Offer)面试题34:丑数
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (三)终结任务
  • (转)jdk与jre的区别
  • (轉貼) UML中文FAQ (OO) (UML)
  • .bat文件调用java类的main方法