索引顺序表(分块)查找分析


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

一、分块查找表存储结构

查找表由"分块有序"的线性表和索引表组成。

1、"分块有序"的线性表

表R[1…n]均分为b块,前b-1块中结点个数为s=[n/b],第b块的结点数小于等于s;每一块中的关键字不一定有序,但前一块中的最大关键字必须小于后一块中的最小关键字,即表是"分块有序"的。

2、索引表

抽取各块中的最大关键字及其起始位置构成一个索引表ID[l…b],即IDi中存放第i块的最大关键字及该块在表R中的起始位置。由于表R是分块有序的,所以索引表是一个递增有序表。

【例】下图就是满足上述要求的存储结构,其中R只有18个结点,被分成3块,每块中有6个结点,第一块中最大关键字22小于第二块中最小关键字24,第二块中最大关键字48小于第三块中最小关键字49。
在这里插入图片描述

二、分块查找的基本思想

1、首先查找索引表

索引表是有序表,可采用二分查找或顺序查找,以确定待查的结点在哪一块。

2、然后在已确定的块中进行顺序查找

由于块内无序,只能用顺序查找。

三、分块查找示例

【例】对于上例的存储结构:

1、查找关键字等于给定值K=24的结点

因为索引表小,不妨用顺序查找方法查找索引表。即首先将K依次和索引表中各关键字比较,直到找到第1个关键宇大小等于K的结点,由于K<48,所以关键字为24的结点若存在的话,则必定在第二块中;然后,由ID[2].addr找到第二块的起始地址7,从该地址开始在R[7…12]中进行顺序查找,直到R[11].key=K为止。

2、查找关键字等于给定值K=30的结点

先确定第二块,然后在该块中查找。因该块中查找不成功,故说明表中不存在关键字为30的结点。

四、算法分析——平均查找长度ASL

分块查找是两次查找过程。整个查找过程的平均查找长度是两次查找的平均查找长度之和。

①以二分查找来确定块,分块查找成功时的平均查找长度

ASLblk=ASLbn+ASLsq≈log(b+1)-1+(s+1)/2≈log(n/s+1)+s/2

②以顺序查找确定块,分块查找成功时的平均查找长度

ASL’blk=(b+1)/2+(s+1)/2=(n/s+s)/2+1

可见,平均查找长度不仅和n有关还和s有关,在n已经确定的情况下,s是可以选择的。容易证明 ,当s=sqrt(n)时,ASL=sqrt(n)+1。

分块查找比顺序查找要快,但不如折半查找。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章