索引順序表(分塊)查找分析


索引順序查找又稱分塊查找(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。

分塊查找比順序查找要快,但不如折半查找。

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