前端JS 时间复杂度和空间复杂度

时间复杂度 BigO

算法的时间复杂度通常用大 O 符号表述,定义为 T(n) = O(f(n))
实际就是计算当一个一个问题量级(n)增加的时候,时间T增加的一个趋势
T(n):时间的复杂度,也就相当于所消耗的时长
O:表示正比例关系
f(n):代码执行的次数

f(n) 可以有的值:复杂度由简单到复杂

1.常数型 O(1)
2.对数型 O(log n)
3.线性型 O(n)
4.线性对数型 O(nlogn)
5.平方型 O(n^2)、立方型 O(n^3)K 次方型 O(n^k)
6.平方底指数型 O(2^n)、立方底指数型 O(3^n)K 次底指数型 O(k^n)
7.阶乘型 O(n!)

在这里插入图片描述

  1. 常数型 O(1)
只要没有循环或递归等复杂逻辑,无论代码执行多少行,代码复杂度都为O(1),如下:1.function sum() {const a = 1;const b = 2;return a + b;}2.int x = 0;int y = 1;int temp = x;x = y;y = temp;
上述代码在执行的时候,所消耗的时间不会随着特定变量的增长而增长,即使有几万行这样的代码,我们都可以用O(1)来表示它的时间复杂度。
  1. 对数型 O(log n)
function fun(n) {let i = 1;while (i < n) {i = i * 2;}
}

在上面的循环中,每次i都会被乘以2,也意味着每次 i 都离 n 更进一步。那需要多少次循环 i 才能等于或大于 n 呢,也就是求解:2^x =n,答案x=log2^n。也就是说循环 log2^n次之后,i会大于等于n,这段代码就结束了。所以此代码的复杂度为:O(logN)。
3. 线性阶O(n)

function fun(n) {let sum = 0;for (let i = 0; i < n.length; i++) {sum += n[i];}return sum;
}

在这段代码中,for循环会执行n遍,因此计算消耗的时间是随着n的变化而变化,因此这类代码都可以用O(n)来表示其时间复杂度。
4. 线性对数阶O(nlogN)

线性对数阶O(nlogN)很好理解,也就是将复杂度为O(logN)的代码循环n遍:
function fun(n) {for (let j = 0; j < n; j++) {let i = 1;while (i < n) {i = i * 2;}}
}
因为每次循环的复杂度为O(logN),所以n * logN = O(nlogN)
  1. 平方型 O(n^2)、立方型 O(n^3)、K 次方型 O(n^k)
O()就是将循环次数为n的代码再循环n遍:
for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {x++;}
}
O()的本质就是n * n,如果我们将内层的循环次数改为m,复杂度就变为 n * m = O(n * m)
for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {x++;}
}
O(n^3)就是将循环次数为n的代码再循环3遍:
for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {for (int j = 1; j <= n; j++) {x++;}}
}
O(n^k)就是将循环次数为n的代码再循环k遍:
  1. 平方底指数型 O(2^n)
斐波那契,使用递归的情况下,因为使用了两次递归,时间复杂度为 O(2^n) 
function fib(n) {if (n <= 1) return n;return fib(n - 1) + fib(n - 2);
}
  1. 阶乘型 O(n!)
下例,时间复杂度为 O(n!),基本不能称作为算法,n 越大,就容易卡死,小心尝试
function fun(n) {console.log(n);for (let i = 0; i < n; i++) {fun(n - 1);}
}

空间复杂度

算法的空间复杂度指的是在运行过程中临时占用的存储空间大小的量度
空间复杂度常见的为以下三个例子:

  1. 空间复杂度O(1)
所需要的临时空间不随着某个变量 n 的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)
function sum() {const a = 1;const b = 2;return a + b;
}
  1. 空间复杂度O(n)
下例,定义一个数组的空间,数组的长度随着 n 的规模不同,会不一样,这里空间复杂度为 O(n)
function fun(n) {let arr = [];for (let i = 0; i < n.length; i++) {arr.push(n[i]);}return arr;
}
  1. 空间复杂度O(n^2)
下例,最终形成一个二维数组的空间,空间复杂度为 O(n^2)
function fun(n) {const arr = [];for (let i = 0; i < n; i += 1) {arr.push([]);for (let j = 0; j < n; j += 1) {arr[i].push(j);}}
}

以上便是「时间复杂度」和「空间复杂度」的简单介绍啦,简单来说,这两个复杂度反映的是,随着问题量级的增大,时间和空间增长的趋势。学会了复杂度的分析,我们就可以对比算法之间的优劣势啦~~

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态规划(算法竞赛、蓝桥杯)--混合背包DP

1、B站视频链接&#xff1a;E14 背包DP 混合背包_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N1010,M10000; int a[M],b[M],c[M];//体积、价值、类型 int f[N];int main(){int n,m,v,w,s;cin>>n>>m;int num1;for(int i1;i&…

【Java程序设计】【C00331】基于Springboot的驾校预约学习系统(有论文)

基于Springboot的驾校预约学习系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的驾校预约学习系统&#xff0c;本系统有管理员、用户和教练三种角色&#xff1b; 管理员&#xff1a;个人中心、管理员管理、教练…

linux gdb 调试工具

1.写程序 首先&#xff0c;我们先写出一个 .c 或者.cpp程序 如 然后 gcc -g hello.c -o hello 或者 g -g hello.cpp -o hello &#xff08;-g&#xff09;要加 2. gdb调试 用 gdb &#xff08;可执行程序&#xff0c;如hello&#xff09; 进入之后&#xff0c;有…

mongoDB 优化(1)索引

1、创建复合索引&#xff08;多字段&#xff09; db.collection_test1.createIndex({deletedVersion: 1,param: 1,qrYearMonth: 1},{name: "deletedVersion_1_param_1_qrYearMonth_1",background: true} ); 2、新增索引前&#xff1a; 执行查询&#xff1a; mb.r…

[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

mini-spring|关于Bean对象作用域以及FactoryBean的实现和使用

需求 FactoryBean 直接配置FactoryBean 获取FactoryBean中的Bean对象 FactoryBean的getObject方法通过反射获取Bean对象 由此省去对实体Dao类的定义 解决方法 对外提供一个可以二次从 FactoryBean 的 getObject 方法中获取对象的功能即可 整体架构 整个的实现过程包括了两部…

Python编程实验五:文件的读写操作

目录 一、实验目的与要求 二、实验内容 三、主要程序清单和程序运行结果 第1题 第2题 四、实验结果分析与体会 一、实验目的与要求 &#xff08;1&#xff09;通过本次实验&#xff0c;学生应掌握与文件打开、关闭相关的函数&#xff0c;以及与读写操作相关的常用方法的…

第五课:BIO高级操作

一、BIO模式下的端口转发思想 需求&#xff1a;需要实现是个客户端的消息可以发送给所有的客户端接收.(群聊实现) 我们每一个客户端都会和服务器端建立一个socket通道&#xff0c;这样服务器端和客户端就能够实现通信。为了让服务器端知道我们当前有多少个socket正在运行&…

国际黄金价格是什么?和黄金价格有何区别?

黄金是世界上最珍贵的贵金属之一&#xff0c;其价值被无数人所垂涎。而国际黄金价格作为市场上的参考指标&#xff0c;直接影响着黄金交易的买卖。那么国际黄金价格到底是什么&#xff0c;与黄金价格又有何区别呢&#xff1f;本文将为您详细解答。 国际黄金价格是指以美元计量的…

如何恢复数据?5个实用数据恢复方法!

亲爱的朋友们&#xff0c;你是否也有过这样的经历&#xff0c;电脑里的数据突然消失&#xff0c;让你手足无措&#xff1f;别担心&#xff0c;今天我就来教你如何恢复数据&#xff0c;让你不再为数据丢失而烦恼。 首先&#xff0c;我们需要了解数据丢失的原因。可能是你不小心…

ZDH-大数据采集-支持KETTLE任务

目录 目录 项目源码 预览地址 支持KETTLE介绍 新增KETTLE任务 配置调度KETTLE 重要说明 感谢支持 项目源码 预览地址 支持KETTLE介绍 新增KETTLE任务 配置调度KETTLE 重要说明 项目源码 zdh_web:GitHub - zhaoyachao/zdh_web: 大数据采集,抽取平台 预览地址 后…

【MySQL】基于Docker搭建MySQL一主二从集群

本文记录了搭建mysql一主二从集群&#xff0c;这样的一个集群master为可读写&#xff0c;slave为只读。过程中使用了docker&#xff0c;便于快速搭建单体mysql。 1&#xff0c;准备docker docker的安装可以参考之前基于yum安装docker的文章[1]。 容器相关命令[2]。 查看正在…