一、算法:解决问题的方法。
我们可以把所有的算法想象为一本
“
菜谱
”
,特定的算法比如菜谱中的的一道菜的制作流程,只要按照菜谱的要求制作,那么谁都可以做出一道好吃的菜。so
,这个做菜的步骤就可以理解为:“
解决问题的步骤
”
例如排序的算法,有插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
这么多算法,那怎么衡量他们的好坏呢?
比如衡量一台电脑的好坏,可以
CPU
,价格,内存等
算法可以用时间复杂度,和空间复杂度来衡量。
时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。
二、.时间复杂度
1.什么是时间复杂度
public class Main {
public static void main(String[] args) {
//下面这句代码会运行多长时间
int i = 0;
//那下面这句呢?
int a = 1,b = 2,c = 3...z = 26;
for(int i = 0; i < n ;i++){
System.out.println("Hello world!");//那这句呢?
}
//电脑运行每一句代码的时候都要要花费时间,我们可以把每一条语句的执行时间都看做是一样的,记为一个时间单元。
//所以上面的前两句代码各花费了两个时间单元,第三句花费了n个时 间单元
//用T(n)表示程序运行了多长时间,那么上面的代码运行时间为
T(n) = 2 + n
//其中的n被我们称为问题的规模,其实就是处理问题的大小
//一般只关心随着问题规模n趋于无限大时对结果影响最大的项
//所以上面的T(n)可以简化为T(n) ~ n
简化后的式子就是这个算法的时间复杂度
记为O(f(n))为时间复杂度
//所以上面的算法的时间复杂度为O(n)
}
}
常见的复杂度如下:
- 常数阶:O(1)
- 线性阶:O(n)
- 平方阶:O(nˆ2)
- 对数阶:O(logn)
- 线性对数阶:O(nlongn)
- 立方阶:O(nˆ3)
- 指数阶:O(2ˆn)
(
1
)常数阶
定义变量、给变量赋值、打印输出、这种只执行一次的语句的时间复杂度就是O(1)
(
2
)线性阶
单层for
循环中的语句执行次数为
n
次的语句,时间复杂度就是
O(n)
(
3
)对数阶
例如

(
4
)平方阶
双层for
循环中的语句执行次数为
n*n,
时间复杂度为
O(nˆ2)

2.为什么要计算算法的时间复杂度
时间复杂度可以表示算法的运行时间趋势,从而判定一个算法的效率的好坏
3.怎么计算算法的时间复杂度
一、得出运行时间的函数
f
(
n
)
二、对函数进行简化
①用常数
1
来取代运行时间中所有加法常数
②修改后的函数中,只保留最高阶项
③如果最高阶项存在且不是
1
,则忽略这个项的系数
三、空间复杂度
1.
是另一个衡量算法好坏的因素
2.
一个算法在运行过程中临时占用存储空间大小的量度
3.
空间复杂度算的是变量的个数