索引分块查找的实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

查找举例
• • • • • • • • • • • • • • • • • • • •
int blksearch(record r[],index idx[],keytype key) { int i=0,j; while(i<idxN) { if(key<=idx[i].key){ break; } else i++; } j=idx[i].low; while(j<=idx[i].high) { if(key==r[j].key){ 索引表 return j;} else 最大关键字 22 48 86 j++; 1 7 13 起始地址 } return -1; }
索引分块查找程序设计
指导教师: 指导教师:
演讲人: 演讲人:
1 基本思想 2 优点 3 流程图 4 实例演示
分块查找又称索引顺序查找,它是介于顺序查找和折半 分块查找又称索引顺序查找, 查找之间的查找方法。 查找之间的查找方法。 基本思想: 基本思想: 首先将查找表分成若干块, 1. 首先将查找表分成若干块,在每一块中数据元素的存 放是任意的,但块与块之间必须是有序的; 放是任意的,但块与块之间必须是有序的; 建立一个索引表, 2. 建立一个索引表,把每块中最大的关键字值按块的顺 序存放在一个辅助数组中,这个索引表也按升序排列; 序存放在一个辅助数组中,这个索引表也按升序排列; 3. 查找时先用给定的关键字值在索引表中查找,确定满 查找时先用给定的关键字值在索引表中查找, 足条件的数据元素存放在哪个块中; 足条件的数据元素存放在哪个块中; 再到相应的块中顺序查找,便可以得到查找的结果。 4. 再到相应的块中顺序查找,便可以得到查找的结果。
基本思想
①在表中插入或删除一个记录时,只要找到该 在表中插入或删除一个记录时, 记录所属的块, 记录所属的块,就在该块内进行插入和删除运 算。 ②因块内记录的存放是任意的,所以插入或删 因块内记录的存放是任意的, 除比较容易,无须移动大量记录。 除比较容易,无须移动大量记录。 分块查找的主要代价是增加一个辅助数组的存 储空间和将初始表分块排序的运算。 储空间和将初始表分块排序的运算。 分块查找算法的效率介于顺序查找和二分查找 之间。 之间。
90
查找失败! 该记录不存在
22
12
13
3
9
20
33
42
44
38
24
48
60
58
74
49
86
53
1
2
3
返回
38
查找成功! 关键字为第10个记录
22
12
13
3
9
20
33
42
44
38
24
48
60
58
74
49
86
53
1
2
3
返回
• • • • • • • • • • • • • • • • • • • •
int blksearch(record r[],index idx[],keytype key) { //i代表索引块地址 代表索引块地址, int i=0,j; //i代表索引块地址,j代表表中元素的地址 while(i<idxN) { if(key<=idx[i].key){ break; } else i++; } j=idx[i].low; while(j<=idx[i].high) { if(key==r[j].key){ 索引表 return j;} else 最大关键字 22 48 86 j++; 1 7 13 起始地址 } return -1; }
优点
开始
取Байду номын сангаас引表有效项数和索引表首址
在索引表中读取数据块的首址和最大值 Yes 查找数据<=该块最大值? No No 索引表有效项数比较完否? Yes 读取下一数据块的首址 计算数据元素的个数 用顺序查找法在块内查找 No 查找失败 找到否? 结束 Yes 查找成功
流程图
若以索引顺序表表示静态查找表, ① 若以索引顺序表表示静态查找表,则可以进行 分块查找。 分块查找。 以下就是一个索引顺序表,把长度为18 18的顺序 ② 以下就是一个索引顺序表,把长度为18的顺序 表分成3 这三块中的关键字“分块有序” 表分成3块,这三块中的关键字“分块有序”, 然后找出每一块的最大关键字, 然后找出每一块的最大关键字,并用指针指示 每一块中的第一个记录。 每一块中的第一个记录。 动画演示查找成功 动画演示查找失败 程序演示
相关文档
最新文档