分块查找——按照分类进行查找吗?

分块查找是一种折中顺序查找和二分查找的算法,它将线性表分块并按块有序,块内元素不需有序。通过块间二分查找定位块,块内顺序查找元素。适用条件是按块有序,块内任意。分块查找包括块定位和块内查找两个步骤,块索引表可以基于顺序表或链表,支持静态或动态查找。虽然速度不及二分查找,但优于顺序查找,且无需对整个键值表排序。
摘要由CSDN通过智能技术生成

顺序查找效率太低,而二分查找条件严格。能否有一种算法,折合两种优点呢?

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值