分塊查詢(介於折半查詢和順序查詢之間的查詢方式)
阿新 • • 發佈:2018-12-10
分塊查詢:分塊查詢又稱索引順序查詢,它是順序查詢的一種改進方法。
方法描述:將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.