目录
- [1.1 数据结构的研究内容](#1.1 数据结构的研究内容)
- [1.2 基本概念和术语](#1.2 基本概念和术语)
- [1.2.1 数据、··元素、··项和··对象](#1.2.1 数据、··元素、··项和··对象)
- [1.2.2 数据结构](#1.2.2 数据结构)
- [1.2.3 数据类型和抽象数据类型](#1.2.3 数据类型和抽象数据类型)
- [1.3 抽象数据类型的表示与实现](#1.3 抽象数据类型的表示与实现)
- [1.4 算法和算法分析](#1.4 算法和算法分析)
- [1.4.1 算法的定义与特性](#1.4.1 算法的定义与特性)
- [1.4.2 算法的时间复杂度](#1.4.2 算法的时间复杂度)
- [1.4.3 算法的空间复杂度](#1.4.3 算法的空间复杂度)
- [1.5 小结](#1.5 小结)
1.1 数据结构的研究内容
1.2 基本概念和术语
1.2.1 数据、··元素、··项和··对象
数据:
是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。
数据元素:
是数据的基本单位,也称元素/记录,用于完整地描述一个对象。如学生表中的一名学生。
数据项:
是组成数据元素的、有独立含义的、不可分割的最小单位。如学生基本信息表中的学号、姓名、性别等。
数据对象:
是性质相同的数据元素的集合,是数据的一个子集。如整数数据对象、字母字符数据对象、由多个数据项组成的复合数据元素。
1.2.2 数据结构
数据结构是带"结构"的数据元素的集合,"结构"就是指数据元素之间存在的关系,包括逻辑结构和存储结构。
一、逻辑结构
从逻辑关系上描述数据,与数据的存储无关,独立于计算机,数据元素和关系两要素
- 集合结构
数据元素之间只有"属于同一集合"的关系。
如确定一名学生是否为班级成员,只需将班级看作一个集合结构。
- 线性结构
数据元素之间存在一对一的关系。
如将学生信息数据按照其入学报道的时间先后顺序进行排列。
- 树结构
数据元素之间存在一对多的关系。
如在班级的管理体系中,班长管理多个组长,每位组长管理多名组员。
- 图结构或网状结构
数据元素之间存在多对多的关系。
如多位同学之间的朋友关系,任何两位同学都可以是朋友。
总结
二、存储结构
数据对象在计算机中的存储表示,也称物理结构。把数据对象存储到计算机时,通常既要存储各数据元素的数据,又要存储数据元素之间的逻辑关系。
- 顺序存储结构
借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,要求所有的元素依次存放在一片连续的存储空间中,数据从低地址向高地址方向储存,通常借助数组类型来描述。
- 链式存储结构
无需占用一整块存储空间,但为了表示数据元素(结点)之间的关系,需要给每个结点附加指针字段,用于存放后继元素的存储地址,通常借助指针类型来描述。每个结点占用两个连续的存储单元。
1.2.3 数据类型和抽象数据类型
- 数据类型
在程序设计语言中,每一个数据都属于某种数据类型。类型规定了数据的取值范围、存储方式以及允许进行的运算,数据类型是一个值的集合和定义在这个值集上的一组操作的总称。
如C语言中的整型变量,其值集为某个区间上的整数,定义在其上的操作为加减乘除和取模等算术运算。
- 抽象数据类型
就是指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括...三部分(如下)
定义格式:
ADT 抽象数据类型名
{
数据对象:<定义>
数据关系:<定义>//采用数学符号和自然语言描述
基本操作:<定义>
}ADT 抽象数据类型名
基本操作的定义格式:
基本操作名(参数表)
//赋值参数只为操作提供输入值,以"&"开头,除此之外还将返回操作结果
初始条件:<描述>//操作执行之前数据结构和参数应满足的条件,为空则省略
操作结果:<描述>//操作完成后,数据结构的变化状况和应返回的结果
1.3 抽象数据类型的表示与实现
运用抽象数据类型描述数据结构,有助于在设计一个软件系统时,不必首先考虑其中包含的数据对象,以及操作在不同处理器中的表示和实现细节,而是在构成软件系统的每个相对独立的模块上定义一组数据和相应的操作,把这些数据的表示和操作细节留在模块内部解决,在更高的层次上进行软件的分析和设计,从而提高软件的整体性能和利用率。
在C++中,用类的声明表示抽象数据类型,用类的实现来实现抽象数据类型。因此,C++中实现的类相当于数据的存储结构以及在存储结构上实现的对数据的操作。
(有在尽量缩减篇幅了其实,觉得这些很有助于理解就保留了)
以复数为例,
//定义部分
ADT Complex
{
数据对象:D={e1,e2|e1,e2∈R,R是AXT实数集}
数据关系:S={<e1,e2>|e1是复数的实部,e2是复数的虚部}
基本操作:
Create(&C,x,y)
操作结果:构造复数C,其实部和虚部分别被赋以参数x和y的值。
Add(C1,C2)
初始条件:C1,C2是复数。
操作结果:返回两个复数C1和C2的和。
}ADT Complex
//表示部分
typedef struct //复数类型
{
float Realpart; //实部
float Imagepart;//虚部
}Complex;
//实现部分
void Create(&Complex C,float x,float y)
{
//构造一个复数
C.Realpart=x;
C.Imagepart=y;
}
Complex Add(Complex C1,Complex C2)
{
//求两个复数C1和C2的和
Complex sum;
sum.Realpart=C1.Realpart+C2.Realpart;
sum.Imagepart=C1.Imagepart+C2.Imagepart;
return sum;
}
1.4 算法和算法分析
1.4.1 算法的定义与特性
算法是为了解决某类问题而规定的一个有限长的操作序列。
有穷性、确定性、可行性、输入和输出。
1.4.2 算法的时间复杂度
描述的是算法执行时间开销和问题规模n之间的关系。包含最好、平均和最坏时间复杂度。时间复杂度通常包括:常量阶、线性阶、平方阶、对数阶等。
求下面语句的执行次数:
for(i=1;i<=n;i++)//n+1
for(i=1;i<=n;i++)
求这一句x++;//n
for(i=1;i<=n;i++)
这一句for(j=1;j<=n;j++)//n(n+1)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
这一句x++;//n²
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
这一句x++;
结果是这个\(\sum_1^n\) * \(\sum_1^i\) * j
javascript
for(i=1;i<=n;i=i*2)
{
x++;
s=0;
}
结果是这个\(log_2n\)
相应的,整个程序的时间复杂度就取决于最大阶,如:
for(i=1;i<=n;i++)//n+1
for(j=1;j<=n;j++)//n(n+1)
n+1+n(n+1)=n+1+n²+n ---- O(n²)
1.4.3 算法的空间复杂度
程序执行时,除了需要寄存本身所有指令、常数、变量和输入的数据外(取决于问题本身),还需要一些对数据进行操作的辅助存储空间。空间复杂度考虑的就是在算法实现中考虑的辅助空间大小。
1.5 小结
1)数据结构是一门研究非数值计算程序设计中操作对象,以及这些对象之间的关系和操作的学科。
2)数据结构包括两个方面的内容:数据的逻辑结构和存储结构。同一逻辑结构采用不同的存储方法,可以得到不同的存储结构。
- 逻辑结构是从具体问题抽象出来的数学模型,从逻辑关系上描述数据,它与数据的存储无关。根据数据元素之间关系的不同特性,通常有四类基本逻辑结构:集合、线性、树形、图状结构。
- 存储结构是逻辑结构在计算机中的存储表示,分为顺序和链式两类。
3)抽象数据类型是指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,包括数据对象、数据关系、基本操作三部分。
4)算法是为了解决某类问题而规定的一个有限长的操作序列。算法有五个特性:有穷性、确定性、可行性、输入和输出。一个算法的优劣应从正确性、可读性、健壮性和高效性四个方面来评价。
5)算法分析的两个主要方面是分析算法的时间复杂度和空间复杂度,以考察算法的时间和空间效率。一般情况下,将算法的时间复杂度作为分析的重点。算法执行时间的数量级称为算法的渐近时间复杂度,T(n)=O(f(n))
,它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,简称时间复杂度。