Bootstrap

一文彻底搞懂数据结构中索引查找(分块查找)到底是什么?

数据太多,杂乱无章,查找困难!但是,在数据库中利用索引能过很容易的就查找到我们所需要的数据。

索引查找又称为分块查找,是一种介于顺序查找和二分查找之间的一种查找方法,索引查找的基本思想是:首先查找索引表,可用二分查找或顺序查找,然后在确定的块中进行顺序查找。

在实现索引查找算法前需要弄清楚以下三个术语。

(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 匹配的数据。

返回结果:

注意:

查找表中的数据可以利用顺序存储结构或者是链式存储结构。(建议采用链式存储结构)。

;