时间复杂度&空间复杂度
1空间复杂度——算法的空间性能分析
(1)算法的空间性能的影响因素
• 指令空间(由机器决定)
•数据空间(常量,变量占用空间)
•环境栈空间
(2)度量方法
单个常量,变量:由机器和编译器规定的类型存储决定。
数组变量:所占空间等于数组大小乘以单个数组元素所占的空间。
结构变量:所占空间等于各个成员所占空间的累加
例如:
double a[100]所需空间为100×8=800
int matrix[r][c]所需空间为2·r·c
2时间复杂度——算法的时间性能分析
(1)算法的时间性能的影响因素:
•机器的运行速度(执行代码的速度)
•书写程序的语言
•编译产生代码的质量
•算法的策略
•问题的规模
(2)度量方法
时间复杂性分为最好时间复杂性,最坏时间复杂性,平均时间复杂性。解决一个问题的所有算法中,时间复杂性最好的那个算法的时间复杂性定义为问题的时间复杂性。
各种语句的程序步数:
•注释:程序步数为0
•声明语句:程序步数为0,包括定义常数和变量的语句,用户自定义数据类型的语句,确定访问权限的语句,指明函数特征的语句。
•表达式:若表达式中不包含函数的调用,则程序步数为1;如果表达式包括函数调用,程序步数要包括分配给函数调用的程序步骤。
•赋值语句:<变量>=<表达式>的程序步数为1.但如果赋值语句中变量是数组或字符串(字符数组),则赋值语句的程序步数等于变量的体积加上表达式的程序步数。
•循环语句:若仅考虑循环控制部分,则有三种形式:
①while<表达式>do…
②do … while<表达式>
③for(<初始化语句>;<表达式1>;<表达式2>)…
①和②控制部分的程序步数等于<表达式>的程序步数。③控制部分第一次执行的程序步数等于<初始化语句>与<表达式1>的程序步数之和,后续执行的程序步数等于<表达式1>和<表达式2>程序步数之和。
•switch语句:
switch(<表达式>){
case 条件1:<语句1>
case 条件2:<语句2>
… …
default:<语句>
}
首部switch(<表达式>)的程序步数等于表达式具有的程序步数;执行一个条件的程序步数等于它自己的程序步数加上它前面的所有条件计算的程序步数。
•if_then语句:
If(<表达式>)<语句1>;
else(<语句2>);
分别将<表达式>,<语句1>,<语句2>的程序步数分配给,每一部分。如果else部分不出现,则这部分没有时间开销。
•函数执行语句/函数调用语句:函数调用语句的程序步数为0,其时间开销计入函数执行语句。函数执行语句的程序步数一般为1.
•动态存储管理语句
•转移语句:这类语句包括continue,break,goto,return和return<表达式>,程序步数一般为1,但是若return<表达式>中<表达式>的程序步数为实例特性函数,则其程序步数为<表达式>的程序步数。
时间复杂度的例题
c<log(2)n<n<nlog(2)n<n^2 <n^3<2n<3n<n!