时间复杂度与空间复杂度

简介: 时间复杂度与空间复杂度

优先考虑时间复杂度

在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。

但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。

所以我们如今已经不需要再特别关注一个算法的空间复杂度。

🔎时间复杂度

一般所说时间复杂度为最坏情况下的时间复杂度

🌻大O渐近法

用1来取代执行次数中加法常数

举例:执行次数N2+2N+10——>N2+2N+1

只保留最高阶项

举例:执行次数N2+2N+1——>N2

如果最高阶项系数不为1,将其修改为1

举例:执行次数3N2——>N2


🌻举例1

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);
    }

共执行N2+2N+10次

大O渐近法表示则是O(N2)

O(N2+2N+10——>N2+2N+1——>N2)


🌻举例2

共执行2N+10次

时间复杂度:0(N)


🌻举例3

共执行M+N次

时间复杂度:0(M+N)

如果M和N相等,时间复杂度:0(N)


🌻举例4

共执行100次

时间复杂度:0(1)


🌻举例5

第一次嵌套的for循环执行N-1-0次,第二次嵌套的for循环执行N-1-1次,因为N的值在递减

共执行[(N-1)+(N-2)+(N-3)+…+1]次——>N*(N-1)——>也就是N2-N次

时间复杂度:0(N2)


🌻举例6

int binarySearch(int[] array, int value) {
        int begin = 0;
        int end = array.length - 1;
        while (begin <= end) {
            int mid = begin + ((end-begin) / 2);
            if (array[mid] < value)
                begin = mid + 1;
            else if (array[mid] > value)
                end = mid - 1;
            else
                return mid;
        }
        return -1;
    }


🌻举例7

int factorial(int N) {
        return N < 2 ? N : factorial(N-1) * N;
    }

递归的时间复杂度:递归的次数*递归后代码的执行次数

假设N为4,那么递归了4次

当N是一个未知数时,递归了N次

每次递归后代码均执行了1次,因为时一个三目运算符,只能选择其中一项

时间复杂度:O(N*1)——>O(N)


🔎空间复杂度

空间复杂度是指一个算法在运行过程中临时占用存储空间大小

也是采用大O渐近法表示

🌻举例1

空间复杂度:O(1)

这里没有计算数组的空间,因为数组作为参数是必须开辟空间的,而不是在运行过程中临时开辟存储空间


🌻举例2

空间复杂度:O(N+1)——>O(N)


🌻举例3

long factorial(int N) {
        return N < 2 ? N : factorial(N-1)*N;
    }

当N为3时,递归了3次,所以在栈上临时开辟了3块空间

当N是一个未知数时,临时开辟了N块空间

空间复杂度:O(N)

相关文章
|
10月前
|
机器学习/深度学习 计算机视觉
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
428 9
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
|
程序员 Go
go语言中if 语句
go语言中if 语句
250 3
|
存储 Kubernetes API
Kubernetes学习-核心概念篇(三) 核心概念和专业术语
Kubernetes学习-核心概念篇(三) 核心概念和专业术语
Kubernetes学习-核心概念篇(三) 核心概念和专业术语
|
监控 安全 Linux
centos常用指令
centos常用指令
|
机器学习/深度学习 搜索推荐 算法
【前沿解读】17篇2023淘天业务技术A类顶会论文(下)
【前沿解读】17篇2023淘天业务技术A类顶会论文(下)
610 3
|
存储 算法 NoSQL
11)面对千万级别的 key 应该如何节省内存
11)面对千万级别的 key 应该如何节省内存
126 0
11)面对千万级别的 key 应该如何节省内存
|
人工智能 编解码 算法
【IJCAI 2023】流感知优化之 DAMO-StreamNet 论文解读
传统视频目标检测(Video Object Detection, VOD)是离线(offline)的检测任务,即仅考虑算法的检测精度,未考虑算法的延时。流感知(Streaming Perception)任务作为VOD的一个细分方向,采用流平均精度(Streaming Average Precision, sAP)指标,衡量算法的在线(online)检测能力,即同时衡量算法的精度和延时。本文针对现有的流感知工作在训练方式和模型感受野两方面的不足,提出了DAMO-StreamNet,在保证算法实时性的前提下,实现了SOTA的性能。
1569 6
【IJCAI 2023】流感知优化之 DAMO-StreamNet 论文解读
|
测试技术 API 持续交付
深入理解自动化测试框架Selenium的设计与实现
【4月更文挑战第28天】 本文旨在深度剖析自动化测试框架Selenium的核心设计原理与实现机制。不同于传统的摘要概括,本文将通过具体实例和代码片段,详细阐述Selenium如何通过WebDriver接口与不同浏览器进行交互,以及其支持多种编程语言环境的设计理念。文章还将探讨Selenium Grid的配置和使用,展示其在分布式并行测试中的优势。最后,对Selenium在持续集成环境中的应用进行展望,为读者提供一种全新的视角来理解并运用Selenium。
|
Python
【PythonWeb】两种方法、搭建自己的pypi服务器。内网的你,必须要会
【PythonWeb】两种方法、搭建自己的pypi服务器。内网的你,必须要会

热门文章

最新文章