第 7 章学习小结
查找:1、逻辑结构:线性结构;非线性结构
2、存储结构:顺序结构;链式结构
一、
平均查找长度是衡量查找算法效率的最主要指标。
二、线性表的查找
(1)顺序查找
/*设置监视哨的顺序查找的算法描述*/
typedef struct{
Elemtype *elem;
int TableLen;
}SSTable;
int Search_Seq(SSTable ST,Elemtype key){
ST.elem[0]=key; //哨兵
for(int i=ST.TableLen;ST.elem[i]!=key;--i);//从后往前找
return i; // 若表中不存在该元素,i=0
}
查找成功ASL=(n+1)/2
查找失败ASL=(n+1)*1
辅助空间为O(1),仅有一个(即“哨兵”),与n 无关
优点:算法简单,对表结构无任何要求,有序、无序、顺序结构、链式结构均适用
缺点:平均查找长度较大,查找效率较低
(2)二分查找(仅适用于有序的顺序表)
int Search_Bin(SSTable ST, KeyType key, int low, int high)
{
low = 1; high = ST.length;
while(low <= high)
{
mid = (low+high)/2;
if(key == ST.R[mid].key) return mid;
else if(key < ST.R[mid].key) high=mid-1;
else low=mid+1;
}
return 0;
}
等概率查找时ASL=log2(n+1)−1
时间复杂度为O(log2n)
(3)分块查找
三、树表的查找
(1)二叉排序树
二叉排序树查找算法的性能取决于二叉树的结构
其ASL最好情况log3n成正比,最差情况为树高h(此时为单支树)
二叉排序树上的查找与二分查找相差不大,但对于需要经常进行插入、删除和查找运算的表,采用二叉排序树比较好。
(2)平衡二叉树
平衡因子:左子树和右子树的深度之差(左减右),
平衡二叉树上所有结点的平衡因子只可能是-1、0和1
四、散列表的查找
(1)构造方法
1、数字分析法
2、平方取中法
3、折叠法
4、除留余数法
(2)处理冲突的方法
1. 开放地址法
(1)线性探测法
(2)二次探测法
(3)伪随机探测法
2. 链地址法