文件关键字学习 严蔚敏讲数据结构笔记28

最近使用开发的过程中出现了一个小问题,顺便记载一下原因和方法--文件关键字

    二、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的幂次时,还应考虑

 

 

 

     

    

 
 

     

    

 
 
 
 

     

 

    以上是看视频的全体条记。

文章结束给大家分享下程序员的一些笑话语录: 《诺基亚投资手机浏览器UCWEB,资金不详或控股》杯具了,好不容易养大的闺女嫁外国。(心疼是你养的吗?中国创业型公司创业初期哪个从国有银行贷到过钱?)

--------------------------------- 原创文章 By
文件和关键字
---------------------------------

posted @ 2013-05-30 20:34  坚固66  阅读(274)  评论(0编辑  收藏  举报