学习 严蔚敏讲数据结构笔记28
来源:互联网 发布:数据归一化的方法 编辑:程序博客网 时间:2024/06/05 23:48
二、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的幂次时,还应考虑
以上是看视频的全部笔记。
- 学习 严蔚敏讲数据结构笔记28
- 学习 严蔚敏讲数据结构笔记01
- 学习 严蔚敏讲数据结构笔记02
- 学习 严蔚敏讲数据结构笔记03
- 学习 严蔚敏讲数据结构笔记04
- 学习 严蔚敏讲数据结构笔记05
- 学习 严蔚敏讲数据结构笔记06
- 学习 严蔚敏讲数据结构笔记07
- 学习 严蔚敏讲数据结构笔记08
- 学习 严蔚敏讲数据结构笔记09
- 学习 严蔚敏讲数据结构笔记10
- 学习 严蔚敏讲数据结构笔记11
- 学习 严蔚敏讲数据结构笔记12
- 学习 严蔚敏讲数据结构笔记13
- 学习 严蔚敏讲数据结构笔记14
- 学习 严蔚敏讲数据结构笔记15
- 学习 严蔚敏讲数据结构笔记16
- 学习 严蔚敏讲数据结构笔记17
- ActionContext和ServletActionContext小结
- 文件逻辑结构、外存分配和空闲空间管理
- 软件项目进度延期关键因素和应对措施
- arm开发板的一些文件的说明
- 信号量与互斥锁
- 学习 严蔚敏讲数据结构笔记28
- java前台线程和后台线程
- GDB 命令行参数
- 浏览器定位页面高度
- 什么是阿干特图(the Argand diagram)
- UNIX SIGTERM等信号意义
- 能上qq打不开网页
- 分布式计算实践(C#)-1
- CocoaChina2013开发者大会演讲稿-主会场-陈昊芝