分块查找 分块查找(Blocking Search)又称索引顺序查找它是一种性能介于顺序查找和二分查找之间的查找方法 二分查找表存储结构 二分查找表由分块有序的线性表和索引表组成 ()分块有序的线性表 表R[n]均分为b块前b块中结点个数为 第b块的结点数小于等于s;每一块中的关键字不一定有序但前一块中 的最大关键字必须小于后一块中的最小关键字即表是分块有序的 ()索引表 抽取各块中的最大关键字及其起始位置构成一个索引表ID[lb]即 ID[i](≤i≤b)中存放第i块的最大关键字及该块在表R中的起始位置由于表R是分块有序的所以索引表是一个递增有序表 【例】下图就是满足上述要求的存储结构其中R只有个结点被分成块每块中有个结点第一块中最大关键字小于 第二块中最小关键字第二块中最大关键字小于第三块中最小关键字 分块查找的基本思想 分块查找的基本思想是 ()首先查找索引表 索引表是有序表可采用二分查找或顺序查找以确定待查的结点在哪一块 ()然后在已确定的块中进行顺序查找 由于块内无序只能用顺序查找 分块查找示例 【例】对于上例的存储结构 ()查找关键字等于给定值K=的结点 因为索引表小不妨用顺序查找方法查找索引表即首先将K依次和索引表中各关键字比较直到找到第个关键宇大小等于K的 结点由于K<所以关键字为的结点若存在的话则必定在第二块中;然后由ID[]addr找到第二块的起始地址从该地址 开始在R[]中进行顺序查找直到R[]key=K为止 ()查找关键字等于给定值K=的结点 先确定第二块然后在该块中查找因该块中查找不成功故说明表中不存在关键字为的结点 算法分析 ()平均查找长度ASL 分块查找是两次查找过程整个查找过程的平均查找长度是两次查找的平均查找长度之和 ①以二分查找来确定块分块查找成功时的平均查找长度 ASL blk =ASL bn +ASL sq ≈lg(b+)+(s+)/≈lg(n/s+)+s/ ②以顺序查找确定块分块查找成功时的平均查找长度 ASL blk =(b+)/+(s+)/=(s +s+n)/(s) 注意 【例】若表中有个结点则应把它分成个块每块中含个结点用顺序查找确定块分块查找平均需要做次比 较而顺序查找平均需做次比较二分查找最多需次比较 注意 分块查找算法的效率介于顺序查找和二分查找之间 ()块的大小 在实际应用中分块查找不一定要将线性表分成大小相等的若干块可根据表的特征进行分块 【例】一个学校的学生登记表可按系号或班号分块 () 结点的存储结构 各块可放在不同的向量中也可将每一块存放在一个单链表中 ()分块查找的优点 分块查找的优点是 ①在表中插入或删除一个记录时只要找到该记录所属的块就在该块内进行插入和删除运算 ②因块内记录的存放是任意的所以插入或删除比较容易无须移动大量记录 分块查找的主要代价是增加一个辅助数组的存储空间和将初始表分块排序的运算 |