一种新的分块查找表的构思设计与实现

一种新的分块查找表的构思设计与实现

摘要:在书中的分块查找中要求把一个大的线性表分解成若干块,每块中的关键码无序,但块与块之间必须是分块有序的。查找时,首先在索引表中进行查找,确定要找到数据元素所在的块。然后,在相应的块中采用顺序查找,即可找到对应的数据元素。在这种分块查找中,查找效率低,空间浪费过大(因为块与块之间必须留有一定的空间进行插入等操作)。该文设计了一种新的分块查找的存储结构,是基于图的邻接表结构体进行设计出来的,实现了该结构上的基本操作。这种新的分块查找的存储结构能够使存储空间得以合理利用。
关键词:新的分块查找;存储结构;算法设计;

0 引言

文献[1-3]设计实现了新的分块查找的存储结构,在定义新的分块查找的存储结构时,基于图的邻接表存储结构进行设计。在索引顺序表中,实现书中的分块查找,先对要查找的关键字平均分成若干个子表。对每个子表建立一个索引,索引中包含中两部分内容:该子表部分中最大的关键字以及第一个关键字在总表中的位置,即该子表的起始位置。(建立的索引表要求按照关键字进行升序排序,查找表要么整体有序,要么分块有序。)分块有序指的是第二个子表中所有关键字都要大于第一个子表中的最大关键字。进行查找时:
1)确定要查找的关键字可能存在的具体块(子表);
2)在具体的块中进行顺序查找。这样查找效率低,并且造成了空间的浪费现象。
该文设计了这种新的分块查找的存储结构,实现了该结构上的基本算法。该结构解决了上述问题,使得存储空间得以合理利用。

1. 新的分块查找结构体的设计

新的分块查找是基于图的一种顺序存储与链式存储相结合的存储结构。“顺序存储”是指用一个顶点数组存储每一块中的最大关键码,每个数组元素有三个域:最大关键码域(maxkey),块的长度域(length)和指针域(first),最大关键码域用来存放每块中的最大关键码,块的长度域用来存放每块的长度,指针域指向一个单链表,此单链表用来存储每块中除最大关键码外的其他关键码。在此链表中,一个结点是由数据域(data)和指向下一个关键码的指针域(next)。
所以新的分块查找的数据类型可进行如下定义:

#define MAX  20
typedef struct node
{
   
	int data;             --数据域  
	struct node *next;
}node;					  --链表
typedef struct 
{
   
	int Maxkey;			--关键码最大值
	int length;			--块的长度
	struct node *first;
}Block;					--顺序表
typedef struct
{
   
	Block Maxkeys[MAX];		
	int Maxkeynum;		--块的总数
	int num;				--关键码总数
}MaxkeyGraph;

表识符合说明:Block Maxkeys[MAX]:表示顺序存储与链式存储结合构成的数组;Maxkeynum:块的个数;num:关键码的数目。

2 新的分块查找存储结构上基本操作的设计与实现

新的分块查找的基本操作很多,本文只设计了创建,插入,查找,打印操作。其他操作不再讨论。
1)创建操作
创建操作具体为:先输入关键码的数目和块的个数,接下来开始输入每个块中的信息(最大关键码和块的长度),i从0 开始到Maxkeynum开始循环输入,直至输完调出循环。接下来采用头插法开始输入每个块中数据(其他关键码)。相关代码如下:

void CreateMaxkeyGraph(MaxkeyGraph *G)
{
   
	int i,j,k=1;
	node *p;
	printf("请输入块的个数,所有关键码数\n");
	scanf("%d %d",&(G
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值