严蔚敏数据结构(C语言版)知识点总结笔记课后答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第1章绪论
1.1复习笔记
一、数据结构的定义
数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科。
二、基本概念和术语
数据
数据(data)是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称,它是计算机程序加工的“原料”。
2.数据元素
数据元素(data element)是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
3.数据对象
数据对象(data object)是性质相同的数据元素的集合,是数据的一个子集。
4.数据结构
数据结构(data structure)是相互之间存在一种或多种特定关系的数据元素的集合。
(1)数据结构的基本结构
根据数据元素之间关系的不同特性,通常有下列四类基本结构:
① 集合。
数据元素之间除了“同属于一个集合”的关系外,别无其它关系。
② 线性结构。
数据元素之间存在一个对一个的关系。
③ 树形结构。
数据元素之间存在一个对多个的关系。
④ 图状结构或网状结构。
数据元素之间存在多个对多个的关系。
如图1-1所示为上述四类基本结构的关系图。
图1-1 四类基本结构的关系图
(2)数据结构的形式定义
数据结构的形式定义为:数据结构是一个二元组Data_Structure==(D,S)
其中:D表示数据元素的有限集,S表示D上关系的有限集。
(3)数据结构在计算机中的表示
数据结构在计算机中的表示(又称映象)称为数据的物理结构,又称存储结构。
它包括数据元素的表示和关系的表示。
① 元素的表示。
计算机数据元素用一个由若干位组合起来形成的一个位串表示。
② 关系的表示。
计算机中数据元素之间的关系有两种不同的表示方法:顺序映象和非顺序映象。
并由这两种不同的表示方法得到两种不同的存储结构:顺序存储结构和链式存储结构。
a.顺序映象的特点是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。
b.非顺序映象的特点是借助指示元素存储地址的指针(pointer)表示数据元素之间的逻辑关系。
5.数据类型
数据类型(Data type)是一个值的集合和定义在这个值集上的一组操作的总称。
按“值”的不同特性,高级程序语言中的数据类型可分为两类:一类是非结构的原子类型,值是不可分解的;另一类是结构类型,值是由若干成分按某种结构
组成的,可以分解,并且它的成分可以是非结构的,也可以是结构的。
6.抽象数据类型
抽象数据类型(Abstract Data Type简称ADT)由一个值域和定义在该值域上的一组操作组成。
抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。
“抽象”的意义在于数据类型的数学抽象特性。
若按其值的不同特性,抽象数据类型可细分为下列三种类型:原子类型,固定聚合类型和可变聚合类型。
7.多形数据类型
多形数据类型(polymorphic data type)是指其值的成分不确定的数据类型。
三、抽象数据类型的表示和实现
抽象数据类型可通过固有数据类型来表示和实现,即利用处理器中已存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作。
1.抽象数据类型的C语言描述
(1)预定义常量和类型
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
(2)数据结构的表示和数据元素类型
typedef //数据结构的表示(存储结构)用类型定义(typedef)描述
ElemType //数据元素类型约定为ElemType
(3)算法的函数描述
函数类型函数名(函数参数表)
{ 语句序列
}
(4)赋值语句
简单赋值变量名=表达式;
串联赋值变量名1=变量名2=…=变量名k=表达式;
成组赋值(变量名1,变量名2,…,变量名k)=(表达式1,表达式2,…,表达式k);
结构名=结构名
结构名=(值1,…,值k);
变量名[]=表达式;
变量名[起始下标..终止下标]=变量名[起始下标..终止下标];
交换赋值变量名变量名
条件赋值变量名=条件表达式?表达式T:表达式F;
(5)选择语句
条件语句1 if(表达式)语句;
条件语句2 if(表达式)语句;
else 语句;
开关语句1 switch(表达式)
{ case 值1:语句序列1;break;
…
case 值n:语句序列n;break;
default:语句序列n+1;
}
开关语句2 switch{
case 条件1:语句序列1;break;
…
case 条件n:语句序列n;break;
default:语句序列n+1;
}
(6)循环语句
for语句for(赋初值表达式序列;条件;修改表达式序列)语句;while语句while(条件)语句;
do-while语句do{
语句序列;
}while(语句);
(7)结束语句
函数结束语句return 表达式;
return;
case结束语句break;
异常结束语句exit(异常代码);
(8)输入和输出语句
输入语句scanf([格式串],变量1,…,变量n);
输出语句printf([格式串],表达式1,…,表达式n);
(9)基本函数
求最大值max(表达式1,…,表达式n)
求最小值min(表达式1,…,表达式n)
求绝对值abs(表达式)
求不足整数值floor(表达式)
求进位整数值ceil(表达式)
判定文件结束eof(文件变量)或eof
判定行结束eoln(文件变量)或eoln
(10)逻辑运算
与运算&&:对于A&&B,当A的值为0时,不在对B求值。
或运算||:对于A||B,当A的值为非0时,不在对B求值。
四、算法和算法分析
算法
(1)算法的定义
算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。
(2)算法的5个重要特性
① 有穷性;
② 确定性;
③ 可行性;
④ 输入;
⑤ 输出。
2.算法设计的要求
(1)正确性(correctness)
正确性是指设计或选择的算法应当能正确地反映某种需求,否则,算法正确与否的衡量准则就不存在了。
“正确”一词的含义大体可分为以下四个层次:
① 程序不含语法错误。
② 程序对于几组输入数据能够得出满足规格说明要求的结果。
③ 程序对于精心选择的、典型、苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果。
④ 程序对于一切合法的输入数据都能产生满足规格说明要求的结果。
(2)可读性(readability)
可读性算法首先是方便人的阅读与交流,其次才是机器执行。
可读性好有助于人对算法的理解,因为晦涩难懂的程序易于隐藏较多错误从而难以调试和修改。
(3)健壮性(robustness)
健壮性是指当输入数据非法时,算法也能适当地作出反应或进行处理,而不会产生莫明其妙的输出结果。
(4)效率与低存储量需求
效率指的是算法执行时间。
对于同一个问题如果有多个算法可以解决,执行时间短的算法效率高;存储量需求指算法执行过程中所需要的最大存储空间,这两者都与问题的规模有关。
3.算法效率的度量
算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量,度量一个程序的执行时间通常有两种方法:
(1)事后统计
很多计算机内部都有计时功能,有的甚至可精确到毫秒级,因此采用不同算法的程序可通过一组或若干组相同的统计数据以分辨优劣。
但这种方法有两个缺陷:一是必须先运行依据算法编制的程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。
(2)事前分析估算
① 消耗时间的因素
一个用高级程序语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:
a.程序依据的算法选用的策略。
b.问题的规模。
c.书写程序的语言。
d.编译程序所产生的机器代码的质量。
e.机器执行指令的速度。
显然,同一个算法用不同的语言实现,或者用不同的编译程序进行编译,或者在不同的计算机上运行时,效率均不相同,这表明使用绝对的时间单位衡量算法的效率是不合适的。
② 时间复杂度
为了便于比较同一问题的不同算法的执行时间,通常的做法是从算法中选取一种对于所研究的问题(或算法类型)来说是基本运算的原操作,以该基本操作重复执行的次数作为算法的时间量度。
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作
T(n)—O(f(n))
它表示随问题规模n的增大算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度(asymptotic time complexity),简称时间复杂度。
由于算法的时间复杂度考虑的只是对于问题规模n的增长率,因此在难以精确计算基本操作执行次数(或语句频度)的情况下,只需求出它关于n的增长率或阶即可。
4.算法的存储空间需求
类似于算法的时间复杂度,以空间复杂度(space complexity)作为算法所需存储空间的量度,记作
S(n)=O(f(n))
其中n为问题的规模。
1.2强化习题详解
【基础知识题】
1.简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。
答:(1)数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并能被计算机程序处理的符号的总称。
(2)数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
(3)数据对象是性质相同的数据元素的集合,是数据的一个子集。
(4)数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
(5)存储结构是数据结构在计算机中的表示(又称映象或数据的物理结构)。
(6)数据类型是一个值的集合和定义在这个值集上的一组操作的总称。
(7)抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。
试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。
答:数据结构是指相互之间存在一种或多种特定关系的数据元素的集合;抽象数据类型是指一个数学模型以及在该模型上的一组操作。
(1)抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。
“抽象”的意义在于数据类型的数学抽象特性。
(2)抽象数据类型包含一般数据类型的概念,但含义比一般数据类型的范畴更广,它不再局限于各处理器中已定义并实现的数据类型,还包括用户在设计软件时自己定义的数据类型。
(3)抽象数据类型可通过固有数据类型来表示和实现,即利用处理器中已存在的数据类型来说明新的结构,利用已经实现的操作来进行新的操作。
设有数据结构(D,R),其中,,
,试按图论中图的画法惯例画出其逻辑结构图。
答:逻辑结构图如下:
试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义(有理数是其分子、分母均为自然数且分母不为零的分数)。
答:ADT Complex{
数据对象:D={r,i|r,i为实数}
数据关系:R={<r,i>}
基本操作:
InitComplex(&C,re,im)
操作结果:构造一个复数C,其实部和虚部分别为re和im
DestroyCmoplex(&C)
操作结果:销毁复数C
Get(C,k,&e)
操作结果:用e返回复数C的第k元的值
Put(&C,k,e)
操作结果:改变复数C的第k元的值为e
IsAscending(C)
操作结果:如果复数C的两个元素按升序排列,则返回1,否则返回0
IsDescending(C)
操作结果:如果复数C的两个元素按降序排列,则返回1,否则返回0
Max(C,&e)
操作结果:用e返回复数C的两个元素中值较大的一个
Min(C,&e)
操作结果:用e返回复数C的两个元素中值较小的一个
}ADT Complex。