7.1查找的基本概念
基本概念
常见操作
查找算法的评价指标
总结
7.2
7.2.1顺序查找
顺序查找,⼜叫“线性查找”,通常⽤于线性表。
算法思想
算法思想:从头到 jio 挨个找(或者反过来也OK)
代码实现
哨兵版
性能分析
顺序查找的优化(对有序表)
⽤查找判定树分析ASL
顺序查找的优化(被查概率不相等)
总结
7.2.2折半查找
折半查找,⼜称“⼆分查找”,仅适⽤于有序的顺序表。
算法思想
算法实现
性能分析
折半查找判定树的构造
折半查找的判定树⼀定是平衡⼆叉树
如果当前low和high之间有奇数个元素,则 mid 分隔后,左右两部分元素个数相等;如果当前low和high之间有偶数个元素,则 mid 分隔后,左半部分比右半部分少⼀个元素
折半查找的判定树中,若 ,则对于任何⼀个结点,必有:右⼦树结点数-左⼦树结点数=0或1
总结
7.2.3分块查找
特点:块内⽆序、块间有序
⽤折半查找查索引
性能分析
总结
7.3.1 B树
引入:5叉查找树
性能优化
B树定义
B树的高度
??
总结
7.3.2B树的插入删除
插入
新元素⼀定是插⼊到最底层“终端节点”,⽤“查找”来确定插⼊位置
删除
本质:要永远保证 ⼦树0<关键字1<⼦树1<关键字2<⼦树2<…
总结
7.3.3 B+树
定义
结点的⼦树个数与关键字个数相等
B+树的查找
B+树 VS B树
下面这张图超出考研大纲要求
总结
7.4散列查找
7.4.1散列查找(上)
散列表(哈希表)
处理冲突的⽅法——拉链法
⽤拉链法(⼜称链接法、链地址法)处理“冲突”:把所有“同义词”存储在⼀个链表中
拉链法的⼩优化
散列查找
最理想情况:散列查找时间复杂度可到达O(1)
装填因⼦α=表中记录数/散列表⻓度
常⻅的散列函数
除留余数法
散列表表⻓为m,取⼀个不⼤于m但最接近或等于m的质数p
直接定址法
直接定址法 —— H(key) = key 或 H(key) = a*key + b
数字分析法
数字分析法 —— 选取数码分布较为均匀的若⼲位作为散列地址
平⽅取中法
平⽅取中法——取关键字的平⽅值的中间⼏位作为散列地址
总结
散列查找是典型的“⽤空间换时间”的算法,只要散列函数设计的合理,则散列表越
⻓,冲突的概率越低
7.4.2散列查找(下)
处理冲突的⽅法——开放定址法
线性探测法
查找
越早遇到空位置,就可以越早确定查找失败
删除
采⽤“开放定址法”时,删除结点不能简单地将被删结点的空间置为空,否则将截断在它之后填⼊散列表的同义词结点的查找路径,可以做⼀个“删除标记”,进⾏逻辑删除
性能分析
线性探测法很容易造成同义词、⾮同义词的“聚集(堆积)”现象,严重影响查找效率
康一康
前排观摩大佬