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

news2024/11/23 15:35:49

目录

算法背景 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;  // 复杂度:T
    for (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 = 0
    base = 1
    # 细胞每轮一分为二,形成数列 1, 2, 4, 8, ..., 2^(n-1)
    for _ in range(n):
        for _ in range(base):
            count += 1
        base *= 2
    # count = 1 + 2 + 4 + 8 + .. + 2^(n-1) = 2^n - 1
    return 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 1
    count = 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^2
          for(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.coloradmin.cn/o/1797978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python的line[:-1]和line[-1]

line[:-1]其实就是去除了这行文本的最后一个字符(换行符)后剩下的部分。 line = "abcde" line[:-1] 结果为:abcd line = "abcde" line[::-1] 结果为:edcba 示例3 [m : ] 代表列表中的第m+1项到最后一项 [ : n] 代表列表中的第一项到第n项 [-1] 代…

Facebook:社交世界的引领者

导语 在当今数字化时代&#xff0c;Facebook已经成为了人们社交生活的重要一环。然而&#xff0c;除了成为社交媒体的象征外&#xff0c;它还在不断探索并领导着社交世界的新方向。 1. 社交平台的发展者 Facebook不仅仅是一个社交平台&#xff0c;更是社交方式的引领者。从其…

世界坐标系和WGS84坐标系相互转换(2024-06-07)

WGS84弧度坐标系转世界坐标 const handelCartographic ()>{const a new Cesium.Cartesian3.fromDegrees(104.1, 30.6, 200);console.log("世界坐标",a);const b new Cesium.Cartographic.fromDegrees(104.1, 30.6, 200);console.log("WGS84弧度坐标系&qu…

什么是ESG?

什么是ESG&#xff1f; ESG的实施和发展是企业应对全球和国内环境、社会和治理挑战的关键路径。《ESG入门一本通》详细阐述了ESG的概念、发展历程和评价体系&#xff0c;并结合中国的实际情况&#xff0c;强调了ESG的重要性和必要性。企业需重视ESG管理和信息披露&#xff0c;…

视觉SLAM十四讲:从理论到实践(Chapter9:后端1)

前言 学习笔记&#xff0c;仅供学习&#xff0c;不做商用&#xff0c;如有侵权&#xff0c;联系我删除即可 一、目标 1.理解后端的概念。 2.理解以EKF为代表的滤波器后端的工作原理。 3.理解非线性优化的后端&#xff0c;明白稀疏性是如何利用的。 4.使用g2o和Ceres实际操作…

C# 集成 C++ 的方法和实践 - P/Invoke(平台调用)- 1

环境&#xff1a; 1 P/Invoke&#xff08;平台调用&#xff09;&#xff1a; C#可以通过P/Invoke调用C编写的DLL中的函数。 1.1 适用范围&#xff1a; P/Invoke 是一种在 C# 程序中调用非托管代码&#xff08;如 C 动态链接库&#xff09;的方式。这种方法适用于函数调用相对…

一文了解AI绘画两大鼻祖 Midjourney 和 Stable Diffusion的区别,超详细讲解小白入门必看教程!

大家好&#xff0c;我是画画的小强 要说AI绘画软件哪家强&#xff1f;有人说Midjoureny (MJ), 有人说Stable Diffuion(SD)&#xff0c;那他们到底有什么区别&#xff1f;应该选择哪款软件学习&#xff1f;今天带大家全面了解一下&#xff01;文末可白嫖AI资料哦&#xff5e; 一…

PVE安装CENTOS9提示“Fatal glibc error: CPU does not support x86-64-v2”

问题描述&#xff1a;PVE安装CENTOS9提示“Fatal glibc error: CPU does not support x86-64-v2” RHEL 9要求x86_64的CPU支持x86-64-v2&#xff0c;x86-64-v2需要处理器支持 CMPXCHG16B、LAHF-SAHF、POPCNT、SSE3、SSE4.1、SSE4.2、SSSE3 等现代指令集 解决方法&#xff1a;…

API接口测试工具:jmeter的安装、汉化、Jmeter桌面快捷图标和基本使用

文章目录 测试工具&#xff1a;JmeterJmeter安装和配置Jmeter汉化设置中文语言&#xff1a;永久方式设置中文语言&#xff1a;临时方式 设置Jmeter桌面快捷图标jmeter基本用法Jmeter无法保存测试问题解决 测试工具&#xff1a;Jmeter Jmeter依赖于JDK&#xff0c;所以必须确保…

SwiftUI获取用户的位置信息(CLLocationManager,CLLocationManagerDelegate)

本篇文章将会介绍一下在SwiftUI中如何通过CorLocation框架获取用户的位置信息&#xff0c;因为获取位置信息属于用户的隐私信息&#xff0c;所以需要在Info.plist文件里面加上访问位置权限的说明。 关于位置信息&#xff0c;可以请求两种级别的许可&#xff1a;always和when i…

项目经理进入职场都会经历的三个阶段

对于项目经理而言&#xff0c;进入职场是一个不断学习和成长的过程。在这个过程中&#xff0c;项目经理通常会经历三个主要阶段&#xff0c;每个阶段都有其独特的特点和挑战。 一、基础建设与学习阶段 对于新入行的项目经理来说&#xff0c;最初的阶段主要是基础技能的积累和…

AI绘画中的色彩空间转换技术

在数字艺术的广阔天地中&#xff0c;AI绘画作为一种新兴的创作方式&#xff0c;正以其独特的魅力吸引着越来越多的关注。它不仅仅是一种技术&#xff0c;更是一种全新的艺术表现形式。而在AI绘画的背后&#xff0c;色彩空间转换技术起着至关重要的作用。今天&#xff0c;我们就…

政安晨【零基础玩转各类开源AI项目】:解析开源项目:Champ 利用三维参数指导制作可控且一致的人体图像动画

目录 论文题目 Champ: 利用三维参数指导制作可控且一致的人体图像动画 安装 创建 conda 环境&#xff1a; 使用 pip 安装软件包 推理 1. 下载预训练模型 2. 准备准备引导动作数据 运行推理 训练模型 准备数据集 运行训练脚本 数据集 政安晨的个人主页&#xff1a;…

Web LLM 攻击技术

概述 在ChatGPT问世以来&#xff0c;我也尝试挖掘过ChatGPT的漏洞&#xff0c;不过仅仅发现过一些小问题&#xff1a;无法显示xml的bug和错误信息泄露&#xff0c;虽然也挖到过一些开源LLM的漏洞&#xff0c;比如前段时间发现的Jan的漏洞&#xff0c;但是不得不说传统漏洞越来…

抖音外卖区域代理需要多少钱?入局成本如何计算?

随着抖音外卖的日益火爆和抖音外卖平台全国代理的退场&#xff0c;想要申请抖音外卖平台区域代理的人数不断上涨。但是&#xff0c;创业毕竟不是儿戏&#xff0c;每一个决定都需要经过权衡利弊。而就做抖音外卖区域代理这一项目而言&#xff0c;抖音外卖平台区域代理需要多少钱…

洛杉矶裸机云多IP服务器网线路测评

在当今日益数字化的世界中&#xff0c;服务器的网络线路质量对于企业的运营效率和用户体验具有至关重要的作用。特别是对于那些寻求在洛杉矶部署裸机云多IP服务器的企业来说&#xff0c;了解服务器的网络线路质量显得尤为重要。本文将对洛杉矶裸机云多IP服务器的网络线路进行测…

Idea解决堆栈溢出

废话不说了&#xff0c;这问题搞了我两天&#xff0c;最近在用内网办公&#xff0c;没用公网&#xff0c;所以博客暂时没更新

QA | 关于智能座舱SusPIS-ATx系统常见问题答疑

前沿 在上一期《基于SusPIS-ATx的座舱仿真系统搭建与评估方法创意研讨会》中&#xff0c;我们围绕汽车智能座舱仿真测试相关评价规范和法规&#xff08;如C-ICAP&#xff09;&#xff0c;引入了智能座舱测试行业难点及次生问题&#xff0c;介绍了基于SusPIS-ATx的智能座舱全域…

原花青素优化定向壳聚糖微通道的简单免疫调控结构设计

引用信息 文 章&#xff1a;A facile Immunoregulatory Constructional Design by Proanthocyanidin Optimizing Directional Chitosan Microchannel 期 刊&#xff1a;Small&#xff08;影响因子&#xff1a;13.3&#xff09; 发表时间&#xff1a;29/02/2024 作 …

多项目管理,如何平衡资源分配和优先级?

在多项目管理中&#xff0c;平衡资源分配和优先级是一项至关重要的任务&#xff0c;这不仅关乎项目的顺利进行&#xff0c;还直接影响到组织的整体效率和战略目标的实现。如果不能合理进行资源分配&#xff0c;容易引起资源的浪费和关键项目进度延期等问题&#xff0c;这不利于…