目录
一、时间复杂度和空间复杂度是什么
在生活中,我们做一件事情需要花费一定的时间和一定的空间,举一个例子:
一个工厂需要制造300件衣服,而制造衣服的机器只有10台,制造一件衣服的时间是1一个小时,那么制造300件衣服就需要30个小时,而如果机器有30台,那么制造衣服所花的时间就是10个小时,而对于计算机也是一样,我们把机器个数也可以说是空间,而一共需要完成这件事的时间也叫时间,而时间复杂度和空间复杂度也类似。
二、为什么要有时间复杂度和空间复杂度
对于为什么要有时间复杂度和空间复杂度这个东西,我们每做一件事都需要时间和空间,那么有些事情需要在时间内完成,那么我们就要要求时间复杂度要低,反过来,我们想避免浪费人力物力,不去考虑时间的话,那就要空间复杂度降低,而人力物力在计算机中就是**内存。**而时间和空间复杂度的减少也就可以提高计算机运行的效率。
三、时间复杂度
时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个数学函数,它描述了该算法的运行时间,一个算法从执行开始到结尾的大概时间,我们可以根据算法中的基本操作的执行次数,算出来算法的时间复杂度,下面我们来具体说明一下:
我们来看一下大O的渐进表示法:
java
public void DaO(int N){
int count=0;
//执行次数n^2
for (int i = 0;i <N ; i++) {
for (int j = 0; j < N; j++) {
count++;
}
}
//执行次数2N
for(int K=0;K<2*N;k++){
count++;
}
int M=10;
//执行次数N
while((M--)>0){
count++;
}
System.out.println(count);
}
我们来看一下上面的代码,第一个for循环我们是一共执行了N^2,第二个for循环我们一共执行了2N次,第三次for循环我们一共执行了10次,那么这段代码一共执行了N^2+2N+10次,但在时间复杂度的表示中,它的时间复杂度是O(N^2),为什么呢?
其实在我们平常计算时间复杂度的时候,我们并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。
大O渐进法规则:
1、用常数1取代运行时间中的所有加法常数(比如在在一共程序中一共运行十次,我们就会说它的时间复杂度是O(1))
2、在修改后的运行次数函数中,只保留最高阶(比如N^3+N^2,只保留N^3)
3、如果最高阶的项存在而且不是1,则去除与这个项目相乘的常熟,得到的结果就是大O阶。(比如2N,去掉最高阶的项之后就是N);
所以上面代码最后的时间复杂度就是O(N^2);
四、空间复杂度
对于空间复杂度来说,就是临时占用存储空间大小的量度,也就意味着如果空间被回收的空间是不算进去的,例如二叉树的遍历,冒泡算法等等,都会有空间的回收,我举几个例子:
第一个是冒泡算法:
java
public static void bubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] < arr[j + 1]) { // 修改此处实现降序排序
// 交换 arr[j] 和 arr[j+1]
// int temp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = temp;
swap(arr,j,j+1);
}
}
}
}
public static void swap(int array[], int a,int b){
int temp = array[a];
array[a]=array[b];
array[b]=temp;
}
public static void printArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
对于这个程序我们说其空间复杂度是O(1),为什么呢?因为swap和printArray方法使用后空间会被系统回收,然后临时变量就没了它们。
而我们看下面这段程序:
java
public int[] feiBoNa(int n){
int[] fibArray=new int[n+1];
fibArray[0]=0;
fibArray[1]=1;
for(int i=2;i<=n;i++){
fibArray[i]=fibArray[i-1]+fibArray[i-2];
}
return fibArray;
}
我们说其空间复杂度是O(N),因为fibArray这个数组创建新的数组成员并没被回收。所以复杂度是O(N)。
总的来说,时间复杂度和空间复杂度的规则是一样的,而空间复杂度要注意的就是被回收的空间是不作为空间复杂度里面的空间。