Lesson2–算法的时间复杂度和空间复杂度
1. 算法效率
1.1 如何衡量一个算法的好坏
对于以下斐波那契数列:
long long Fib(int N)
{
if(N < 3)
return 1;
return Fib(N-1) + Fib(N-2);
}
斐波那契数列的递归实现方式非常简洁,但当N较大时,每多计算一位数,所耗时间急剧上升.
这是因为递归法实现计算斐波那契数列时,计算量会成几何倍数增叫,并且函数会进行大量的重复计算.
1.2 算法的复杂度
衡量一个算法的好坏一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度.
时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法所需的额外空间.
2. 时间复杂度
2.1 时间复杂度的概念
在计算机科学中,算法的 时间复杂度(time complexity) 是一个函数,它定性描述该算法的运行时间.
时间复杂度常用 大O符号表述 , 不包括这个函数的低阶项和首项系数 .
使用这种方式时,时间复杂度可被称为是渐进的,亦即考虑输入值大小趋近无穷时的情况.
void Func1(int N)
{
int count = 0;
for(int i = 0;i < N;++i)
{
for(int j = 0;j < N;++j)
{
++count;
}
}
for(int k = 0;k < 2 * N;++k)
{
++count;
}
int M = 10;
while(M--)
{
++count;
}
printf("%d\n",count);
}
Func1执行的基本操作次数:
F ( N ) = N 2 + 2 ∗ N + 10 F(N)=N^2+2*N+10 F(N)=N2+2∗N+10
- N=10 ~~~~~ F(N)=130
- N=100 ~~~ F(N)=10210
- N=1000 ~ F(N)=1002010
通过上面我们发现大O渐进表示法去掉了那些对结果影响不大的项,简洁地表示出了执行次数.
另外有些算法的时间复杂度存在最好,平均和最坏情况.在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N).
空间复杂度
在计算机科学中,一个算法或程序的 空间复杂度 定性地描述该算法或程序运行所需要的存储空间大小.
和时间复杂度类似,空间复杂度通常也使用大O记号来渐进地表示.