目录
二、抽象数据类型(ADTs:Abstract Data Types)
1.3抽象数据类型的表示与实现
一、数据类型
数据类型是一组性质相同的值的集合,以及定义于这个集合上的一组运算的总称。
#include <iostream>
using namespace srd;
int main()
{
int x,y,m; //float x,y,m;
cin>>x>>y;
m = x % y;
cout<<m<<endl;
return 0;
}
二、抽象数据类型(ADTs:Abstract Data Types)
1.更高层次的数据抽象
2.由用户定义,用以表示应用问题的数据模型
3.由基本的数据类型组成,并包括一组相关的操作
抽象数据类型可以用以下三元组来表示:
ADT = (D,S,P)
D:数据对象
S:D上的关系集
P:D上的操作集
ADT常用定义格式:
抽象数据类型的表示与实现
1.抽象数据类型可以通过固有的数据类型(如整型、实型、字符型等)来表示和实现
2.它有类似C语言中的结构(struct)类型,但增加了相关的操作
3. 教材中用的是类C语言(介于伪码和C语言之间)作为描述工具
抽象数据类型的定义
抽象数据类型的表示
抽象数据类型的实现
抽象数据类型的表示与实现
(1)预定义常量及类型
//函数结果状态代码
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//Status 是函数返回值类型,其值是函数结果状态代码
typedef int Status
(2)数据元素被约定为ElemType类型,用户需要根据具体情况,自行定义该数据类型。
(3)算法描述为以下的函数形式:
函数类型 函数名(函数参数表)
{
语句序列;
}
(4)内存的动态分配与释放
使用new和delete动态分配和释放内存空间
分配空间 指针变量=new数据类型
释放空间 delete指针变量
(5)赋值语句
(6)选择语句
(7)循环语句
(8)使用的结束语句形式有:
函数结束语句 return
循环结束语句 break
异常结束语句 exit(异常代码)
(9)输入输出语句形式有:
输入语句 cin(scanf)
输出语句 cout(printf)
(10)扩展函数有:
求最大值 max
求最小值 min
1.4 算法与算法分析
一、算法和算法分析
1.算法的特性:
输入:有0个或多个输入
输出:有一个或多个输出(处理结果)
确定性:每步定义都是确切、无歧义的
有穷性:算法应在执行有穷步后结束
有效性:每一条运算应足够基本
2.算法的评价:
正确性 可读性 健壮性 高效性:时间代价,空间代价
3.算法的效率的度量
用依据该算法编制的程序在计算机上执行所消耗的时间来度量
事后统计 事前分析估计
(1)事后统计:利用计算机内的计时功能,不同算法的程序可以用一组或多组相同的统计数据区分。
缺点:必须先运行依据算法编制的程序。
所得时间统计量依赖于硬件、软件等环境因素,掩盖算法本身的优劣。
(2)事前分析估计:
一个高级程序在计算机上运行所消耗的时间取决于:
- 依据的算法选用何种策略
- 问题的规模
- 程序语言
- 编译程序产生机器代码质量
- 机器执行指令速度
同一算法用不同的语言、不同的编译程序、在不同的计算机上运行,效率均不同,——使用绝对时间单位衡量算法效率不合适
二、时间复杂度的渐进表示法:
算法中基本语句重复次数执行的次数是问题规模n的某个函数f(n)
算法的时间度量记作:T(n)=O(f(n))
表示随着n的增大,算法执行的时间的增长率和f(n)的增长率相同,称渐进时间复杂度。
- 算法中重复执行次数和算法的执行时间成正比的语句
- 对算法运行时间的贡献最大
- n越大算法的执行时间越长
排序:n为记录数
矩阵:n为矩阵的阶数
多项式:n为多项式的项数
集合:n为元素个数
树:n为树的节点个数
图:n为图的顶点数或边数
n * n阶矩阵加法:
for(i=0;i<n;i++)
for(j=0;j<n;j++)
c[i][j]=a[i][j]+b[i][j];
三、分析算法时间复杂度的基本方法
- 找出语句频度最大的那条语句作为基本语句
- 计算基本语句的频度得到问题规模n的某个函数f(n)
- 取其数量级用符号“O”表示
四、时间复杂度是由嵌套最深层语句的频度决定的
有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同
五、渐进空间复杂度