数据结构习题解析第1章Word格式.docx
- 文档编号:21940069
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:27
- 大小:77.58KB
数据结构习题解析第1章Word格式.docx
《数据结构习题解析第1章Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构习题解析第1章Word格式.docx(27页珍藏版)》请在冰豆网上搜索。
算法与程序的不同之处需要从算法的特性来解释
算法的正确性是最主要的要求
算法的可读性是必须考虑的
程序的程序步数的计算与算法的事前估计
程序的时间代价是指算法的渐进时间复杂性度量
三、教材中习题的解析
1-1什么是数据?
它与信息是什么关系?
【解答】
什么是信息?
广义地讲,信息就是消息。
宇宙三要素(物质、能量、信息)之一。
它是现实世界各种事物在人们头脑中的反映。
此外,人们通过科学仪器能够认识到的也是信息。
信息的特征为:
可识别、可存储、可变换、可处理、可传递、可再生、可压缩、可利用、可共享。
什么是数据?
因为信息的表现形式十分广泛,许多信息在计算机中不方便存储和处理,例如,一个大楼中4部电梯在软件控制下调度和运行的状态、一个商店中商品的在库明细表等,必须将它们转换成数据才能很方便地在计算机中存储、处理、变换。
因此,数据(data)是信息的载体,是描述客观事物的数、字符、以及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。
在计算机中,信息必须以数据的形式出现。
1-2什么是数据结构?
有关数据结构的讨论涉及哪三个方面?
数据结构是指数据以及相互之间的关系。
记为:
数据结构={D,R}。
其中,D是某一数据对象,R是该对象中所有数据成员之间的关系的有限集合。
有关数据结构的讨论一般涉及以下三方面的内容:
1数据成员以及它们相互之间的逻辑关系,也称为数据的逻辑结构,简称为数据结构;
②数据成员极其关系在计算机存储器内的存储表示,也称为数据的物理结构,简称为存储结构;
3施加于该数据结构上的操作。
数据的逻辑结构是从逻辑关系上描述数据,它与数据的存储不是一码事,是与计算机存储无关的。
因此,数据的逻辑结构可以看作是从具体问题中抽象出来的数据模型,是数据的应用视图。
数据的存储结构是逻辑数据结构在计算机存储器中的实现(亦称为映像),它是依赖于计算机的,是数据的物理视图。
数据的操作是定义于数据逻辑结构上的一组运算,每种数据结构都有一个运算的集合。
例如搜索、插入、删除、更新、排序等。
1-3数据的逻辑结构分为线性结构和非线性结构两大类。
线性结构包括数组、链表、栈、队列、优先级队列等;
非线性结构包括树、图等、这两类结构各自的特点是什么?
线性结构的特点是:
在结构中所有数据成员都处于一个序列中,有且仅有一个开始成员和一个终端成员,并且所有数据成员都最多有一个直接前驱和一个直接后继。
例如,一维数组、线性表等就是典型的线性结构
非线性结构的特点是:
一个数据成员可能有零个、一个或多个直接前驱和直接后继。
例如,树、图或网络等都是典型的非线性结构。
1-4.什么是抽象数据类型?
试用C++的类声明定义“复数”的抽象数据类型。
要求
(1)在复数内部用浮点数定义它的实部和虚部。
(2)实现3个构造函数:
缺省的构造函数没有参数;
第二个构造函数将双精度浮点数赋给复数的实部,虚部置为0;
第三个构造函数将两个双精度浮点数分别赋给复数的实部和虚部。
(3)定义获取和修改复数的实部和虚部,以及+、-、*、/等运算的成员函数。
(4)定义重载的流函数来输出一个复数。
抽象数据类型通常是指由用户定义,用以表示应用问题的数据模型。
抽象数据类型由基本的数据类型构成,并包括一组相关的服务。
//在头文件complex.h中定义的复数类
#ifndef_complex_h_
#define_complex_h_
#include<
iostream.h>
classcomlex{
public:
complex(){Re=Im=0;
}//不带参数的构造函数
complex(doubler){Re=r;
Im=0;
}//只置实部的构造函数
complex(doubler,doublei){Re=r;
Im=i;
}//分别置实部、虚部的构造函数
doublegetReal(){returnRe;
}//取复数实部
doublegetImag(){returnIm;
}//取复数虚部
voidsetReal(doubler){Re=r;
}//修改复数实部
voidsetImag(doublei){Im=i;
}//修改复数虚部
complex&
operator=(complex&
ob){Re=ob.Re;
Im=ob.Im;
}//复数赋值
operator+(complex&
ob);
//重载函数:
复数四则运算
operator–(complex&
operator*(complex&
operator/(complex&
friendostream&
operator<
<
(ostream&
os,complex&
c);
//友元函数:
重载<
private:
doubleRe,Im;
//复数的实部与虚部
};
#endif
//复数类complex的相关服务的实现放在C++源文件complex.cpp中
#include<
math.h>
#include“complex.h”
complex&
complex:
:
operator+(complex&
ob){
//重载函数:
复数加法运算。
complexresult;
result.Re=Re+ob.Re;
result.Im=Im+ob.Im;
returnresult;
}
复数减法运算
complexresult;
result.Re=Re–ob.Re;
result.Im=Im–ob.Im;
returnresult;
}
复数乘法运算
result.Re=Re*ob.Re–Im*ob.Im;
result.Im=Im*ob.Re+Re*ob.Im;
returnresult;
}
){
复数除法运算
doubled=ob.Re*ob.Re+ob.Im*ob.Im;
result.Re=(Re*ob.Re+Im*ob.Im)/d;
result.Im=(Im*ob.Re–Re*ob.Im)/d;
friendostream&
os,complex&
//友元函数:
,将复数ob输出到输出流对象os中。
returnos<
ob.Re<
(ob.Im>
=0.0)?
“+”:
“-”<
fabs(ob.Im)<
“i”;
1-5用归纳法证明:
(1)
(2)
(3)
【证明】略
1-6什么是算法?
算法的5个特性是什么?
试根据这些特性解释算法与程序的区别。
通常,定义算法为“为解决某一特定任务而规定的一个指令序列。
”一个算法应当具有以下特性:
①有输入。
一个算法必须有0个或多个输入。
它们是算法开始运算前给予算法的量。
这些输入取自于特定的对象的集合。
它们可以使用输入语句由外部提供,也可以使用赋值语句在算法内给定。
②有输出。
一个算法应有一个或多个输出,输出的量是算法计算的结果。
③确定性。
算法的每一步都应确切地、无歧义地定义。
对于每一种情况,需要执行的动作都应严格地、清晰地规定。
④有穷性。
一个算法无论在什么情况下都应在执行有穷步后结束。
⑤有效性。
算法中每一条运算都必须是足够基本的。
就是说,它们原则上都能精确地执行,甚至人们仅用笔和纸做有限次运算就能完成。
算法和程序不同,程序可以不满足上述的特性(4)。
例如,一个操作系统在用户未使用前一直处于“等待”的循环中,直到出现新的用户事件为止。
这样的系统可以无休止地运行,直到系统停工。
此外,算法是面向功能的,通常用面向过程的方式描述;
程序可以用面向对象方式搭建它的框架。
1-7设n为正整数,分析下列各程序段中加下划线的语句的程序步数。
(1)for(inti=1;
i<
=n;
i++)
(2)x=0;
y=0;
for(intj=1;
j<
j++){for(inti=1;
i++)
c[i][j]=0.0;
for(intj=1;
=i;
j++)
for(intk=1;
k<
k++)for(intk=1;
=j;
k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];
x=x+y;
}
(3)inti=1,j=1;
(4)inti=1;
while(i<
=n&
&
j<
=n){do{
i=i+1;
j=j+i;
for(intj=1;
j++)
}i=i+j;
}while(i<
100+n);
(3)i=1时,i=2,j=j+i=1+2=2+1,
i=2时,i=3,j=j+i=(2+1)+3=3+1+2,
i=3时,i=4,j=j+i=(3+1+2)+4=4+1+2+3,
i=4时,i=5,j=j+i=(4+1+2+3)+5=5+1+2+3+4,
……
i=k时,i=k+1,j=j+i=(k+1)+(1+2+3+4+…+k),
解出满足上述不等式的k值,即为语句i=i+1的程序步数。
(4)
一般地,
求出满足此不等式的k值,即为语句i=i+j的程序步数。
1-8试编写一个函数计算n!
*2n的值,结果存放于数组A[arraySize]的第n个数组元素中,0≤n≤arraySize。
若设计算机中允许的整数的最大值为maxInt,则当n>
arraySize或者对于某一个k(0≤k≤n),使得k!
*2k>
maxInt时,应按出错处理。
可有如下三种不同的出错处理方式:
(1)用cerr<
及exit
(1)语句来终止执行并报告错误;
(2)用返回整数函数值0,1来实现算法,以区别是正常返回还是错误返回;
(3)在函数的参数表设置一个引用型的整型变量来区别是正常返回还是某种错误返回。
试讨论这三种方法各自的优缺点,并以你认为是最好的方式实现它。
#include"
iostream.h"
#definearraySize100
#defineMaxInt0x7fffffff
intcalc(intT[],intn){
inti,edge=MaxInt/n/2;
T[0]=1;
if(n!
=0){
for(i=1;
n;
i++){
T[i]=T[i-1]*i*2;
if(T[i]>
edge)return0;
T[n]=T[n-1]*n*2;
cout<
"
T["
<
n<
]="
T[n]<
endl;
return1;
voidmain(){
intA[arraySize];
inti;
for(i=0;
arraySize;
i++)
if(!
calc(A,i)){
cout<
failedat"
."
break;
1-9
(1)在下面所给函数的适当地方插入计算count的语句:
voidd(ArrayElementx[],intn){
inti=1;
do{
x[i]+=2;
i+=2;
}while(i<
=n);
i=1;
while(i<
=(n/2)){
x[i]+=x[i+1];
i++;
(2)将由
(1)所得到的程序化简。
使得化简后的程序与化简前的程序具有相同的count值。
(3)程序执行结束时的count值是多少?
(4)使用执行频度的方法计算这个程序的程序步数,画出程序步数统计表。
(1)在适当的地方插入计算count语句
voidd(ArrayElementx[],intn){
inti=1;
count++;
i+=2;
count++;
count++;
//针对while语句
}while(i<
=(n/2)){
i++;
//针对最后一次while语句
化简后的程序与原来的程序有相同的count值:
voidd(ArrayElementx[],intn){
do{
count+=3;
i+=2;
while(i<
count+=3;
(3)程序执行结束后的count值为3n+3。
当n为偶数时,count=3*(n/2)+3*(n/2)+3=3*n+3
当n为奇数时,count=3*((n+1)/2)+3*((n–1)/2)+3=3*n+3
(4)使用执行频度的方法计算程序的执行步数,画出程序步数统计表:
行号
程序语句
一次执行步数
执行频度
程序步数
1
2
3
4
5
6
7
8
9
10
11
12
x[i]+=2;
i=1;
x[i]+=x[i+1];
0
1
⎣(n+1)/2⎦
⎣(n+1)/2⎦
⎣n/2+1⎦
⎣n/2⎦
(n≠0)
3n+3
四、其他练习题
1-10填空题
(A)由某一数据对象和该对象中各个数据成员间的关系组成。
依据所有数据成员之间关系的不同,(A)分为两大类:
(B)和(C)。
在(B)中的各个数据成员依次排列在一个线性序列中;
(C)的各个数据成员不再保持在一个线性序列中,每个数据成员可能与零个或多个其他数据成员发生联系。
根据视点的不同,数据结构分为数据的(D)和(E)。
(D)是面向问题的,(E)是面向计算机的。
A:
数据结构B:
线性结构C:
非线性结构
D:
逻辑结构E:
存储结构
1-11判断下列叙述的对错。
如果正确,在题前打“√”,否则打“⨯”。
(1)数据元素是数据的最小单位。
(2)数据结构是数据对象与对象中数据元素之间关系的集合。
(3)数据结构是具有结构的数据对象。
(4)数据的逻辑结构是指各数据元素之间的逻辑关系,是用户按使用需要建立的。
(5)算法和程序原则上没有区别,在讨论数据结构时二者是通用的。
(1)⨯
(2)√(3)⨯(4)√(5)⨯
1-12判断下列叙述的对错。
(1)所谓数据的逻辑结构是指数据元素之间的逻辑关系。
(2)同一数据逻辑结构中的所有数据元素都具有相同的特性是指数据元素所包含的数据项的个数都相等。
(3)数据的逻辑结构与数据元素本身的内容和形式无关。
(4)数据结构是指相互之间存在一种或多种关系的数据元素的全体。
(5)从逻辑关系上讲,数据结构主要分为两大类:
线性结构和非线性结构。
(1)√
(2)⨯(3)√(4)⨯(5)√
1-13填空题
算法是一个有穷的指令集,它为解决某一特定任务规定了一个运算序列。
它应当具有输入、输出、(A)、有穷性和可执行性等特性。
算法效率的度量分为(B)和(C)。
(B)主要通过在算法的某些部位插装时间函数来测定算法完成某一规定功能所需的时间。
而(C)不实际运行算法,它是分析算法中语句的执行次数来度量算法的时间复杂性。
程序所需的存储空间包含两个部分(D)和(E)。
(D)空间的大小与输入输出数据的个数多少,数值大小无关;
(E)空间主要包括其大小与问题规模有关的成分变量所占空间,引用变量所占空间,以及递归栈所用的空间,还有在算法运行过程中动态分配和回收的空间。
确定性B:
事后测量C:
事前估计
固定部分E:
可变部分
1-14有下列几种用二元组表示的数据结构,试画出它们分别对应的图形表示(当出现多个关系时,对每个关系画出相应的结构图),并指出它们分别属于何种结构。
(1)A=(K,R),其中
K={a1,a2,a3,a4},R={}
(2)B=(K,R),其中
K={a,b,c,d,e,f,g,h},R={r},
r={<
a,b>
<
b,c>
c,d>
d,e>
e,f>
f,g>
g,h>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 习题 解析
![提示](https://static.bdocx.com/images/bang_tan.gif)