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

目录

算法背景 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 算法

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

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

相关文章

记录Nuxt 3 官网项目的一次部署

本来以为就是一次简单的部署&#xff0c;之前也是部署过几次nuxt项目了&#xff0c;所以&#xff0c;并没有要记录的想法。但是过程出现了很多问题&#xff0c;最后考虑还是写下来吧。留个记录&#xff08;完整的配置部署过程&#xff09; 这里我将要说明两种部署方式以供选择&…

electron-Vue: Module parse failed: Unexpected character ‘ ‘

​ electron-Vue项目中&#xff0c;我自己写了一个node的C扩展&#xff08;xx.node&#xff09;&#xff0c;然后在.vue文件里import它&#xff0c;然后运行npm run electron:serve&#xff0c;报错如下: ​​ electron-Vue打包默认使用webpack&#xff0c;默认情况下webpack没…

Vue2.0项目搭建流程(一步一步教你如何初始化一个前端项目)

文章目录 1.环境准备2.项目初始化3.删除不必要的初始化文件 1.环境准备 1.winr在cmd终端界面输入node -v&#xff0c;检测node环境是否安装成功 2.cmd终端界面输入vue -V&#xff0c;检测前端脚手架vue/cli是否安装成功 没有显示则终端输入以下指令 //以下内容三选一 cnpm …

vue的elementUI的el-tree的选择

有一棵树型的数据,需要实现:在外部加一个 全选和不全选的按钮,去全部勾选树结构里面每一项的选框。 当点击勾选全选的时候,树的每一项都勾选; 当取消全选的时候,树的每一项都不勾选; 当选树的其中一项时,全选按钮是半选状态; 实现效果如下: <template><…

骨传导耳机哪个牌子好?精选5大品质上乘的尖货骨传导耳机推荐!

作为一名数码博主&#xff0c;我已有十余年的行业经历&#xff0c;其中&#xff0c;骨传导耳机作为近年来新兴的技术产品&#xff0c;凭借特殊的传声方式和佩戴方式吸引到了不少消费者&#xff0c;我也是亲自体验并评测了数十款。基于这些经验&#xff0c;我深感有必要提醒大家…

玩转Matlab-Simscape(初级)- 09 - 在Simulink中创建曲柄滑块机构的控制模型

** 玩转Matlab-Simscape&#xff08;初级&#xff09;- 09 - 在Simulink中创建曲柄滑块机构的控制模型 ** 目录 玩转Matlab-Simscape&#xff08;初级&#xff09;- 09 - 在Simulink中创建曲柄滑块机构的控制模型 前言一、问题描述二、创建模型2.1 识别机构中的刚体2.2 确定刚…

标准发布 | 反渗透和纳滤水处理膜修复再利用技术指南

一、编制单位 本文件由浙江大学、中华环保联合会水环境治理专业委员会提出。 本文件由中华环保联合会归口。 本文件主编单位&#xff1a;浙江大学、河南一膜环保技术有限公司、安徽精高水处理有限公司、国能龙源环保有限公司、湖南沁森高科新材料有限公司。 本文件参编单位&…

C++ | Leetcode C++题解之第119题杨辉三角II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> getRow(int rowIndex) {vector<int> row(rowIndex 1);row[0] 1;for (int i 1; i < rowIndex; i) {row[i] 1LL * row[i - 1] * (rowIndex - i 1) / i;}return row;} };

简搭云可视化大屏设计器:前端技术探索与实践

一、引言 随着数字化时代的到来&#xff0c;数据可视化已经成为企业决策和业务分析不可或缺的一部分。为了满足用户对于数据展示的直观性、便捷性和高效性需求&#xff0c;简搭云可视化大屏设计器应运而生。本文旨在探讨简搭云可视化大屏设计器的前端技术实现&#xff0c;并通…

店匠科技亮相VivaTech,新零售解决方案引关注

在中法建交60周年之际,两国关系持续发展并共同推动双方在人工智能和全球治理领域达成重要合作。同时,浙江-法国高新产业创新合作对接会在巴黎顺利举行,进一步促进了中法两国在高新技术领域的交流与合作。 紧跟此次访问的步伐,众多中国科技创新企业齐聚巴黎,于5月22日至25日在法…

计算机SCI期刊,中科院3区,专业性强,审稿专业

一、期刊名称 Frontiers in Neurorobotics 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;3.1 中科院分区&#xff1a;3区 三、期刊征稿范围 神经机器人前沿在体现自主系统的科学和技术及其应用方面发表了严格的同行评审…

笔记 | 软件工程01:从程序到软件

1 软件工程知识域 2 程序 2.1 何为程序及程序的质量要求 何为程序&#xff1a; 理解&#xff1a;软件工程可能就是在弥补OOP语言与自然语言之间还存在的鸿沟 2.1.1 程序质量的内在和外在体现 2.1.2 程序质量的语法和语义体现 2.2 编写代码的基本原则 2.3 程序质量保证方法 …

JAVA-学习

一、垃圾回收机制 1、为什么要进行垃圾回收机制 如果不进行垃圾回收&#xff0c;内存迟早都会被消耗空&#xff0c;因为我们在不断的分配内存空间而不进行回收。除非内存无限大&#xff0c;我们可以任性的分配而不回收&#xff0c;但是事实并非如此。所以&#xff0c;垃圾回收…

领夹麦克风什么牌子好?2024无线领夹麦克风十大品牌排行榜推荐

​如今&#xff0c;无线麦克风已逐渐渗透到我们日常生活的各个角落&#xff0c;无论是专业的自媒体创作者、带货主播&#xff0c;还是日常拍摄记录生活的我们&#xff0c;都可能用到它。在挑选无线麦克风时&#xff0c;收音降噪效果和性价比无疑是两大核心考量因素。为此&#…

学生问的一道CSS3媒体查询,实现响应式设计的题

目录 题目要求&#xff1a; 解题思路&#xff1a; 解题&#xff1a; 1&#xff09;大屏、3个DIV水平排列 2&#xff09;中屏、前2个DIV水平占一半&#xff0c;第三个另起一行&#xff0c;宽度占满 3&#xff09;小屏&#xff0c;3个DIV铺满&#xff0c;垂直排列 题目要求&…

106.从中序与后序遍历序列构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如&#xff0c;给出 中序遍历 inorder [9,3,15,20,7]后序遍历 postorder [9,15,7,20,3] 返回如下的二叉树&#xff1a; 思路&#xff1a; 后序遍历&#xff0c;最后一个元素一定是根…

市场凌乱,智能算法哪种效果好?

当我们在面对市场波动&#xff0c;个股震荡&#xff0c;无从下手的时候&#xff0c;不懂算法的朋友就只懂做t&#xff1b;懂算法的朋友这会儿就迷茫并不知道选择哪种智能算法交易&#xff1f;今天小编给大家整理一套性价比高的&#xff0c;适合个人投资者搞的算法交易&#xff…

成功的期货交易当然离不开自我调节!!!

期货交易的成功不仅仅取决于技术和市场分析&#xff0c;还取决于交易者的心理素质。市场波动和交易决策可能会导致交易者感到压力、恐惧、贪婪等情绪&#xff0c;这可能会影响其决策和行为。因此&#xff0c;交易者需要学会自我调节&#xff0c;以保持心态平稳和冷静&#xff0…

如何在Weblogic环境中启动认证方式对接Zabbix监控

在WebLogic Server中&#xff0c;启动认证可用于确保只有经过授权的用户和系统能够访问WebLogic Server及其应用程序&#xff0c;通过合理配置认证提供者和安全领域&#xff0c;管理员可以有效管理和控制用户访问。 本文将详细介绍如何在Weblogic环境中配置启动认证并对接Zabb…

Opencv Python图像处理笔记二:图像变换、卷积、形态学变换

文章目录 前言一、几何变换1.1 缩放1.2 平移1.3 旋转1.4 翻转1.5 仿射1.6 透视 二、低通滤波2.1 均值滤波2.2 高斯滤波2.3 中值滤波2.4 双边滤波2.5 自定义滤波 三、高通滤波3.1 Sobel3.2 Scharr3.3 Laplacian3.4 Canny 四、图像金字塔4.1 高斯金字塔4.2 拉普拉斯金字塔 五、形…