(全部做在作业本上)所有题目不用抄
1.1 简答题
(1)简述下列概念:数据、数据元素、数据项、数据对象、数据结构
数据:所有能够输入到计算机中,且能被计算机处理的符号的集合。
数据元素:是数据(集合)中的一个“个体”,它是数据的基本单位。
数据项:数据项是用来描述数据元素的,它是数据的最小单位。
数据对象:具有相同性质的若干个数据元素的集合,如整数数据对象是所有整数的集合
数据结构:是指带结构的数据元素的集合。
(2)数据数据结构由哪三个方面构成?逻辑结构有几种表示形式?逻辑结构分为哪几类?存储结构分为哪几类?数据运算分为哪两个层次?
数据结构的构成:逻辑结构+存储结构+数据运算
逻辑结构表示:直观表示+二元组表示+图形表示
存储结构:顺序存储、链式存储、索引存储、哈希(散列)存储
数据运算:运算描述+运算实现
1.2.计算题(试分析下面各程序段的语句频度和时间复杂度,要有过程)
(1)x=90; y=n;
while(y>0)
if(x>100)
{x=x-10;y--;}
else x++;
x从91变化到101(注意:第1次是从90变化到101,多循环一次),一共10次循环,然后第11次循环中,x再回到91,y减1。上述过程反复进行,直到y从n变为0为止,所以语句频度大约为11n+1,即时间复杂度T(n)=11n+1=O(n)
(2)s=0;
for i=0; i<n; i++)
for(j=0; j<i; j++)
s+=B[i][j];
T(n)=1+(1+2)+(1+2+3)+(1+2+…i)+…(1+2+…+n-1) =(n-2)(n-1)/2 =O(n2)
(3)i=1;
while(i<=n)
i=i*3;
设循环执行了m次,i从1开始,每一次循环i在原值上再乘以3,所以循环结束时i=3m,3m<=n,则m<=log3n ,所以T(n)= log3n =O(logn)
(4)x=n; //n>1
y=0;
while(x>=(y+1)*(y+1))
y++;
设循环执行了m次,y从0开始,每一次循环y加1,所以循环结束时y=m,(m+1)* (m+1)<=x=n,则m<= -1,所以T(n)= -1 =O( )
(5) for(i=0;i<n;i++) //求出最好,最坏和平均时间复杂度
if(a[i]==x) break;
显然如果a[0]=x时,循环执行一次,当数组中没有x时循环执行n次,所以最好时间复杂度Tbest(n)=O(1),最坏时间复杂度Tworst=O(n),如果a[i]=x,循环正好执行i次,所平均时间复杂度T(n)=1/n*(1+2+3+…+n)=(n-1)/2 =O(n)。
1.3 应用题
1.试举一个例子,叙述逻辑结构和存储结构两方面的相互关系。(书上习题3)
逻辑结构由数据元素的集合和数据元素之间的关系组成。它是面向用户的
存储结构是数据元素及其关系在计算机存储器中的存储方式。它是面向程序员的。
逻辑结构和存储结构都是描述数据结构的两个方面。
一种逻辑结构可以有多种存储结构相对应。即一种逻辑结构可以映射成不同的存储结构。比如学生表,逻辑结构是学生的集合和学生之间的相邻关系。在计算机中可以有不同的存储结构。比如用结构体存储学生表,就是顺序存储结构。也可以用链表存储学生表,就是链式存储结构。
2.设有数据逻辑结构S=(D,R),试按题中所给条件画出逻辑结构的图示,并确定相对于关系R,哪些结点是开始结点,哪些结点是终端结点?
D={d1,d2,…,d9}
R={<d1,d3>,<d1,d8>,<d2,d3>,<d2,d4>,<d2,d5>,<d3,d9>, <d5,d6>,<d8,d9>,<d9,d7>, <d4,d7>, <d4,d6>}
开始结点d1,d2 终端结点d6,d7
3. 有理数r可以唯一的表示成一个既约分数:r=p/q 其中p,q是整数,q≠0,并且p和q没有最大公约数,即(p,q)=1。有理数的运算包括构造、销毁、求分子、求分母、加减乘除等。试用抽象数据类型来描述。(参考书上p14 复数的抽象数据类型描述)
例如 r=0.33333…… 可以表示成 r=1/3 其中 p=1,q=3;
r=-3.3可以表示成 r=-33/10 其中 p=-33,q=10;
r=5 可以表示成 r=5/1 其中 p=5,q=1;
r=0.8 可以表示成 r=4/5其中 p=4,q=5;
但是r=8/10,由于8和10有最大公约数2,不是既约分数。
ADT Fraction
{
数据对象:
D={ p,q| p,q均为整数,(p,q)=1且q≠0 }
数据关系:
R={<p,q> |q是分子,p是分母}
数据运算:
InitFaction(&r,int p, int q):构造有理数r
DestroyFaction(&r):销毁有理数r
GetNumerator(r,int &p) :返回有理数的分子
GetDenominator (r,int &q) :返回有理数的分母
Add(r1,r2,&sum) :返回两个有理数的和
Sub(r1,r2,&diff) :返回两个有理数的差
Mult(r1,r2,&prod) :返回两个有理数的积
Div(r1,r2,") :返回两个有理数的商
}
4.对于第3题的有理数r=1/3,试设计出顺序存储结构和链式存储结构。(参考书上p7学生表存储)
提示:顺序存储可以先定义结构体,再定义一个结构体变量存放。
链式存储可以用链表存放,链表有两个结点,第一个结点存放分子,第二个结点存放分母。
//顺序存储定义
typedef struct {
int numerator, denominator; // numerator是分子,denominator是分母
} Fraction;
//定义一个结构体变量,存储有理数1/3
Fraction r = {1,3};
//链式存储定义
typedef struct node {
int data; //数据域data,存放分子或分母的值,类型是整数
struct node *next; //指针域next,表示分子和分母的关系
} FractionNode; //结点定义
//建立两个结点组成的链表F来存储有理数1/3 ,其中第一个结点的data为1,表示分子,第二个结点的data为3,表示分母。第一个结点的next指向第二个结点,表示分子和分母之间的关系。指针F指向第一个结点,表示链表开始,第二个结点的next为空,表示链表结束。