【数据结构】分块查找

本文详细介绍了分块查找算法的基本步骤,包括构建索引表、使用二分查找定位关键字所在块,以及在块中进行顺序查找的过程。文章还提供了C++实现代码,展示了如何创建主表和索引表,以及如何通过二分查找确定关键字位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.分块查找的步骤:

  • 选取各块中的最大关键字构成一个索引表
  • 对索引表尽心二分查找或顺序查找,对块中的数据进行顺序查找

2.分块查找特点:

  • 索引表为有序表
  • 块内节点可以无序
  • 前一块的中的最大值要小于后一块的最小值

3.C++实现:

在这里插入图片描述

#include<iostream>
using namespace std;

typedef struct node{
	int key;   //关键字 
	int max;   //最大关键字下标 
}index;   

typedef struct datatype{
	int key; //关键字 
};

void creat_primary_table(datatype s[], int n){ //创建主表 
	cout<<"请输入元素(要求前一块的最大值小于后一块的最小值):"<<endl;
	int num,temp;
	for(int i=0;i<=n-1;i++){
		cin>>num;
		s[i].key=num;
	} 
	//cout<<"主表创建成功"<<endl;
}
 
void creat_index_table(datatype	*s,int n,index *index,int &m,int L){ //按L块建立索引表 
	int keynum=n/L;
	for(m=0;m<L;m++){//对索引表一一赋值 
		index[m].key=s[m*keynum].key;
		for(int i=m*keynum;i<=m*keynum+keynum-1;i++){//查找每一块中的最大关键字 
			if(index[m].key<s[i].key){
				index[m].key=s[i].key;
				index[m].max=i;
			} 
		}
	}
	//cout<<"索引表创建成功"; 
} 
	
int Bi_search(index *index,datatype *s,int m,int keynum,int key){//二分查找确定关键字所在块,在块中进行顺序查找 
	//index为索引表,s为主表,m为索引表关键字个数,keynum为每块含有的关键字个数 
	int low=0,high=m-1,mid=(low+high)/2;
	while(low<=high && high>-1){
		if(index[mid].key==key){
			high=mid;
			break;
		}
		else if(key<index[mid].key) high=mid-1;
		else low=mid+1;
		mid=(low+high)/2;
	}	
	int i=0,j;	
	if(key>index[mid].key)
		i=index[mid+1].max;
	else
		i=index[mid].max;
	i=i/keynum+1;	//二分查找记录所在块,此时i的值为记录所在的块
	for(j=i*keynum-keynum;j<i*keynum && j<m*keynum;j++)
		if(key==s[j].key)   //查找成功返回记录在主表中的下标 
			return j;
		if(j>=m*keynum || j>i*keynum-1){
			cout<<"未找到该元素";
			return -1; 
		}			
}

int main(){
	int n=0,m=0,L=0;
	cout<<"请输入元素总个数:";  
	cin>>n;
	datatype s[n];
	index index[n];
	creat_primary_table(s,n);  //s为主表,n为关键字个数
	cout<<"创建的主表为:";
	for(int i=0;i<=n-1;i++)
		cout<<s[i].key<<" ";
	cout<<endl<<"请输入需要分的块数:";
	cin>>L;
	creat_index_table(s,n,index,m,L);
	cout<<"创建的索引表为:"<<endl;
	for(int i=0;i<=m-1;i++){
		cout<<index[i].key<<" ";
	}
	
	int key,subcript;
	cout<<endl<<"请输入要查询元素(以-1退出):";
	cin>>key;
	while(key!=-1){
		subcript=Bi_search(index,s,m,n/L,key);
		if(subcript!=-1)
			cout<<"查询元素"<<s[subcript].key<<"的下标为:"<<subcript;
		cout<<endl<<"请输入要查询元素(以-1退出):";
		cin>>key;
	}
	system("pause");	
	return 0;
	
} 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值