查找-线性表的查找-分块查找

分块查找

分块查找(Blocking Search)又称索引顺序查找,这是一种性能介于顺序查找和折半查找之间的一种查找方法。在此查找法中,出表本身以外,尚需建立一个“索引表”。
特点:数据分块存储、块内无序、块间有序

在这里插入图片描述

算法思想

算个过程:
①在索引表中确定待查记录所属的分块(可顺序、可折半)
②在块内顺序查找

案例1-查找成功(顺序)

在查找表中,查找key=22的过程
在这里插入图片描述
第一个索引表10<22 ,继续查找下一个分块,
索引表20<22,继续查找下一个分块,
索引表30>=22,如果22存在的话,一定时在索引表30所指向的分块内,
在这里插入图片描述
从索引表30这个分块的起始位置,数组下标为6的位置开始顺序查找,
List[6] 不满足,继续查找下一位,
List[7] = key,查找成功。

案例2-查找失败(顺序)

在查找表中,查找key=29的过程
在这里插入图片描述
第一个索引表10<29 ,继续查找下一个分块,
索引表20<29,继续查找下一个分块,
索引表30>=29,如果29存在的话,一定时在索引表30所指向的分块内,
在这里插入图片描述
从索引表30这个分块的起始位置,数组下标为6的位置开始顺序查找,
List[6] 不满足,继续查找下一位,
List[7] 不满足,继续查找下一位,
List[8] 不满足,继续查找下一位,
List[9] ,超出分块范围,查找失败。

案例3-查找成功(折半)

用折半查找索引,并查找key=30的记录:
在这里插入图片描述
用折半查找索引,mid=(low+high)/2;
①mid=2,key=maxValue;key=30,一定在块内;
②从索引表30这个分块的起始位置,数组下标为6的位置开始顺序查找,
③List[8] = 30 ,查找成功。

案例4-查找成功(折半)

用折半查找索引,并查找key=19的记录:
用折半查找索引,mid=(low+high)/2;
在这里插入图片描述
① mid=2,key=19<30,high = mid -1=1;
在这里插入图片描述
② mid=0,key=19>10, low=mid+1=1;
在这里插入图片描述
③ mid =1,key=19<20, high=mid-1=0;
在这里插入图片描述
④ 当发生 low>high 时,在low所指的分块中查找记录。
⑤从索引表20这个分块的起始位置,数组下标为2的位置开始顺序查找,
③List[4] = 19 ,查找成功。

案例5-查找失败(折半 )

用折半查找索引,并查找key=54的记录:
用折半查找索引,mid=(low+high)/2;
① mid=2,key=54>30,low=mid+1=3;
② mid=3, key=54>40,low=mid+1=4;
③ mid=4, key=54>50,low=mid+1=5;
在这里插入图片描述
low>high,并且超出索引表的范围,查找失败

算法实现

typedef int ElemType;
//索引表
typedef struct{
    
    
    ElemType maxValue;
    int low;
    int hiht;
}Index;
//顺序存储实际元素
ElemType List[100];

分块查找效率分析(ASL)

算法思想的描述中:案例1和案例2采用的都是顺序查找索引表
算法思想的描述中:案例3、案例4和案例5采用的是折半查找索引表

在这里插入图片描述

ASL = 查索引表的平均查找长度+查分块的平均查找长度

例题

在这里插入图片描述
假设,长度为n的查找表被均匀地分为b块,每块s个元素。
设索引查找和块内查找的平均查找长度分别为L1、Ls,则分块查找的平均长度为
ASL=L1+Ls

顺序查找索引表

用顺序查找索引表,则
L1 = 1 + 2 + . . . + b b \frac{1+2+...+b}{b} b1+2+...+b = b + 1 2 \frac{b+1}{2} 2b+1
Ls = 1 + 2 + . . . + s s \frac{1+2+...+s}{s} s1+2+...+s = s + 1 2 \frac{s+1}{2} 2s+1
ASL = b + 1 2 \frac{b+1}{2} 2b+1 + s + 1 2 \frac{s+1}{2} 2s+1 = s 2 + 2 s + n 2 s \frac{s^2+2s+n}{2s} 2ss2+2s+n ,当s= n \sqrt n n 时,ASLmin= n \sqrt n n +1

折半查找索引表

用折半查找索引表,则
ASLmin=⌈log2(b+1)⌉+ s + 1 2 \frac{s+1}{2} 2s+1
ASLmin≈log2 n s \frac{n}{s} sn+1)+ s 2 \frac{s}{2} 2s

分块查找的优点:

  • 插入和删除比较容易,无需进行大量移动。
    在表中插入和删除数据元素时,只要找到该元素对应的块,就可以在该块内进行插入和删除运算。

分块查找的缺点:

  • 要增加一个索引表的存储空间并对初始索引表进行排序运算。

易错点

对索引表进行折半查找时,若索引表中不包含目标关键字,则折半查找最终停在low>high,要在low所指分块中查找。

猜你喜欢

转载自blog.csdn.net/QQ657205470/article/details/127414396
今日推荐