当前位置:文档之家› 华南理工大学数据结构复习提纲二

华南理工大学数据结构复习提纲二

数据结构复习提纲第二部分复习提纲(不分题型)1.逻辑结构、存储结构、运算、算法、时空复杂性等哪些与计算机硬件有关?无关?逻辑结构:存储结构:指数据的逻辑结构在计算机存储器中的实现,存储结构是依赖于计算机的。

运算:在数据逻辑结构上定义的操作。

◆例如有一张学生成绩表,记录了一个班的学生各门课的成绩。

按学生的姓名为一行记成的表。

这个表就是一个数据结构。

每个记录(有姓名,学号,成绩等字段)就是一个结点,对于整个表来说,只有一个开始结点(它的前面无记录)和一个终端结点(它的后面无记录),其他的结点则各有一个也只有一个直接前趋和直接后继(它的前面和后面均有且只有一个记录)。

这几个关系就确定了这个表的逻辑结构。

那么我们怎样把这个表中的数据存储到计算机里呢? 用高级语言如何表示各结点之间的关系呢? 是用一片连续的内存单元来存放这些记录(如用数组表示)还是随机存放各结点数据再用指针进行链接呢? 这就是存储结构的问题,我们都是从高级语言的层次来讨论这个问题的。

最后,我们有了这个表(数据结构),肯定要用它,那么就是要对这张表中的记录进行查询,修改,删除等操作,对这个表可以进行哪些操作以及如何实现这些操作就是数据的运算问题了。

所谓算法(Algorithm)是对问题求解步骤的一种描述,是指令的有限序列,其中每一条指令表示一个或多个操作。

所谓算法复杂度:T (n) = O(f(n))称T (n) 为算法的渐近时间复杂度(Asymptotic Time Complexity),简称时间复杂度。

O是数量级的符号。

下面我们探讨一下如何估算算法的时间复杂度算法= 控制结构+ 原操作(固有数据类型的操作)算法的执行时间=原操作(i)的执行次数×原操作(i)的执行时间算法的执行时间与原操作执行次数之和成正比2.逻辑结构与存储结构是否一一对应?答:否。

3.算法有哪些描述方法?答:自然语言、表格、C语言、PASCAL语言。

4.算法评价一般考虑哪些内容?算法分析指什么?答:算法评价:正确性、运行时间、占用空间、简单性1.顺序表、链表优缺点?答:链表的优点是空间动态分配,插入和删除时不需要移动数据,缺点是不能随机访问。

顺序表的优点是能熟记存取数据元素,存取速度快,缺点:插入、删除操作需移动数据。

2.分别对有头结点、无头结点的循环、非循环单链表,如何判断为空?如何判断某结点为尾结点?答:有头结点非循环:HEAD->Next = = NULL有头结点循环:HEAD->Next = =NULL无头结点非循环:HEAD = =NULL无头结点循环:HEAD = = NULL3.循环链表主要优点?用尾指针表示循环单链表有什么好处?答:尾指针是指向终端结点的指针,用它来表示单循环链表可以使得查找链表的开始结点和终端结点都很方便,设一带头结点的单循环链表,其尾指针为rear,则开始结点和终端结点的位置分别是rear->next->next 和rear, 查找时间都是O(1)。

若用头指针来表示该链表,则查找终端结点的时间为O(n)。

4.例,输出无头结点的单链表中所有奇数。

解:设链表类型定义如下:typedef int datatype; //结点数据类型,假设为inttypedef struct node * pointer; //一般结点指针类型struct node { //结点结构datatype data;pointer next;};typedef pointer lklist; //头指针类型void disp(lklist L) {pointer p;p=L;while(p!=NULL) {if(p->data%2==1) cout<<p->data<<endl;p=p->next;}}5.例,判断无头结点的链表中结点是否构成等差数列。

解:链表类型定义同上题。

int detect(lklist L) {pointer p,q; //以下用q表示p的前趋datatype x;q=L;if(q==NULL) return 1; //链表为空p=q->next;if(p==NULL) return 1; //链表只有1个结点x=p->data-q->data; //初始结点差while(p->next!=NULL) {q=p;p=p->next;if(p->data-q->data!=x) return 0; //不满足等差关系}return 1;}1.栈、队列的基本运算有哪些?答:出栈、入栈,出队、入队。

2.例:三个点ABC依次进栈(在进栈的中间可能有出栈)。

问ABC、BCA、CAB能否是可能的出栈序列?解:按先进后出的原则分析,ABC可行:即A进A出、B进B出、C进C出;BCA可行:即A进不出,B进B出、C进C出、A出;CAB不行:C出后,栈内有BA,应B先出。

3.循环队列A[m]中,已知头指针、尾指针与元素个数中的任意两个,求另一个?len=(rear-front+m)%m;rear=(front+len)%m;front=(rear-len+m)%m;4.串、长度、子串、相等、子串定位等的概念;串中字符的数目n称为串的长度。

0个字符的串成为空串,它的长度为0。

串的串连是将一个串紧接着存放在另一个串的后面而成的一个新串。

串的连接满足结合率,不满足交换率串的模式匹配问题:子串的定位操作通常称为串的模式匹配。

通常思想是从主串S的第pos个字符起和模式的第一个字符比较,若相等则继续逐个比较后继字符,否则从主串的下一个字符起再重新和模式的字符比较。

依此类推,直至模式T中的每个字符依次和主串S中的一个连续的字符序列相等,则称匹配成功,函数值为和模式T中第一个字符相等的字符在主串S中的序号,否则称模式不匹配,函数值为0。

1.一维数组是否是顺序表?数组元素地址的计算?答:是,数组首地址加上元素的偏移地址。

2.三元组含义?一般矩阵按三元组存储能否节省空间?三元组表表示法:每一个非0元素对于一个三元组(row,col,val),row为非0元素的行下标,col 为非0元素的列下标,val为非0元素的值。

显然,有N个非0元素的,只需要3N个存储单元。

3.何为稀疏矩阵、特殊矩阵?为什么要对矩阵压缩存储?稀疏矩阵:对于m*n的矩阵A中若有N个非0元,若N<<m*n,则可称A为稀疏矩阵。

特殊矩阵(1):对称矩阵由于对称性,只需存储上三角或下三角部分,如按行优先顺序存储对称矩阵A,则等价于压缩在一个一维数组B中。

LOC[a ij]=LOC[B[k]]=LOC(a11)+(k-1)*L特殊矩阵(2):上(下)三角矩阵以下三角为例,既当i<j时,a ij=0。

其压缩思路同对称矩阵。

LOC[a ij]=LOC(a11)+(k-1)*L矩阵压缩的原因:在数值分析中经常出现一些阶数很高的矩阵,同时在矩阵中有许多值相同的元素或者是0元素。

有时为了节省存储空间,可以对这类矩阵进行压缩储存。

1.何时用树结构?树是否只能用链式存储?解:表示具有分支和层次关系的数据时用树。

二叉树等特殊情况可用顺序存储。

2.已知二叉树的深度k ,则其结点数范围?已知二叉树的结点数,则其深度k 范围?答:至多有2k-1个结点,至少为0。

具有n 个(n>0)各结点的完全二叉树深度为⎡⎤)1(log 2+n 或⎣⎦n 2log +13.只有3个结点的二叉排序树有几种形态? 解:有5种,见下图所示。

4.完全二叉树有6个叶子,则结点总数就是11吗?解:已知叶子数的完全二叉树一般有两棵,结点数差1,见下图:AB C DEFGH I J K AB C D EF GH I J K L一般,结点数n =n 0+n 1+n 2,而n 0=n 2+1(二叉树性质),所以n =2n 0-1+n 1。

完全二叉树树中度为1的结点最多只有1个,即n 1=1或0,所以n =2n 0或n =2n 0-1。

5.最优二叉树可否有100个结点?若有111个结点,则其中有多少个叶子?有没有度为1的结点?解:结点总数n=2n 0-1,n 0为叶子数,可见结点数为奇数。

对111个结点,n 0=(n+1)/2=56。

根据构造过程,每次两个结点合并,故结点的度要么为2(分支结点),要么为0(叶子),不会出现度1的结点。

5. 二叉树的顺序存储结构、二叉链表的画法?二叉链表中有多少个空指针?答:顺序存储结构:按照顺序存储结构的定义,在此约定,用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素,即将完全二叉树上的编号为i 的结点元素存储在如上定义的一维数组中下标为i-1的分量中。

二叉链表每个结点设置三个域:值域、左指针域、和右指针域。

有n+1个空指针。

6. 树、森林与二叉树的相互转换?如何判断二叉树是树还是森林转换而来?树/森林的遍历与对应二叉树的遍历之间有何关系?8.例:求二叉树的结点数。

解:设二叉树结点类型为bitree ,函数名为sum ,函数返回结点数。

int sum(bitree t) { int L,R;if(t==NULL) return 0; //当前树为空,递归出口 L=sum(t->lchild); //求左子树中结点数 R=sum(t->rchild) //求右子树中结点数return L+R+1; //结点数=左子树中结点数+右子树中结点数+1 }9.例:求二叉树的叶子结点数。

解:设二叉树结点类型为bitree ,函数名为leaf ,函数返回叶子数。

int leaf(bitree t) { int L,R;if(t==NULL) return 0; //当前树为空,递归出口if(t->lchild==NULL && t->rchild==NULL) return 1;//当前点为叶子,递归出口 L=leaf(t->lchild); //求左子树中叶子数 R=leaf(t->rchild) //求右子树中叶子数return L+R; //叶子数=左子树中叶子数+右子树中叶子数 }10.例:求二叉树的高度。

解:设二叉树结点类型为bitree ,函数名为high ,函数返回高度。

int high(bitree t) { int L,R;if(t==NULL) return 0; //当前树为空,递归出口 L=high(t->lchild); //求左子树高度 R=high(t->rchild) //求右子树高度return (L>R?L:R)+1; //高度=左、右子树高度较大者+1 }1. 图的边数范围?连通图的边数范围?顶点度数之和与边数有何关系?答:无向图中最多有)1(21-n n 条边,若为有向图,最多有n (n-1)条边。

相关主题