1、基本概念
索引查找又称分级查找。
索引存储的基本思想是:首先把一个集合或线性表(他们对应为主表)按照一定的函数关系或条件划分成若干个逻辑上的子表,为每个子表分别建立一个索引项,由所有
这些索引项构成主表的一个索引表,然后,可采用顺序或链接的方式来存储索引表和每个子表。
索引表的类型可定义如下:
struct IndexItem
{
IndexKeyType index;//IndexKeyType为事先定义的索引值类型
int start; //子表中第一个元素所在的下标位置
int length; //子表的长度域
};
typedef struct IndexItem indexlist[ILMSize];//ILMSize为事先定义的整型常量,大于等于索引项数m
主表的类型可定义如下:
typedef struct ElemType mainlist[MaxSize];//MaxSize为事先定义的整型常量,大于等于主表中元素的个数n
在索引表中的每个索引项对应多条记录,则称为稀疏索引,若每个索引项唯一对应一条记录,则称为稠密索引。
2、索引查找算法
过程:
首先根据给定的索引值K1,在索引表上查找出索引值等于K1的索引项,以确定对应子表在主表中的开始位置和长度,然后再根据给定的关键字K2,在对应的子表中查找出
关键字等于K2的元素。
设数组A是具有mainlist类型的一个主表,数组B是具有indexlist类型的在主表A上建立的一个索引表,m为索引表B的实际长度,即所含的索引项的个数,K1和K2分别为给定
带查找的索引值和关键字,并假定每个子表采用顺序存储,则索引查找算法为:
int Indsch(mainlist A, indexlist B, int m, IndexKeyType K1, KeyType K2)
{//利用主表A和大小为 m 的索引表B索引查找索引值为K1,关键字为K2的记录
//返回该记录在主表中的下标位置,若查找失败则返回-1
int i, j;
for (i = 0; i < m; i++)
if (K1 == B[i].index)
break;
if (i == m)
return -1; //查找失败