一.定义
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作
简而言之,算法是描述解决问题的方法
二.特性
输入、输出、有穷性、确定性和可行性
好的算法应该具有正确性,可读性,健壮性,高效率和低存储量的特征
三.算法时间效率度量
1.可以忽略加法常数
O(2n + 3) = O(2n)
2.与最高次项相乘的常数可忽略
O(2n^2) = O(n^2)
3.最高次项的指数大的,函数随着 n 的增长,结果也会变得增长得更快
O(n^3) > O(n^2)
4.判断一个算法的(时间)效率时,函数中常数和其他次要项常常可以忽略,而更应该关注主项(最高阶项)的阶数
O(2n^2) = O(n^2+3n+1)
O(n^3) > O(n^2)
四.时间复杂度&空间复杂度的区别用法
1.时间复杂度:大 O 阶推导方法
①.定义
时间复杂度所需消耗的时间即基本操作执行次数
②.时间复杂度的计算
- 用常数 1取代运行时间中的所有加法常数
- 在修改后的运行次数函数中,只保留最高阶项
- 如果最高阶项存在且不是 1,则去除与这个项相乘的常数
③.举例:
int i,j;
for ( i = 0; i < n; ++i){
for(j = i; j < n; ++j){
//时间复杂度为 O(1) 的程序步骤序列
}
}
④.分析:
对于外循环,其时间复杂度为 O(n);
对于内循环,当 i=0 时,内循环执行了 n 次,当 i=1 时,执行了 n-1 次,······当 i=n-1 时,执行了 1 次。
因此内循环总的执行次数为:
n + (n-1) + (n-2) + ··· + 1
根据大 O 阶推导方法,最终上述代码的时间复杂度为 :
⑤.常见的时间复杂度
2.空间复杂度
①.定义
算法的空间复杂度通过计算算法所需的存储空间实现
即运行完一个程序所需内存的大小
算法的时间复杂度和空间复杂度是可以相互转化的
②.空间复杂度的计算
利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计
一个算法所需的存储空间用f(n)表示
空间复杂度的计算公式记作:S(n)=O(f(n))
其中n为问题的规模
S(n)表示空间复杂度
③.存储空间
(1)固定部分
这部分属于静态空间
这部分空间的大小与输入/输出的数据的个数多少、数值无关
主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间
(2)可变空间
这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等
这部分的空间大小与算法有关