0907《数据结构》期末考试指导.docx
《0907《数据结构》期末考试指导.docx》由会员分享,可在线阅读,更多相关《0907《数据结构》期末考试指导.docx(22页珍藏版)》请在冰豆网上搜索。
0907《数据结构》期末考试指导
0907《数据结构》2015年6月期末考试指导
一、考试说明
1、考试形式:
闭卷
2、考试时间:
90分钟
3、考试包括以下任意几种题型:
一、选择题
二、填空题
三、问答题
四、计算题
二、复习重点内容
第一章绪论
1、数据
数据是对信息的一种符号表示。
在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。
2、数据元素和数据对象
数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
数据对象是性质相同的数据元素的集合,是数据的一个子集。
3、数据的逻辑结构和存储结构
数据之间的相互关系称为逻辑结构。
通常分为集合、线性结构、树型结构、图状结构或网状结构四类基本结构
数据结构在计算机中的表示称为数据的物理结构,又称为存储结构。
4、数据结构的二元组表示
数据结构的形式定义为,数据结构是一个二元组:
Data-Structure=(D,S)
其中:
D是数据元素的有限集,S是D上关系的有限集。
5、算法的特性
算法具有以下五个特性:
(1)有穷性:
一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
(2)确定性:
算法中每一条指令必须有确切的含义。
不存在二义性。
且算法只有一个入口和一个出口。
(3)可行性:
一个算法是可行的。
即算法描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。
(4)输入:
一个算法有零个或多个输入,这些输入取自于某个特定的对象集合。
(5)输出:
一个算法有一个或多个输出,这些输出是同输入有着某些特定关系的量。
第二章线性表
1、线性链表基本概念
结点:
数据元素及直接后继的存储位置(地址)组成一个数据元素的存储结构,称为一个结点;
结点的数据域:
结点中用于保存数据元素的部分;
结点的指针域:
结点中用于保存数据元素直接后继存储地址的部分;
空指针:
不指向任何结点,线性链表最后一个结点的指针通常是指针。
头指针:
用于存放线性链表中第一个结点的存储地址。
假设L为链表的头指针,它指向表中第一个结点,若L为“空”(L=NULL),则所表示的线性链表为“空”表,其长度n为“零”。
头结点:
线性链表的第一元素结点前面的一个附加结点,称为头结点。
2、线性表的顺序存储结构
把线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里。
用这种方法存储的线性表简称顺序表。
假设线性表的每个元素需占用l个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储位置。
则线性表中第I+1个数据元素的存储位置LOC(ai+1)和第i个数据元素的存储位置LOC(aI)之间满足下列关系:
LOC(ai+1)=LOC(ai)+l
线性表的第i个数据元素ai的存储位置为:
LOC(ai)=LOC(a1)+(I-1)*l
由于C语言中的一维数组也是采用顺序存储表示,故可以用数组类型来描述顺序表。
3、线性链表
链表是指用一组任意的存储单元来依次存放线性表的结点,这组存储单元即可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。
因此,链表中结点的逻辑次序和物理次序不一定相同。
为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息,这个信息称为指针(pointer)或链(link)。
这两部分组成了链表中的结点结构:
(data,next)
其中:
data域是数据域,用来存放结点的值。
next是指针域(亦称链域),用来存放结点的直接后继的地址(或位置)。
链表正是通过每个结点的链域将线性表的n个结点按其逻辑次序链接在一起的。
由于上述链表的每一个结只有一个链域,故将这种链表称为单链表(SingleLinked)。
第三章栈和队列
1、栈的定义及基本运算
栈(Stack)是限制在表的一端进行插入和删除运算的线性表,通常称插入、删除的这一端为栈顶(Top),另一端为栈底(Bottom)。
当表中没有元素时称为空栈。
假设栈S=(a1,a2,a3,…an),则a1称为栈底元素,an为栈顶元素。
栈中元素按a1,a2,a3,…an的次序进栈,退栈的第一个元素应为栈顶元素。
换句话说,栈的修改是按后进先出的原则进行的,只能在栈顶插入和删除元素。
因此,栈称为后进先出表(LIFO)。
2、队列的定义及基本运算
队列(Queue)也是一种运算受限的线性表。
它只允许在表的一端进行插入,而在另一端进行删除。
允许删除的一端称为队头(front),允许插入的一端称为队尾(rear)。
先进入队列的成员总是先离开队列。
因此队列亦称作先进先出(FirstInFirstOut)的线性表,简称FIFO表。
当队列中没有元素时称为空队列。
在空队列中依次加入元素a1,a2,…an之后,a1是队头元素,an是队尾元素。
显然退出队列的次序也只能是a1,a2,…an,也就是说队列的修改是依先进先出的原则进行的。
第四章串
1、串定义
串(String)是零个或多个字符组成的有限序列。
一般记作S=“a1a2a3…an”,其中S是串名,双引号括起来的字符序列是串值;ai(1≦i≦n)可以是字母、数字或其它字符;串中所包含的字符个数称为该串的长度。
长度为零的串称为空串(EmptyString),它不包含任何字符。
通常将仅由一个或多个空格组成的串称为空白串(BlankString)。
要注意空串和空白串的不同,例如“”和“”分别表示长度为1的空白串和长度为0的空串。
第五章数组和广义表
1、数组的顺序存储方式
数组通常有两种顺序存储方式:
⑴行优先顺序——将数组元素按行排列,第i+1个行向量紧接在第i个行向量后面。
以二维的m*n数组为例,按行优先顺序存储的线性序列为:
a(0,0),a(0,1),…,a(0,n-1),a(1,0),a(1,1),…a(1,n-1),……,a(m-1,0),a(m-1,1),…,a(m-1,n-1)
在PASCAL、C语言中,数组就是按行优先顺序存储的。
⑵列优先顺序——将数组元素按列向量排列,第j+1个列向量紧接在第j个列向量之后,A的m*n个元素按列优先顺序存储的线性序列为:
a(0,0),a(1,0),…,a(m-1,0),a(0,1),a(1,1),…a(m-1,1),……,a(0,n-1),a(1,n-1),…,a(m-1,n-1)
在FORTRAN语言中,数组就是按列优先顺序存储的。
2、对称矩阵
在一个n阶方阵A中,若元素满足下述性质:
aij=aji0≦i,j≦n-1
则称A为对称矩阵。
对称矩阵中的元素关于主对角线对称,故只要存储矩阵中上三角或下三角中的元素,让每两个对称的元素共享一个存储空间,这样,能节约近一半的存储空间。
(1).若i≧j,则aij在下三角形中。
aij之前的i行(从第0行到第i-1行)一共有1+2+…+i=i(i+1)/2个元素,在第i行上,aij之前恰有j个元素(即ai0,ai1,ai2,…,aij-1),因此有:
k=i*(i+1)/2+j0≦k(2).若i因为aij=aji,所以只要交换上述对应关系式中的i和j即可得到:
k=j*(j+1)/2+i0≦k第六章树和二叉树
1、二叉树的定义
二叉树是由n(n>=0)个结点的有限集合构成,此集合或者为空集,或者由一个根结点及两棵互不相交的左右子树组成,并且左右子树都是二叉树。
这也是一个递归定义。
二叉树可以是空集合,根可以有空的左子树或空的右子树。
二查树不是树的特殊情况,它们是两个概念。
2、树的存储结构
(1).双亲表示法
在树中,除根结点没有双亲外,其他每个结点的双亲是唯一确定的。
(2).孩子表示法
采用孩子表示法表示一棵树时,树中每个结点除了存储其自身的值之外,还必须指出其所有子女的位置。
(3).孩子兄弟表示法
所谓孩子兄弟表示法,即在存储树中每个结点时,除了包含该结点值域外,还设置两个指针域firstchild和rightsibling,分别指向该结点的第一个子女和其右兄弟,即以二叉链表方式加以存储,因此该方法也常被称为二叉树表示法。
3、遍历二叉树
在二叉树的一些应用中,常常要求在树中查找具有某种特征的结点,或者对树中全部结点逐一进行某种处理。
这就引入了遍历二叉树的问题,即如何按某条搜索路径巡访树中的每一个结点,使得每一个结点均被访问一次,而且仅被访问一次。
二叉树的遍历顺序包括:
先序遍历、中序遍历和后序遍历。
(1).先序遍历二叉树的操作定义为:
若二叉树为空,则空操作;否则
访问根结点;
先序遍历左子树;
先序遍历右子树。
(2).中序遍历二叉树的操作定义为:
若二叉树为空,则空操作;否则
中序遍历左子树;
访问根结点;
中序遍历右子树。
(3).后序遍历二叉树的操作定义为:
若二叉树为空,则空操作;否则
后序遍历左子树;
后序遍历右子树;
访问根结点。
4、线索二叉树
当以二叉链表作为存储结构时,只能找到结点的左右孩子的信息,而不能在结点的任一序列的前驱与后继信息,这种信息只有在遍历的动态过程中才能得到,为了能保存所需的信息,可增加标志域:
lchild
ltag
data
rtag
rchild
其中:
以这种结构构成的二叉链表作为二叉树的存储结构,叫做线索链表,其中指向结点前驱与后继的指针叫做线索。
加上线索的二叉树称之为线索二叉树。
5、树与二叉树的转换
二叉树与树都可用二叉链表存贮,以二叉链表作中介,可导出树与二叉树之间的转换。
树与二叉树转换方法:
6、森林和二叉树的转换
将森林中树的根看成兄弟,可用树孩子兄弟表示法存储森林;用树与二叉树的转换方法,进行森林与二叉树转换。
从树的二叉链表示的定义可知,任何一棵和树对应的二叉树,其右子树必为空。
所以只要将森林中所有树的根结点视为兄弟,即将各个树转换为二叉树;再按森林中树的次序,依次将后一个树作为前一棵树的右子树,并将第一棵树的根作为目标树的根,就可以将森林转换为二叉树。
转换规则:
若F={T1,T2,T3,…,Tn}是森林,则B(F)={root,LB,RB}
(1).若F为空,即n=0,则B(F)为空树。
(2).若F非空,则B(F)的根是T1的根,其左子树为LB,是从T1根结点的子树森林F1={T11,T12,…,T1m}转换而成的二叉树;其右子树为RB,是从除T1外的森林F’={T2,T3,…,Tn}转换而成的二叉树。
7、哈夫曼树的概念
路径:
从一个结点到另一个结点之间的若干个分支
路径长度:
路径上的分支数目称为路径长度;
结点的路径长度:
从根到该结点的路径长度
树的路径长度:
树中所有叶子结点的路径长度之和;一般记为PL。
在结点数相同的条件下,完全二叉树是路径最短的二叉树。
结点的权:
根据应用的需要可以给树的结点赋权值;
结点的带权路径长度:
从根到该结点的路径长度与该结点权的乘积;
树的带权路径长度=树中所有叶子结点的带权路径之和;通常记作
WPL=wi×Li
哈夫曼树:
假设有n个权值(w1,w2,…,wn),构造有n个叶子结点的严格二叉树,每个叶子结点有一个wi作为它的权值。
则带权路径长度最小的严格二叉树称为哈夫曼树。
第七章图
1、图的深度优先搜索遍历
(1)首先访问顶点i,并将其访问标记置为访问过,即visited[i]=1;
(2)然后搜索与顶点i有边相连的下一个顶点j,若j未被访问过,则访问它,并将j的访问标记置为访问过,visited[j]=1,然后从j开始重复此过程,若j已访问,再看与i有边相连的其它顶点;
(3)若与i有边相连的顶点都被访问过,则退回到前一个访问顶点并重复刚才过程,直到图中所有顶点都被访问完为止。
2、图的广度优先搜索遍历
广度优先搜索遍历类似于树的按层次遍历。
设图G的初态是所有顶点均未访问,在G中任选一顶点i作为初始点,则广度优先搜索的基本思想是:
(1) 首先访问顶点i,并将其访问标志置为已被访问,即visited[i]=1;
(2) 接着依次访问与顶点i有边相连的所有顶点W1,W2,…,Wt;
(3) 然后再按顺序访问与W1,W2,…,Wt有边相连又未曾访问过的顶点;
依此类推,直到图中所有顶点都被访问完为止。
3、AOE-网和关键路径
若在带权的有向图中,以顶点表示事件,有向边表示活动,边上的权值表示完成该活动的开销(如该活动所需的时间),则称此带权的有向图为用边表示活动的网络,简称AOE网。
AOE网中,从开始顶点到结束顶点之间路径长度中的最大路径为关键路径。
由于AOE网中某些子工程(活动)可以同时进行,要保证每个子工程都能完成,完成该工程的最少时间就是该工程AOE网的关键路径长度。
确定AOE网中关键路径的步骤:
(1).计算事件的最早发生时间ve(k)
(2).计算事件的最迟发生时间vl(k)
(3).计算活动ai的最早开始时间e[i]
若活动ai有边表示,则活动ai的最早开始时间e[i]可由下式计算:
e[i]=ve[j]
(4).计算活动ai的最迟开始时间l[i]
若活动ai有边表示,则活动ai的最迟开始时间l[i]可由下式计算:
l[i]=vl[k]-
(5).计算活动ai的时间余量d[i]确定关键路径
令d[i]=l[i]-e[i],对于活动ai,若有d[i]=0,则说明活动ai为关键活动,由关键活动组成的路径就是关键路径。
4、寻找最短路径的迪杰斯特拉(Dijkstra)算法
(1).Dijkstra算法的基本思想
按路径长度递增顺序求最短路径算法,与求最小生成树的普里姆算法类似。
(2).Dijkstra算法的基本步骤
设V0是起始源点,U=已求得最短路径终点集合。
V-U=未确定最短路径的顶点的集合
初始时U={V0}
1)长度最短的最短路径是边数为1的长度最小的路径。
2)下一条长度最短的路径:
①Vi∈V-U,先求出V0到Vi中间只经U中结点的最短路径;
②上述最短路径中长度最小者即为下一条长度最短的路径;
③将所求最短路径的终点加入U中;
3)重复2)直到求出所有的最短路径
第八章动态存储管理
1、动态存储管理的定义
计算机内存在刚开始工作时,空闲部分是一个整块的连续区域;随着用户进入系统,多次申请和释放内存以后,空闲部分不再是连续的了,而成了多个空闲区。
动态存储管理指系统随机地根据用户程序申请空间的大小,进行分配空间和回收不用空间所进行的内存管理。
2、可利用空间表及分配方法
可利用空间表是将所有内存空闲块用链表连接而成,空闲块的大小可以是全相同的,也可以是分成若干固定大小的,还可以是随机大小的。
可利用空间表的分配算法包括:
(1).首次拟合法
(2).最佳拟合法
(3).最坏拟合法
第九章查找
1、顺序查找
顺序查找是一种最简单的查找方法,它的基本思想是:
从表的一端开始,顺序扫描线性表,依次将扫描到的结点关键字和待找的值K相比较,若相等,则查找成功,若整个表扫描完毕,仍末找到关键字等于K的元素,则查找失败。
为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值称为查找算法在查找成功时的平均查找长度(AverageSearchLength,ASL)。
2、二分查找
二分查找的基本思想是:
首先将待查值K与有序表array[0]到array[n-1]的中点mid上的关键字array[mid].key进行比较,若相等,则查找成功;否则,若array[mid].key>k,则在array[1]到array[mid-1]中继续查找,若有array[mid].key每通过一次关键字的比较,区间的长度就缩小一半,区间的个数就增加一倍,如此不断进行下去,直到找到关键字为K的元素;若当前的查找区间为空(表示查找失败)。
查找过程可用二叉树描述:
每个记录用一个结点表示;结点中值为该记录在表中位置,这个描述查找过程的二叉树称为判定树。
n个元素的表的折半查找的判定树是唯一的,即:
判定树由表中元素个数决定。
找到有序表中任一记录的过程就是:
走了一条从根结点到与该记录相应的结点的路径。
比较的关键字个数:
为该结点在判定树上的层次数。
因此,二分查找的时间复杂度为O(log2n)。
3、散列表和散列函数
散列表也称哈希表。
散列法存储的基本思想:
建立关键码字与其存储位置的对应关系,或者说,由关键码的值决定数据的存储地址。
具体说,就是选取某个函数,依该函数按关键字计算元素的存储位置,并按此存放;查找时,由同一个函数对给定值k计算地址,将k与地址单元中元素关键码进行比较,确定查找是否成功。
散列法中使用的转换函数称为散列函数。
常用的散列函数的构造方法包括:
直接定址法、除留余数法、折叠法等。
4、处理冲突的方法
通常关键码的集合比存储地址集合大得多,因而经过散列函数变换后,可能将不同的关键码映射到同一个存储地址上,这种现象称为冲突。
解决冲突的常用方法是开放定址法,其思路是有冲突时就去寻找下一个空的哈希地址,只要哈希表足够大,空的哈希地址总能找到,并将数据元素存入。
在具体实现上,常采用线性探测法,即一旦冲突,就找附近(下一个)空地址存入。
用表达式表示就是:
Hi=(Hash(key)+di)modm(1≤i其中:
Hash(key)为哈希函数
m为哈希表长度
di为增量序列1,2,…m-1,且di=i
第十章内部排序
1、直接插入排序
直接插入排序(StraightInsertionSorting)的基本思想是:
把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
直接插入排序在空间复杂度上,只需要一个元素的辅助空间,用于元素的位置交换。
时间复杂度为O(n2)
2、起泡排序
起泡排序排序的基本思想是:
通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的排序码,若发现逆序则交换,使排序码较大的元素逐渐从前部移向后部(从下标较小的单元移向下标较大的单元),就象水底下的气泡一样逐渐向上冒。
起泡排序算法的时间复杂度为O(n2)。
由于其中的元素移动较多,所以属于内排序中速度较慢的一种。
3、快速排序
快速排序(QuickSorting)的基本思想是:
任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一趟排序,将待排元素分为左右两个子序列,左子序列元素的排序码均小于或等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。
快速排序的平均时间复杂度为O(nlog2n)。
最好的空间复杂度为O(log2n),最坏的空间复杂度为O(n)。
4、简单选择排序
简单选择排序的基本思想是:
第一次从array[0]~array[n-1]中选取最小值,与array[0]交换,第二次从array[1]~array[n-1]中选取最小值,与array[1]交换,第三次从array[2]~array[n-1]中选取最小值,与array[2]交换,…,第i次从array[i-1]~array[n-1]中选取最小值,与array[i-1]交换,…,第n-1次从array[n-2]~array[n-1]中选取最小值,与array[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。
简单选择排序的时间复杂度为O(n2)数量级,当记录占用的字节数较多时,通常比直接插入排序的执行速度要快一些。
5、二路归并排序
二路归并排序的基本思想是:
将两个有序子区间(有序表)合并成一个有序子区间,一次合并完成后,有序子区间的数目减少一半,而区间的长度增加一倍,当区间长度从1增加到n(元素个数)时,整个区间变为一个,则该区间中的有序序列即为我们所需的排序结果。
二路归并排序的时间复杂度为O(nlog2n),空间复杂度为O(n)。
6、各种内排序方法的选择规则
(1)当待排序元素的个数n较大,排序码分布是随机,而对稳定性不做要求时,则采用快速排序为宜。
(2)当待排序元素的个数n大,内存空间允许,且要求排序稳定时,则采用二路归并排序为宜。
(3)当待排序元素的个数n大,排序码分布可能会出现正序或逆序的情形,且对稳定性不做要求时,则采用堆排序或二路归并排序为宜。
(4)当待排序元素的个数n小,元素基本有序或分布较随机,且要求稳定时,则采用直接插入排序为宜。
(5)当待排序元素的个数n小,对稳定性不做要求时,则采用直接选择排序为宜,若排序码不接近逆序,也可以采用直接插入排序。
冒泡排序一般很少采用。
第十一章外部排序
1、外部排序的过程
(1)按可用内存大小,将外存上含n个记录的文件分成若干长度为l的子文件或段(segment),依次读入内存并利用有效的内部排序方法对它们进行排序,并将排序后得到的有序子文件(通常称这些有序子文件为归并段或顺串(run))重新写入外存。
(2)对归并段进行逐趟归并,使归并段(有序的子文件)逐渐由小至大,直至得到整个有序文件为止。
第十二章文件
1、直接存取文件
直接存取文件指的是利用杂凑(Hash)法进行组织的文件。
它类似于哈希表,既根据文件中关键字的特点设计一种哈希函数和处理冲突的方法将记录散列到存储设备上,故又称散列文件。
与哈希表不同的是,对于文件来说,磁盘上的文件记录通常是成组存放的。
2、直接存取文件的特点
优点:
文件随机存放,记录不需进行排序;插入、删除方便,存取速度快,不需要索引区,节省存储空间。
缺点:
不能进行顺序存取,只能按关键字随机存取,且询问方式限于简单询问,并且在经过多次的插入、删除之后,也可能造成文件结构不合理,即溢出桶满而基桶内多数为被删除的记录。
三、重点习题
(一)选择题
1、算法指的是()。
A.对特定问题求解步骤的一种描述,是指令的有限序列B.计算机程序
C.解决问题的计算方法D.数据处理
2、若某线性表中最常用的操作是取第i个元素和找第i个元素的前趋,则采用()存储方法最节省时间。
A.顺序表B.单链表C.双链表D.单循环链表
3、二维数组A的每个元素是由6个字符组成的串,行下标的范围从0~8,列下标的范围是从0~9,则存放A至少需要()个字节。
A.90B.180C.240D.540
4、一个高度为h的满二叉树共有n个结点,其中有m个叶子结点,则有()成立。
A.n=h+mB.h+m=2nC.m=h-1D.n=2h-1
5、判定一个有向图是否存在回路除了可以利用拓扑排序方法外,还可以用()。
A.求关键路径的方法B.求最短路径的方法C.广度优先遍历算法D.深度优先遍历算法
6.判定一个有向图是否存在回路除了可以利用拓扑排序方法外,还可以用()。
A、求关键路径的方法B、求最短路径的方法C、广度优先遍历算法D、深度优先遍历算法
7.当待排序序列基本有序或个数较小的