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

目录

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

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

三、时间复杂度

四、空间复杂度

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

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

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

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

相关推荐
Freak嵌入式11 分钟前
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
java·开发语言·数据结构·python·接口·抽象基类
MogulNemenis1 小时前
力扣春招100题——队列
数据结构·算法·leetcode
学java的小菜鸟啊1 小时前
第五章 网络编程 TCP/UDP/Socket
java·开发语言·网络·数据结构·网络协议·tcp/ip·udp
菜鸟求带飞_2 小时前
算法打卡:第十一章 图论part01
java·数据结构·算法
是小Y啦2 小时前
leetcode 106.从中序与后续遍历序列构造二叉树
数据结构·算法·leetcode
万河归海4282 小时前
C语言——二分法搜索数组中特定元素并返回下标
c语言·开发语言·数据结构·经验分享·笔记·算法·visualstudio
秋夫人4 小时前
B+树(B+TREE)索引
数据结构·算法
代码雕刻家4 小时前
数据结构-3.1.栈的基本概念
c语言·开发语言·数据结构
AlexMercer10125 小时前
【C++】二、数据类型 (同C)
c语言·开发语言·数据结构·c++·笔记·算法
^^为欢几何^^7 小时前
lodash中_.difference如何过滤数组
javascript·数据结构·算法