机器学习之数学基础(六)~时间复杂度和空间复杂度

目录

算法背景 background

1. 时间复杂度 Time Complexity

1.1 时间复杂度分类

1.1.1 O(1) 常数阶

1.1.2 O(n) 线性阶

1.1.3 O(n^2) 平方阶 

1.1.4 O(logn) 对数阶

1.1.5 O(nlogn) 线性对数阶

1.1.6 O(2^n) 指数阶

1.1.7 O(n!) 阶乘阶

1.1.8 时间复杂度分类 

1.2 时间复杂度 Rules

1.3 时间复杂度计算流程

2. 空间复杂度 Space Complexity

参考 


算法背景 background

核心Algorithms + Data Structures = Programs

-》高性能的代码 = 相应速度快的代码。需要初级程序员了解算法,灵活地运用算法。

-》发明设计一款算法:要去推导证明算法的可行性

数据结构是为算法服务的,而算法又需要作用在特定的数据结构上。

-》谁的算法快,谁的算法更优!!

如果两种算法实现的速度差不多,那我们还可以去评价算法所占用的空间。

时间复杂度:执行当前算法所消耗的时间。--》快

空间复杂度:执行当前算法所消耗的内存空间。--》省

1. 时间复杂度 Time Complexity

时间复杂度 time complexity:全称为算法的渐进时间复杂度,表示执行当前算法的最高运算次数,记作T(n)=O(f(n)),表示算法的执行时间与数据规模n之间的增长关系。

核心:分析算法时间复杂度的关键在于分析出代码循环了多少次!

Note:时间复杂度反映的只是一个趋势,也就是随着n的变化,算法执行时间的也是会变化的。

1.1 时间复杂度分类

1.1.1 O(1) 常数阶

本质:复杂度与数据规模n无关! 

public static void print(int n){int a = 1;int b = 2;int c = 3;int sum = a + b + c;System.out.println(sum);
}

1.1.2 O(n) 线性阶

对应:单层for循环

public static void print1(int n){int a = 0;  // 复杂度:Tfor (int i=0;i<n;i++){System.out.println(i);  // 复杂度:n*T}
}

假设每一行代码的执行时间是T,那上段代码的执行时间T(n)=  T+n*T=(n+1)T.

->算法时间复杂度 Rule 1: 常量可以被忽略。

所以,T(n) = nT = O(n). 

1.1.3 O(n^2) 平方阶 

 双层循环平方阶O(n^2)

三层循环立方阶O(n^3)

K层循环就是K次立方阶。

1.1.4 O(logn) 对数阶

对应:while 循环

e.g. 二分查找,二叉树问题 

public static void print2(int n){int i=1;while (i <= n) {i = i * 2;}
}

分析算法时间复杂度的关键在于分析出while循环了多少次。

1->2->4->8...

2^x=n,只要能得到x的值,就得到了循环次数。

x = {log_2}^{n} = O({log_2}^{n})

同理, {log_3}^{n} = {log_3}^{2} * {log_2}^{n} = O({log_2}^{n}),不管底数是多少,最终都可以转换为以2为底的对数阶 =》O({log_2}^{n}) = O({log}^{n})

=》算法时间复杂度 Rule 2: 当循环中下标以指定倍数形式衰减,那么这就是一个对数阶。

1.1.5 O(nlogn) 线性对数阶

时间复杂度 = 代码执行次数!

for (int j=1;j<=n;j++){int i=1;   // 时间复杂度 O(n)while (i <= n) {i = i * 2;  // 时间复杂度 O(logn)}
}

嵌套代码的时间复杂度O(nlog_n) = 单独的嵌套内循环 * 单独的嵌套外循环 O(n) * O(logn)

= 嵌套内外循环时间复杂度之和 O(n) + O(nlogn)

1.1.6 O(2^n) 指数阶

def exponential(n: int) -> int:"""指数阶(循环实现)"""count = 0base = 1# 细胞每轮一分为二,形成数列 1, 2, 4, 8, ..., 2^(n-1)for _ in range(n):for _ in range(base):count += 1base *= 2# count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1return count

单独的嵌套内循环次数无法计算 

无法利用乘积求时间复杂度,只能用加法了 

嵌套外循环时间复杂度 O(n) 

 base:1, 2, 4, 8, 2^(n-1)

嵌套内循环次数:等比数列求和公式S_n = a \frac{1-r^n}{1-r} \rightarrow 2^n-1

1.1.7 O(n!) 阶乘阶

def factorial_recur(n: int) -> int:"""阶乘阶(递归实现)"""if n == 0:return 1count = 0# 从 1 个分裂出 n 个for _ in range(n):count += factorial_recur(n - 1)return count

1.1.8 时间复杂度分类 

最好时间复杂度、最坏时间复杂度、平均时间复杂度

1.2 时间复杂度 Rules

  • 只要是常数级别,不论n多大,代码效率都是一样的。
  • 忽略常量、低次幂和高次幂系数。
  • 嵌套代码的时间复杂度O(nlog_n) = 单独的嵌套内循环 * 单独的嵌套外循环 O(n) * O(logn)

    = 嵌套内外循环时间复杂度之和 O(n) + O(nlogn)

  • 在同一个算法中,存在明确大小关系的,可以直接取最大值作为这个算法的复杂度。

多项式时间复杂度关系:O(1) < O(log_n) < O(n) < O(nlog_n) < O(n^2) < O(n^3)

指数时间复杂度关系:O(n^2) < O(2^n) < O(n!) < O(n^n) 

1.3 时间复杂度计算流程

Note:只有可运行的语句才会增加时间复杂度,除了循环外,其他可执行语句的时间复杂读都是O(1),可以被忽略。 

(1) 计算出基本操作的执行次数T(n). 计算算法中每条语句的执行次数;在做算法分析时,一般默认为考虑最坏的情况,而不是考虑循环break or continue情况

(2) 计算出T(n)的数量级。忽略常量、低次幂和高次幂系数。

(3) 用O表示时间复杂度。只保留最高项

for(i=1;i<=n;++i){for(j=1;j<=n;++j){c[ i ][ j ]=0; //该步骤属于基本操作 执行次数:n^2for(k=1;k<=n;++k)c[ i ][ j ]+=a[ i ][ k ]*b[ k ][ j ]; //该步骤属于基本操作 执行次数:n^3}} 

第一步计算基本语句执行次数:T(n)= n^2+n^3;
第二步T(n)的同数量级,我们可以确定 n^3为T(n) 的同数量级;
第三步用大O表示时间复杂度:T(n) =O(n^3)。 

2. 空间复杂度 Space Complexity

空间复杂度 space complexity:全称为算法的渐进空间复杂度,表示执行当前算法所消耗的内存空间。是指一个算法在运行过程中临时占用存储空间大小的度量,记作S(n)=O(f(n)),用来表示算法的存储空间雨数据规模n之间的增长关系。

核心:以最差的输入数据为准;以算法运行中的峰值内存为准

  • 定义一个常数变量,与n无关,它的空间复杂度为O(1).
  • 定义一个数组,数组长度为n,这个数组需要的空间复杂度为O(n),因为它的空间随着n变化而变化。
  • 二维数组,空间复杂度O(n^2) 

参考 

https://www.cnblogs.com/lonely-wolf/p/15674526.html

一文搞懂算法的时间复杂度与空间复杂度_算法与复杂度的关系-CSDN博客

2.3   时间复杂度 - Hello 算法

2.4   空间复杂度 - Hello 算法

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

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

相关文章

基于FPGA的SystemVerilog练习

文章目录 一、认识SystemVerilogSystemVerilog的语言特性SystemVerilog的应用领域SystemVerilog的优势SystemVerilog的未来发展方向 二、流水灯代码流水灯部分testbench仿真文件 三、用systemVerilog实现超声波测距计时器测距部分led部分数码管部分采样部分顶层文件引脚绑定效果…

华为昇腾310B初体验,OrangePi AIpro开发板使用测评

0、写在前面 很高兴收到官方的OrangePi AIpro开发板测试邀请&#xff0c;在过去的几年中&#xff0c;我在自己的博客写了一系列有关搭载嵌入式Linux系统的SBC&#xff08;单板计算机&#xff09;的博文&#xff0c;包括树莓派4系列、2K1000龙芯教育派、Radxa Rock5B、BeagleBo…

001----flask

flask---001 flask与django对比今日概要问答今日详细1.flask快速使用1.2 快速使用flask1.3 用户名密码登录 flask与django对比 django是个大而全的框架&#xff0c;flask是一个轻量级的框架。 django内部为我们提供了非常多的组件&#xff1a;orm/session/cookie/admin/from/mo…

mysql 分区

目标 给一个表&#xff08;半年有800万&#xff09;增加分区以增加查询速度 约束 分区不能有外键否则会报错 https://blog.csdn.net/yabingshi_tech/article/details/52241034 主键 按照时间列进行分区 https://blog.csdn.net/winerpro/article/details/135736454 参看以…

时序预测 | Matlab灰色-马尔科夫预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab灰色-马尔科夫预测 灰色马尔科夫预测&#xff08;Grey-Markov Prediction&#xff09;是一种用于时间序列预测的方法&#xff0c;它结合了灰色系统理论和马尔科夫链模型。灰色系统理论是一种非参数化的预测方法…

[vue2项目]vue2+supermap[mapboxgl]+天地图之地图的初始化

Supermap参考教程 天地图 一、安装 1、终端:npm install supermap/vue-iclient-mapboxgl 2、在package.json文件的dependencies查看supermap/vue-iclient-mapboxgl依赖是否安装成功。 3、在mian.js全局引入 import VueiClient from supermap/vue-iclient-mapboxgl; Vue.use(…

研学活动报名收集材料怎么写?教程来了!

研学活动作为学校教育的重要组成部分&#xff0c;不仅能够拓宽学生的视野&#xff0c;还能促进家校沟通。学生们报名还是十分积极踊跃的&#xff0c;然而研学活动报名收集材料该怎么写却困扰着不少老师&#xff0c;其实只需要把姓名和联系方式等收集全就可以了&#xff0c;主要…

typescript --object对象类型

ts中的object const obj new Object()Object 这里的Object是Object类型&#xff0c;而不是JavaScript内置的Object构造函数。 这里的Object是一种类型&#xff0c;而Object()构造函数表示一个值。 Object()构造函数的ts代码 interface ObjectConstructor{readonly prototyp…

UMG绝对坐标与局部空间

在 Unreal Engine 的 UMG&#xff08;Unreal Motion Graphics&#xff09;中&#xff0c;“绝对坐标”和“局部空间”是两个常见的概念&#xff0c;主要用于描述 UI 元素的位置和大小。 概念与区别 绝对坐标&#xff08;Absolute Coordinates&#xff09;&#xff1a;这是指相…

[数据集][目标检测]RSNA肺炎检测数据集VOC+YOLO格式6012张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6012 标注数量(xml文件个数)&#xff1a;6012 标注数量(txt文件个数)&#xff1a;6012 标注…

彩光大放异彩!《智慧园区以太全光网络建设技术规程》应用案例征集活动结果公布

近日,中国建筑业协会绿色建造与智能建筑分会正式公布了《智慧园区以太全光网络建设技术规程》应用案例征集活动的结果。本次活动旨在推广和应用该规程,进一步推动智慧园区的数字化、智慧化、绿色化建设。众多优秀项目在征集活动中脱颖而出,展示了规程在实际应用中的显著成效。评…

如果任务过多,队列积压怎么处理?

如果任务过多,队列积压怎么处理? 1、内存队列满了应该怎么办2、问题要治本——发短信导致吞吐量降低的问题不能忽略!!3、多路复用IO模型的核心组件简介1、内存队列满了应该怎么办 如图: 大家可以看到,虽然现在发短信和广告投递,彼此之间的执行效率不受彼此影响,但是请…

vue3+typescript 使用Codemirror

安装 // npm npm install codemirror-editor-vue3 codemirror^5.65.12// ts版 还需安装&#xff1a; npm install types/codemirror全局注册 修改main.ts&#xff1a; import { createApp } from vueimport App from ./App.vueimport { InstallCodemirro } from "code…

M-G364PD惯性测量单元:相机及微小层面的革命性应用

在现代科技飞速发展的今天&#xff0c;精准控制和精确测量是众多高端设备实现卓越性能的关键。爱普生推出的M-G364PD惯性测量单元&#xff08;IMU&#xff09;&#xff0c;因其卓越的性能和微小尺寸&#xff0c;成为相机以及其他微小层面应用的理想选择&#xff0c;为科技创新提…

JVMの堆、栈内存存储

1、JVM栈的数据存储 通过前面的学习&#xff0c;我们知道&#xff0c;将源代码编译成字节码文件后&#xff0c;JVM会对其中的字节码指令解释执行&#xff0c;在解释执行的过程中&#xff0c;又利用到了栈区的操作数栈和局部变量表两部分。 而局部变量表又分为一个个的槽位&…

JavaScript 基础 - 对象

对象 对象是一种无序的数据集合&#xff0c;可以详细的描述描述某个事物。 注意数组是有序的数据集合。它由属性和方法两部分构成。 语法 声明一个对象类型的变量与之前声明一个数值或字符串类型的变量没有本质上的区别。 <script>let 对象名 {属性名&#xff1a;属性值…

DynamiCrafter ComfyUI 教程 | 对图片转视频的效果进行精细化控制

近日&#xff0c;由北大、腾讯AI Lab联合推出的 AI 视频生成工具 DynamiCrafter 一经上线便引起了巨大反响。只需要输入一张普普通通的静态图&#xff0c;加上几句简单的文字引导&#xff0c;瞬间就能生成超逼真的动态视频&#xff0c;简直不要太厉害&#xff01; 静态图 fire…

renren-fast-vue启动报错

问题描述 拉取人人开源vue项目启动失败 报错信息 版本信息 序号名称版本号1node14.21.3 启动方案 1.拉取项目 git clone https://gitee.com/renrenio/renren-fast-vue.git 2.执行安装依赖命令 npm install 3.此时报错 chromedriver2.27.2 install: node install.js 4.手动…

kafka集群内外网分流方案——筑梦之路

前言 在现代分布式系统架构中&#xff0c;Kafka作为一款高性能的消息队列系统&#xff0c;广泛应用于大数据处理、实时流处理以及微服务间的异步通信场景。特别是往往企业级应用中&#xff0c;业务网段和内网通信网段不是同一个网段&#xff0c;内网的机器想要访问业务数据只能…

Java内存模型(JMM)

Volatile关键字 如何保证变量的可见性 在Java中&#xff0c;Volatile关键字可以保证变量的可见性&#xff0c;如果我们将变量声明为volatile&#xff0c;这就指示JVM&#xff0c;这个变量是共享且不稳定的&#xff0c;**每次使用它都到主存中进行读取&#xff08;禁止读取本地…