1.2基本概念和术语
1.2.1数据,数据元素,数据项,数据对象
*数据:*信息的载体
*对客观事物符号化的表示
*能被计算机识别,储存或加工
数据包括:数值型:如整数,实数
非数值型:文字,图像,声音,图形
*数据元素:是数据的基本单位,在计算机中通常作为一个整体考虑或处理。用于完整的描述一个对象。是数据的一个个体。又称为:元素,记录,结点,顶点等。如:棋盘的一个状态,一个学生的记录等
*数据项:是组成数据元素的,有独立含义的,不可分割的最小单位。如学生的姓名,年龄等
*数据对象:是性质相同的数据元素的集合,是数据的一个子集
数据项——>数据元素——>数据对象——>数据
1.2.2数据结构
*数据结构:带有结构的数据元素的集合,结构即数据之间存在的关系
——逻辑结构
数据结构:——物理/存储结构——数据元素及其关系在内存中的表示(又称为映像)
——数据的运算和实现
1)逻辑结构
数据的逻辑结构是从逻辑关系上描述数据,与数据的存储无关,是独立于计算机的。可以看作是从具体问题中抽象出来的数学模型
*线性结构:数据元素之间存在一对一的关系,有且仅有一个开始和一个终端结点,中间每个结点只有一个直接前趋和一个直接后继。如:线性表,栈,队列,数组
*非线性结构:——集合结构:数据元素属于同一集合,除此之外别无关系
——树形结构:数据元素之间存在一对多的关系
——图形结构:数据元素之间存在多对多的关系
2)存储结构
数据对象在计算机中的储存表示称为数据的存储结构(物理结构),通常要求存储数据元素和逻辑关系。是数据元素及其关系在计算机中存储的结构,是数据结构在计算机中的表示。
*顺序存储结构:用一组连续的存储单元一次存储数据元素(通常使用数组)
*链式存储结构:无需占用一整块内存空间,但为了表示结点之间的关系,需要在每个结点添加指针字段,用于存放后继结点的存储地址。
3)逻辑结构和存储结构的关系
*存储结构是逻辑结构和数据元素本身的映像
*逻辑结构是数据结构的抽象,存储结构是数据结构的实现
1.2.3数据类型和抽象数据类型
1)数据类型:每一个数据都属于某种数据类型。类型明显或隐含的规定了数据的取值范围,存储方式以及允许进行的运算。数据类型是一个值的集合和定义在这个值集上的一组操作的总称。
2)抽象数据类型:
抽象数据类型(ADT)通常指由用户定义的,表示应用问题的数学模型,及定义在其上的操作总称。具体包括:数据对象,数据对象上关系的集合以及对数据对象的基本操作的集合。
数据对象的形式定义格式:
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT 抽象数据类型名
其中,数据对象和数据关系的定义用数学语言和自然语言,基本操作的定义格式为:
基本操作名(参数列表)
初始条件:<初始条件描述>
操作结果:<操作结果描述>
ps:参数表:赋值参数:只为操作提供输入值。引用参数:除提供输入值外还返回操作结果
1.3抽象数据类型的表示和实现 见书p8-p9页基本语法
1.4算法与算法分析
算法:是解决问题的一种方法或过程,为了解决的问题规定的有限长的操作序列,一个问题可以有多个算法。
程序:某种程序设计语言对算法的具体实现。
算法语言描述:——自然语言
——流程图:传统流程图,NS,流程图
——伪代码,类语言:类c语言
——程序代码:c语言,Java语言等
1.4.1算法定义及特性
算法的五个重要特性:
1)有穷性:算法必须执行有穷步结束,且每步要在有穷时间完成
2)确定性:对于操作步骤,算法要有明确定义
3)可行性:算法的操作可以通过已经实现的基本操作来实现
4)输入:一个算法要有0个或多个输入
5)输出:算法要有一个或多个输出,无输出的算法无意义。用函数描述算法时,输出多用返回值或引用类型的形参表示
1.4.2评价算法优劣性的基本标准
1)正确性:对于精心选择的,典型,苛刻且带有刁难性的数据能满足要求
2)可读性:易于理解
3)健壮性:输入数据非法时,能做出正确的反应
4)高效性:时间和空间的高效性
1.4.3算法的时间复杂度
衡量算法效率的方法:事后统计法和事前估计法(一般采用后者)
1)问题规模和语句频度
问题规模是算法求解问题输入量的多少,一般用n来表示(如矩阵阶数n,树的结点数n)
语句频度是一条语句重复执行的次数
设每条语句执行一次所需时间均是单位时间,则一个算法的执行时间可用该算法中所有语句频度来度量
//求两个n阶矩阵的乘积算法
for(int i = 0; i <= n;i++) //频度为n+1(for循环最后一次要判断,但内部执行n次)
for(int j = 0;j <= n;j++) //频度n*(n+1)
{
c[i][j] = 0; //n*n
for(int k = 1;k <= n;k++) //n*n*(n+1)
c[i][j] = c[i][j]+a[i][j]*b[k][j]; //n*n*n
}
则该算法所需时间f(n) = 2*n^3+3*n^2+2*n+1
2)算法时间复杂度定义
当n—>∞时,若存在一个辅助函数g(n)使得lim f(n)/g(n) = c(c!=0);
此处g(n)取n^3
那么f(n)与g(n)为同阶,或者说其数量级相同。用O来表示数量级
记作T( n ) = O( f( n ) )=O(n^3)
上式即为算法的渐进时间复杂度,简称算法时间复杂度
定理一:求算法时间复杂度时,可以忽略所有低次项和最高次项的系数
多数情况下,当有若干个循环语句时,算法时间复杂度是由最深层循环内的基本语句的频度决定的
常见算法时间复杂度递增序列
常量阶O(1),对数阶O(lgn),线性阶O(n),线性对数阶O(nlgn),平方阶(n^2),立方阶O(n^3),......,k次方阶O(n^k),指数阶O(2^n),阶乘阶O(n!)
//对数阶分析
for(int i = 1;i <= n;i=i*2)
{x++;s=0}
//取a为执行次数
//则有2^a<=n
//得a <= log2(n)
3)最好,最坏和平均时间复杂度
对于某些问题的算法时间复杂度,除问题规模外,还依赖于其他因素(如排序的数组原始状态)
最好时间复杂度:算法在最好情况下的时间复杂度
最坏时间复杂度:算法在最坏情况下的时间复杂度
平均时间复杂度:算法在所有可能的情况下,按照输入示例以等概率出现时计算量的加权平均值。
通常考虑最坏时间复杂度和平均时间复杂度
4)算法时间复杂度的计算法则
加法法则
T(n) = T1(n) + T2(n) = O(f(n)) + O(g(n)) = O(max{ f(n) , g(n) })
乘法法则
T(n) = T1(n) * T2(n) = O(f(n)) * O(g(n)) = O( f(n) * g(n) )
1.4.4算法空间复杂度
只需分析算法在实现时所需要的辅助空间
若执行时所需要的辅助空间相对于输入数据来说是个常数,则称为原地工作,辅助空间O(1)
对一个算法来说,其时间复杂度和空间复杂度往往是此消彼长的