顺序查找效率太低,而二分查找条件严格。能否有一种算法,折合两种优点呢?
1.分块查找概念
1.分块查找
先将线性表分块,然后实行“块间二分查找,块内顺序查找”。
2.适用条件
按块有序,块内任意。每一块内的元素不需要有序,但块与块之间是按键值有序的。即第i块中所有元素的键值都必须小于第j块中的所有元素
2.分块查找实现
1.分块查找步骤
1.块定位:确定所查找元素可能属于的块,可以通过二分查找实现
2.块内查找:建立一个块索引表,块索引表中包含每一块的相关信息。通常将块中的最大值作为该块的键值代表
2.建立块索引表
第一种类型:基于顺序表,每块的长度不同,在块索引表中记录每一块的起点和终点,这种类型适用于静态查找,因为在一块中进行插入和删除操作时都会影响到其后继块的块索引信息
第二种类型:基于顺序表,每块的长度相同,在块索引表中记录每一块的起点和实际元素的个数,每块都可能有一些空闲的位置,因此这种类型可实现有限的动态查找,即在每一块没有填满前都可以向该快中插入数据,而对一块中元素的删除操作只对本块中的元素有影响
第三种类型:基于链表,在块索引中记录每块的第一个结点的地址和键值。适用于动态查找,对主表进行插入和删除操作时,只对所操作的块中的结点有影响
3.分块查找表类型定义
#define M 6//分块数的上限
struct bitNode {
//块索引表的元素类型定义
int mkey;//键值代表
int begin, end;//块的起点下标和终点下一个元素的下标
bool operator<(const bitNode bit)const {
return mkey < bit.mkey;
}
};
struct bitTable {
//分块查找表
bitNode bit[M];//块索引表
int sz;//分块的实际数量
vector<int>sl