数据结构之索引文件

        除了文件本身(称做数据区)之外,另建立一张指示逻辑记录和物理记录之间一一对应关系的表——索引表。这类包括文件数据区和索引表两大部分的文件称做索引文件。

        图1所示为两个索引表的例子。索引表中的每一项称做索引项。不论主文件是否按关键字有序,索引表中的索引项总是按关键字(或逻辑记录号)顺序排列。若数据区中的记录也按关键字顺序排列,则称索引顺序文件。反之,若数据区中记录不按关键字顺序排列,则称索引非顺序文件。​

《数据结构之索引文件》 图1 索引表示例

​        索引表是由系统程序自动生成的。在记录输入建立数据区的同时建立一个索引表,表中的索引项按记录输入的先后次序排列,待全部记录输入完毕后再对索引表进行排序。例如,对应于图2(a)的数据文件,其索引表如图2(b)所示,而图2(c)为文件记录输入过程中建立的索引表。

《数据结构之索引文件》 图2 索引非顺序文件示例 (a)文件数据区;(b)索引表 (c)输入过程中建立的索引表

​        索引文件的检索方式为直接存取或按关键字(进行简单询问)存取,检索过程,应分两步进行:首先,查找索引表,若索引表上存在该记录,则根据索引项的指示读取外存上该记录;否则说明外存上不存在该记录,也就不需要访问外存。由于索引项的长度比记录小得多,则通常可将索引表一次读入内存,由此在索引文件中进行检索只访问外存两次,即一次读索引,一次读记录。并且由于索引表是有序的;则查找索引表时可用折半查找法。

        索引文件的修改也容易进行。删除一个记录时,仅需删去相应的索引项;插人一个记录时,应将记录置于数据区的末尾,同时在索引表中插人索引项;更新记录时,应将更新后的记录置于数据区的末尾,同时修改索引表中相应的索引项。

        当记录数目很大时,索引表也很大,以致一个物理块容纳不下。在这种情况下查阅索引仍要多次访问外存。为此,可以对索引表建立一个索引,称为查找表。假设图2(b)的索引表需占用3个物理块的外存,每–个物理块容纳3个索引,则建立的查找表如图3所示。检索记录时,先查找查找表,再查索引表,然后读取记录。3次访问外存即可。若查找表中项目还多,则可建立更高一级的索引。通常最高可有四级索引:数据文件→索引表→查找表→第二查找表→第三查找表。而检索过程从最高–级索引即第三查找表开始,仅需5次访问外存。

《数据结构之索引文件》 图3 图2(b)中索引表的索引

​          上述的多级索引是一种静态索引,各级索引均为顺序表结构。其结构简单,但修改很不方便,每次修改都要重组索引。因此,当数据文件在使用过程中记录变动较多时,应采用动态索引。如二叉排序树(或二叉平衡树)、B-树以及键树,这些都是树表结构,插入、删除都很方便。又由于它本身是层次结构,则无需建立多级索引,而且建立索引表的过程即排序的过程。通常,当数据文件的记录数不很多,内存容量足以容纳整个索引表时可采用二叉排序树(或平衡树)作索引。反之,当文件很大时,索引表(树表)本身也在外存,则查找索引时尚需多次访问外存,并且,访问外存的次数恰为查找路径上的结点数。显然,为减少访问外存的次数,就应尽量缩减索引表的深度。因此,此时宜采用m叉的B-树作索引表。m的选择取决于索引项的多少和缓冲区的大小。,键树适用于作某些特殊类型的关键字的索引表。和上述对排序树的讨论类似,当索引表不大时,可采用双链表作存储结构(此时索引表在内存);反之,则采用Trie树。总之,由于访问外存的时间比内存查找的时间大得多,所以对外存中索引表的查找效能主要取决于访问外存的次数,即索引表的深度。

        显然,索引文件只能是磁盘文件。

        综上所述,由于数据文件中记录不按关键字顺序排列,则必须对每个记录建立一个索引项,如此建立的索引表称之为稠密索引,它的特点是可以在索引表中进行“预查找”,即从索引表便可确定待查记录是否存在或作某些逻辑运算。如果数据文件中的记录按关键字顺序有序,则可对一组记录建立一个索引项,这种索引表称之为非稠密索引,它不能进行“预查找”,但索引表占用的存储空间少,管理要求低。

        然后今天就讲到这里啦,大家记得点赞收藏,分享转发,关注小哥哥哦! 最后,如果你想学或者正在学C/C++编程,可以加入小编的编程学习C/C++企鹅圈《数据结构之索引文件》https://jq.qq.com/?_wv=1027&k=vLNylJeG

    原文作者:南风fahaxiki
    原文地址: https://blog.csdn.net/m0_64407685/article/details/124323705
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞