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

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

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

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

相关文章

C习题002:澡堂洗澡【仅供参考】

问题 输入样例 在这里给出一组输入。例如&#xff1a; 2 5 1 3 3 2 3 3 输出样例 在这里给出相应的输出。例如&#xff1a; No代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB 代码 #include<stdio.h> int main() {int N,W,s,t,p;int arr_s[…

百度挂绳验证码底图还原

声明&#xff1a; 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;若有侵权&#xff0c;请添加&#xff08;wx&#xff1a;wyqlxl99&#xff09;联系删除 …

【python】 用来将对象持久化的 pickle 模块

pickle 模块可以对一个 Python 对象的二进制进行序列化和反序列化。说白了&#xff0c;就是它能够实现任意对象与二进制直接的相互转化&#xff0c;也可以实现对象与文本之间的相互转化。 比如&#xff0c;我程序里有一个 python 对象&#xff0c;我想把它存到磁盘里&#xff…

信息安全——概述

信息安全的目标 保密性 Confidentiality 数据保密性&#xff1a;对于未授权的个体而言&#xff0c;信息不可用 隐私性&#xff1a;确保个人能控制或确定自身那些信息可以被收集、保存&#xff0c;这些信息可以被谁公开及向谁公开 完整性 Integrity 信息的完整性、一致性&…

猜数字游戏,炸弹数,random

package com.zhang.random;import java.util.Random; import java.util.Scanner;public class RandomTest2 {public static void main(String[] args) {//随机生成一个1~100之间的数&#xff0c;提示用户猜测&#xff0c;猜大提示猜大&#xff0c;猜小提示小了&#xff0c;直到…

Vue 组件和插件:探索细节与差异

查看本专栏目录 关于作者 还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#x…

代码随想录算法训练营 个人总结

训练营周期&#xff1a;2023/12/27 - 2024/2/29&#xff0c;共计65天 LeetCode记录&#xff1a; 考研期间发现的Carl哥和他的代码随想录&#xff0c;考研期间说白了才算是认认真真学习和练习代码的时间&#xff0c;年底参加完考研后报名了代码随想录训练营&#xff0c;希望可以…

PyTorch基础(19)-- torch.take_along_dim()方法

一、前言 在深挖ML4CO的代码过程中&#xff0c;遇到了torch.take_along_dim()这个方法&#xff0c;影响到我后续的代码阅读&#xff1b;加之在上网搜索资料的过程中&#xff0c;网络上对此函数的介绍文章少之又少&#xff0c;即使有&#xff0c;也是对torch官网文档中的解释进…

Unity | Shader基础知识(第十集:shader常用外部资产单词速成)

目录 一、外部资产简介 二、常用的外部资产单词 三、常用的外部资产单词和引入内部 四、图片资产外部调整的具体讲解 1.Tiling&#xff0c;中文&#xff1a;铺地砖 2.Offset&#xff0c;中文&#xff1a;偏移 五、作者的话 一、外部资产简介 在第六集中&#xff0c;我们…

理解TCP Socket编程模型和I/O多路复用技术

最基本Socket模型 基本只能一对一通信&#xff0c;因为使用的是同步阻塞的方式&#xff0c;当服务端在还没处理完一个客户端的网络 I/O 时&#xff0c;或者 读写操作发生阻塞时&#xff0c;其他客户端是无法与服务端连接的。 多进程模型 基于最原始的阻塞网络 I/O&#xff0c…

【InternLM 实战营笔记】基于 InternLM 和 LangChain 搭建MindSpore知识库

InternLM 模型部署 准备环境 拷贝环境 /root/share/install_conda_env_internlm_base.sh InternLM激活环境 conda activate InternLM安装依赖 # 升级pip python -m pip install --upgrade pippip install modelscope1.9.5 pip install transformers4.35.2 pip install str…

Node.js基础---npm与包

包 概念&#xff1a;Node.js 中的第三方模块又叫做包 来源&#xff1a;由第三方个人或团队开发出来的&#xff0c;免费使用&#xff0c;且为开源 为什么需要&#xff1a;Node.js的内置模块只有一些底层API&#xff0c;开发效率低 包是基于内置模块封装出来的&#xff0c;提供更…

音频筑基:CD还是HiRes?高清音频分类一文说透

音频筑基&#xff1a;CD还是HiRes&#xff1f;高清音频分类一文说透 前言音乐品质分类相关资料 前言 音频信号中&#xff0c;经常遇到高清音乐、无损音质、CD、HiRes等说法&#xff0c;本文主要在纯数字信号级别&#xff0c;从音源分类和编码质量两个维度&#xff0c;做一个分析…

使用 MongoDB Atlas 无服务器实例更高效地开发应用程序

使用 MongoDB Atlas无服务器实例更高效地开发应用程序 身为开发者&#xff0c;数据库并不一定需要您来操心。您可不想耗费时间来预配置集群或调整集群大小。同样地&#xff0c;您也不想操心因未能正确扩展而导致经费超标。 MongoDB Atlas 可为您提供多个数据库部署选项。虽然…

每日一题——LeetCode1544.整理字符串

方法一 字符串转数组删除元素 将字符串转为数组&#xff0c;遍历数组&#xff0c;如果碰到同一字母大写小写连续出现就原地删除这两个元素&#xff0c;最后把数组转回字符串并返回 var makeGood function(s) {let arrs.split()for(let i0;i<s.length-1;i){if(arr[i]!arr[…

基于SSM SpringBoot vue物流配送人员管理系统

基于SSM SpringBoot vue物流配送人员管理系统 系统功能 登录注册 个人中心 员工管理 考勤信息管理 小区信息管理 打卡信息管理 出勤统计管理 派单信息管理 工资结算管理 任务统计管理 开发环境和技术 开发语言&#xff1a;Java 使用框架: SSM(Spring SpringMVC Mybaits)或…

Java反射机制底层原理

反射机制 这篇文章我是参考了Java 中的反射机制&#xff08;两万字超全详解&#xff09;_java反射-CSDN博客 然后我在这里做一下总结&#xff0c;因为原文章真的很好&#xff0c;我才疏学浅没什么进行补充&#xff0c;只能做出自己的总结并且写一下自己对这个的理解。 原理&…

有效果的新闻软文推广都是怎么做的?

新闻软文推广能够在短时间内提高产品知名度&#xff0c;塑造品牌的美誉度与公信力&#xff0c;并且效果不是短期的&#xff0c;有一定的持续性&#xff0c;是数字化时代下品牌进行宣传的主要方式之一&#xff0c;受到很多企业的青睐&#xff0c;今天媒介盒子就来和大家聊聊&…

网络编程第二天

1.基于TCP的通信(面向连接的通信) 服务器代码实现&#xff1a; #include <myhead.h> #define IP "192.168.126.91" #define PORT 9999 int main(int argc, const char *argv[]) {//1、创建套接字int sfd-1;if((sfdsocket(AF_INET,SOCK_STREAM,0))-1){perror(…

Python学习DAY09_文件和异常

文件和异常 实际开发中常常会遇到对数据进行持久化操作的场景&#xff0c;而实现数据持久化最直接简单的方式就是将数据保存到文件中。 在 Python 中实现文件的读写操作其实非常简单&#xff0c;通过 Python 内置的 open 函数&#xff0c;我们可以指定文件名、操作模式、编码信…