数据结构与算法
第一章 绪论
第二章 线性表
第三章 树与二叉树
第四章 图
第五章 查找
第六章 排序
文章目录
第五章 查找(搜索)
一、基本概念
查找算法时间发到有由关键字比较次数决定
平均查找长度(ASL):把给定值与关键字进行比较的次数的期望值称为查找算法在查找成功时的平均查找长度
计算公式:假设待查的记录是查找表中第
i
i
i 个记录,其为第
i
i
i 个位置的概率为
p
i
p_i
pi , 则
∑
p
i
=
1
\sum p_i = 1
∑pi=1 ,
c
i
c_i
ci 为查找第
i
i
i 个记录所进行的比较次数,则
A
S
L
=
∑
i
=
1
n
p
i
c
i
ASL=\displaystyle\sum_{i=1}^n {p_i c_i}
ASL=i=1∑npici。
二、线性查找
A S L s u c c e s s = n + 1 2 ASL_{success} = \displaystyle\frac{n+1}{2} ASLsuccess=2n+1
三、折半查找
int search(int k,LIST F){
int mid;
while(l<=r){
if(F[mid] = k){
return mid;
}
else if (F[mid]<k){
l = l+1;
}
else{
r = e-1;
}
}
return -1;
}
时间复杂度:
O
(
log
n
)
O(\log n)
O(logn)
A
S
L
s
u
c
c
e
s
s
=
n
+
1
n
log
2
(
n
+
1
)
−
1
ASL_{success} = \displaystyle \frac{n+1}{n} \log_{2}{(n+1)} -1
ASLsuccess=nn+1log2(n+1)−1
最坏性能与平均性能比较接近
查找失败时所需关键字比较次数不超过判定树的高度
四、分块查找
线性查找+折半查找
均匀分块,块间有序,块内无序
五、二叉查找树
查找:
BST Search(keytype k,BST F){
if(F == NULL){
return NULL;
}
else if (k == F->data.key){
return F;
}
else if(k < F->data.key){
return Search(k,F->lchild);
}
else {
return Search(k,F->rchild);
}
}
插入:
void Insert(records R, BST &F){
if(F == NULL){
F = new celltype;
F->data = R;
F->lchild = NULL;
F->rchild = NULL;
}
else if(R.key < F->data.key){
Insert(R,F->lchild);
}
else{
Insert(R,F->rhild);
}
}
删除:
records DeleteMin(BST &F){
records tem;
BST P;
if(F->lchild == NULL){
P = F;
tem = F->data;
F = F->rchild;
delete P;
return tmp;
}else{
return (DeleteMin(F->lchild))
}
}
void Delete(keytype k,BST &F){
if(F != NULL){
if(k < F->data.key){
Delete(k,lchild);
}
else if (k > F->data.key){
Delete(k.rchild);
}else{
if(F->rchild == NULL){
F = F->rchild;
}
else if (F->lchild == NULL){
F = F->lchild;
}
else{
F ->data = DeleteMin(F->rchild);
}
}
}
}
时间复杂度在 O ( log N ) O(\log N) O(logN)和 O ( N ) O(N) O(N)之间
六、AVL树
AVL(balanced binary tree or height-balanced tree)树
AVL 树是空二叉树或者是根结点左右子树高度之差小于等于1,且左右子树都是 AVL 树的 BST 。
平衡因子(balanced factor, BF)定义为该结点的左子树与右子树的高度之差。
四种类型:LL,LR,RL,RR
左左->右 , 右右->左 , 左右->左右,右左->右左
七、B-树与B+树
m路查找树
B树
八、散列技术
散列技术需要解决的关键问题:
散列函数的构造、散列冲突的处理、散列结构上的查找、插入和删除
散列函数的构造的原则:计算简单、分布均匀
(一)哈希函数的构造方法:
1、直接定址法
散列函数是关键字值的线性函数
适用情况:事先知道关键字的值,关键字取值集合不是很大且连续性较好。
2、质数除余法
质数除余法是一种最简单、也是最常用的构造散列函数的方法,并且不要求事先知道关键码的分布。
3、其他方法:平方取中法、折叠法、数字分析法、随机数法
(二)冲突处理的方法:
1、开放定址法
可存放新表项的空闲地址既向它的同义词表项开放,又向它的非同义词表项开放。
常用的探测技术:线性探测法、线性补偿探测法、二次探测法、随机探测法
开放定址法产生的散列表称为开散列表
2、带溢出表的内散列法
3、拉链法(链地址法)
(三)散列查找的性能分析
装载因子: $\alpha $= 表中填入的记录数/表的长度
散列技术不止是一个查找技术,还是一种存储技术