在了解时间复杂度和空间复杂度之前要先搞清楚算法效率,算法效率分为两种一个是时间效率也称时间复杂度,另一个是空间效率也称空间复杂度。
很显然,时间复杂度衡量一个算法用时多少即它的运行速度,空间复杂度衡量的是算法需要的空间,这两种复杂度都采用大O的渐进表示法来表示。随着计算机的发展,计算机的存储容量已经达到了很高的一个程度,现在基本上考虑的都是一个算法的时间复杂度,空间复杂度已经不再是一个需要特别关注的问题了。
我做的一个本节总结的思维导图↓
时间复杂度
计算时间复杂度主要是计算算法中基本操作的执行次数,采用大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",count);
}
1.先计算Func1的基本操作执行了多少次
F(N)=N^2+2*N+10
- N=10 F(N)=130
- N=100 F(N)=10210
- N=1000 F(N)=1002010
2.使用大O的渐进表示法
大O的渐进表示法:big O notation,用于描述函数的渐进行为的数学符号
大O渐进表示法的规则为
- 用常数1取代运行时间中所有的加法常数项
- 再修改后的运行次数函数中只保留最高阶项
- 最高阶项的常数如果不是1,则除去这个常数
按照规则最后得到结果Func1的时间复杂度为O(N^2)
空间复杂度
空间复杂度主要记住是计算变量的个数而不是程序占用了多少空间的大小,就不举实例说明了。
二者区别
- 时间复杂度是累积计算
- 空间复杂度是复用