数据结构第七章小结
查找
1.平均查找长度ASL=ΣPiCi,查找成功时,Pi为第i个记录的概率,Ci为已比较过关键字的次数
查找方法
1.顺序查找:从表的一端开始依次比较
可用于线性表和链表
通过设置哨兵可以降低时间复杂度,使查找更简洁。
2.二分查找:首先查找表要有序
初始使low为1,high为表长,mid=low+high /2
在mid不大于high的情况下:
若mid<key,low=mid+1,high=high,mid=high+low /2继续
若mid>key,low=low,high=mid-1......
直到high>low时结束,此时为没有找到
注意判断条件必须是在low<=high时成立,若去掉=则会在一些情况下出错
二分查找也可以改写成递归的形式,需要了解
二分查找一般只适用于线性表,如果用于链表并不会很快
3.分块查找
每块的最大关键字处需要有序,块内可以无序
树表的查找:
1.二叉排序树
与顺序表的二分查找类似
优点在于可以自由地插入和删除结点,可以用于数据动态存储的情况下
最优时查找时间复杂度可达O(log2n)但受树的形态影响,往往达不到
2.平衡二叉树
是二叉排序树的优化
平衡因子只为0,-1,1(一个结点左右子树深度之差)
可由普通二叉排序树进行变换得到
3.B树
深度远小于二叉排序树,在I/O时可以节省大量时间
4.B+树可以进行顺序查找也可以像B树一样查找
散列表的查找
散列函数的构造方法
数字分析法、平方取中法、折叠法、留取余数法(一般情况下用第四种,类似H(key)=key%p的形式)
冲突:两个不同的key对应的散列地址相同的情况
解决冲突的方法
1.开放地址法,即冲突时寻找下一个空的散列地址存放数据,寻找可用线性勘测法,二次探测法,伪随机探测法
2.链地址法,将相同散列地址的数据存在一个单链表中
查找时需要知道散列函数和解决冲突的方式
装填因子α=表中填入的记录数/散列表的长度
α的值会影响平均查找长度ASL