学习 严蔚敏讲数据结构笔记28

来源:互联网 发布:数据归一化的方法 编辑:程序博客网 时间:2024/06/05 23:48

二、VSAM文件

VSAM(VisualStorageAccessMethod)文件是利用操作系统中提供的虚拟存储器的功能组织的文件,免除了用户为读写记录时直接对外存进行操作,对用户而言,文件只有控制区间和控制区域等逻辑存储单位。

1.      文件结构

2.      控制区间是用户进行依次存取的逻辑单位,可看成是一个逻辑磁道。但它的实际大小和物理磁道无关。

控制区域由若干控制区间和它们的索引项组成,可看成是一个逻辑柱面。

VSAM文件初建时,每个控制区间内的记录数不足额定数,并且有的控制区间内的记录数不为零。

3.      顺序集本身是一个单链表,它包含文件的全部索引项,同时,顺序集中的每个结点即为B+树的叶子结点,索引集中的结点即为B+树的非叶子结点。

4.      文件的操作

检索:可进行顺序存取和按关键字存取;

插入:按关键字大小插入在某个适当的控制区间中,当控制区间中的记录数超过文件规定的大小时,要“分裂”控制区间,必要时,还需要“分裂”控制区域。

删除:必须“真实地”删除记录,因此要在控制区间内“移动”记录

5VSAM文件通常被作为大型索引顺序文件的标准组织方式。

其优点是:动态呢分配和释放空间,不需要重组文件;能较快地实现对“后插入”的记录的检索。

其缺点是:占有较多的存储空间,一般只能保持75%的存储空间利用率。(因此,一般情况下,极少产生需要分裂控制区域的情况)。

 

12.5直接存取文件

1.和前几节讨论论的文件组织方法不同,直接存取文件的特点是,由记录的关键字“直接”得到记录在外存上映象地址。

类似于哈希表的构造方法,根据文件中关键字的特点设计一种“哈希函数”和“处理冲突的方法“将记录散列到外存储设备上,又称“散列文件”。

2哈希文件结构

由于记录在外存上是成组存放的,因此允许多个记录映象到同一个地址上。在此,称外存储器中存放多个记录的“数据块”为“桶”。因此由哈希函数得到的映象地址为“桶地址”。

例如:有一组关键字如下所列

{589,063,269,505,764,182,166,330}

假设哈希函数为key MOD 7,每个同可以容纳3个记录(称桶的容量为3),则哈希文件如下:

在哈希文件中,“冲突”和“溢出”是不同的概念,一般情况下,假设桶的大小为m,则允许哈希地址产生m-1次的冲突,当发生第m次冲突时,才需要进行“冲突处理”,对散列文件而言,通常采用链地址法出路冲突。为区别起见,称直接“散列”的数据块为“基桶”,而“溢出”存放的数据块为“溢出桶”。

 

3.文件的操作

检索:只能进行按关键字的查找,不能进行顺序查找。检索时,先在基桶内进行查找,若不存在,则再到溢出桶中进行查找。

插入:当查找不成功时,将记录插入在相应的基桶或溢出桶内。

删除:对被删记录做特殊标记

 

5.      优点:记录随机存放,不需要进行排序:插入、删除方便,存取速度快,节省存储空间,不需要索引区。

缺点:不能进行顺序存取,在经过多次插入和删除操作之后,需进行“重组文件”的操作。

 

12.多关键字文件

一、多关键字文件的特点

除需要对主关键字建立“主索引”外,尚需对各个次关键字建立“次索引”。

次索引项:

 

二、次索引的组织方法

1.多重链表文件

特点:将所有具有相同次关键字的记录链接在同一个链表中,该链表的头指针即为次索引项中“指针域”的值。

2.倒排文件

特点:将所有具有相同次关键字的记录构成一个次索引顺序表,此时的次索引顺序表中仅存放记录的“主关键字”或记录的“物理记录号”,次索引项中的“指针”指向相应的次索引顺序表。

3.次关键字索引表本身的结构可以是顺序表,也可以是树表或哈希表,视具体的次关键字的特性而定。

 

本章学习要求:

熟悉各类文件的特点,构造方法以及如何实现检索,插入和删除。

 

9.15

47_001

int Search_Sq(SSTable ST, KeyType key)

{

         ST.elem[ST.length+1].key  = key;

         i  = 1;

         while(ST.elem[i].key  > key)

                   ++  i;

         if(ST.elem[i].key  = key && i != ST.length + 1)

                   return  i;

         else

                   return  0;

}

 

 

9.18

47_002

int IsBSTree(BiTree T)

{

         if(!  T)

                   return  1;

         else  if(IsBSTree(T->lchild))

                  if(pre->data < T->data)

                   {

                            pre  = T;

                            return(IsBSTree(T->rchild));

                   }

                   else 

                            return  0;

}

9.13

47_003

typedef struct

{

         KeyType  data;

         struct  *next;

} Lnode, *Link;

 

typedef struct

{

         Link  *elem; //指针数组

         int  count; //当前记录个数

}LHashTable; //链地址处理冲突的哈希表

 

void CrtLHTable(LHashTable &LH)

{

         for(i  = 0; i < m; i ++)

                   LH[i]  = NULL;

         for(LH.count  = 0, j = 0; j < n; j ++)

         {

                   scanf(key);

                   i  = H(key);

                   p  = LH[i];

                   while(p  && p->data != key)

                            p  = p->next;

                   if(!  p)

                   {

                            s  = (Link) malloc(sizeof(Lnode));

                            s->data  = key;

                            LH.count  ++;

                            s->next  = LH[i];

                            LH[i]  = s;

                   }

         }

}

 

 

48_001

i = 0;

k = 1;

j = n+1;

while(k != j)

{

         if(H.r[k]  = 'red')

         {

                   i  ++;

                   H.r[i]  <-- --> H.r[k];

                   k  ++;

         }

         else  if(H.r[k] = 'while')

                            k  ++;

         else

         {

                   j  --;

                   H.r[k]  <-- --> H.r[j];

         }

}

二、利用“选择排序”的思想

10.17

48_001

void adjust(HeapType &H, int p)

{

         //已知H.r[1..p]是堆

         //现调用H.r[p+1],使H.r[1..p+1]为堆

         j  = p + 1;

         rc  = H.r[p+1];

         for(i  = j / 2; j > 1; i = j/2)

         {

                   if(H.r[i].key  >= rc.key)

                            break;

                   H.r[j]  = H.r[i];

                   j  = i;

         }

}

 

当为2的幂次时,还应考虑

 

 

 

 

 

以上是看视频的全部笔记。

原创粉丝点击