一)、逻辑结构类型:
1、 集合:
元素之间关系:无。
特点:数据元素之间除了“属于同一个集合”的关系外,别无其他逻辑关系。是最松散的,不受任何制约的关系。
2、 线性结构:
元素之间关系:一对一。
特点:开始元素和终端元素都是唯一的,除此之外,其余元
素都有且仅有一个前驱元素和一个后继元素。
3、 树形结构:
元素之间关系:一对多。
特点:开始元素唯一,终端元素不唯一。除终端元素以外,每个元素有
一个或多个后继元素;除开始元素外,每个元素有且仅有一个前驱元素。
4、 图形结构:
元素之间关系:多对多。
特点:所有元素都可能有多个前驱元素和多个后继元素。
二)、数据类型(data type):
在用高级程序设计语言编写的程序中,必须对程序中出现的每个变量、常量或表达式,明确说明它们所属的数据类型。例如,C 语言中的基本数据类型有:整型、字符型、实型(包括单精度型和双精度型)及枚举型。
数据结构是指带结构的数据元素的集合,包括数据逻辑结构、存储结构和数据运算。
数据类型显式或隐含地规定了数据的取值范围、存储方式以及允许进行的运算。例如,在16位计算机中,C语言的int(整型)数据类型隐含取值范围为-32768~32767,其运算有+、-、*、/、%等。因此可以认为,数据类型是在程序设计语言中已经实现了的数据结构。
数据类型作用:
约束变量或常量的取值范围
约束变量或常量的操作
数据类型是一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称。
数据类型= 数据值的集合+ 一组操作
(1)高级语言中的数据类型包括:数据的逻辑结构、存储结构及操作的实现。
(2)高级语言中的数据类型按值的不同特性分为:原子类型 结构类型
(3)数据类型并不局限于高级语言
(4)我们可以撇开计算机不考虑,现实中的任何一个问题都可以定义为一个数据类型——称为抽象数据类型。
三)、抽象数据类型(ADT):
1、抽象数据类型= 逻辑结构+抽象运算
抽象数据类型= 数据结构+ 数据操作
基本运算:
AssignComplex(\&z,v1,v2):构造复数Z。
DestroyComplex(\&z):复数z被销毁。
GetReal(z,\&real):返回复数z的实部值。
GetImag(z,\&Imag):返回复数z的虚部值。
Add(z1,z2,\&sum):返回两个复数z1、z2的和。
}ADTComplex
2、抽象数据类型的表示与实现
抽象数据类型需要通过高级编程语言中已经实现的数据类型(通常称之为固有数据类型)来表示和实现。
抽象数据类型的实现包括数据结构的实现和操作的实现。一旦定义了一个抽象数据类型及具体实现,程序设计中就可以像使用基本数据类型那样,十分方便地使用抽象数据类型。
四)、算法:
程序是指使用某种计算机语言对一个算法的具体实现,即具体要怎么做。不一定满足有穷性
算法侧重于对解决问题的方法描述,即要做什么一定满足有穷性
算法用计算机语言描述——程序
1、 算法设计的5个目标:
正确性、可使用性、可读性、健壮性、高效性
在计算机中算法指的是解决某一问题的有限运算序列,它必须具备输入、输出和(可行性、确定性和有穷性)等5个特性。
2、算法的描述:
自然语言
流程图
程序设计语言
伪码
五)、算法分析:
算法分析目的:分析算法的时空效率以便改进算法性能。
1、 算法分析方式:
事后分析统计方法:编写算法对应程序,统计其执行时间。
编写程序的语言不同、执行程序的环境不同、其他因素,所以不能用绝对执行时间进行比较。
事前估算分析方法:撇开上述因素,认为算法的执行时间是问题规模的函数。
2、算法构成:
一个算法是由控制结构(顺序、分支和循环三种)和原操作构成的
控制结构:
顺序结构:按照所述顺序处理
分支结构:根据判断条件改变执行流程
循环结构:当条件成立时,反复执行给定的处理操作
原操作:指固有数据类型的操作,如+、-、*、/、++和--等
算法执行时间和空间消耗取决于两者的综合效果。
3、 算法T (n )和S (n ):
算法进行事前分析估算,就是要对问题规模n 与该算法在运行时所耗费的时间T 以及所占用的空间S 给出一个数量关系评价,即T(n)和S(n)
为了便于比较同一问题的不同算法,通常从这些算法中选取一种或几种对于所研究的问题(或算法类型)来说是基本操作的原操作,以该基本操作重复执行的次数作为算法的时间度量。
多数情况下,基本操作包含在最深层循环内的语句中,它的执行次数与包含它的语句的频度相同。
语句频度是指该语句重复执行的次数。
4、渐进分析法:
计算复杂函数时,只考虑对函数量级影响显著的部分,忽略掉不能显著改变函数量级的部分,其结果就是原函数的一个近似值,这个近似值在问题规模很大时会足够接近函数原值,这种方法称为渐近分析法。
5、时间复杂度:
【O的定义】设f (n )是正整数n 的一个函数,如果存在两个正常数c和n0,对于所有的n ≥n0,都有|f (n )|≤c |g (n )|,则记作f (n )=O (g (n ))
说明函数g (n ) 是函数f (n ) 取值的上限,也可以说函数f的增长最终至多趋同于g的增长
若某个算法是O (g (n ))的,只是表明了该算法最多会差到何种程度
大O记号给出了一个函数增长率的所有上限中最小的那个上限。
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作:T(n)=O(f(n))
它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度。
按数量级递增排列,常见的时间复杂度有:
常数阶O(1)、对数阶O(logn)、线性阶O(n)、线性对数阶O(nlogn)、平方阶O(n2)、立方阶O(n3)、指数阶O(2n)
6、空间复杂度:
类似于算法的时间复杂度,以空间复杂度作为算法所需存储空间的量度,
记作:S(n)=O(f(n))
其中,n为问题的规模(或大小)。
一个算法在所占用的存储空间:算法运行过程中临时占用的辅助存储空间
7、小结:
算法效率的度量:事后统计、事前分析估算;问题规模、基本操作、语句频度;渐近分析法、大O记号
算法的时间性能分析:渐近时间复杂度
算法的空间性能分析:空间复杂度