首先,基于上篇对于顺序查找与折半查找算法当中,在其中提到由于顺序查找的效率比较低,而折半查找算法效率比顺序查找效率高,但由于存在 折半查找仅限于 有序表的查找,只适用于顺序存储结构,不适用于链表查找,所以此次给大家分享更加效率高的算法 ---- 分块查找算法
分块查找算法(索引顺序表查找)
分块查找 (Blocking Search) 又称索引顺序查找,这是一种性能介于顺序查找和折半查找之 间的一种查找方法
查找条件:
子表内可以是无序的,但是子表之前面的子表中每个元素必须小于后面子表中的每个元素。
查找过程:
先确定待查记录所在快(顺序或折半查找),再再快内查找(顺序查找)
存储结构
二分查找表由"分块有序"的线性表和索引表组成。
(1)"分块有序"的线性表
表R[1..n]均分为b块,前b-1块中结点个数为,第b块的结点数小于等于s;每一块中的关键字不一定有序,但前一块中的最大关键字必须小于后一块中的最小关键字,即表是"分块有序"的。
(2)索引表
抽取各块中的最大关键字及其起始位置构成一个索引表ID[l..b],即:ID[i](1≤i≤b)中存放第i块的最大关键字及该块在表R中的起始位置。由于表R是分块有序的,所以索引表是一个递增有序表。
【例】下图就是满足上述要求的存储结构,其中R只有18个结点,被分成3块,每块中有6个结点,第一块中最大关键字22小于第二块中最小关键字24,第二块中最大关键字48小于第三块中最小关键字49。
算法分析
(1)平均查找长度ASL
分块查找是两次查找过程。整个查找过程的平均查找长度是两次查找的平均查找长度之和。
① 一般情况下,为进行分块查找,可以将长度为 n 的表均匀地分成b块,每块含有 s个记录,即 b=【n/s]; 又假定表中每个记录的查找概率相等,则每块查找的概率为 1/b , 块中每个记录的查找概率为 1/s。 若用顺序查找确定所在块,则 分块查找的平均查找长度为
可见,此时的平均查找长度不仅和表长n有关,而且和每一块中的记录个数s有关。在给定 n的前提下,s是 可以选择的。容易证明,当s取 时,ASLbs取最小值心
+1。这个值比顺序查 找有了很大改进,但远不及折半查找。
② 若用折半查找确定所在块,则分块查找的平均查找长度为
解析:s为每块内部的记录个数,n/s即快的数目
举个例子:当n=9,s=3时,ASL_bs=3.5;而折半法为3.1;顺序法为5
分块查找的优点是:在表中插入和删除数据元素时,只要找到该元素对应的块,就可以在该 块内进行插入和删除运算。 由于块内是无序的,故插入和删除比较容易,无需进行大量移动。 如 果线性表既要快速查找又经常动态变化,则可采用分块查找。
缺点是:要增加一个索引表的存 储空间并对初始索引表进行排序运算。
最后进行下线性表的顺序查找、折半查找、分块查找间的比较
顺序查找 | 折半查找 | 分块查找 | |
ASL | 最大 | 最小 | 介于两者之间 |
表结构 | 有序表、无序表 | 有序表 | 分块有序 |
存储结构 | 顺序表、线性链表 | 顺序表 | 顺序表、线性链表 |