书名:数据结构(C语言描述)(慕课版)
主编:范翠香 罗作民
副主编:宋昕 李晔
啊啊啊啊啊为什么这么快就要期末考了TAT
得知期末手写代码的一瞬间 : ) → ;(
期末复习用,题目手打,答案来自老师:)
爱来自你理曲江校区 ;)
第一章 绪论
一、客观习题
1.
研究数据结构就是研究(D)数据的逻辑结构、存储结构及其数据在运算上的实现
2.
以下说法正确的是(D)
A.数据元素是数据的最小单元 B.数据项是数据的基本单位
× 数据元素是数据的基本单位,数据项是数据的最小单位
C.数据结构是带有结构的各数据项的集合
× 数据结构是带有结构的数据元素的集合
D.一些表面上很不相同的数据可以有相同的逻辑结构 √
3.
在计算机中算法指的是解决某一问题的有限运算序列,它必须具备输入、输出、(B)可行性、可移植性和可扩充性
4.
某算法的时间复杂度为O(n²),表明该算法的(C)执行时间与n²成正比
5.(老师说可以不看,题目答案有点问题)
比较一个问题不同的算法的空间复杂度时主要度量(D)算法中需要的临时变量所占用的存储空间的大小
(老师说:存储空间的大小随输入规模变化)
6.
通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着(B)不仅数据元素所包含的数据项个数要相同,而且对应数据项的类型要一致
7.
算法是(D)解决问题的有限运算序列
8.
通常从正确性、易读性、健壮性、高效性等方面评价算法的质量,以下解释错误的是(D)
A.正确性是指算法应能正确地实现预定的功能
B.易读性是指算法应易于阅读和理解,以便调试、修改和扩充
C.健壮性是指当环境发生变化时,算法能适当地做出反应或进行处理,不会产生不需要的运行结果
D.高效性是指算法要达到所需的时间性能 ×
算法高效性的判定与时间和空间两个因素有关,而不是单纯的考虑时间性能
9.
设n是描述问题规模的非负整数,下面程序段的时间复杂度是(A)O()
x = 2;
while (x < n / 2)
x = 2 * x;
10.
下面程度段的时间复杂度是(C)O()
count = 0;
for (k = 1; k <= n; k *= 2)
for (j = 1; j <= n; j ++)
count ++;
11.(老师说别看了有问题)
以下程序段中语句“m++;”的频度是(A)n(n+1)
for (j = 1; j <= 2 * i; j ++)
m ++;
12.
数据在计算机内有链式和顺序两种存储方式,在存储空间使用的灵活性上,链式存储比顺序存储要(B)高
二、简答题
1.
请分别解释什么是存储实现和运算实现。
存储实现是设计数据的存储结构,是建立数据的机内表示,包括数据元素和数据元素之间关系的存储。运算实现是在某种存储实现的基础上具体实现各种运算,其运算实现的核心(即算法设计)是设计实现某一运算的处理步骤。
2.
算法的时间复杂度反映的是算法的绝对执行时间吗?两个时间复杂度都为O(n²)的算法,对于相同的问题规模n,它们的绝对执行时间是否一定相同?请说明原因。
算法的时间复杂度反映的是算法执行时间的数量级,并不是绝对执行时间。两个时间复杂度都为O(n2)的算法,对于相同的问题规模n,它们的绝对执行时间也不一定一定相同
3.
简述四种逻辑结构中的数据元素之间的关系
数据的逻辑结构包含两个要素,分别是数据元素和关系。其中,关系是指数据元素间的逻辑关系。根据数据元素之间关系的不同特性,通常有四类基本结构构关系,它们的复杂程度依次递进,如图1.1所示。
1) 集合结构:数据元素之间除了“属于同一集合”的关系外,无其他关系。例如,确定一名学生是否为班级成员,只需要将班级看作一个集合结构;
2) 线性结构:数据元素之间存在一对一的关系。例如,将学生信息数据按照其入学报到的时间先后顺序进行排列,组成一个线性结构;
3) 树形结构:数据元素之间存在一对多的关系。例如,在班级管理体系中,班长管理多个组长,每位组长管理多名组员,从而形成树形结构;
4) 图结构/网状结构:数据元素之间存在多对多的关系。例如,多位朋友之间的朋友关系,任何两位同学都可以是朋友,从而形成图结构或者网状结构。
4.
存储结构是由几种基本的存储方式实现的?请分别进行解释
1) 顺序存储结构:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,通常借助程序设计语言的数组类型来描述;
2) 链式存储不像顺序存储结构要求所有元素依次存放在一段连续的存储空间中,而是无需 占用一整块存储空间。由于为了表示结点之间的关系,需要给每个结点附加指针字段,用于存放后继元素的存储地址,通常借助程序设计语言的指针类型来描述。
5.
分析以下算法的时间复杂度
// (1)
x = 90;
y = 100;
while (y > 0)
if (x > 100) {
x = x - 10;
y --;
} else x ++;
//O(1)。程序中基本语句“y--;”或者“x++;”执行次数是由x和y决定的,而x和y都是一个常数。所以T(n) = O(1)。
// (2)
s = 0;
for (i = 0; i < n; i ++)
for (j = 0; j < n; j ++)
s += B[i][j];
sum = s;
// O(n2)。由于程序为嵌套循环,外层循环的执行次数为n,内层循环的执行次数也为n。所以T(n) = O(n2)。
// (3)
x = 0;
for (i = 1; i < n; i ++)
for (j = 1; j <= n - i; j ++)
x ++;
// O(n2)。程序中基本语句“x++;”的执行次数为n-1+n-2+…+1=n(n-1)/2。T(n) = O(n2)。
// (4)
while ((y + 1) * (y + 1) <= n)
y = y + 1;
// O(n1/2)。设循环体共执行T(n)次,每循环一次循环变量y加1,最终T(n)=y,即: (T(n)+1)2≤n。所以 T(n)=O(n1/2)。
三、算法设计题
描述一个集合的抽象数据类型ADSet,其中所有元素为正整数,请设计集合的顺序存储类型,完成:
抽象数据类型ADSet的描述为:
ADT ADSet
{
数据对象: D={di|0≤i≤n,n为一个正整数}
数据关系: 无
完成:
createset(&s,a,n): 由整型数组a创建一个集合s;
dispset(s): 输出集合s;
inset(s,e): 判断e是否在集合s中;
}
集合的顺序存储类型为:
typedef struct
{
int data[MaxSize];
int length;
} Set;
1) 创建一个集合:
void createset(Set &s, int a[], int n)
{
int i;
for(i=0;i<n;i++)
s.data[i]=a[i];
s.length=n;
}
2) 输出一个集合:
void dispset(Set s)
{
int i;
for(i=0;i<s.length;i++)
printf(“%d”, s.data[i]);
printf(“\n”);
}
3) 判断e是否在集合s中:
int inset(Set s, int e)
{
int i;
for(i=0;i<s.length;i++)
if(s.data[i]==e)
return 1;
return 0;
}