查找(线性索引)
【1】线性索引
索引就是把一个关键字与它对应的记录相关联的的过程。
索引是为检索而存在的。
一个索引由若干个索引项构成,每个索引项至少应包含关键字和其对应的记录在存储器中的位置等信息。
索引技术是组织大型数据库以及磁盘文件的一种重要技术。
索引按照结构可以分为线性索引,树形索引和多级索引。
所谓线性索引就是将索引项集合组织为线性结构,也称为索引表。
重点了解三种线性索引:稠密索引,分块索引和倒排索引。
【2】稠密索引
稠密索引是指在线性索引中,将数据集中的每个记录对应一个索引项。
所下图所示:
对于稠密索引这个索引表而言,索引项一定是按照关键码有序的排列。
为什么要这样做呢?
索引项有序也就意味着,我们要查找关键字时,可以用折半,插值及斐波那契等有序查找算法。
比如要查找关键字18的记录,如果直接从右侧的数据表中查找,那只能顺序查找。
需要查找6次才可以看到结果!!
而如果是从侧的索引表中查找,只需两次折半查找就可以得到18对应的指针。对应找到结果。
好吧!以上显然是稠密所以优点。
如果数据集非常大,比如上亿,那也就意味着索引也得同样的数据集长度规模。
对于内存有限的计算机来说,可能就需要反复去访问磁盘,查找性能大大下降。
稠密索引文件的每个记录都有一个索引项,记录在数据区存放是任意的,但索引是按序的,这种索引称为稠密索引。
稠密索引文件的索引查找、更新都较方便,但由于索引项多,占用空间较大。
【3】分块索引
注意理解:稠密索引是因为索引项和数据集的记录个数相同,所以空间代价很大。
如何减少索引项的个数呢?
我们可以对数据集进行分块,使其分块有序,然后再对每一块建立一个索引项(类似于图书馆的分块)。
分块有序是把数据集的记录分成了若干块,并且这些块需要满足两个条件:
(1)块内无序
每一块内的记录不要求有序
(2)块间有序
比如要求第二块所以记录的关键字均要大于第一块中所有记录的关键字,第三块要大于第二块。
只有块间有序才有可能在查找时带来效率。
对于分块有序的数据集,将每块对应一个索引项,这种索引方法叫做分块索引。
分块索引的索引项结构分为三个数据项:
a: 最大关键码--存储每一块中的最大关键字。
b: 存储每一块中记录的个数以便于循环时使用。
c: 用于指向块首数据元素的指针,便于开始对这一块中记录进行遍历。
如下图所示:
在分块索引表中查找,可以分为两步:
a: 在分块索引表中查找要查的关键字所在块。
由于分块索引表是块间有序的,因此很容易利用折半插值等算法得到结果。
b:根据块首指针找到相应的块,并在块中顺序查找关键码。
因为块中可以是无序的,因此只能顺序查找。
【4】倒排索引
关于倒排索引,请参见一下几篇文章:
(1)《倒排索引1》
(2)《倒排索引2》
Good Good Study, Day Day Up.
顺序 选择 循环 总结