查找->靜態查找表->分塊查找(索引順序表)


文字描述

  分塊查找又稱為索引順序查找,是順序查找的一種改進方法.在此查找算法中,除表本身外, 還需要建立一個”索引表”.索引表中包括兩項內容:關鍵字項(其值為該字表內的最大關鍵字)和指針項(指示該子表的第一個記錄在表中位置)。索引表按關鍵字有序,則表或者有序或者分塊有序。所謂“分塊有序”指的是第二個子表中所有記錄的關鍵字均大於第一個子表中的最大關鍵字,第三個子表中的所有關鍵字均大於第二個子表中的最大關鍵字,,,,以此類推。

  因此分塊查找算法需分兩步進行:

  先確定待查記錄所在的塊(子表)。由於索引項組成的索引表按關鍵字有序,則確定塊的查找可以用順序查找,也可以用折半查找。

  再在塊中順序查找。如果塊中記錄是任意排列的,就只能是順序查找。

示意圖

 

算法分析

  分塊查找的平均查找長度為ASLbs = Lb+Lw, 其中Lb為查找索引表確定所在塊的平均查找長度,Lw為在塊中查找元素的平均查找長度。

  一般情況下,為進行分塊查找,可以將長度為n的表均勻地分成b塊,每塊含有s個記錄,即b=[n/s];又假定表中每個記錄的查找概率相等,則每塊查找的概率為1/b,塊中每個記錄的查找概率為1/s。

  若用順序查找確定所在塊,順序查找子表中的元素,則分塊查找的平均查找長度為

  若用折半查找確定所在塊,順序查找子表中的元素,則分塊查找的平均查找長度為

代碼實現 

 1 //./a.out 5 13 19 21 37 56 64 75 80 88 92
 2 
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 #include <string.h>
 6 
 7 #define DEBUG
 8 
 9 #define MAX_SIZE 50
10 #define BLOCK_SIZE 5
11 
12 typedef struct{
13     int start;
14     int end;
15     int key;
16 }Index_K;
17 
18 
19 //分塊查找算法
20 int block_search(int key, int a[], Index_K index_k[], int len)
21 {
22     int i = 0;
23     int j = 0;
24     int k = -1;
25     //順序查找確定所在塊
26     while((index_k[i].start>=0) && (key>index_k[i].key))
27         i+=1;
28     if(index_k[i].start < 0){
29         return k;
30     }
31     //順序查找子表中的元素
32     for(j = index_k[i].start; j<=index_k[i].end; ++j){
33         if(key == a[j])
34             k = j;
35     }
36     return k;
37 }
38 
39 //順序打印整型數組中的元素
40 void print(int a[], int len)
41 {
42     int i = 0;
43     for(i=0; i<len; i++){
44         printf("[%d]:%d ", i, a[i]);
45     }
46     printf("\n");
47     return;
48 }
49 
50 int main(int argc, char *argv[])
51 {
52     if(argc < 2)
53         return -1;
54     
55     int a[MAX_SIZE] = {0};
56     Index_K index_k[MAX_SIZE/BLOCK_SIZE+1];
57     
58     int i = 0, j = 0, len = 0, key = 0;
59     for(i=1; i<argc; i++){
60         a[i-1] = atoi(argv[i]);
61     }
62     len = i-1;
63 
64 #ifdef DEBUG
65     printf("輸入數據:");
66     print(a, len);
67 #endif
68     printf("索引表:\n");
69     i = j = 0;
70     while(i<len){
71         index_k[j].start = i;
72         index_k[j].end = ((i+BLOCK_SIZE)>(len-1))?(len-1):(i+BLOCK_SIZE);
73         index_k[j].key = ((i+BLOCK_SIZE)>(len-1))?a[len-1]:a[i+BLOCK_SIZE];
74         printf("index_k[%d].start=%d .end=%d .key=%d\n", j, index_k[j].start, index_k[j].end, index_k[j].key);
75         j += 1;
76         i += BLOCK_SIZE;
77         i += 1;
78     }
79     index_k[j].start = index_k[j].end = index_k[j].key = -1;
80     
81     while(1){
82         printf("輸入key:");
83         scanf("%d", &key);
84         if(key<0)
85             break;
86         printf("key(%d) 位於 %d\n", key, block_search(key, a, index_k, len));
87     }
88     return 0;
89 }
分塊查找(索引順序表)

運行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM