关于数据结构中的一个数学的问题,具体见描述

栏目:资讯发布:2023-11-29浏览:3收藏

关于数据结构中的一个数学的问题,具体见描述,第1张

在第一个元素前加一个元素的概率是p1,移动的次数是n次,期望就是np1

在第二个元素前加一个元素的概率是p2,移动的次数是n-1次,期望就是(n-1)p2

在第i个元素前加一个元素的概率是pi,移动的次数是n-i+1次,期望就是(n-i+1)pi

全部加起来就是np1+(n-1)p2++(n-i+1)pi++2p(n-1)+pn

Σ表示求和,下标是最小值,上标是最大值,这里表示从i=1到i=n+1的和,就是上面的求和的式子了

题目可能有问题,i=n+1时,n-n-1-1=-2,移动-2次怎么可能,所以那里应该是n-i+1

一个软件系统框架应建立在数据之上,而不是建立在操作之上。一个含抽象数据类型的软件模块应包含定义、表示、实现三个部分。

对每一个数据结构而言,必定存在与它密切相关的一组操作。若操作的种类和数目不同,即使逻辑结构相同,数据结构能起的作用也不同。

不同的数据结构其操作集不同,但下列操作必不可缺:

1 结构的生成;

2 结构的销毁;

3 在结构中查找满足规定条件的数据元素;

4 在结构中插入新的数据元素;

5 删除结构中已经存在的数据元素;

6 遍历。

抽象数据类型:一个数学模型以及定义在该模型上的一组操作。抽象数据类型实际上就是对该数据结构的定义。因为它定义了一个数据的逻辑结构以及在此结构上的一组算法。抽象数据类型可用以下三元组表示:(D,S,P)。D是数据对象,S是D上的关系集,P是对D的基本操作集。ADT的定义为:

ADT 抽象数据类型名{

数据对象:(数据元素集合)

数据关系:(数据关系二元组结合)

基本操作:(操作函数的罗列)

} ADT 抽象数据类型名;

抽象数据类型有两个重要特性:

数据抽象

o 用ADT描述程序处理的实体时,强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)。

数据封装

o 将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节。

数据结构中,逻辑上(逻辑结构:数据元素之间的逻辑关系)可以把数据结构分成线性结构和非线性结构。线性结构的顺序存储结构是一种随机存取的存储结构,线性表的链式存储结构是一种顺序存取的存储结构。线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。逻辑结构与数据元素本身的形式、内容、相对位置、所含结点个数都无关。

算法的设计取决于数据(逻辑)结构,而算法的实现依赖于采用的存储结构。数据的运算是在数据的逻辑结构上定义的操作算法,如检索、插入、删除、更新的排序等。

数据结构的形式定义为:数据结构是一个二元组:

Data-Structure=(D,S)

其中:D是数据元素的有限集,S是D上关系的有限集。

数据结构不同于数据类型,也不同于数据对象,它不仅要描述数据类型的数据对象,而且要描述数据对象各元素之间的相互关系。

题目中的答案都没错:

第一题:由分枝数,有2D+30+1(树根)=N;D为双分枝结点,N为总结点数

由数结点数有,50+30+D=N。解上面两个方程可得N=129

第二题,当树只有左子树时

第三题,小于等于

第四题,n+n^2约等于n^2。后面的乘不能忽略

54 文件系统的实现

541 存储空间的分配与回收

在计算机系统中,存储空间是一种宝贵的资源。外存储设备中的空间容量虽然比较大,但也不是无限的,故对文件删除之后而不再使用的空间,必须加以回收,然后在建立文件等操作中重新利用。

对于制度的存储设备,无所谓回收,也无所谓动态分配,这种存储设备在物理上就是不可重用的。

为了进行存储空间的分配与回收,在外存储设备上设置有空闲空间登记表,该表动态跟踪该外存储设备上所有还没有分配给任何文件的空闲块的数目和块号。

该空闲空间登记表虽然称为表,但不一定以一个二维表格的形式实现。从方便、高效和安全的角度考虑,通常把空闲空间登记表放在存储介质上。

对空闲空间表的访问与修改工作是经常发生的。在进行文件删除、文件建立、写文件等操作中都会访问和修改空闲空间表。

在设计空闲空间登记表的数据结构时,一般有四种不同的方案可以考虑,下面分别介绍。

1、 位示图

位示图的基本思想是,利用一串二进制位(BIT)的值来反映磁盘空间的分配使用情况。在位示图中,没一个磁盘中物理块用一个二进制位对应,如果某个物理块为空闲,则相应的二进制位为0;如果该物理块已分配了,则相应的二进位为,如图5-15所示。

位示图对空间分配情况的描述能力强。一个二进位就描述一个物理块的状态。另外,位示图占用空间较小,因此可以复制到内存,使查找既方便又快速。位示图适用于各种文件物理结构的文件系统。使用位示图能够简单有效地在盘上找到N个连续的空闲块。

2、 空闲块表

空闲块表是专门为空闲块建立的一张表,该表记录外存储器全部空闲的物理块:包括每个空闲块的第一个空闲物理块号和该空闲块只能感空闲物理块的个数。如图5-16所示。空闲块表方式特别适合于文件物理结构为顺序结构的文件系统。

在建立新文件时,应该寻找一组连续的空闲物理块,其空闲块个数恰好等于所申请值,或接近于所申请值。系统首先查找空闲块表,主要查看该空闲块表项中是否有符合上述申请值的对应表项,如果有,就将该表项从空闲块表中删去,并且把所对应的一组连续的空闲物理块分配给申请者。

当删除文件时,系统收回它所占用的物理块,并且考虑所收回的物理块是否可以与原有空闲块相邻接,以便合并成更大的空闲区域,最后修改有关空闲块表项。

3、 空闲块链表

将外存储器中所有的空闲物理块连成一个链表,用一个空闲块首指针指向第一个空闲块,随后的每个空闲块中都含有指向下一个空闲块的指针,最后一块的指针为空,表示链尾,这样就构成了一个空闲块链表,如图5-17所示。

在图45-17中,一个空闲块链表的首指针维持一个指向物理块12的指针,该块是第一个空闲物理块。物理块12包含一个指向物理块13的指针,物理块13指向物理块14,如此等等。

空闲块链表模式效率低。要遍历整张空闲块链表,必须读每一个物理块,这就需要大量的I/O时间。

在空闲块链表模式中对空间的申请和释放是以块为单位的。申请空间时从链首取空闲块。空间释放时将物理块接入链尾。

空闲块链表法节省内存,但申请空间和回收空间的速度较慢,实现效率较低。

4、 成组链接

对链接表的一个改进方案是将N个空闲盘块的地址存放在第一个空闲块中,如图5-18所示。期于N-1个空闲盘块是实际空闲的。假设每100个空闲块为一组。第一组的100个空闲块块号放在第二组的头一块中,而第二组的其余99块是完全空闲的。第二组的100个块号又放在第三组的头一块中,依次类推,组与组之间形成链接关系。在最后一组的块号中第2个单元填“0”,表示该块中指出的块号是最后一组的块号,空闲块链到此结束。在这个空闲块链中,不组100块的一个组的块号,通常放在内存的一个专用块中。这种方式称为成组链接。

系统在初始化时先把专用块内容读到内存中,当需分配空闲块时,就直接在内存中找到哪些块是空闲的,每分配一块后把空闲块数减1。但在把一组中的第一个空闲块分配出去之前,应把登记在该块中的下一组的块号及块数保存到专用块中(此时原专用块中的信息已经无用,因为它指出的一组空闲块都已被分配了)。当一组空闲块被分配完后,则再把专用块的内容读到内存中,指出另一组可供分配的空闲块。

假设初始化时系统已把专用块读入主存储器L单元开始的区域中,分配和回收的算法如下:

⑴分配一个空闲块

查L单元内容(空闲块数):

当空闲块数>1,I:=L+空闲块数;

从I单元得到一空闲块号;

把该块分配给申请者;

空闲块数减1。

当空闲块数=1,取出L+1单元内容(一组的第一块块号或0);

取值 =0,无空闲块,申请者等待;

≠0,把该块内容复制到专用块;

把专用块内容独到主存L开始的区域。

⑵归还一块

查L单元的空闲块数;

当空闲块数〈100,空闲块数加1;

J:=L+空闲块数;

规划块号填入J单元。

当空闲块数=100,把主存中登记的信息写入归还块中;

把归还块号填入L+1单元;

将L单元置成1。

采用成组链接后,分配回收空闲块时均在内存中查找和修改,只有在一组空闲块分配完或空闲的磁盘块构成一组时才需要启动磁盘读写。因此,成组链接的管理方式比普通的链接方式效率高。

成组链接这种方案能够迅速找到大量空闲盘块地址。有些版本的UNIX操作系统便采用了这种方案。

542 实现文件系统的表目

当用户申请打开一个文件时,系统要在内存中为该用户保存一些必要的信息,这些信息以表格栏目中内容的形式出现,被称为表目。在实现文件系统时所需要的表目有若干种,其中在内存中所需的重要表目有如下一些:

1、 系统打开文件表

系统打开文件表,专门用于保存已打开文件的文件控制块。该系统打开文件表放在内存。除了保存已打开文件的文件控制块之外,在该表格中还保存有已打开的文件号、共享计数、修改标志等等,图5-19。

2、 用户打开文件表

在每个进程中,都有一个“用户打开文件表”。该表的内容有文件描述符、打开方式、读写指针、系统打开文件表入口等,图5-20。另外在进程的进程控制块PCB中,还记录了“用户打开文件表”的位置。

3、 系统打开文件表与用户打开文件表之间的关系

用户打开文件表指向了系统打开文件表。如果多个进程共享同一个文件,则一定有多个用户打开文件表目对应着系统打开文件表的同一入口,图5-21。

543 记录的成组与分解

用户的文件毫无疑问是由用户按名自己的需要组织的。用户还可按信息的内在逻辑关系,把文件划分成若干个逻辑记录。显然,逻辑记录的大小是由文件性质决定的。

另外,存储介质上的物理分块与存储介质的特性有关,尤其是磁盘。磁盘上的块的大小是在磁盘初始化时预先划好的。因此,逻辑记录的大小往往与存储介质物理分块的大小不一直。

当用户文件的逻辑记录比存储介质的物理分块小得多时,把一个逻辑记录存入一个物理块中,就会造成存储空间的浪费。为此,可把多个逻辑记录存放在一个物理块中,当用户需要某个逻辑记录时再从一物理块信息中将其分解出来。

1、 记录的成组

把若干个逻辑记录合成一组存放一物理块的工作称“记录的成组”,每块中的逻辑记录个数称“块因子”。

记录的成组在不同存储介质上进行信息转储是很有用的。

由于信息交换以块为单位,所以,要进行成组操作时必须使用内存的缓冲区。该缓冲区的长度等于要进行成组的最大逻辑记录长度乘以成组的块因子。成组转储操作如图5-22所示。

在进行记录成组时,还应考虑逻辑记录的格式。这是因为在记录式文件中,有“定长记录格式”和“不定长记录格式”。对定长记录格式的文件按记录成组的方式存储到存储介质上,则除最后一块外,每块中存放的逻辑记录个数是相同的。故只要在文件目录中说明逻辑记录的长度和块因子,在需要使用某个记录时就能方便地将其找出。

如果是一个不定长记录格式的文件,各个逻辑记录的长度可能不相等,在进行记录成组操作时,就应在每个逻辑记录前附加说明该记录长度的控制信息。

2、 记录的分解

对应签署记录成组的操作,有必要考虑从一组逻辑记录中把一个逻辑记录分离出来的操作,这种操作称为“记录的分解”。

显然,从事记录的分解操作也要使用内存缓冲区。

当用户请求读一个文件中的某个记录时,文件系统首先找出该记录所在物理块的位置,然后把含有该记录的物理块全部信息读入内存缓冲区,由于读入内存缓冲区的物理块信息中含有多个逻辑记录,所以要再从内存缓冲区中分解出指定的记录,然后传送到用户工作区。

对定长记录格式,只要的逻辑记录的长度就可容易地进行分解。对不定长记录格式,要根据说明逻辑记录长度的控制信息,计算出用户所指定的记录在内存缓冲区中的位置,然后把记录分解出来。图5-23是记录的分解操作示例。

在图5-23中,用户要求读出逻辑记录K4。用户文件中的记录是成组存放在磁盘上的,系统找出含有记录K4的物理块,从中读出了6个逻辑记录K1,K2,K3,K4,K5和K6,并且知道这些逻辑记录的长度为80,块因子为6。该块信息被读入内存缓冲区后,根据逻辑记录的长度和块因子胃,立即就能取出其中的逻辑记录K4,并把K4传送到用户工作区。

从上面的讨论可以看到,为了提高存储空间的利用率和减少启动设备的次数,采用了记录的成组和分解技术。但是上述效果的获得也付出了代价,主要包括:需要设立内存缓冲区,另外操作系统增加了成组和分解的操作的功能。

544 文件的操作

文件系统是提供给用户使用的,用户可以进行按名存取所需要的文件。在文件系统的实现中,为用户提供使用文件的手段是文件系统的重要任务之一。

1、 建立文件

用户首先调用文件系统的“建立文件”操作,在请求调用该操作时,提供所要创建的文件的文件名及若干参数:用户名、文件名、存取方式、存储设备类型、记录格式、记录长度,等等。

系统依据用户提供的文件名及若干参数,为这一新创建的文件分配一个文件控制块,填写文件控制块中的有关项。

建立文件的实质是建立文件的文件控制块FCB,并建立必要的存储空间,分配空的FCB。从而建立起系统与文件的联系。

建立文件系统调用的一般格式为:CREATE(文件名,访问权限,(最大长度))。

建立文件的具体步骤如下:

⑴检查参数的合法性:

文件名是否符合命名规则,若是,则进行下一步⑵;否则报错,返回。

⑵检查同一目录下有无重名文件:

若没有,则进行下一步⑶;否则报错,返回。

⑶在目录中有无空闲位置;

若有,则进行下一步⑷;否则,不成功返回。

⑷填写目录项内容:

包括:文件名、用户名、存取权限、长度置零,首地址等等。

⑸返回

2、 打开文件

打开文件,是使用文件的第一步,任何一个文件使用前都要先打开,即把文件控制块FCB送到内存。

打开文件系统调用的一般格式为:FD=OPEN(文件路径名,打开方式)。

打开文件时,系统主要完成以下工作:

⑴根据文件路径名查目录,找到FCB主部。

⑵根据打开方式、共享说明和用户身份检查访问合法性。

⑶根据文件号查系统打开文件表,看文件是否已被打开。

如果是,共享计数加1;

否则,将外存中的CB主部等信息填入系统打开文件表空表项,共享计数置为1。

⑷在用户打开文件表中取一空表项,填写打开方式等,并指向系统打开文件表对应表项。

返回信息:FD:文件描述符,是一个非负整数,用于以后读写文件。

3、 读文件

打开文件后,就可以读取文件中的信息。

读文件系统调用的一般格式为:READ(文件名,(文件内位置),要读的长度,内存目的地址)。

隐含参数:文件主。

读写方式可为读、写合既读又写等。

读文件时,系统主要完成以下工作:

⑴检查长度是否为正整数;

若是,则进行下一步;否则,转向(10)。

⑵根据文件名查找目录,确定该文件在目录中的位置。

⑶根据隐含参数中的文件主和目录中该文件的存储权限数据,检查是否有权读:

若是,则进行下一步,否则,转向(10)。

⑷由文件内位置与要读的长度计算最末位置,将其与目录中的文件长度比较,超过否?

若是,则转向(10);否则,进行下一步(5)。也可将参数中的长度修正为目录中的文件长度。

⑸根据参数中的位置、长度和目录中的映射信息,确定物理块号、需要读出的块数等读盘参数。

⑹根据下一块号读块至内存缓冲区。

⑺取出要读的内容,也许要进行成组的分解,将取出的内容送至参数中的内存目的地址。

⑻根据块内长度或起始块号+块数,确定还读下一块吗?同时确定下一块号:

若是,则转向(5);否则,进行下一步(9)。

⑼正常返回。

⑽错误返回,返回响应错误号。

4、 写文件

写文件系统调用的一般格式为:WRITE文件名,记录键,内存位置)。

把内存中指定单元的数据作为指定的一个记录写入指定文件中,系统还将为其分配物理块,以便把记录信息写到外存上。

5、 关闭文件

若文件暂时不用每则应将它关闭。文件关闭后一般不能存取,若要存取,则必须再次打开

6、 删除文件

删除文件文件系统调用的一般格式为:DELETE(文件名)。

7、 指针定位

指针定位的一般格式为:SEEK(FD,新指针的位置)。

指针定位时,系统主要完成以下工作:

⑴由FD检查用户打开文件表,找到对应的入口;

⑵将用户打开文件表中文件读写指针位置设为新指针的位置,供后续读写命令存取该指针处文件内容。

希望对你有帮助

关于数据结构中的一个数学的问题,具体见描述

在第一个元素前加一个元素的概率是p1,移动的次数是n次,期望就是np1在第二个元素前加一个元素的概率是p2,移动的次数是n-1次,期望就是(n...
点击下载
热门文章
    确认删除?
    回到顶部