时间复杂度的相关概念

1. 统计时间增长趋势

时间复杂度分析统计的不是算法运行时间,而是算法运行时间随着数据量变大时的增长趋势,也就是算法运行时间与输入数据的关系。

// 算法 A 的时间复杂度:常数阶
function algorithm_A(n) {console.log(0);
}
// 算法 B 的时间复杂度:线性阶
function algorithm_B(n) {for (let i = 0; i < n; i++) {console.log(0);}
}
// 算法 C 的时间复杂度:常数阶
function algorithm_C(n) {for (let i = 0; i < 1000000; i++) {console.log(0);}
}

● 算法 A 只有 1 个打印操作,算法运行时间不随着 n 增大而增长。我们称此算法的时间复杂度为“常数阶”。
● 算法 B 中的打印操作需要循环 n 次,算法运行时间随着 n 增大呈线性增长。此算法的时间复杂度被称为“线性阶”。
● 算法 C 中的打印操作需要循环 1000000 次,虽然运行时间很长,但它与输入数据大小 n 无关。因此 C 的时间复杂度和 A 相同,仍为“常数阶”。
在这里插入图片描述

2. 函数渐近上界

function algorithm(n) {var a = 1; // +1a += 1; // +1a *= 2; // +1// 循环 n 次for(let i = 0; i < n; i++){ // +1(每轮都执行 i ++)console.log(0); // +1}
}

设算法的操作数量是一个关于输入数据大小 n 的函数,记为 T ( n ) T(n) T(n) ,则以上函数的操作数量为: T ( n ) = 3 + 2 n T(n) = 3+2n T(n)=3+2n
T ( n ) T(n) T(n)是一次函数,说明其运行时间的增长趋势是线性的,因此它的时间复杂度是线性阶。
我们将线性阶的时间复杂度记为 O ( n ) O(n) O(n) ,这个数学符号称为大 O 记号(big-O notation),表示函数 T ( n ) T(n) T(n)渐近上界(asymptotic upper bound)。
在这里插入图片描述

所以要知道执行的时间复杂度,就是要确定 f ( n ) f(n) f(n)

3. 推算方法

步骤1: 统计操作数量 T(n)

由于上述 c⋅f(n) 中的常数项 c 可以取任意大小,因此操作数量 T(n) 中的各种系数、常数项都可以忽略,循环嵌套时使用乘法。

function algorithm(n) {let a = 1;  // +0(技巧 1)a = a + n;  // +0(技巧 1)// +n(技巧 2)for (let i = 0; i < 5 * n + 1; i++) {console.log(0);}// +n*n(技巧 3)for (let i = 0; i < 2 * n; i++) {for (let j = 0; j < n + 1; j++) {console.log(0);}}
}

所以简化后的操作数量 T ( n ) = n 2 + n T(n) = n^2+n T(n)=n2+n

步骤2:判断渐近上界

时间复杂度由 T ( n ) T(n) T(n)最高阶的项来决定.
在这里插入图片描述

所以上面例子的时间复杂度为 O ( n 2 ) O(n^2) O(n2)

4. 常见的时间复杂度类型

在这里插入图片描述

在这里插入图片描述

常数阶 O(1)

操作数量与输入数据大小n 无关

/* 常数阶 */
function constant(n) {let count = 0;const size = 100000;for (let i = 0; i < size; i++) count++;return count;
}

线性阶O(n)

操作数量取决于输入数据大小n,随着n变化

/* 线性阶 */
function linear(n) {let count = 0;for (let i = 0; i < n; i++) count++;return count;
}

平方阶

通常出现在内外循环中

/* 平方阶 */
function quadratic(n) {let count = 0;// 循环次数与数据大小 n 成平方关系for (let i = 0; i < n; i++) {for (let j = 0; j < n; j++) {count++;}}return count;
}

指数阶

/* 指数阶(循环实现) */
function exponential(n) {let count = 0,base = 1;// 细胞每轮一分为二,形成数列 1, 2, 4, 8, ..., 2^(n-1)for (let i = 0; i < n; i++) {for (let j = 0; j < base; j++) {count++;}base *= 2;}// count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1 = z^nreturn count;
}

对数阶

一般用于分治策略中,比如二分法。

与指数阶相反,对数阶反映了“每轮缩减到一半”的情况。设输入数据大小为 n ,由于每轮缩减到一半,因此循环次数是 l o g 2 n log_2^n log2n ,即 2 n 2^n 2n 的反函数。

/* 对数阶(循环实现) */
function logarithmic(n) {let count = 0;while (n > 1) {n = n / 2;count++;}return count;
}

T ( n ) = l o g 2 n + 1 T(n) = log_2^n+1 T(n)=log2n+1
O ( n ) = l o g 2 n O(n) = log_2^n O(n)=log2n

在这里插入图片描述

所以无论底数m为多少,对其本身的时间复杂度不影响,所以通常会省略底数m。

线性对数阶

线性对数阶常出现于嵌套循环中,两层循环的时间复杂度分别为 O ( l o g n ) O(log^n) O(logn) O ( n ) O(n) O(n)

/* 线性对数阶 */
function linearLogRecur(n) {if (n <= 1) return 1;let count = linearLogRecur(n / 2) + linearLogRecur(n / 2);for (let i = 0; i < n; i++) {count++;}return count;
}

阶乘阶 O(n!)

阶乘阶对应数学上的“全排列”问题。给定 n 个互不重复的元素,求其所有可能的排列方案,方案数量为:
在这里插入图片描述

阶乘通常使用递归实现。

/* 阶乘阶(递归实现) */
function factorialRecur(n) {if (n === 0) return 1;let count = 0;// 从 1 个分裂出 n 个for (let i = 0; i < n; i++) {count += factorialRecur(n - 1);}return count;
}

5. 最差、最佳、平均时间复杂度

假设输入一个长度为 n 的数组 nums ,其中 nums 由从 1 至 n 的数字组成,每个数字只出现一次;但元素顺序是随机打乱的,任务目标是返回元素 1 的索引。我们可以得出以下结论。
● 当 nums = [?, ?, …, 1] ,即当末尾元素是 1 时,需要完整遍历数组,达到最差时间复杂度 O ( n ) O(n) O(n)
● 当 nums = [1, ?, ?, …] ,即当首个元素为 1 时,无论数组多长都不需要继续遍历,达到最佳时间复杂度 O ( 1 ) O(1) O(1)

“最差时间复杂度”对应函数渐近上界,使用大 O O O记号表示。相应地,“最佳时间复杂度”对应函数渐近下界,用 Ω Ω Ω记号表示

比如上述示例,由于输入数组是被打乱的,因此元素 1 出现在任意索引的概率都是相等的,那么算法的平均循环次数就是数组长度的一半 n/2 ,平均时间复杂度为 Θ(n/2)=Θ(n) 。
在这里插入图片描述


🔍空间复杂度的相关概念
参考:https://www.hello-algo.com/

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

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

相关文章

分类预测 | Matlab实现GWO-CNN-SVM灰狼冰算法优化卷积支持向量机分类预测

分类预测 | Matlab实现GWO-CNN-SVM灰狼冰算法优化卷积支持向量机分类预测 目录 分类预测 | Matlab实现GWO-CNN-SVM灰狼冰算法优化卷积支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现GWO-CNN-SVM灰狼冰算法优化卷积支持向量机分类预测&…

10.无代码爬虫软件做网页数据抓取流程——工作流程设置与数据预览

首先&#xff0c;多数情况下免费版本的功能&#xff0c;已经可以满足绝大多数采集需求&#xff0c;想了解八爪鱼采集器版本区别的详情&#xff0c;请访问这篇帖子&#xff1a;https://blog.csdn.net/cctv1123/article/details/139581468 八爪鱼采集器免费版和个人版、团队版下…

Salia PLCC cPH2 远程命令执行漏洞(CVE-2023-46359)

漏洞描述 Salia PLCC cPH2 v1.87.0 及更早版本中存在一个操作系统命令注入漏洞&#xff0c;该漏洞可能允许未经身份验证的远程攻击者通过传递给连接检查功能的特制参数在系统上执行任意命令。 产品界面 fofa语法 "Salia PLCC" POC GET /connectioncheck.php?ip1…

Android Studio项目升级报错:Namespace not specified

原项目升级AGP到8.0时报错&#xff1a; Namespace not specified. Specify a namespace in the modules build file: C:\Users\Administrator\Desktop\MyJetpack\app\build.gradle. See https://d.android.com/r/tools/upgrade-assistant/set-namespace for information about…

vue大作业-端午节主题网站

vue大作业-端午节主题网站介绍 端午节&#xff0c;又称为龙舟节&#xff0c;是中国的传统节日之一&#xff0c;每年农历五月初五庆祝。这个节日不仅是纪念古代爱国诗人屈原的日子&#xff0c;也是家人团聚、共享美食的时刻。今天&#xff0c;我们非常高兴地分享一个以端午节为…

Go变量作用域精讲及代码实战

1. 变量的作用域概述 在编程中&#xff0c;变量的作用域&#xff08;Scope&#xff09;定义了变量在程序中的可见性和生命周期。理解变量的作用域对于编写健壮且可维护的代码至关重要。Go语言&#xff08;简称Go&#xff09;提供了几种不同的作用域类型&#xff0c;使得开发者可…

Ubuntu/Linux系统安装JDK1.8(带jdk1.8资源和操作教程)

文章目录 前言一、JDK1.8下载二、上传三、安装四、配置环境变量五、查看总结 前言 &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;Ubuntu/Linux jdk1.8安装包&#xff…

SpringBootWeb 篇-入门了解 Spring Cache 、Spring Task 与 WebSocket 框架

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Spring Cache 概述 1.1 Spring Cache 具体使用 1.1.1 引入依赖 1.1.2 Spring Cache 相关注解的介绍 2.0 Spring Task 概述 2.1 cron 表达式 2.2 Spring Task 使用…

云平台DNS故障导致网站访问卡顿异常排查过程,wireshark、strace等工具在实际问题排查过程中的应用方法

一、问题现象 项目上使用华为私有云&#xff0c;前段时间华为升级云平台后&#xff0c;云上用户反馈业务系统出现卡顿&#xff0c;之前几秒可以刷新出来的页面现在需要几十秒。提供了一个比较明显的url和curl调用方法。 10.213.x.xxx:8082/files/login curl -H "Content-…

LabVIEW开发指针式压力仪表图像识别

系统利用LabVIEW编程实现对指针式压力仪表的读取&#xff0c;通过相机、光源、固定支架等硬件捕捉仪表图像&#xff0c;并通过图像识别技术解析压力值。系统分为两个阶段&#xff1a;第一阶段固定相机更换仪表&#xff0c;第二阶段移动相机识别多个固定仪表。本文介绍硬件选择、…

Jenkins 发测试邮件报错 553 Mail from must equal authorized user

Jenkins 发测试邮件报错 553 Mail from must equal authorized user 报错信息报错原因解决办法 报错信息 org.eclipse.angus.mail.smtp.SMTPSenderFailedException: 553 Mail from must equal authorized user at org.eclipse.angus.mail.smtp.SMTPTransport.mailFrom(SMTPTra…

我工作中用Redis的10种场景

Redis作为一种优秀的基于key/value的缓存&#xff0c;有非常不错的性能和稳定性&#xff0c;无论是在工作中&#xff0c;还是面试中&#xff0c;都经常会出现。 今天这篇文章就跟大家一起聊聊&#xff0c;我在实际工作中使用Redis的10种场景&#xff0c;希望对你会有所帮助。 …

丹尼尔·T·琼斯:精益生产到底是什么?

本文摘要自《精益思想》、《改变世界的机器》作者之一丹尼尔T琼斯的文章。丹尼尔T琼斯是一位学者、英国作家和研究员。他曾多次获得瑞士山吉奥卓越运营奖研究与专业出版类别的奖项&#xff0c;也包括了国际精益六西格玛研究所&#xff08;ILSSI&#xff09;[1]的"精益思想…

【Java】已解决java.sql.SQLException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.sql.SQLException异常 在Java中&#xff0c;java.sql.SQLException是一个通用的异常类&#xff0c;用于表示在数据库操作中发生的错误。无论是类型错误、数据类型不匹配…

Nacos 2.x 系列【15】数据源插件支持达梦、Oracel、PostgreSQL......

文章目录 1. 概述2. 持久层机制2.1 固定语句2.2 数据源插件 3. 案例演示3.1 编译已实现插件3.2 自定义插件3.3 数据库初始化3.4 插件引入3.4.1 方式一&#xff1a;引入到源码3.4.2 方式二&#xff1a;插件加载目录 3.5 修改配置3.6 测试 1. 概述 在实际项目开发中&#xff0c;…

[Linux] 历史根源

UNIX系统&#xff1a; 1969年&#xff0c;由贝尔实验室的K.Thompson和D.M.Ritchie为PDP-7机器编写的一个分时操作系统&#xff0c; 最初使用汇编语言编写&#xff0c; 后来1972年C语言出世以后&#xff0c;二人由使用C写了UNIX3&#xff0c; 此后UNIX大为流行开来 UNIX流派树&a…

vxe-table 列表过滤踩坑_vxe-table筛选

但是这个过滤输入值必须是跟列表的值必须一致才能查到&#xff0c;没做到模糊查询的功能&#xff0c;根据关键字来过滤并没有实现。 下面提供一下具体实现方法&#xff1a;&#xff08;关键字来过滤&#xff09; filterNameMethod({ option, row }) {if (row.name.indexOf(op…

不拼搏不是兄弟的京东,618被指「心眼子」太多上热榜……

好多年不咋公开露面的刘强东&#xff0c;在明尼苏达州事件逐渐不被人提起后&#xff0c;其按捺不住的互联网企业家网红属性&#xff0c;这大半年内&#xff0c;好像又血脉觉醒了……‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 比如在今年618前夕&#xff0c;刘强东因跨国操盘京东&a…

GlusterFS企业分布式存储

GlusterFS 分布式文件系统代表-nfs常见分布式存储Gluster存储基础梳理GlusterFS 适合大文件还是小文件存储&#xff1f; 应用场景术语Trusted Storage PoolBrickVolumes Glusterfs整体工作流程-数据访问流程GlusterFS客户端访问流程 GlusterFS常用命令部署 GlusterFS 群集准备环…

轻松选购指南:如何挑选3D建模和3D渲染的高效计算机?

选择最适合 3D 建模和3D渲染的计算机可能是一项艰巨的任务&#xff0c;特别是对于初学者来说。有很多因素需要考虑&#xff0c;包括处理器、显卡、内存和存储容量。 如果你计划购买一台计算机或利用3D产品渲染服务&#xff0c;那么你必须了解需要考虑的特性。以下是选择3D建模…