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

news2024/11/16 8:57:04

如何衡量代码好坏,算法的考察到底是在考察什么呢?

衡量代码好坏有两个非常重要的标准就是:运行时间和占用空间,就是我们后面要说到的时间复杂度和空间复杂度,也是学好算法的重要基石。

确切的占内用存或运行时间无法进行计算,而且同一段代码在不同性能的机器上执行的时间也不一样,可是代码的基本执行次数,我们是可以算得出来的,这就是时间复杂度。

平时表示算法复杂度主要就是用 O(),读作大欧表示法,只用一个 O() 表示。

时间复杂度

O(1)

我们都知道,js 的执行是从上往下顺序执行的,for循环等会影响代码执行的速度。

看一下这个代码:

function foo() {
    let number = 0;
    console.log(number);
    number++;
    console.log(number);
}

就是很简单的顺序执行代码,完成这些代码需要4个步骤,但是在计算机的世界里,常数1和常数100没有什么区别,因此

  • 如果只是常数直接估算为1,O(3) 的时间复杂度就是 O(1),不是说只执行了1次,而是对常量级时间复杂度的一种表示法。一般情况下,只要算法里没有循环和递归,就算有上万行代码,时间复杂度也是O(1)

相应地,如果代码里有 if 的判断,也可以看作常量,因为它的执行次数不会随着任何一个变量的增大而变长。

O(n)

再来看第二段代码:

function foo() {
    let arr = [1, 2, 3, 4, 5]
    for(let i = 0; i < arr.length; i++) {
        console.log(i)
    }
}

里面有一个for循环,循环是 n 次,每次循环里都会执行:i < arr.length  i++ console.log(i)这三句,也就是说,循环执行次数是3n,加上 arr = [1, 2, 3, 4, 5]  i = 0

刚刚提到常数对时间复杂度的影响可以忽略不计,所以3n 和 n 的差别不大,可以看作 n ,几句上下文的执行也可忽略不计,所以一层循环的时间复杂度就是 O(n)

O(n²)

比如嵌套循环,如下面这样的,里层循环执行 n 次,外层循环也执行 n 次,总执行次数就是 n x n,时间复杂度就是 n 的平方,也就是 O(n²)。假设 n 是 10,那么里面的就会打印 10 x 10 = 100 次:

function foo(n) {
    for(let i = 0; i < n; i++) {
        for(let j = 0; i< n; j++) {
            console.log(i+j)
        }
    }
}

再来看这段代码:里面包含一层的循环,也包含两层的循环,我们取最高次项,所以它的时间复杂度也是 O(n²):

function foo(n){
    if( n > 100){
        for( let k = 0; k < n; k++){
            console.log(k)
        }
    }else{
        for( let i = 0; i < n; i++){
            for( let j = 0; j < n; j++){
                console.log(j)
            }
        }
    }
}

O(logn)

这段代码里,循环次数的影响主要来源于 n/2 ,这个时间复杂度就是 O(logn)

function foo(n){
    let day = 0
    while(n > 1){
        n = n/2
        day++
    }
    return day
}
console.log( foo(16) )
function foo(n){
    for(let i = 1; i <= n; i *= 2){
        console.log(i)
    }
}
foo( 16 )

随着数据量或者 n 的增大,时间复杂度也随之增加,也就是执行时间的增加,会越来越慢,越来越卡。总的来说时间复杂度就是执行时间增长的趋势,那么空间复杂度就是存储空间增长的趋势。

空间复杂度

空间复杂度是衡量算法在运行过程中临时占用存储空间大小的度量。

空间复杂度记作S(n)=O(f(n)),其中n是问题规模,f(n)是某个函数。

空间复杂度不是程序本身的大小,而是程序运行时占用的内存空间大小,它包括存储算法本身所需的存储空间、算法的输入输出数据所需的存储空间和算法在运行过程中临时占用的存储空间。算法的输入输出数据所需的存储空间是由问题本身决定的,通过参数列表由调用函数传递进来,这部分空间不随算法的不同而改变。而算法本身占用的存储空间和算法的书写长度成正比,这部分空间可以通过编写更短的算法来压缩。

算法在运行过程中临时占用的存储空间是衡量空间复杂度的关键部分,它主要包括为局部变量分配的存储空间,如参数表中的形参变量和函数体中定义的局部变量。

此外,空间复杂度与时间复杂度是相辅相成的,在追求较好的时间复杂度时可能会增加空间复杂度,反之亦然。因此,在设计算法时,需要综合考虑算法的各项性能,包括使用频率、处理的数据量大小、编程语言的特性、运行机器的系统环境等因素。

常用的空间复杂度有 O(1)O(n)O(n²)

O(1)

只要不会因为算法里的执行,导致额外的空间增长,就算是一万行,空间复杂度也是 O(1),比如下面这样,时间复杂度也是 O(1)

function foo() {
    let number = 0;
    console.log(number);
    number++;
    if(number === 1) {
        console.log(1)
    }
    console.log(number);
}

O(n)

比如下面这样,n 的数值越大,算法需要分配的空间就需要越多,来存储数组里的值,所以它的空间复杂度就是 O(n),时间复杂度也是 O(n)

function foo(n) { 
    let arr = [] 
    for( let i = 1; i < n; i++ ) { 
        arr[i] = i 
    } 
}

O(n²)

O(n²) 这种空间复杂度一般出现在比如二维数组,或是矩阵的情况下

不用说,你肯定明白是啥情况啦

就是遍历生成类似这样格式的:

let arr = [ 
    [1,2,3,4,5], 
    [1,2,3,4,5], 
    [1,2,3,4,5] 
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1620218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Seal^_^【送书活动第2期】——《Flink入门与实战》

Seal^_^【送书活动第2期】——《Flink入门与实战》 一、参与方式二、本期推荐图书2.1 作者简介2.2 编辑推荐2.3 前 言2.4 本书特点2.5 内容简介2.6 本书适用读者2.7 书籍目录 三、正版购买 一、参与方式 评论&#xff1a;"掌握Flink&#xff0c;驭大数据&#xff0c;实战…

想冲宇宙厂,直接挂了。。。

宇宙厂实际是字节&#xff0c;这个称呼是因为字节跳动主宰了宇宙内一切App&#xff0c;有点家大业大的意思。 今天分享一位字节春招凉经&#xff0c;问了一些数据库和Java八股&#xff0c;没出算法题&#xff0c;直接挂了&#xff0c;竟然最喜欢出算法题的字节&#xff0c;这次…

【嵌入式】“野指针”和“悬空指针”的奇淫拙劣

【嵌入式】“野指针”和“悬空指针”的奇淫拙劣 1. 前言1.1 授权须知 2. 野指针和悬空指针3.举例说明3.1 示例一&#xff1a;free 之后&#xff0c;没有让指针指向NULL3.1.1 代码解析3.1.2 运行代码的结果3.1.3 程序崩溃在哪&#xff1f; 3.2 悬空指针–释放后使用攻击 1. 前言…

JS----随机数字,字符,数组

随机数字 function random(min 0, max 100) {if (min > 0 && max > 0 && max > min) {const gab max - min 1return Math.floor(Math.random() * gab min)}return 0 }输入格式 随机字符 function randomStr (len 32) {var s for (; s.lengt…

产品经理好干吗?

赚钱的工作都不轻松吧&#xff0c;除非是家里资源好的。 产品经理的薪资还是可观的 &#xff0c;小白如何成为产品经理&#xff1f; 首先要有经验&#xff0c;有理论知识&#xff0c;对想从事产品经理相关岗位的人来说&#xff0c;这基本是个必考的证书了&#xff0c;感兴趣的…

Java web应用性能分析之【Linux服务器性能监控分析概叙】

大多数场景&#xff0c;我们的Java web应用都是部署在linux环境&#xff0c;所以对linux服务器的性能指标需要有一个比较清晰的认识。Linux服务器的性能指标无非就5个方面&#xff1a;CPU、内存、磁盘、网络、文件系统。不同的性能指标都有对应的命令进行监控和查看&#xff08…

揭秘亚马逊、虾皮自养号测评:提升排名与流量的新策略

亚马逊一直是跨境电商平台中的佼佼者&#xff0c;每年新入驻亚马逊的商家也是非常多的&#xff0c;对于新入驻的卖家来说&#xff0c;如何在竞争激烈的市场中脱颖而出&#xff0c;增加流量并转化为订单&#xff0c;是摆在面前的重要任务。 一、亚马逊新店怎么增加流量&#xf…

验证线缆(汽车线束、网线、多芯线)破损或断开与正常线缆的区别在哪里?依AEM CV-100 k50测试仪

工厂产线生产的线缆&#xff08;汽车线束、网线、多芯线&#xff09;做成成品&#xff0c;即2端都安装好了模块。在这种情况下如何快速的判定此条线缆是合格的呢&#xff0c;此处的合格为物理层面上的合格&#xff08;不会出现开路、短路&#xff09;&#xff0c;也就是最基本保…

pytorch-解决过拟合之regularization

目录 1.解决过拟合的方法2. regularization2. regularization分类3. pytorch L2 regularization4. 自实现L1 regularization5. 完整代码 1.解决过拟合的方法 更多的数据降低模型复杂度 regularizationDropout数据处理早停止 2. regularization 以二分类的cross entropy为例&…

前端三剑客 HTML+CSS+JavaScript ⑤ HTML文本标签

别困在过去&#xff0c;祝你有勇气开始&#xff0c;下一行 —— 24.4.24 一、文本标签 1.特点 1.用于包裹&#xff1a;词汇、短语等 2.通常写在排版标签里面&#xff08;h1~h6、p、div&#xff09; 3.排版标签更宏观&#xff08;大段的文字&#xff09;&#xff0c;文本标签更微…

去雾笔记01-SRKTDN: Applying Super Resolution Method to Dehazing Task

文章目录 Abstract1. Introduction2. Related Work3. Method3.1. Network Architecture Abstract 们提出了一种结合超分辨方法和知识转移方法的模型。我们的模型由一个教师网络、一个去雾网络和一个超分辨率网络组成。 1. Introduction ECNU KT团队提出了一个知识蒸馏[20]模…

OpenAI 笔记:chat API

聊天模型接受一系列消息作为输入&#xff0c;并返回模型生成的消息作为输出。 1 导入openai 的api key from openai import OpenAIclient OpenAI(api_key***) 2 调用聊天API completion client.chat.completions.create(model"gpt-3.5-turbo",messages[{"…

09—DOM和BOM

一、DOM 1、HTML DOM (文档对象模型) 文档对象模型&#xff08;Document Object Model&#xff0c;DOM&#xff09;是表示和操作HTML和XML文档内容的基础API。当网页被加载时&#xff0c;浏览器会根据DOM模型&#xff0c;将结构化文档&#xff08;比如HTML和XML&#xff09;解…

3d模型合并怎么样不丢材质?---模大狮模型网

在3D设计中&#xff0c;合并模型是常见的操作&#xff0c;它可以帮助设计师将多个单独的模型组合成一个&#xff0c;从而简化场景并提高渲染效率。然而&#xff0c;合并模型时常常会面临一个棘手的问题&#xff1a;如何确保合并后的模型不丢失原有的材质?本文将探讨如何在合并…

Parallels Desktop 19完美中文版 PD19虚拟机详细图文安装教程 亲测兼容M1/M2

对于许多Mac用户来说&#xff0c;运行Windows应用程序是必不可少的。也许你的雇主使用的软件只适用于Windows&#xff0c;或者需要使用依赖于某些Windows技术的网站。或者你想在Mac上玩Windows游戏。或者&#xff0c;你可能需要在其他操作系统上测试应用程序和服务——你可以在…

【数据结构-图】

目录 1 图2 图的定义和基本概念&#xff08;在简单图范围内&#xff09;3 图的类型定义4 图的存储结构4.1 邻接矩阵 表示法4.2 邻接表 表示法4.3 十字链表 表示法4.4 邻接多重表 表示法 5 图的遍历5.1 深度优先搜索-DFS 及 广度优先遍历-BFS 6 图的应用6.1 最小生成树6.1.1 克鲁…

Azure AKS集群监控告警表达式配置

背景需求 Azure AKS集群中&#xff0c;需要对部署的服务进行监控和告警&#xff0c;需要创建并启用预警规则&#xff0c;而这里怎么去监控每个pod级别的CPU和内存&#xff0c;需要自己写搜索查询 解决方法 搜索和查询的语句如下&#xff0c;需要自己替换其中的部分信息,其中…

Qwen1.5微调

引子 由于工作上需要&#xff0c;一直在用Qwen做大模型推理&#xff0c;有个再训练的需求&#xff0c;特此琢磨下Qwen的训练。OK&#xff0c;我们开始吧。 一、安装环境 查看显卡驱动版本 根据官网推荐 OK&#xff0c;docker在手&#xff0c;天下我有。 docker pull qwenll…

vuetify3.0+tailwindcss+vite最新框架

1、根据vuetify官网下载项目 安装vuetify项目 2、根据tailwindcss官网添加依赖 添加tailwindcss依赖 3、 配置main.ts // main.ts import "./style.css"4、使用 <template><h1 class"text-3xl font-bold underline">Hello world!</…

sscanf和scanf区别

sscandf 从字符串中提取数据 scanf 标准输入流读取数据 int num; sscanf("42", "%d", &num);float f; sscanf("3.14", "%f", &f);char str[20]; sscanf("Hello, World!", "%s", str);int a, b; sscanf(…