查找算法【考研/408】
当采用链式存储时,只能顺序查找
顺序查找
一般线性表的顺序查找:
若每个元素的查找概率相等时,即????????=1n
有序表的顺序查找:
查找成功同上
折半查找
数据必须有序(升序降序都行)且顺序存储
搞出来的树是平衡二叉树,∴查找失败最多为平衡二叉树的高
h=log2(????+1)
分块查找
会手算模拟即可
块内无序,块间有序
索引表中查找块:顺序查找/折半查找
块内查找:顺序查找/折半查找
????????????=????????+????????,????????:索引块查找 ????????:块内查找
若将长度n的查找表均匀分成b块,每块s个记录,等概率下,则
B树和B+树
每个节点内的关键字如果很多 也可以进行折半查找,因为节点内关键字有序
若每个结点内关键字太少,导致树变高,要查更多层结点,效率低(例如只有1个关键字,那就变成了二叉查找树)↓
如果不平衡,就会导致树很高,就要查找很多层↓
策略!规定对于任何一个结点,其所有子树的高度都要相同
核心特性
计算B树高度时,不包含失败节点(叶子结点)
n个关键字的m阶B树的最小最大高度 ↓
最小高度:
最大高度:
—— —— B树 ↑ —— —— —— —— —— —— —— —— B+树 ↓ —— —— —— —— —— —— —— ——
注:以上是一棵4阶B+树
B+树中索引结点为保留的最大关键字
B+树的前面只索引,只有在找到叶子结点之后才知道这个记录在哪,才能结束查找,所以B+树中,无论查找成功与否,最终一定都要走到最下面一层结点
B+树支持顺序查找
一棵m阶的B+树需满足下列条件:
1)每个分支结点最多有m棵子树(孩子结点)
3)结点的子树个数与关键字个数相等。
4)所有叶结点包含全部关键字及指向相应记录的指针,叶结点中将关键字按大小顺序排列,并且相邻叶结点按大小顺序相互链接起来
5)所有分支结点中仅包含它的各个子结点中关键字的最大值及指向其子结点的指针。
因为B树和B+树的结点都是放在磁盘的块中,所以每弄一个结点都需要拿一块,因为B树的结点要放记录,而B+数的结点仅索引,所以B数的结点需要的内存更大,而磁盘速度慢,所以B树需要耗费更大的时间
所以,B+树适合关系型数据库索引
散列表
散列函数 Hash(key)=Addr
散列表建立了关键字和存储地址之间的一种直接映射关系
常用的散列函数
1、直接定址法
计算简单,不会冲突,适合关键字连续分布,若关键字不连续分布就会有空位,产生浪费
2、除留余数法
若散列表长m,则取p为不大于m但最接近或等于m的质数
使每个关键字转换后等概率映射,降低冲突
3、数字分析法
就分析!
4、平方取中法
取关键字的平方值的中间几位作为散列地址
处理冲突方法
产生冲突后怎么解决
1、开放定址法
????????的确定方法有以下四种
2、拉链法(链接法,chaining,链地址法)