数据结构与算法实验教程实验Word格式.docx
《数据结构与算法实验教程实验Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构与算法实验教程实验Word格式.docx(29页珍藏版)》请在冰豆网上搜索。
通常来说,一个数据结构DS可以表示为一个二元组:
DS=(D,S)
这里,D是数据元素的集合(或者是“结点”,可能还含有“数据项”或“数据域”),S是定义在D(或其他集合)上的关系的集合,S={R|R:
D×
D×
...},称之为元素的逻辑结构。
例如:
学生排队问题数据结构的二元组为:
DS=(student,order)
其中:
student={ai|ai∈D,D为同类学生的信息集}
order={<
ai,ai+1>
|ai,ai+1∈student,i=1,2,…n-1}
(学生在队伍中的关系是前后次序关系)
逻辑结构有4种基本类型:
集合结构、线性结构、树状结构和网络结构。
表和树是最常用的两种高效数据结构,许多高效的算法都用这两种数据结构来设计实现。
表(全序关系)是线性结构的,树(偏序或层次关系)和图(局部有序)是非线性结构的。
数据结构的物理结构是指逻辑结构的存储镜像(image),即用怎样的物理存储方式来表示其逻辑关系。
数据结构DS的物理结构P对应于从DS的数据元素到存储区M(维护着逻辑结构S)的一个映射:
P:
(D,S)->
M
1)存储器模型。
一个存储器M是一系列固定大小的存储单元,每个单元U有一个唯一的地址A(U),该地址被连续地编码。
每个单元U有一个唯一的后继单元U'
=succ(U)。
P有4种基本映射模型:
顺序(sequential)、链接(linked)、索引(indexed)和散列(hashing)映射。
因此,我们至少可以得到4×
4种可能的物理结构(并不是所有的可能组合都合理):
sequential
(sets)
linked
lists
indexed
trees
hash
graphs
例如,学生排队问题中,因为数据元素之间是一种前后次序关系,即采用的逻辑数据结构为线性结构,在计算机中可以开辟一个连续的存储空间来存放数据元素,故可采用顺序结构作为其物理结构。
2)数据结构DS上的操作。
所有的定义在DS上的操作在改变数据元素(结点)或结点的域时必须保持DS的逻辑和物理结构。
3)DS上的基本操作。
任何其他对DS的高级操作都可以用这些基本操作来实现。
最好将DS和它的所有基本操作看作为一个整体——称之为模块。
我们可以进一步将该模块抽象为数据类型(其中DS的存储结构被表示为私有成员,基本操作被表示为公共方法)。
例如,学生排队问题中的基本操作有出列(删除操作)、入列(插入操作)和点名(检索)等。
3.算法
算法(algorithm)是在有限步骤内求解某一问题所使用的一组定义明确的规则。
通俗地说,就是计算机解题的过程。
在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法。
前者是推理实现的算法,后者是操作实现的算法。
一个算法应该具有以下5个重要的特征。
1)有穷性:
一个算法必须保证执行有限步骤之后结束。
2)确切性:
算法的每一步骤必须有确切的定义。
3)可行性:
算法中的每一步骤必须充分可及,即算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。
4)输入:
一个算法有0个或多个输入,以刻画运算对象的初始情况。
所谓0个输入是指算法本身定义了初始条件。
5)输出:
一个算法有一个或多个输出,以反映对输入数据加工后的结果。
没有输出的算法是毫无意义的。
4.算法表达中抽象机制
要用计算机解决一个稍为复杂的实际问题,大体都要经历如下步骤(如图1.1所示)。
图1.1从问题到程序
1)将实际问题数学化。
即把实际问题抽象为一个带有一般性的数学问题。
这一步要引入一些数学概念,精确地阐述数学问题,弄清问题的已知条件、所要求的结果,以及在已知条件和所要求的结果之间存在着的隐式或显式的联系等。
2)对于确定的数学问题,设计其求解的方法。
即所谓的算法设计。
这一步要建立问题的求解模型,即确定问题的数据模型并在此模型上定义一组运算。
然后,借助于对这组运算的调用和控制,从已知数据出发导向所要求的结果,形成算法并用自然语言来表述。
这种语言还不是程序设计语言,不能被计算机所接受。
3)用计算机的某种程序设计语言来表达已设计好的算法。
换句话说,将非形式自然语言表达的算法转变为一种程序设计语言表达的算法。
这一步叫程序设计。
4)在计算机上编辑、调试和测试编制好的程序,直到输出预期的结果。
在这里,我们只关心第3步,而且把注意力集中在算法程序表达的抽象机制上,目的是引入一个重要的概念——抽象数据类型,同时为大型程序设计提供一种相应的自顶向下逐步求精、模块化的具体方法,即运用抽象数据类型来描述程序的方法。
抽象数据类型(abstractdatatypes,简称ADT)是算法设计和程序设计中的重要概念。
严格地说,它是算法的一个数据模型连同定义在该模型上、作为该算法构件的一组运算。
这个概念明确地把数据模型与作用在该模型上的运算紧密地联系起来。
事实正是如此。
一方面,数据模型的运算依赖于数据模型的具体表示,因为数据模型运算以数据模型中的数据变量作为运算对象,或作为运算结果,或二者兼而为之;
另一方面,有了数据模型的具体表示以及数据模型运算的具体实现,运算的效率随之确定。
于是,就有这样的一个问题:
如何选择数据模型的具体表示使该模型上的各种运算的效率都尽可能地高?
很明显,对于不同的运算组,为使组中所有运算的效率都尽可能地高,其相应的数据模型所具体表示的选择将是不同的。
在这个意义下,数据模型的具体表示又反过来依赖于数据模型上定义的那些运算。
特别是,当不同运算的效率互相制约时,还必须事先将所有运算的相应使用频度排序,让所选择的数据模型的具体表示优先保证使用频度较高的运算有较高的效率。
数据模型与定义在该模型上的运算之间存在着的这种密不可分的联系,是抽象数据类型的概念产生的背景和依据。
一些基本抽象数据类型,包括表、栈、队列、串、树、二叉树和图等,是最基本和最简单的,并且是实现其他抽象数据类型的基础。
高级抽象数据类型主要包括集合、字典、散列表、有序字典、并查集、优先队列、优先级树和堆、检索树、搜索树、分离集合等。
1.1.2实验目的
1)理解数据结构和算法的基本概念。
2)通过因特网搜索与浏览,了解数据结构和算法的计算环境,了解因特网环境中主流的数据结构和算法技术网站。
3)掌握通过专业网站不断丰富数据结构和算法最新知识的学习方法,尝试通过专业网站的辅助和支持来开展数据结构和算法的应用实践。
1.1.3工具/准备工作
在开始本实验之前,请回顾教科书的相关内容。
需要准备一台带有浏览器,能够访问因特网的计算机。
1.1.4实验内容与步骤
1)请查阅有关资料,简单叙述下列概念:
①数据结构:
________________________________________________________
_________________________________________________________________________
②算法:
____________________________________________________________
③ADT:
2)请简述数据结构与算法对计算机学科的意义。
_____________________________________________________________________
3)请教你的老师或者查阅有关的专业教学计划,并简述:
①在你主修的专业中,数据结构课程与哪些后续课程有什么关联?
②就你主修的专业而言,学习数据结构与算法有什么实际意义?
4)上网搜索和浏览,了解数据结构和算法知识的应用情况,看看哪些网站在做着数据结构与算法的技术支持工作?
请在表1.1中记录搜索结果。
提示:
一些数据结构与算法专业网站的例子包括:
(算法与数据结构)
(编程爱好者论坛-数据结构与算法讨论区)
你习惯使用的网络搜索引擎是:
_________________________________________
你在本次搜索中使用的关键词主要是:
___________________________________
表1.1数据结构与算法专业网站实验记录
网站名称
网址
内容描述
请记录:
在本次实验的网络搜索和浏览中,你感觉比较重要的2个数据结构与算法专业网站是:
1)网站名称:
2)网站名称:
请分析:
你认为各数据结构与算法专业网站当前的技术热点是:
1)技术名称:
技术描述:
___________________________________________________________
2)技术名称:
3)本实验的各部分操作能够顺利完成吗?
如果不能,请分析并说明为什么。
1.1.5实验总结
1.1.6实验评价(教师)
1.2抽象数据类型的表示和实现
1.2.1背景知识
1.抽象数据类型的定义
抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。
抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关,即不论其内部结构如何变化,只要它的数学特性不变,就不影响其外部的使用。
抽象数据类型和数据类型实质上是一个概念。
例如,各个计算机都拥有的“整型”类型是一个抽象数据类型,尽管它们在不同处理器上的实现方法可以不同,但由于其定义的数学特性相同,在用户看来是相同的。
因此,“抽象”的意义在于数据类型的数学抽象特性。
另一个方面,抽象数据类型的范围更广,它不再局限于各种处理器中已定义并实现的数据类型,还包括用户在设计软件系统时自己定义的数据类型。
为了提高软件的复用率和提高软件的可移植性,一个软件系统的框架应建立在数据之上,而不是在操作之上(后者是传统软件设计方法所为)。
即在构成软件系统的每个相对独立的模型上,定义一组数据和施于这些数据上的一组操作,并在模块内部给出这些数据的表示及其操作的细节,而在模块外部使用的只是抽象的数据和抽象的操作。
显然,所定义的数据类型的抽象层次越高,含有该抽象数据类型的软件模块的复用程度也就越高。
2.抽象数据类型的表示
一个含抽象数据类型的软件模块通常应包含定义、表示和实现3个部分。
抽象数据类型可用以下三元组表示:
(D,S,P)
其中,D是数据对象,S是D上的关系集,P是对D的基本操作集。
通常采用以下格式定义抽象数据类型:
ADT抽象数据类型名{
数据对象:
<
数据对象的定义>
数据关系:
数据关系的定义>
基本操作:
基本操作的定义>
}ADT抽象数据类型名
其中,数据对象和数据关系的定义用伪码描述,基本操作的定义格式为:
基本操作名(参数表)
初始条件:
描述了操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。
若初始条件为空,则省略之。
操作结果:
说明了操作正常完成之后,数据结构的变化状况和应返回的结构。
基本操作有两种参数:
赋值参数:
只为操作提供输入值。
引用参数:
以&
打头,除了可提供输入值外,还将返回操作结果。
3抽象数据类型举例
以下以抽象数据类型三元组为例,说明抽象数据类型是如何定义的(这里只包括几个常见的基本操作,读者可在理解的基础上,根据需要自行添加相关的操作)。
(1)三元组的顺序存储结构
三元组实际上就是一个数据对象中有3个数据元素。
这里采用动态分配的顺序存储结构来表示三元组在计算机中的具体存储方式,如图1.2所示。
图1.2动态分配的顺序存储的三元组
图中,ElemType表示三元组中元素的数据类型,可以是整型数,也可以是字符、浮点数或者更复杂的数据类型。
Triplet为指向三元组起始元素的指针类型,这就好比有3个数的序列,第1个数为T[0],第2个数为T[1],第3个数则为T[2](T为Triplet类型)。
(2)三元组的抽象数据类型定义
三元组的抽象数据类型定义如下:
ADTTriplet{
D={e1,e2,e3|e1,e2,e3∈ElemSet(ElemSet为某个数据对象的集合)}
R1={<
e1,e2>
<
e2,e3>
}
InitTriplet(&
T,v1,v2,v3)
构造三元组T,元素e1,e2和e3分别被赋以参数v1,v2,v3值
DestroyTriplet(&
T)
三元组T被销毁
Get(T,i,&
e)
三元组T已存在,1≤i≤3
用e返回T的第i元的值
Put(&
T,i,e)
改变T的第i元的值为e
Max(T,&
三元组T已存在
用e返回T的三个元素中的最大值
Min(T,&
用e返回T的三个元素中的最小值
}ADTTriplet
1.2.2实验目的
1)通过抽象数据类型三元组的表示和实现,了解抽象数据类型的定义方式。
2)掌握抽象数据类型的定义方式和用C语言实现的方法。
3)熟悉如何运用主函数检验各基本操作函数的正确性的具体操作。
1.2.3工具/准备工作
在开始实验前,请回顾教科书中相关的内容。
需要一台计算机,其中装有BorlandC++5.0或MicrosoftVisualC++6.0开发环境。
1.2.4实验内容与步骤
1.基础知识
请分析并填空:
1)抽象数据类型中基本操作有两种参数:
赋值参数和引用参数。
赋值参数的作用是___________________________,引用参数的作用是__________________________。
2)在数据结构中,从逻辑上可以把数据结构分成___________和_____________。
3)线性结构中元素之间存在________关系,树形结构中元素之间存在_________关系,图形结构中元素之间存在________关系。
4)数组、串、有序表和顺序表中,_________是属于物理结构的。
5)抽象数据类型中基本操作的定义(即基本操作的函数原型说明)包括___________、________