1. 程式人生 > >8.2.3 分塊查詢法

8.2.3 分塊查詢法

分塊查詢法要求將列表組織成以下兩種索引順序結構:

①首先將列表分成若干個塊(子表)。一般情況下,塊的長度均勻,最後一塊可以不滿。每塊中元素任意排列,即塊內無序,但塊與塊之間有序。

②構造一個索引表。其中每個索引項對應一個塊並記錄每塊的起始位置,以及每塊中的最大關鍵字(或最小關鍵字)。索引表按關鍵字有序排列。

 

上圖所示為一個索引順序表。其中包括三個塊,第一個塊的其實地址為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; 
} 

 測試結果: