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

3.5.2、查找和排序算法-查找算法

考的少,近五年只考过1-2分的折半查找

顺序查找

将待查找的关键字为key的元素从头到尾与表中元素进行比较,如果中间存在关键字为key的元素,则返回成功;否则,则查找失败。时间复杂度为O(n)。

10203040506070

顺序查找就是从左到右(从10到70一个一个的进行比较查找),最好的情况就是第一个,最坏的情况就是最后一个才找到。时间复杂度考虑的是最坏的情况。

折半(二分)查找

只能对有序的数组进行查找
设查找表的元素存储在一维数组[1…n]中,在表中元素已经按照关键字递增方式排序的情况下,进行折半查找的方法是:
1、首先将待查元素的关键字(key)值与表r中间位置上(下标为mid)记录的关键字进行比较,若相等,则查找成功;
2、若key>r[mid].key,则说明待查记录只可能在后半个子表r[mid+1…n]中,下一步应在后半个子表中查找;
3、若key<r[mid].key,说明待查记录只可能在前半个子表r[1.mid-1]中,下一步应在r的前半个子表中查找:
4、重复上述步骤,逐步缩小范围,直到查找成功或子表为空失败时为止。
在这里插入图片描述
如图查找30
1)先找到mid=3的值是40。L=0,R=7,M=7/2=3
2)30<40,舍弃40右侧的数据,找到中间值mid=1的值是20。L=0,R=M-1=3-1=2,M=2/2=1
3)30>20,舍弃20左侧的数据。L=M+1=1+1=2,R=2,M=(2+2)/2=2

要注意两点:

  1. 中间值位置求出若为小数,应该向下取整,即4.5=4,非四舍五入;
  2. 中间值已经比较过不相等,在划分下一次比较区间时,无需将中间值位置再纳入下一次比较区间。当查找的数据越多时,二分查找的效率越高。

折半查找的时间复杂度为O(log2n)

哈希查找

需要先进行哈希存储
前面的查找方法,由于记录在存储结构中的相对位置是随机的,所以查找时都要通过一系列与关键字的比较才能确定被查记录在表中的位置。也就是说,这类查找都是以关键字的比较为基础的,而哈希表则通过一个以记录的关键字为自变量的函数(称为哈希函数)得到该记录的存储地址,所以在哈希表中进行查找操作时,
需要用同一哈希函数计算得到待查记录的存储地址,然后到相应的存储单元去获得有关信息再判定查找是否成功。
即我们要进行的哈希查找,要查找的元素首先使用哈希函数运算出结果放到哈希表里面;然后要查找的元素也使用哈希函数进行运算,运算的函数在哈希表里查找

散列(哈希)表:根据设定的哈希函数H(key)和处理冲突的方法,将一组关键字映射到一个有限的连续的地址集上,并以关键字在地址集中的“像”作为记录在表中的存储位置。

在这里插入图片描述
在上图中,很明显,哈希函数产生了冲突,使用的是线性探测法解决冲突,还有其他方法如下:

  • 线性探测法:按物理地址顺序取下一个空闲的存储空间。
  • 伪随机数法:将冲突的数据随机存入任意空闲的地址中。查找效率会很低
  • 再散列法:原有的散列函数冲突后,继续用此数据计算另外一个哈希函数,用以解决冲突。

在上图查找13,只要将13取模运算=2。在哈希表地址2的位置就是要查找的元素
查找12,12取模运算=1, 地址1的值是34,然后往后不断的查找
在CPU里加减乘除是最基本的运算,时间可以忽略≈0,所以这种查找还是很快的

练习题

例:在13个元素构成的有序表M[1.13]中进行折半查找(向下取整),若找到的元素为M[4],则被比较的元素依次为
A.M[7]、M[3]、M[5]、M[4]
B.M[7]、M5]、M[4]
C.M[7]、M[61、M[4]
D.M[7]、M[4]

答案A
在这里插入图片描述

例:以下关于哈希Hash,散列查找叙述中,正确的是()
A.哈希函数应尽可能复杂些,以消除冲突
B.构造哈希函数时应尽量使关键字的所有组成部分都能起作用
C.进行哈希查找时,不再需要与查找表中的元素进行比较
D.在哈希表中只能添加元素不能删除元素

答案B
例如java里的对象Book(id=1001,name=english,price=29),将Book放入哈希表需要将Book的所有属性id,name,price运算得到一个值,再将该值进行哈希运算
C,例如哈希查找图例中的查找12

【2022年】以下关于散列表(哈希表),及其查找特点的叙述中,正确的是()
A.在散列表中进行查找时,只需要与待查找关键字及其同义词进行比较
B.只要散列表的装填因子不大于1/2,就能避免冲突
C.用线性探测法解决冲突容易产生聚集问题
D.用链地址法解决冲突可确保平均查找长度为1

答案C
A:线性探测法,发生冲突后要一直往后查找
B:冲突不能避免,只能减少。可以将哈希长度加大,减少冲突
D:查找长度为1就是1次就能找到。一旦发生冲突就不能只查找一次

【2023年】对某有序表进行折半查找(二分查找)时,进行比较的关键字序列不可能是()。
A.42,61,90,85,77
B.42,90,85,61,77
C.90,85,61,77,42
D.90,85,77,61,42

答案C
画二叉树,每次折半,右边的数都比前面大;左边的数据币前面小。满足该规则不发生冲突即可。如下图61,90,85,77的值都是比42大的。90,85,77的值都是比61大的
在这里插入图片描述
B:90,85,61,77都比42大;85,61,77比90小;61,77比85小;满足规则
在这里插入图片描述
C:42比61小,不满足规则
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【区块链】浅谈面向小白的关于BlockChain那些事
  • 监控网络丢包脚本
  • C#中的泛型约束:如何利用泛型约束来提高代码的类型安全性和灵活性?
  • Git(分布式版本控制系统)、Gitlab、分支、分支冲突
  • 苦学Opencv的第十四天:人脸检测和人脸识别
  • Lambda和Stream让代码简洁的七大原则
  • Java常见的面试二
  • react中zuStand状态管理工具使用
  • 设计模式之工厂模式
  • ElasticSearch(七)— 相关性检索和组合查询
  • git 推送时出现错误 Locking support detected on remote “origin“
  • 右键没有压缩选项
  • 音视频入门基础:H.264专题(17)——FFmpeg源码获取H.264裸流文件信息(视频压缩编码格式、色彩格式、视频分辨率、帧率)的总流程
  • docker部署本地词向量模型
  • Django学习(二)
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • gops —— Go 程序诊断分析工具
  • LintCode 31. partitionArray 数组划分
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • php面试题 汇集2
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Theano - 导数
  • 翻译--Thinking in React
  • 分布式事物理论与实践
  • 服务器之间,相同帐号,实现免密钥登录
  • 简单数学运算程序(不定期更新)
  • 浏览器缓存机制分析
  • 详解移动APP与web APP的区别
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 06-01 点餐小程序前台界面搭建
  • hi-nginx-1.3.4编译安装
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 从如何停掉 Promise 链说起
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • 组复制官方翻译九、Group Replication Technical Details
  • # include “ “ 和 # include < >两者的区别
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #nginx配置案例
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (二十四)Flask之flask-session组件
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十二)Flink Table API
  • (学习日记)2024.01.19
  • (一)UDP基本编程步骤
  • (正则)提取页面里的img标签
  • **CI中自动类加载的用法总结
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET CORE Aws S3 使用
  • .NET 使用配置文件
  • .NET 中的轻量级线程安全
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法