二、VSAM文件
VSAM(VisualStorageAccessMethod)文件是利用操作系统中提供的虚拟存储器的功能组织的文件,免除了用户为读写记录时直接对外存进行操作,对用户而言,文件只有控制区间和控制区域等逻辑存储单位。
1. 文件结构
2. 控制区间是用户进行依次存取的逻辑单位,可看成是一个逻辑磁道。但它的实际大小和物理磁道无关。
控制区域由若干控制区间和它们的索引项组成,可看成是一个逻辑柱面。
VSAM文件初建时,每个控制区间内的记录数不足额定数,并且有的控制区间内的记录数不为零。
3. 顺序集本身是一个单链表,它包含文件的全部索引项,同时,顺序集中的每个结点即为B+树的叶子结点,索引集中的结点即为B+树的非叶子结点。
4. 文件的操作
检索:可进行顺序存取和按关键字存取;
插入:按关键字大小插入在某个适当的控制区间中,当控制区间中的记录数超过文件规定的大小时,要“分裂”控制区间,必要时,还需要“分裂”控制区域。
删除:必须“真实地”删除记录,因此要在控制区间内“移动”记录
5.VSAM文件通常被作为大型索引顺序文件的标准组织方式。
其优点是:动态呢分配和释放空间,不需要重组文件;能较快地实现对“后插入”的记录的检索。
其缺点是:占有较多的存储空间,一般只能保持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的幂次时,还应考虑
|
以上是看视频的全部笔记。