1.时间复杂度的概念
在平时我们写代码时避不开写各种算法,算法千千万万,就有好坏之分,如何判断一个算法的好坏
呢?为了解决这个问题,就引出了算法效率这个概念,算法效率分析分为两种:第一种是时间效
率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。
时间复杂度顾名思义就是来衡量一个数学算法的运行时间,即操作中基本的执行次数。而时间复杂
度的计算就要运用到一个叫做大O的渐进表示法。
2.大O的渐进表示法
// 请计算一下func1基本操作执行了多少次?
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--) > 0) {
count++;
}
System.out.println(count);
}
Func1的执行次数的公式:F(N)=N^2+2*N+10
实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次
数,那么这里我们使用大O的渐进表示法。
1.推导大O阶方法
1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
如上述Func1的大O阶就为O(N^2)
3.空间复杂度的概念
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度不是程序占用
了多少bytes的空 间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计
算规则基本跟时间复杂度类似,也使用大O渐进表示法。
4.错题分析
1.计算时间复杂度
void fun(int n) {
int i=l;
while(i<=n)
i=i*2;
}
答:此函数有一个循环,但是循环没有被执行n次,i每次都是2倍进行递增,所以循环只会被执行log2(n)次。
2.如果一个函数的内部中只定义了一个二维数组a[3][6],请问这个函数的空间复杂度为?
答:函数内部数组的大小是固定的,不论函数运行多少次,所需空间都是固定大小的,因此空间复杂度为O(1),虽然二维数组是多个一维数组组成的,但本质上只开辟了一个数组的空间,和把一个数组赋给另一个数组或开辟两个数组不一样(上两个的空间复杂度为O(n))
1251

被折叠的 条评论
为什么被折叠?



