算法复杂度分析:揭秘隐藏的计算之谜

复杂度

算法的复杂度指的是执行该算法的程序在运行时所需要的时间和空间资源。时间复杂度不是代码真正的时间,而是数据规模的增长所表达的趋势。


算法的复杂度分析分为时间复杂度和空间复杂度。一般我们说的多的是算法的时间复杂度,希望通过较少时间执行算法程序。时间复杂度越低,算法的效率越高。

时间复杂度

时间复杂度就是运行的算法程序所需要的时间资源,取决于代码中量级最大的部分。下面将从a,b,c三个函数中分析时间复杂度。

    function a() {
        console.log(`恭喜发财a`);
        return 666;
    }

函数a打印字符串执行次数为1次

返回666,执行一次

执行总次数为2.时间复杂度为O(1)(所有常数的时间复杂度都是O(1)

function b() {
    for (let i = 0; i < n; i++) {
        console.log(`平安喜乐2`);
    }
    return 666;
}

for循环表达式执行n+1次

为什么不是n次?for循环表达式运行了n次,第n+1次比较之后不符合条件结束循环,所以执行n+1次。

打印字符串在for循环内部所以执行了n次(第n+1次比较不符合条件就结束循环不打印了)

return666执行一次

执行总次数为2n+2,时间复杂度为O(n)

拓展
在for循环的条件表达式中使用var定义的变量不是该循环的局部变量,而是与for循环处于同样的作用域中,即方法中使用var定义的变量i之后的代码都可以使用i。
let声明的变量是语句的局部变量。因为let作用域为块作用域,而此函数的块就是for循环中,所以let定义的i变量只能在for循环内部使用。
关于for循环表达式变量定义使用var和let的区别,如图所示
在这里插入图片描述
在这里插入图片描述

function c() {
    let sum = 0;  //1
    let i = 1;  //1
    let j = 1;  //1
    for (; i < n; ++i) {  //n
        j = 1;  //1*n
        for (; j < n; ++j) {  //n*n
            sum = sum + i + j;  //1*n*n
        }
    }
}

在函数c中,每行代码执行次数已经在上面代码中标出来了,循环内部的语句执行次数就是自身执行次数*循环执行次数,注意是否存在循环嵌套。

c函数中for循环表达式执行n次,因为是从1开始的哈哈哈,b函数是从0开始的。


在这个c函数中for循环的表达式省略写了, for (; i < n; ++i)是非常简洁的写法,省略了for循环的初始条件部分,代码的可读性略微降低,初始化部分移动到循环外,简洁但不推荐哈哈哈。


代码的所有组合情况无外乎循环,嵌套,递归。
常见的时间复杂度分析有O(1),O(logN),O(N),O(NlogN),O(N2),O(N3)

二分法是最典型的时间复杂度是O(logN)

看一下下面的代码

function d(n) {
    let i = 1;
    while (i <= n) {
        i = i * 2;
    }
    return i;
}

代码的执行过程大概i2222>n,即i*2^n,反过来就是log₂n,n表示规模(指数函数与对数函数互为逆运算)

综上所述,本代码的时间复杂度为O(logN)

function d(n) {
    let i = 1;
    while (i <= n) {
        i = i * 2;
    }
    return i;
    //上面部分的时间复杂度是O(logN)
    function cal(n) {
        let sum = 0;//1
        for (let i = 0; i < n; i++) { //n+1
            sum += a(n)//n*O(logN)  那个1可以直接忽略
        }
        return sum;//1
    }
}

通过以上的案例分析可以学到基于循环,嵌套,递归情况下的时间复杂度的分析,取决于代码中的最大量级的部分。关于时间复杂度的分析还可以分为最好情况下的时间复杂度,最坏情况下的时间复杂度,平均情况的时间复杂度,均摊时间复杂度。最好或者最坏可能取悦于原始数据的排序的不同顺序。

空间复杂度

空间复杂度是指运行算法的程序所使用的内存空间资源,在一些算法中可能会为了提升时间复杂度而提高空间复杂度,利用空间换时间。

下面通过一个简单的例子分析空间复杂度.

function e(n) {
    const arr = [];
    arr.length = n;
    for (let i = 0; i < n; i++) {
        arr[i] = i * i;
    }
}

上述代码主要是定义一个数组,给数组定义长度,然后使用for循环为数组填充数据。,使用的内存空间就是数组的长度,即空间复杂度为O(n)。

常用的空间复杂度分析和常见的时间复杂度分析是相同的O(1),O(logN),O(N),O(NlogN),O(N2),O(N3)

间就是数组的长度,即空间复杂度为O(n)。

常用的空间复杂度分析和常见的时间复杂度分析是相同的O(1),O(logN),O(N),O(NlogN),O(N2),O(N3)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

iOS 实现视图遮罩效果

有时候&#xff0c;我们会遇到这种需求&#xff0c;只讲视图的某个部分展示出来 这时候&#xff0c;我们可以通过设置该视图layer.mask layerb来实现&#xff0c;需要注意的是&#xff0c;这里的layerb必须要设置backgroundColor&#xff0c;渐变layer有colors,否则达不到效果…

ubuntu sudo apt-get install neo4j 配置安装与设置远程访问

文章目录 下载Adding the Debian repositoryInstalling Neo4j安装流程设置远程访问 下载 neo4j 官方的下载地址&#xff0c;进入页面之后&#xff0c;往下滑&#xff1a; https://neo4j.com/deployment-center/#community 点击 Visit https://debian.neo4j.com/ Adding the …

链表(数组实现的伟大二踢脚)

一.链表与数组 链表作为 C 语言中一种基础的数据结构&#xff0c;在平时写程序的时候用的并不多&#xff0c;但在操作系统里面使用的非常多。不管是RTOS还是Linux等使用非常广泛&#xff0c;所以必须要搞懂链表&#xff0c;链表分为单向链表和双向链表&#xff0c;单向链表很少…

2024.5.1【项目测试报告】模拟微信实现网页聊天室

目录 项目介绍 核心功能 额外拓展 核心技术 项目页面设计 注册页面 登录页面 找回密码页面 网页聊天室页面 个人中心页面 测试计划 功能测试 注册页面 登录页面 找回密码页面 个人中心页面 网页聊天室页面 自动化测试 单例驱动 获取屏幕截图 注册页面自动化测…

GPG的使用

这里写自定义目录标题 安装加密程序生成加密密钥怎么备份自己的密钥就可以使用公钥加密邮件信息了 安装加密程序 下载gpg4win&#xff1a; https://www.gpg4win.org/index.html 免费的&#xff0c;如果使用的是苹果电脑&#xff0c;使用https://gpgtools.org/。 如果是linux&a…

【精选文献】JAG|基于时序Sentinel-1 SAR影像小农耕作区烟草空间分布制图

目录 文章简介 01 文章摘要 02 研究背景、目标及创新点 03 研究区域与数据集 04 研究方法 05 研究结果 06 研究讨论 07 研究结论 08 文章引用 文章简介 论文名称&#xff1a;Mapping tobacco planting areas in smallholder farmlands using Phenological-Spatial-Te…

golang判断通道chan是否关闭的2种方式

chan通道在go语言的办法编程中使用频繁&#xff0c;我们可以通过以下2种方式来判断channel通道是否已经关闭&#xff0c;1是使用 for range循环&#xff0c;另外是通过 for循环中if 简短语句的 逗号 ok 模式来判断。 示例代码如下&#xff1a; //方式1 通过for range形式判断…

LNMP部署wordpress

1.环境准备 总体架构介绍 序号类型名称外网地址内网地址软件02负载均衡服务器lb0110.0.0.5192.168.88.5nginx keepalived03负载均衡服务器lb0210.0.0.6192.168.88.6nginx keepalived04web服务器web0110.0.0.7192.168.88.7nginx05web服务器web0210.0.0.8192.168.88.8nginx06we…

Nodejs -- 流程控制库

流程控制库 尾触发和next 尾触发最多的应用是在Connect的中间件 var app connect() app.use(connect.staticCache()) app.use(connect.static(__dirname /public)) app.use(conect.cokkieParser()) app.use(connect.session()) app.use(connect.query()) app.use(connect.…

跨平台终端软件——quardCRT

作为一个技术栈比较复杂的程序&#xff0c;工作常常会在windows/linux/macos等不同的平台切换开发&#xff0c;开发过程中最常用的就是终端工具了&#xff0c;一个趁手的终端可以成倍的提高工作效率&#xff0c;因此我一直希望能找个一个跨平台体验一致无缝切换的终端软件&…

Unity Audio Filter 入门

概述&#xff1a; 如果你在你项目中需要一些特殊的声音效果&#xff0c;那这部分声音过滤器的部分一定不要错过喔&#xff0c;让我们来学习这部分的内容吧&#xff01; 这部分理论性比较强&#xff0c;认真看我的注解哈&#xff0c;我尽量解释的易懂一点。 Audio Chorus Filter…

街道征迁项目档案管理系统

街道征迁项目档案管理系统是一个用于管理街道征迁项目档案的软件系统。该系统的主要功能包括档案录入、档案存储、档案检索、档案共享等。 系统的用户可以通过该系统录入征迁项目相关的档案信息&#xff0c;包括项目名称、征迁范围、土地面积、征迁补偿费用等。同时&#xff0c…

vue本地调试devtools

一、谷歌浏览器加载扩展程序 二、把解压的压缩包添加即可&#xff0c;重启浏览器 三、启动前端本地项目&#xff0c;即可看到Vue小图标

AD | Altium Designer(原理图设计、电路仿真、PCB绘图)汉化版

Altium Designer(原理图设计、电路仿真、PCB绘图) 通知公告 Altium Designer(AD)是一种功能强大的电子设计自动化(EDA)软件。它主要用于设计和开发电子产品,如电路板(PCB)、集成电路(IC)和嵌入式系统。AD提供了完整的设计工具套件,包括原理图设计、PCB布局、仿真、设…

ICode国际青少年编程竞赛- Python-1级训练场-识别循环规律1

ICode国际青少年编程竞赛- Python-1级训练场-识别循环规律1 1、 for i in range(4):Dev.step(6)Dev.turnLeft()2、 for i in range(3):Dev.turnLeft()Dev.step(2)Dev.turnRight()Dev.step(2)3、 for i in range(3):Spaceship.step(5)Spaceship.turnLeft()Spaceship.step(…

互联网轻量级框架整合之MyBatis底层运转逻辑

MyBatis运转过程中主要步骤有两个&#xff0c;其一读取配置文件缓存到Configuration对象&#xff0c;用于构建SqlSessionFactory&#xff1b;其二是SqlSession的执行过程&#xff0c;这其中SqlSessionFactory的构建过程相对很好理解&#xff0c;而SqlSession的执行过程就相对复…

LT6911GX HDMI2.1 至四端口 MIPI/LVDS,带音频 龙迅方案

1. 描述LT6911GX 是一款面向 VR / 显示应用的高性能 HDMI2.1 至 MIPI 或 LVDS 芯片。HDCP RX作为HDCP中继器的上游&#xff0c;可以与其他芯片的HDCP TX配合使用&#xff0c;实现中继器功能。对于 HDMI2.1 输入&#xff0c;LT6911GX 可配置为 3/4 通道。自适应均衡功能使其适合…

vue3+vite+js 实现移动端,PC端响应式布局

目前使用的是vue3vite&#xff0c;没有使用ts 纯移动端|PC端 这种适用于只适用一个端的情况 方法&#xff1a;amfe-flexible postcss-pxtorem相结合 ① 执行以下两个命令 npm i -S amfe-flexible npm install postcss-pxtorem --save-dev② main.js文件引用 import amfe-f…

FreeRTOS信号量

信号量简介 def 1&#xff1a; 信号量是一种解决问题的机制&#xff0c;可以实现共享资源的访问 信号量浅显理解例子&#xff1a; 空车位&#xff1a; 信号量资源&#xff08;计数值&#xff09; 让出占用车位&#xff1a; 释放信号量&#xff08;计数值&#xff09; 占用车…

LT6911UXB HDMI2.0 至四端口 MIPI DSI/CSI,带音频 龙迅方案

1. 描述LT6911UXB 是一款高性能 HDMI2.0 至 MIPI DSI/CSI 转换器&#xff0c;适用于 VR、智能手机和显示应用。HDMI2.0 输入支持高达 6Gbps 的数据速率&#xff0c;可为4k60Hz视频提供足够的带宽。此外&#xff0c;数据解密还支持 HDCP2.2。对于 MIPI DSI / CSI 输出&#xff0…