一、数据结构的研究内容
程序的本质: 程序=数据结构+算法
课程内容:
数据结构的地位:
二、基本概念和术语
1.数据的相关概念
数据
定义:数据是对客观事物的符号表示。是能输入计算机且能被计算机识别、存储和加工的各种符号的集合。
包括:数值型数据(整数、实数),非数值型数据(文字、图像、声音)。
数据元素
是数据的基本单位。
也称为元素,但在不同数据结构中有不同名称,如记录、节点、顶点。在计算机程序中通常作为一个整体进行考虑和处理。
一个数据元素可由若干个数据项构成,例如学生成绩管理系统中,一名学生的信息就是一个数据元素,他的学号、姓名和各科成绩就是数据项。
数据项
构成元素的不可分割的最小单位。
是数据的最小单位。
数据对象
是性质相同的数据元素的集合,例如学习成绩管理系统中所有学生的学号或单科成绩。
是数据的子集。这里要和数据元素区分开,数据元素是数据的个体。
2.数据结构的相关概念
概念
数据元素相互之间的关系称为结构。
数据结构是指相互之间存在一种或多种特定关系的数据元素集合。
或者说,数据结构是带结构的数据元素集合。(注意不是数据项的集合!)
内容
逻辑结构:数据元素之间的逻辑关系。
分为线性结构(前后一一相连)和非线性结构(前后存在一对多或多对多)。
分为集合结构、线性结构、树形结构、图状结构。
与数据元素本身的形式、内容、相对位置和个数无关。
存储结构(物理结构):是数据结构在计算机中的表示(又称映像)。
顺序存储结构:借助元素在存储器中的相对位置来表示数据元素之间的关系,通常使用数组。
链式存储结构:顺序存储结构要求所有的元素依次存放在一片连续的存储空间中,而链式存储结构,无需占用一整块存储空间。但为了表示结点之间的关系,需要给每个结点附加指针字段,用于存放后继元素的存储地址。通常使用指针。
索引存储结构:索引表(通讯录、字典)
散列存储结构:散列表
数据的运算和实现:是指对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现。
3. 数据类型和抽象数据类型
数据类型
定义:一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称。
作用:约束变量或常量的取值范围和操作。
注意:一些基本数据结构可以用数据类型来实现,如数组、字符串;而诸如栈、队列、树、图等常用的数据结构则不能用数据类型来实现。
抽象数据类型 (Abstruct Data Type,ADT)
概念
是指一个数学模型以及定义在这个数学模型上的操作。
由用户定义,从问题抽象出数据模型(逻辑结构);
还包括定义在数据模型上的一组抽象运算;
不考虑具体的存储结构和实现算法。
形式定义
抽象数据类型可用(D,S,P)三元组表示;
D是数据对象,S是D上的关系集,P是对D的基本操作集。
定义格式
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
} ADT 抽象数据类型名
其中数据对象和数据关系的定义用伪代码描述;
基本操作的定义格式为:
基本操作名(参数表)
初始条件:<初始条件描述>
操作结果:<操作结果描述>
参数表:和函数类似,赋值参数只为操作提供输入值,以&开头的引用参数还能返回操作结果。
初始条件:描述操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败并返回相应的出错信息。若初始条件为空,则省略之。
操作结果:说明操作完成之后,数据结构的变化状况和应返回的结果。
具体格式和示例:
4.概念小结
三、算法和算法分析
1.算法
定义
是为了解决某类问题而规定的一个有限长的操作序列。
对特定问题的求解方法和步骤的描述,是指令的有限序列。其中每个指令表示一个或多个操作。
简而言之,就是求解问题的方法和步骤。
算法是抽象的,程序是具体的,数据结构通过算法实现操作,算法通过数据结构设计程序。
特性
有穷性:步骤和时间有穷;
确定性:操作的含义明确,不会出现歧义;
可行性
输入输出:一个算法有零个或多个输入,至少有一个输出。
评价标准
正确性:对任何合法的输入数据都能输出满足条件的结果。
可读性:易于理解。
健壮性(鲁棒性,Robustness):对待非法的输入数据和程序出错,能够有合理的处理方式。
高效性:要求花费尽量少的时间和尽量低的存储需求。
2.算法效率分析
判断指标
一个算法在满足正确性、可读性和健壮性的前提下,才考虑算法的效率;
算法效率从时间和空间两方面考虑。时间效率指的是算法花费的时间,空间效率指的是算法执行过程中所耗费的存储空间,时间效率和空间效率有时候是矛盾的。
时间复杂度和空间复杂度是衡量算法的两个主要指标。
算法时间效率的度量
算法运行时间=一个简单操作所需的时间*简单操作次数
算法运行时间=每条语句执行次数(又称语句频度)*该语句执行时间(求和)
做题时,默认执行每条简单语句(单次运算、赋值)的时间为单位时间。
算法时间复杂度
影响因素
问题的规模
待处理数据的初态
问题的其他因素(如某些排序的算法,其执行时间与待排序记录的初始状态有关)
最好、最坏和平均时间复杂度
最好时间复杂度:算法计算量可能达到的最小值;
最坏时间复杂度:算法计算量可能达到的最大值;
平均时间复杂度:算法在所有可能情况下,按照输入实例以等概率出现时,算法计算量的加权平均值。分析查找算法的时间复杂度时会采用平均时间复杂度。
算法空间复杂度
算法的时间复杂度分析题
常数阶
算法中没有使用计数器,全都是常数。
x = 90;
y = 100;
while (y > 0) {
if (x > 100) {
x = x - 10;
y--;
} else x++;
}
答案:O(1)
解析:程序的执行次数为常数阶。
平方阶
s = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
s += B[i][j];
sum = s;
}
}
答案:O(n 2)
解释:语句 s+=B[i] [j]; 的执行次数为n 2。
对数阶
i = 1;
while (i <= n) {
i = i * 3;
}
答案:O(log 3n)
解释:语句i=i*3;的执行次数为log 3n (有关对数公式:如果a x = N,记做 x = log aN)
设 i = i*3 执行了 x 次,则 3 x = n ;故 x = log 3n 。
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。
i = 1 时,循环执行 n-1 次,
i = 2 时,循环执行 n-2 次,
i = 3 时,循环执行 n-3 次,
…
i = n-1 时,循环执行 1 次。
则相加: (n-1)+(n-2)+(n-3)+…+3+2+1 = n(n-1)/2
一共有 n-1 个式子,前后相加等于 n ,则总和为 n(n-1)/2
x = n; //n>1
y = 0;
while (x≥(y + 1) * (y + 1)){
y++;
}
PTA 选择题
数据结构相同,对应的存储结构不一定相同。
存储结构指的是元素在内存中的位置和排序。
不同顺序表的数据结构相同,但是具体实现顺序表之后,其使用的内存可能是像数组一样的连续线性存储,也可能是不连续线性存储,这样的存储结构就不一样了。
更深入地解释就是,存储结构不一定是一样的,而且极大概率不一样,因为在编译器里跑的变量虽然都是相对偏移量,但是是虚拟内存,不是内存条上对应的结构。
逻辑结构的生成在先,所以逻辑结构独立于其存储结构。
记住抽象数据类型的三个特点就行,
数据封装、信息隐藏、使用和实现分离。
记住结论就好,是执行时间与之成正比。
期末题库
数据结构被形式地定义为一个二元组 ( D , S ) ,其中S是D上 关系 的有限集。
算法分析的目的是:找出数据结构的合理性。
整数不属于抽象数据类型。(这是基本的数据类型)
程序设计的实质是:给出解决特定问题程序的过程。(而非简单的数据处理)
数据结构的基本操作的设置的最重要的准则是:实现应用程序与存储结构的独立。(应用程序代表数据的逻辑结构,存储结构指的就是数据存储的物理结构)
算法的时间复杂度是问题规模的函数。(问题规模就是n,时间复杂度虽然和算法的执行时间成正比,但依旧是问题规模n的函数)
数据的物理结构包括数据元素的表示和元素间关系的表示。(没有操作,因为这里是物理结构而不是数据结构!)
算法的时间复杂度都是以算法中执行频度最高的语句的执行次数来确定的吗?不是的,那只是一个影响因素,不能由它直接确定,影响时间复杂度的因素还有问题的规模和待处理数据的初态等。
线性结构中结点按逻辑关系依次排列形成一条“锁链”。这个描述是对的,可以用锁链模型来理解线性结构的一对一关系。