直接存取文件指的是利用杂凑(Hash)法进行组织的文件。它类似于哈希表,即根据文件中关键字的特点设计一种哈希函数和处理冲突的方法将记录散列到存储设备上,故又称散列文件。
与哈希表不同的是,对于文件来说,磁盘上的文件记录通常是成组存放的。若干个记录组成一个存储单位,在散列文件中,这个存储单位叫做桶(Bucket)。假若一个桶能存放m个记录,这就是说,m个同义词的记录可以存放在同一地址的桶中,而当第m+1个同义词出现时才发生“溢出”。处理溢出也可采用哈希表中处理冲突的各种方法,但对散列文件,主要采用链地址法。
当发生“溢出”时,需要将第m+1个同义词存放到另一个桶中,通常称此桶为“溢出桶”;相对地,称前m个同义词存放的桶为“基桶”。溢出桶和基桶大小相同,相互之间用指针相链接。当在基桶中没有找到待查记录时,就顺指针所指到溢出桶中进行查找。因此,希望同一散列地址的溢出桶和基桶在磁盘上的物理位置不要相距太远﹐最好在同一柱面上。例如,某一文件有18个记录,其关键字分别为278,109,063,930,589,184,505,269,008,083,164,215,330,810,620,110,384,355。桶的容量m=3,桶数b=7。用除留余数法作哈希函数H(key)=key MOD7。由此得到的直接存取文件如图1所示。
在直接文件中进行查找时,首先根据给定值求得哈希地址(即基桶号),将基桶的记录读入内存进行顺序查找,若找到关键字等于给定值的记录,则检索成功;否则,若基桶内没有填满记录或其指针域为空,则文件内不含有待查记录﹔否则根据指针域的值的指示将溢出桶的记录读入内存继续进行顺序