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

转自:http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.2.3.htm

分块查找

     分块查找(Blocking Search)又称索引顺序查找。它是一种性能介于顺序查找和二分查找之间的查找方法。

1、 二分查找表存储结构
     二分查找表由"分块有序"的线性表和索引表组成。
(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。
      
2、分块查找的基本思想
  分块查找的基本思想是:
(1)首先查找索引表
  索引表是有序表,可采用二分查找或顺序查找,以确定待查的结点在哪一块。

(2)然后在已确定的块中进行顺序查找
   由于块内无序,只能用顺序查找。

3、分块查找示例
【例】对于上例的存储结构:
(1)查找关键字等于给定值K=24的结点
  因为索引表小,不妨用顺序查找方法查找索引表。即首先将K依次和索引表中各关键字比较,直到找到第1个关键宇大小等于K的结点,由于K<48,所以关键字为24的结点若存在的话,则必定在第二块中;然后,由ID[2].addr找到第二块的起始地址7,从该地址开始在R[7..12]中进行顺序查找,直到R[11].key=K为止。
(2)查找关键字等于给定值K=30的结点
  先确定第二块,然后在该块中查找。因该块中查找不成功,故说明表中不存在关键字为30的结点。
  具体过程【参见动画演示

4、算法分析
(1)平均查找长度ASL
  分块查找是两次查找过程。整个查找过程的平均查找长度是两次查找的平均查找长度之和。
①以二分查找来确定块,分块查找成功时的平均查找长度
      ASLblk=ASLbn+ASLsq≈lg(b+1)-1+(s+1)/2≈lg(n/s+1)+s/2

②以顺序查找确定块,分块查找成功时的平均查找长度
      ASL‘blk=(b+1)/2+(s+1)/2=(s2+2s+n)/(2s)
注意:
    当 s= 时ASL‘blk取极小值 +1 ,即当采用顺序查找确定块时,应将各块中的结点数选定为 。
  【例】若表中有10000个结点,则应把它分成100个块,每块中含100个结点。用顺序查找确定块,分块查找平均需要做100次比较,而顺序查找平均需做5000次比较,二分查找最多需14次比较。
  注意:
  分块查找算法的效率介于顺序查找和二分查找之间。

(2)块的大小
  在实际应用中,分块查找不一定要将线性表分成大小相等的若干块,可根据表的特征进行分块。
  【例】一个学校的学生登记表,可按系号或班号分块。

(3) 结点的存储结构
  各块可放在不同的向量中,也可将每一块存放在一个单链表中。
  
(4)分块查找的优点
  分块查找的优点是:
  ①在表中插入或删除一个记录时,只要找到该记录所属的块,就在该块内进行插入和删除运算。
  ②因块内记录的存放是任意的,所以插入或删除比较容易,无须移动大量记录。
  分块查找的主要代价是增加一个辅助数组的存储空间和将初始表分块排序的运算。

时间: 2024-10-22 23:48:20

转:线性表的查找-分块查找的相关文章

查找 | 分块查找

// 32 66 90//15,32,9,22,18 43,66,49,35,53 90,78,71,86 //分析:分块查找由索引查找和子表查找两步完成.设n个数据元素的查找表分为m个子表,且每个子表//均为t个元素,则t=n/m .这样,分块查找的平均查找长度为:// ASL=ASL索引表+ASL子表=1/2(m+1)=1/2(m+n/m)+1//可见,平均查找长度不仅和表的总长度n有关,而且和所分的子表的个数m有关. #include <stdio.h> #define LEN 15ty

(转载)查找一 线性表的查找

查找一 线性表的查找 目录 查找的基本概念 顺序查找 二分查找 分块查找 三种线性查找的PK 参考资料 相关阅读 查找的基本概念 什么是查找? 查找是根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素. 查找算法的分类 若在查找的同时对表记录做修改操作(如插入和删除),则相应的表称之为动态查找表: 否则,称之为静态查找表. 此外,如果查找的全过程都在内存中进行,称之为内查找: 反之,如果查找过程中需要访问外存,称之为外查找. 查找算法性能比较的标准 --平均查找长度ASL(Av

查找一 线性表的查找

查找的基本概念 什么是查找? 查找是根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素. 查找算法的分类 若在查找的同时对表记录做修改操作(如插入和删除),则相应的表称之为动态查找表: 否则,称之为静态查找表. 此外,如果查找的全过程都在内存中进行,称之为内查找: 反之,如果查找过程中需要访问外存,称之为外查找. 查找算法性能比较的标准 ——平均查找长度ASL(Average Search Length) 由于查找算法的主要运算是关键字的比较过程,所以通常把查找过程中对关键字需

[Data Structure &amp; Algorithm] 线性表的查找

平均查找长度 ASL 影响查找算法好坏的主要标准 - 时间复杂度,通常用 - 平均查找长度 定义 - 为确定记录在查找表中的位置,需要和给定值进行比较的关键字的个数的期望 公式 - ASL = (查找成功时 + 查找失败时)的平均查找长度的期望 基本概念 Ps - 查找成功时的概率 Pf - 查找失败时的概率 Pi - 需要比较I次才能确定位置的记录出现的概率 n - 查找表的长度 好的算法 可以改变 - Pi 对于越小的i对应的Pi越大越好 不可以改变 - Ps和Pf 线性表上的查找 顺序表

3、分块查找——查找算法

3.分块查找 (又称 索引顺序查找)[性能介于 顺序查找 和 折半查找之间]   索引表 最大关键字 22 48 86   起始地址 1 7 13 22 12 13 8 9 20 33 42 44 38 24 48 60 58 74 49 86 53 表及其索引表 块的查找 既可以顺序查找,也可以折半查找. 因为上表块中记录是无序的,所以只能是顺序查找. 分块查找平均查找长度:ASLbs=Lb+Lw Lb:查找索引表确定所在块的平均查找长度. Lw:块中查找元素的平均查找长度. 一般情况下,长度

查找算法系列之简单查找:顺序查找、二分查找、分块查找

近期总结了各大排序算法的原理 ,并对其进行了实现,想着一并把查找算法总结了,今天就着手开始总结查找算法. 废话不多说,这篇文章从最简单的查找算法开始讲起,之后会补充复杂的二叉搜索树查找(BST)和B树,B+树查找以及哈希查找等. 顾名思义,查找就是寻找到关键字在队列中的位置,最笨的查找算法就是依次顺序比较,复杂度为O(n),但是有很多方法的复杂度可以达到O(logn)等等. 1.顺序查找 关键字与数组中的数顺序比较,时间复杂度O(n). template<class T> int OrderS

使用C语言实现线性表

线性表是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列,序列中的每个数据元素,可以是一个数字,可以是一个字符,也可以是复杂的结构体或对象.例如:1,2,3,4,5是一个线性表,A,B,C,D...Z是一个线性表,一列列车的车厢1,车厢2...车厢n是一个线性表. 线性表的机内表示法(又称存储结构)有2种,一种是顺序存储结构,另一种是链式存储结构. 顺序存储结构,顾名思义就是按顺序来存储的一种存储结构,比如线性表(1,2,3,4,5),共计5个元素,每个int型的数据元素假设占用

学习使用C语言实现线性表

线性表是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列,序列中的每个数据元素,可以是一个数字,可以是一个字符,也可以是复杂的结 构体或对象.例如:1,2,3,4,5是一个线性表,A,B,C,D...Z是一个线性表,一列列车的车厢1,车厢2...车厢n是一个线性表. 线性表的机内表示法(又称存储结构)有2种,一种是顺序存储结构,另一种是链式存储结构. 顺序存储结构,顾名思义就是按顺序来存储的一种存储结构,比如线性表(1,2,3,4,5),共计5个元素, 每个int型的数据元素假设

数据结构之线性表(链式存储结构)

线性表的实现分顺序存储结构和链式存储结构 上一节我们主要介绍了顺序存储结构,在最后我们还分别总结了顺序存储结构的优缺点, 对于顺序结构的缺点,我们有没有什么好的解决方法呢? 我们今天要介绍的线性表的链式存储结构就可以很好的解决顺序结构的缺点,一起来看. 顺序结构最大的缺点就是在进行插入和删除操作的时候,如果插入位置不理想,那么我们需要移动大量的元素,那产生这一问题的原因是什么呢? 仔细分析后,我们可以发现在顺序存储结构中,他们相邻的元素的存储位置也是相邻的,我们在申请内存的的时候,是一次性申请一