定义:算法是对问题求解步骤的描述,通过有限序列的指令来实现。
特征:
- 有穷性:有限步之后结束,不会出现无线循环。
- 确定性:不存在二义性,算法每个步骤被精确定义。
- 可行性:受限计算机的能力等因素,有些算法理论上可行,实际上无法完成。
- 输入:能被计算机处理的各种数据类型。
- 输出:一至多个程序输出结果。
算法的复杂度
时间复杂度:
- 它用来衡量算法问题规模增大,算法执行时间增长的快慢。
- 时间复杂度是问题规模的函数:记作T(n),时间复杂度主要分析T(n)的数量级。
- T(n)=O(f(n)),大O记法,f(n)是算法中基本运算的频度,一般我们考虑最坏情况下的时间复杂度。
空间复杂度:
- 它用来衡量算法随着问题规模增大,算法所需空间增长的快慢。
- 是问题规模函数:S(n)=O(g(n))
常用的时间复杂度大小关系:
从左至右,时间性能依次降低。
复杂度的计算
eg:
int sum=0 //执行一次
for (int i=0; i<=n; i+1){ // i=0执行一次,i<=n执行n+2次,i+1执行n+1次
sum=sum+i; // 执行n+1次
}
时间分析:
共执行(3n+6)个语句,每个语句执行时间为常数t,执行总的时间T=(3n+6)*t。
随着n增大,T与n的增长率一致。所以复杂度为O(n)。
复杂度是关于增长率的,因此忽略常数项,一般直接关注循环段的基本操作的执行次数。
单个循环体
关注循环体的执行次数,设为k.
int sum=0;
for(int i=0;i<=n;i++){
sum=sum+i;
}
循环体执行次数:k=n+1
时间复杂度为O(n)
int sum = 0;
for (int i=0; i<=n; i=pow(2,n)){
sum = sum + i;
}
那么,,当
时,跳出循环。
所以执行次数为[],所以时间复杂度logn。
多个循环体
两个运算规则:乘法规则和加法规则
for (i=1;i<=n;i++)
x++;
for (j=1;j<=n;j++)
for(k=1;k<=n;k++)
x++;
两个循环体是独立的,采用加法规则
时间复杂度为:
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j=pow(2,j)){
sum = sum + j;
}
}
两个循环体是嵌套的,采用乘法规则:
时间复杂度为:
空间复杂度
空间复杂度S(n)指算法运行过程中所有的使用辅助空间的大小。
记为:
- 辅助空间:除了存储算法本身的指令、常数、变量和输出数据伊娃,还需要存储对数据操作的存储单元。