最近使用开发的过程中出现了一个小问题,顺便记载一下原因和方法--文件关键字
二、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的幂次时,还应考虑
|
以上是看视频的全体条记。
文章结束给大家分享下程序员的一些笑话语录: 《诺基亚投资手机浏览器UCWEB,资金不详或控股》杯具了,好不容易养大的闺女嫁外国。(心疼是你养的吗?中国创业型公司创业初期哪个从国有银行贷到过钱?)
--------------------------------- 原创文章 By
文件和关键字
---------------------------------