平均查找长度
顺序查找
typedef struct //查找表的数据结构
{
ElemType *elem; //元素存储空间0号为留空
int TableLen; // 表的长度
/* data */
}SSTable;
int Seacher_Seq(SSTable ST,ElemType key){
ST.elem[0]=key; // 哨兵
for(i=ST.TableLen;ST.elem[i]!=key;--i){ // 重后往前找
return i; //若表中不存在关键字为key的元素,将查找到i为0时退出for循环.
}
}
成功:ASL=(1+n)/2
失败:ASL=n+1
折半查找
适合于有序的表
折半查找有 一个最小的生成树:
来练习一道
失败结单很特殊,不是树的高度,而是高度减一
第二题
分块查找
当s = n^(1/2)
时有ASL最小值为n ^(1/2)-1
树形查找
二叉排序树(BST)
定义:
查找算法:
插入算法:
二叉排序树的构造:
二叉排序树的删除☆:
思考:若在二叉排序树中删除并插入某结点,得到的二叉排序树和原来的相同嘛?
答:可能相同,可能不同.
查找效率分析:
还是通过高度来算ASL 每个结点高度的总和除总的个数
平衡二叉树
要会构造平衡二叉树,要学会手删节点
平衡因子是左子树高度减右子树高度
平衡二叉树的插入:
为了保证平衡二叉树的平衡要对不平衡的因子进行调整,调整有以下四种情况
情景一:
情景二:
情景三:
情景四
注意: LR和RL旋转时,新结点究竟是插入C的左子树还是插入C的右子树不影响旋转过程,而图7.13和图7.14中以插入C的左子树中为例。
练习来了
假设关键字序列为{15,3,7,10,9,8}
平衡二叉树的删除
对w结点
进行删除
删除之后找到 不平衡的点 z
y
是z最高的子树
x
是y最高的子树
于是有以下情况:
例子:
平衡二叉树的一个性质:
假设Nh表示深度为h的平衡二叉树含有最少节点数有
来两道题:
来继续做题:
答:
答:
答:
答:
B树和B+树
m阶B树
树中每个结点至多有m颗子树,至多有m-1个关键字,比如说三阶 B树就每个结点最多有三个子树,有两个关键字.
B树的插入
(1)没满直接加入
(2)关键字满的情况:
B树的删除
B树
会做这两道题就行:
第二题:
散列表
散列表构造方法
1.直接定值法
直接排,或者通过一些运算排
2.除留余数法
3.数字分析法
就想电话号码15246721696 支取后面4位
4.平方取取中法
比如说:1310x1310=176100 取761这几位
冲突的方法
开放定址法: 线性探测法,平方探测法,
1.线性探测法,被占用了按顺序找下一个空位.☆☆
2.平方探测法.被占用了移动Di=0²,1²,-1²,2²,-2²,....,k²,-k² 直到找到空位为止.
拉链法:
要学会算它的ASL,
例如:{19,14,23,01,68,20,84,27,55,11,10,79}来看用除留余数法H(key)=key%13,和线性探测法
算ASL的办法把所有比较的次数画成表:
做题:
失败的ASL呢?
来做一个好的题目: