数据太多,杂乱无章,查找困难!但是,在数据库中利用索引能过很容易的就查找到我们所需要的数据。
索引查找又称为分块查找,是一种介于顺序查找和二分查找之间的一种查找方法,索引查找的基本思想是:首先查找索引表,可用二分查找或顺序查找,然后在确定的块中进行顺序查找。
在实现索引查找算法前需要弄清楚以下三个术语。
(1)主表:即要查找的序列。
(2)查找表:一般我们会将主表分成几个块,每个块中的元素被称为是查找表。
(3)索引表:即索引项的集合。
在利用索引查找时,需要先对数据进行分块。
在索引表中记录了两个数据 :
最大关键字,起始地址(指针项)。
- 索引表的构建:
1) 分块:
第Rk 块中所有关键字< Rk+1块中所有关键字,(k=1, 2, …, L-1)
2) 建立索引项:
关键字项:记载该块中最大关键字值;
指针项: 记载该块第一个记录在表中位置。
3) 所有索引项组成索引表。
如下数据索引查找:
上数据转化成索引表如下:
当我要查找数据:
- k = 38 时
- 是大于第一个块中的最大关键字,但是小于第二个块中的最大关键字,易得 和数据进行匹配的数据在第二个块中,在第二个块中进行顺序查找。查找出结果,返回索引。
- k = 50 时
- 是大于第二个块中的最大关键字,但是小于第三个块中的最大关键字,易得 和数据进行匹配的数据在第三个块中,在第三个块中进行顺序查找。查找出结果,返回索引。
但是问题就来了 ······························
块内的查找如何判断结束 ?
首先根据待查找关键字在索引表当中定位块。定位的方法是:只要 key>索引块i的最大关键值,则i++,定位下一个索引项;直到定位到 索引块,或者把索引项都定位完也没有比key关键字大的索引项。 如果定位到块,则在块内部进行顺序查找。
算法实现:
int IndexSequelSearch(IndexType ls[], DataType s[], int m, KeyType key){
/*索引表为ls[0]-ls[m-1],顺序表为s */
i=0;
while(i<m && key>ls [i ].key) i++;
/*块间查找*/
if(i==m)return -1; /*查找失败*/
else{ /*在块内顺序查找*/
j=ls[ i ].Link;
while(Key!=s[j].key && j<ls[ i+1 ].Link) j++;
if(key = = s[j].key)
return j;
/*查找成功*/
else return -1; /*查找失败*/
}
}
索引顺序查找的ASL?
• ASL=ASL(索引表)+ASL(块内)。
总结:
在索引查找方法中 ,利用的是首先将所得的数据进行排序分块,
将要查找的数据 k 和分块中的最大值进行比较,判断k在哪个分块,
在分块中判断是否数据中有和K 匹配的数据。
返回结果:
注意:
查找表中的数据可以利用顺序存储结构或者是链式存储结构。(建议采用链式存储结构)。