索引順序查詢(分塊查詢)

2021-10-10 06:14:10 字數 1912 閱讀 7622

索引順序查詢又叫分塊查詢,它是介於順序查詢和折半查詢之間的一種查詢方法。折半查詢雖然具有很好的效能,但其前提條件是線性表順序儲存而且按照關鍵字排序,這一前提條件在結點數很大且表元素動態變化時難以滿足。而順序查詢雖然可以解決表元素動態變化的要求,但查詢效率很低。如果既要保持查詢效率,又要能夠滿足表元素動態變化的需求,則可採用索引順序查詢的方法。

在此查詢方法中,除查詢表外還需要為查詢表建立乙個「索引表」,索引表是分段有序的。將查詢表分為若干個子表,為每乙個子表建立乙個索引項儲存在索引表中,索引項包括兩項內容:關鍵字項和指標項。例如現有乙個查詢表,為其建立乙個索引表,如圖1所示。

圖1 查詢表及其索引表

在索引表中關鍵字項儲存的是子表中的最大值,指標項儲存的是子表的位址。索引順序查詢的基本思想就是:(1)首先根據給定的關鍵字key,在索引表中查詢以確定key所在的子表;(2)然後再在子表中查詢關鍵字為key的元素,如果找到,則查詢成功;否則查詢失敗。

索引表是有序表,則既可進行順序查詢也可進行折半查詢,以確定待查元素所在子表;而子表可能是無序的,因此只能用順序查詢。

例如給定key=59,則索引表中查詢得出結果:22索引順序查詢的實現相比前面所學的幾種查詢演算法要難一些,但理解了其查詢原理,實現起來也相對容易,為了讓讀者更好的體會查詢過程,接下來我們通過乙個案例來展示索引順序查詢,具體如例1所示。

例1

1    #define _crt_secure_no_warnings

2 #include 3 #include 4 //索引順序查詢(分塊查詢)

5 struct indexblock //定義塊的結構

6 indexblock[4]; //定義索引表,裡面有4個struct物件

11

12 int blocksearch(int key, int a)

13

33

34 int main()

35 ; //查詢表

38 printf("已知查詢表:\n");

39 for (int i = 0; i < 15; i++)

40 printf("%d ", a[i]);

41

42 printf("\n");

43

44 for (int i = 0; i < 3; i++)

45

54

55 printf("請輸入你要查詢的數:\n");

56 int key;

57 scanf("%d", &key);

58 int index = blocksearch(key, a);

59

60 if (index >= 0)

63 else

67

68 system("pause");

69 return 0;

70 }

執行結果如圖2所示。

圖2 例1執行結果

在例1中,**5-10行定義了乙個索引表,**44-53行確定了索引表對應的每個子表的大小及每個子表中的最大值。**12-32行的函式就是實現的索引順序查詢的演算法:**17-18行確定要查詢的關鍵字在哪個子表中,確定了子表後,**第25-26行在子表中查詢,如果查詢到就返回其角標,如果沒找到則查詢失敗。

索引順序表查詢演算法(分塊查詢演算法)

有時候,可能會遇到這樣的表 整個表中的元素未必有序,但若劃分為若干塊後,每一塊中的所有元素均小於 或大於 其後面塊中的所有元素。我們稱這種為分塊有序。首先,我們需要先建立乙個索引表,索引表中為每一塊都設定 索引項,每乙個索引項都包含兩個內容 在前面建立的索引表的基礎上,我們查詢乙個關鍵字需要兩個步驟...

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

二 分塊查詢的基本思想 三 分塊查詢示例 四 演算法分析 平均查詢長度asl 索引順序查詢又稱分塊查詢 blocking search 它是一種效能介於順序查詢和二分查詢之間的查詢方法。查詢表由 分塊有序 的線性表和索引表組成。表r 1 n 均分為b塊,前b 1塊中結點個數為s n b 第b塊的結點...

分塊索引(查詢)

什麼叫做分塊索引?分塊索引就是對資料集進行分塊,使得分塊有序,然後再對每一塊建立乙個索引項,從而減少索引項個數。分塊查詢是折半查詢和順序查詢的一種改進方法,折半查詢雖然具有很好的效能,但其前提條件時線性表順序儲存而且按照關鍵碼排序,這一前提條件在結點樹很大且表元素動態變化時是難以滿足的。而順序查詢可...