8.2.3 分塊查詢法
阿新 • • 發佈:2018-12-25
分塊查詢法要求將列表組織成以下兩種索引順序結構:
①首先將列表分成若干個塊(子表)。一般情況下,塊的長度均勻,最後一塊可以不滿。每塊中元素任意排列,即塊內無序,但塊與塊之間有序。
②構造一個索引表。其中每個索引項對應一個塊並記錄每塊的起始位置,以及每塊中的最大關鍵字(或最小關鍵字)。索引表按關鍵字有序排列。
上圖所示為一個索引順序表。其中包括三個塊,第一個塊的其實地址為0,塊內最大關鍵字為25;第二個塊的起始地址為5,塊內最大關鍵字為58;第三個塊的起始地址為10,塊內最大關鍵字為88。
分塊查詢的基本過程:
①首先,將待查關鍵字k與索引表中的關鍵字進行比較,以確定待查記錄所在的塊。具體的可用順序查詢法或折半查詢法進行。
②進一步用順序查詢法,在相應塊內查詢關鍵字為k的元素。
分塊查詢法:
#include<iostream> using namespace std; int main() { cout<<"請輸入列表中資料元素的個數"<<endl; int num1=0; //列表中資料元素的個數 cin>>num1; int arr[num1]; cout<<"請依次輸入"<<num1<<"個數據"<<endl; for(int i=0;i<num1;i++) { cin>>arr[i]; } int num2=0; //把資料分為num2個塊 cout<<"請輸入需要把資料分成多少塊"<<endl; cin>>num2; int table[2][num2]; cout<<"請從小到大輸入"<<num2<<"個數據,對各塊的起始地址進行賦值"<<endl; for(int i=0;i<num2;i++) { cin>>table[1][i]; } cout<<"請依次將各個塊的最大值輸入"<<endl; for(int i=0;i<num2;i++) { cin>>table[0][i]; } //開始查詢 cout<<"請輸入要查詢的值"<<endl; int key=0; cin>>key; int low=0,high=num2-1; int num3;//key位於第num3塊 int temp=num2-1; //採用順序查詢法倒序查詢 while(key<=table[0][temp]&&temp>=0) { num3=temp; temp--; } cout<<"資料位於第"<<num3<<"塊"<<endl; //在塊內查詢 int j=table[1][num3]; while(j<table[1][num3+1]||j<num1) { if(key==arr[j]) { cout<<"資料元素"<<key<<"位於第"<<j<<"個"; return 0; } else { j++; } } cout<<"找不到資料元素:"<<key<<endl; }
測試結果: