查找
一、查找
(一)概念:
查找——在数据集合中寻找满足某种条件的数据元素的过程
查找表(查找结构)——用于查找的数据集合,由同一类的数据元素(或记录)组成
关键字——数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的
(二)查找算法的效率评价:
查找长度——在查找运算中,需要对比的关键字的次数
平均查找长度(ASL)——所有查找过程中进行关键字的比较次数的平均值
二、顺序查找:
又叫线性查找,通常用于先信标
(一)算法思想:
从头到jio挨个找(从jio到头也可以)
(二)算法实现:
typedef struct{//查找的数据结构:顺序表
int* elem;//动态数组基地址
int TabeLen;//表长
}SSTable;
//顺序查找
int Search_Seq(SSTable ST,int key){
for(int i = 0;i < ST.TabeLen && ST.elem[i] != key;++ i){
//查找成功则返回元素小标;查找失败则返回-1
return i == ST.TabeLen?-1:i;
}
}
三、折半查找
(一)算法思想:
又称二分查找,仅适用于有序的顺序表
(二)算法实现:
四、分块查找
(一)算法思想:
五、B树
(一)概念:
对于5叉排序树,规定除了根节点外,任何结点都至少有3个分叉,2个关键字,若每个结点内关键字太少,会导致树变高,则需要查更多层结点,效率低
策略:
1)m叉树中,规定除了跟结点外,任何结点至少有[m/2]个分叉,即至少含有[m/2]-1个关键字
2)规定m叉查找树中,对于任何一个结点,其所有子树的高度都相同,保证课平衡
满足以上“策略”条件即是一颗B树,所谓B树:
1)又称多路平衡查找树,B树中所有结点的孩子个数的最大值为B树的阶,用m表示;
2)一颗m阶B树或为空树,或满足以下条件:
(1)树中每个结点至多有m个子树,即至多含有m-1个关键字;
(2)若根节点不是终端结点,则至少有两颗子树;
(3)除根节点外的所有非叶子结点至少有[m/2]棵子树,即至少含有[m/2]-1个关键字;
(4)所有非叶子结点结构如下:
(5)所有的叶结点都出现在同一层次上,且不带信息(视为外部结点或类似折半查找判定树的查找失败结点,实际上不存在,指向这些结点的指针为空)。
(二)B树的高度:
注:B树的高度不包括叶子结点(失败结点)。
问题:含有n个关键字的m阶B树的最小高度和最大高度是多少?
最小高度——让每个结点尽可能的满,有m-1个关键字,m个分叉,则有
最大高度——让各层的分叉尽可能少,即根节点只有2个分叉,其他结点只有[m/2]个分叉;
各层结点至少有:第一层1、第二层2、第三层2[m/2]…第h层2([m/2])h-2;
第h+1层共有叶子结点(失败结点)2([m/2])h-1;
n个关键字的B树必有n+1个叶子节点(n个关键在将数域切分为n+1个区间),则n+1 >= 2([m/2])h-1,即:h <= log[m/2][(n+1)/2] + 1
(三)B树的插入:
(四)B树的删除: