注:本文同步发布于稀土掘金。
4 线性索引查找
4.1 概述
索引就是把一个关键字与它对应的记录相关联的过程,一个索引由若干个索引项构成,每个索引项至少应包含关键字和其对应的记录在存储器中的位置等信息。
索引按照结构可分为线性索引、树形索引和多级索引,本文只介绍线性索引,所谓线性索引,就是将索引项集合组织为线性结构,也称为索引表。
4.2 稠密索引
稠密索引是指在线性索引中,将数据集中的每个记录对应一个索引项,如下所示:
由于稠密索引的索引项与数据集的数据量相同,因而稠密索引的数据量往往很大,因此对于稠密索引这个索引表来说,索引项一定是按照关键码有序的排列。
折半查找到插值查找,都可以在稠密索引中进行高效使用。
4.3 分块索引
稠密索引因为索引项与数据集的记录个数相同,所以空间代价很大,为了减少索引项的个数,我们可以对数据集进行分块,使其分块有序,然后再对每一块建立一个索引项,从而减少索引项的数量。
分块有序,是把数据集的记录分成了若干块,并且这些块需要满足两个条件:
(1) 块内无序,即每一块内的记录不要求有序;
(2) 块间有序,块和块之间是有顺序的;
对于分块有序的数据集,将每块对应于一个索引项,这种索引方法叫做分块索引。分块索引的索引项结构分三个数据项:
(1) 最大关键码,它存储每一块中的最大关键字,这样的好处是可以使得在它之后的下一块中的最小关键字也能比这一块最大的关键字要大;
(2) 存储了块中的记录个数,以便于循环时使用;
(3) 用于指向块首数据元素的指针,便于开始对这一块中记录进行遍历;
如下所示:
在分块索引表中进行查找的步骤为:
(1) 查找关键字所在的块;
(2) 根据块首指针找到相应的块,关在块中顺序查找关键码,因为块内是可以无序的,因此只能使用顺序查找;
4.4 倒排索引
倒排索引(Inverted Index)有索引结构中有两个元素:
(1) 次关键码:即具体的关键字;
(2) 记录号表,存储具有相同次关键字的所有记录的记录号(可以是指向记录的指针或者是该记录的主关键字);
倒排索引中的每一项都包含一个属性值和具有该属性值的各记录的地址,由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因此称为倒排索引。
例如有两本书:
倒排索引表类似如下所示:
其中英文单词就是次关键码,而文章编号则为记录号表。