1. 程式人生 > >分塊查詢(介於折半查詢和順序查詢之間的查詢方式)

分塊查詢(介於折半查詢和順序查詢之間的查詢方式)

分塊查詢:分塊查詢又稱索引順序查詢,它是順序查詢的一種改進方法。

方法描述:將n個數據元素“按塊有序”劃分為m塊(m<=n)。每一塊中的資料元素不必有序,但塊與塊之間必須“按塊有序”,即第1快中的任一元素的關鍵字都必須小於第2塊中任一元素的關鍵字;而第2塊中任一元素又都小於第3塊中的任一元素,……

圖示分塊如下:

操作步驟:

1、先選取各快中的最大關鍵字構成一個索引表

2、查詢分兩部分:先對索引表進行二分查詢或順序查詢,以確定待查記錄在哪一塊中;然後在已確定的快中用順序法進行查詢。

分塊查詢平均查詢長度:

設長度為n的表均勻地分成b塊,每塊含有s個記錄,則b=n/s;

順序查詢所在塊,分塊查詢的平均查詢長度=(b+1)/2 + (s+1)/2 = (n/s+s)/2+1;

折半查詢所在塊,分塊查詢的平均查詢長度=log2(n/s+1)+s/2;

優點:在表中插入或刪除一個記錄時,只要找到該記錄所在塊,就在該塊中進行插入或刪除運算(因快內無序,所以不需要大量移動記錄)。

缺點:增加了一個輔助陣列的儲存空間和將初始表分塊排序的運算。

效能:介於順序查詢和二分查詢之間。

示例(block.c):

#include <stdio.h>

#include <stdlib.h>


#define MAX 3

#define MAXSIZE 18



typedef int ElemType;

typedef struct IndexItem{

ElemType index;

int start;

int length;

}IndexItem;

IndexItem indexlist[MAX];


ElemType MainList[MAXSIZE] = {22, 12, 13, 8, 9, 20, 33, 42, 44, 38, 24, 48, 60, 58, 74, 49, 86, 53};


int sequential(IndexItem indexlist[], ElemType key)

{

int index;

if(indexlist[0].index >= key) return 1;

for(index = 1; index <= MAX; index++){

if((indexlist[index-1].index < key)&&(indexlist[index].index >= key))

return index+1;

}

return 0;

}


int mainsequential(ElemType MainList[], int index, ElemType key)

{

int i, num=0;

for(i = 0; i < index-1; i++){

num += indexlist[i].length;

}

for(i = num; i < num+indexlist[index-1].length; i++){

if(MainList[i] == key) return i+1;

}

return -1;

}


int

main(void)

{

indexlist[0].index = 22;

indexlist[0].start = 1;

indexlist[0].length = 6;

indexlist[1].index = 48;

indexlist[1].start = 7;

indexlist[1].length = 6;

indexlist[2].index = 86;

indexlist[2].start = 13;

indexlist[2].length = 6;

int index = sequential(indexlist, 38);

printf("index = %d.\n", index);

int mainindex = mainsequential(MainList, index, 38);

printf("mainindex = %d.\n", mainindex);

return 0;

}

編譯:gcc block.c

執行:./a.out

測試結果:

index = 2. mainindex = 10.