文件是逻辑上相关的记录的集合。通常一个文件的各个记录是按照某种次序排列起来的。可以按记录中关键字值的大小,也可以按各个记录存入文件的时间先后排列。这样各记录间自然形成一种线性关系,所以一般情况下,文件被看成是一种线性结构。
计算机上的文件一般分为操作系统文件和数据库文件。操作系统文件仅仅是一组连续的字符序列,无结构无解释。数据库文件是带有结构的记录文件的集合,每个记录都是一个或多个数据结构,也称为逻辑记录。
文件是存在外存储器上的。为了有效分配外存空间,多个扇区通常形成簇或块。簇(块)是文件的最小分配单位,它们的大小由操作系统决定。文件存储器上的文件称为物理文件,一簇或块(物理块)中的信息称为物理记录。用户读/写的记录是指逻辑记录,查找该逻辑记录所在的物理块是操作系统文件管理器的职责,文件管理是操作系统的主要功能模块。
文件的结构就是磁盘上数据的组织方式,我们知道磁盘上的数据读写时间10ms~100ms,相当的满!所以文件结构的设计目的就是尽量减少数据读写次数。下面介绍几种主要的文件结构:顺序文件、散列文件、索引文件、倒排文件。
顺序文件:顾名思义,数据是按顺序存放的,那就是线性表咯!顺序文件又分为串行处理文件和顺序处理文件。
串行处理文件的记录未按关键字值排序,它的排序是按照每条记录的访问频率组织的。串行处理文件的顺序搜索: 从文件的第一个记录开始,依次将待查关键字值与文件中的记录的关键字值进行比较,直到成功找到该记录,或直到文件搜索完毕,搜索失败终止。
顺序文件已按关键字排序。有序表上的各种搜索方法原则上都可以用于顺序处理文件的搜索,如顺序搜索和二分搜索等。但由于文件是外存上的数据结构,在考虑算法时,必须立足于尽量减少访外次数,因此顺序处理文件的搜索算法有自己的特点。下面介绍顺序处理文件上的分块插值搜索。因为磁盘的读写单位是块(Block),所以在搜索的时候可以根据关键字值的范围确定在哪个设备的哪个块上,从而达到缩小搜索范围的效果。
散列文件:从名字上大家也能猜出来肯定跟散列表有关联,不错,它从形式上跟散列表是类似的。不过,那个存放数据的线性单元改名字了叫”基桶“,分开链接法的单链表改叫”溢出桶“。当需要插入记录时,可将其插在最后一个桶(基桶或溢出桶)中,若该桶已装满,则在该桶后新增加一个溢出桶,将新记录插入该新桶中。先从基桶开始查找可用空间,包括被打上删除标记的空间。如有,则将新记录存于该处,否则再新增溢出桶。当需要删除记录时,仅需对被删除的记录作删除标记即可。当被删除的记录不在最后一个桶中时,将最后一个桶中的记录移到存放被删除记录的位置。
有稀疏索引就有稠密索引,当文件是串行处理文件时,就得对每个记录建立一个索引项,组成索引表,这种索引就称为稠密索引。
B-树: m叉搜索树或者是一棵空树,或者是一棵满足下列特性的树:
(1)根结点最多有m棵子树,并具有如下结构: n,P0,(K1,P1),(K2,P2),…,(Kn,Pn)其中,Pi是指向子树的指针,0<i<n<m,Ki是元素的关键字值,1<i <n<m;
(2) Ki<Ki+1 , 1<i<n;
(3) 子树Pi上所有关键字值都大于Ki,小于Ki+1,0<i<n;
(4) 子树P0上所有关键字值都小于K1,子树Pn上的所有关键字值都大于Kn;
(5) 子树Pi,0<i<n也是m叉搜索树。一棵m阶B+树或者是空树,或者是满足下列特性的树:
每个B+树结点的结构如下:N,(P0,K0),(P1,K1),…,(Pn-1,Kn-1)其中,Pi是指向子树的指针,Ki是子树Pi上的最大关键字值,Ki<Ki+1 0<i<n<m。