数据结构——时间和空间复杂度

目录

一、时间复杂度和空间复杂度是什么

二、为什么要有时间复杂度和空间复杂度

三、时间复杂度

四、空间复杂度

一、时间复杂度和空间复杂度是什么

在生活中,我们做一件事情需要花费一定的时间和一定的空间,举一个例子:

一个工厂需要制造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)。

总的来说,时间复杂度和空间复杂度的规则是一样的,而空间复杂度要注意的就是被回收的空间是不作为空间复杂度里面的空间。

相关推荐
愿天垂怜16 分钟前
【C++】C++11引入的新特性(1)
java·c语言·数据结构·c++·算法·rust·哈希算法
淡写青春20921 分钟前
计算机基础---进程间通信和线程间通信的方式
java·开发语言·数据结构
特种加菲猫32 分钟前
初阶数据结构之栈的实现
开发语言·数据结构·笔记
bingw01141 小时前
华为机试HJ62 查找输入整数二进制中1的个数
数据结构·算法·华为
苏言の狗1 小时前
小R的二叉树探险 | 模拟
c语言·数据结构·算法·宽度优先
jianqimingtian1 小时前
如何使用 Matlab 制作 GrabCAD 体素打印切片
数据结构·数据库
gkdpjj2 小时前
C++优选算法十四 优先级队列(堆)
开发语言·数据结构·c++·算法
几窗花鸢2 小时前
力扣面试经典 150(上)
数据结构·c++·算法·leetcode
Heisenberg~3 小时前
详解八大排序(五)------(计数排序,时间复杂度)
c语言·数据结构·排序算法
Hera_Yc.H14 小时前
数据结构之一:复杂度
数据结构