第七章学习小结
查找
查找表: 由同一类型的数据元素(或记录)构成的集合,可以用线性表、树表、散列表来实现
动态查找表: 在查找的同时对表做修改操作(插入、删除)
静态查找表: 仅查找
平均查找长度(ASL)----> 衡量查找算法的性能:ASL = P1C1+P2C2 +....+PiCi
一、线性表的查找
(1)顺序查找
设置监视哨的顺序查找:
int Search_Seq(SSTable ST,KeyType key)
{
ST.R[0].key=key; //哨兵
for(i=ST.length;ST.R[i].key!=key;--i) //从后往前找
return i;
}
优点:算法简单,对表结构无任何要求,既适用于顺序结构,也适用于链式结构; 无论记录是否按关键字有序均可应用
缺点:平均查找长度较大,查找效率较低,所以当n很大时,不宜采用顺序查找
(2)析半查找(二分查找):不适用于数据元素经常变动的线性表
特点:必须采用顺序存储结构,而且表中元素按关键字有序排列
int Search(SSTable ST ,KeyType key)
{
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; // 表中不存在待查找元素
}
优点: 比较次数少,查找效率高
缺点: (1)对表结构要求高,只能用顺序存储的有序表
(2)查找前排序,排序很费时; 为了保持有序性,对表进行插入和删除时,平均比较和移动表中一半元素,费时
(3)分块查找(索引顺序查找)
除表本身外,还需建立一个索引表:
最大关键字
起始地址
如果线性表既要快速查找有经常动态变化,可采用分块查找
缺点: 增加一个索引表的存储空间并对初始索引表进行排序运算
二、树表的查找
二叉排序树(二叉查找树)
特点: (1)中序遍历一颗二叉树时可以得到一个结点值递增的有序序列
(2)含有n个结点的二叉排序树的平均查找长度和树的形态有关。最差:单支树((1+n)/2);
平衡二叉树(AVL树)
平衡因子: 该结点左子树和右子树的深度之差
平衡调整规律:LL,RR,LR,RL
三、散列表的查找
1, 直接算出位置,与数据量无关 记录在数组中的存储位置P与其关键字key之间存在对应关系:H(key) = P 2,H函数称为哈希函数 优点:查找速度极快O(1),与元素个数无关
相关术语
(1)散列函数:转换函数,将关键字转换为位置(下标) (2)散列表 冲突:不同的关键字映射到同一个散列地址 冲突解决:开放地址法 线性探测再散列 二次(平方)探测再散列 随机探测再散列 链地址法:将相同散列地址的链成一个单链表,适合表长不定
(3)同义词:H函数相等的关键字
除留余数法:所选P要小于表长的最大质数