“查找”学习提纲(一)——线性查找
前言
“查找”学习提纲(一)——线性查找
代码模板
查找的基本概念
相关概念
- 查找:在数据集合中寻找满足某种条件的数据元素的过程
- 查找表:同一类型的数据元素的集合
- 记录:数据元素
- 关键字:唯一标识数据元素的数据项/字段的值
查找(表)的类型
- 静态查找(表)
- 动态查找(表)
查找的相关操作
- 判断是否存在——静态
- 检索各种属性——静态
- 插入——动态
- 删除——动态
查找的结果
- 成功
- 失败
查找方式的选择因素
- 查找表的数据结构:如顺序存储或链式存储
- 查找表中关键字的次序:如无序或有序
查找的性能分析
时间复杂度->平均查找长度(ASL)/平均比较次数:
- 查找长度/比较次数:比较关键字的次数
- 平均查找长度(ASL):查找每记录的概率(一般为1/n)×查找长度。n为数据规模
空间复杂度
顺序/线性查找
适用
- 线性表
注意:有序线性表的顺序查找和有序顺序表的折半查找,思想不同
性能
平均查找长度(ASL):
- 查找成功:(n+1)/2。n为数据规模
- 查找失败:n或n+1(使用哨兵机制)
时间复杂度:O(n)
空间复杂度:O(1)。未使用额外辅助空间
有序表查找失败的平均查找长度(ASL):n/2+n/(n+1)。其他相同
代码模板
1 | //顺序/线性查找 无序 |
1 | //顺序/线性查找 无序 使用“哨兵”机制 |
折半/二分查找
适用
- 有序顺序表
性能
平均查找长度(ASL):[log以2为底的(n+1)]-1。n为数据规模
时间复杂度:O(logn)
空间复杂度:O(1)。未使用额外辅助空间
代码模板
1 | //折半/二分查找 |
插值查找
适用
- 有序顺序表
性能
时间复杂度:O(logn)。n为数据规模
空间复杂度:O(1)。未使用额外辅助空间
若数据规模大,关键字分布均匀,则性能优于折半查找
代码模板
1 | //插值查找 |
斐波那契查找
适用
- 有序顺序表
性能
时间复杂度:O(logn)。n为数据规模
空间复杂度:
- O(1)。未使用额外辅助空间(不包括斐波那契数列的大小)
- O(m)。m为斐波那契数列的大小(包括斐波那契数列的大小)
通常性能优于折半查找
代码模板
1 | //斐波那契查找 |
折半、插值和斐波那契查找总结
- 过程相似
- 分隔值的选择策略不同
索引查找的类型
- 线性索引
- 树形索引
- 多级索引
线性索引的类型
- 稠密索引:一个索引对应一条记录;记录可无序,索引有序;索引是主关键字
- 分块索引:一个索引对应多条记录/一个块;块内可无序,块间有序;索引是主关键字
- 倒排索引:一个索引对应多条记录;记录可无序,索引有序;索引是次关键字
分块/索引顺序查找
适用
- 线性表
结构描述
查找表:
- 块内可无序
- 块间有序:前一个块中的最大关键字小于后一个块中的所有关键字,以此类推
索引表:索引块,有序
- 键值分量:各块的最大关键字
- 链值分量:各块的第一条记录的地址/指针
- …。如块中记录的个数等
算法描述
- 对块间/索引表:顺序查找或折半查找等
- 对块内/查找表:一般为顺序查找,若有序可为折半查找等
性能
平均查找长度(ASL):ASL1 + ASL2。其中ASL1为对块间查找的平均查找长度(ASL),ASL2为对块内顺序查找的平均查找长度(ASL)
时间复杂度:O(logn)~O(n)。n为数据规模
- O(logn)。n为数据规模(对块间折半查找等+对块内顺序查找)
- O(n)。n为数据规模(对块间顺序查找+对块内顺序查找)
空间复杂度:
- O(1)。未使用额外辅助空间(不包括索引表的大小)
- O(m)。m为索引表的大小(包括索引表的大小)
查找表的大小为n,块数为b,每块中的记录数为s,等概率情况:
- 对块间顺序查找,对块内顺序查找:ASL = ASL1 + ASL2 = (b + 1)/2 + (s + 1)/2 = (s² + 2 × s + n)/(2 × s)
- 对块间顺序查找,对块内顺序查找,b = s = 根号n:ASL = 根号n + 1
- 对块间折半查找,对块内顺序查找:ASL = ASL1 + ASL2 = [log以2为底的b]下取整+1或[log以2为底的(b + 1)]上取整 + (s + 1)/2
- b = s = 根号n,ASL为最小/优值
代码模板
1 | //结构体 |
总结
名称 | 适用 | 时间复杂度 | 空间复杂度 |
---|---|---|---|
顺序查找 | 线性表 | O(n) | O(1) |
折半查找 | 有序顺序表 | O(logn) | O(1) |
插值查找 | 有序顺序表 | O(logn) | O(1) |
斐波那契查找 | 有序顺序表 | O(logn) | O(m) |
稠密索引查找 | - | - | - |
分块查找 | 线性表 | O(logn)~O(n) | O(m) |
倒排索引查找 | - | - | - |
参考资料
- 《2023版数据结构高分笔记》主编:率辉
- 《2023年计算机组成原理考研复习指导》组编:王道论坛
- 《大话数据结构》作者:程杰
- 插值查找算法原理分析——及python与C++实现 - 知乎 (zhihu.com)
- 斐波那契查找原理——附python和C++实现 - 知乎 (zhihu.com)
- 斐波那契查找原理详解与实现 - 腾讯云开发者社区-腾讯云 (tencent.com)
作者的话
- 感谢参考资料的作者/博主
- 作者:夜悊
- 版权所有,转载请注明出处,谢谢~
- 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
- 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
- 文章在认识上有错误的地方, 敬请批评指正
- 望读者们都能有所收获
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 夜悊的技术小宅!