【学习笔记】算法学习01:复杂度分析

news/发布时间2024/5/18 12:16:40

学习地址Hello算法:https://www.hello-algo.com/

文章目录

  • 一、复杂度分析
    • 1.1 时间复杂度
      • 1.1.1 时间复杂度分析有哪些特点?
      • 1.1.2 计算方法:
      • 1.1.3 常见类型的时间复杂度:
      • 1.1.4 最差、最佳、平均时间复杂度
    • 1.2 空间复杂度
      • 1.2.1 算法相关空间
      • 1.2.2 推算方法
      • 1.2.3 常见的类型

一、复杂度分析

1.1 时间复杂度

时间复杂度分析统计的不是算法运行时间,而是算法运行时间随着数据量变大时的增长趋势

1.1.1 时间复杂度分析有哪些特点?

  • 时间复杂度能够有效评估算法效率。输入的数据越大,时间复杂度更优的算法,效率更高。
  • 时间复杂度的推算方法更简便。可以简单地将所有计算操作的执行时间视为相同的“单位时间”,从而将“计算操作运行时间统计”简化为“计算操作数量统计”
  • 时间复杂度也存在一定的局限性。时间复杂度不能等同于实际运行时间差别很大,在实际情况下,我们很难仅凭时间复杂度判断算法效率的高低。尽管存在上述问题,复杂度分析仍然是评判算法效率最有效且常用的方法。

1.1.2 计算方法:

  • 第一步:统计操作数量——操作数量 T(n) 中的各种系数、常数项都可以忽略循环嵌套时使用乘法

  • 第二步:判断渐近上界——时间复杂度由 T(n) 中最高阶的项来决定。这是因为在 n 趋于无穷大时,最高阶的项将发挥主导作用,其他项的影响都可以忽略。

    image-20240221103732655

    函数渐近上界

    函数的渐近上界

1.1.3 常见类型的时间复杂度:

  1. 即使操作数量 size 可能很大,操作数量与输入数据大小 n 无关,时间复杂度仍为 常数阶O(1)
  2. 操作数量相对于输入数据大小 n 以线性级别增长 线性阶 O(n);比如遍历数组和遍历链表等操作
  3. O(n2) 平方阶通常出现在嵌套循环中。比如冒泡
  4. 生物学的“细胞分裂”是指数阶增长的典型例子,时间复杂度为 指数阶O(2n) 。对于数据规模较大的问题,指数阶是不可接受的,通常需要使用动态规划或贪心算法等来解决。
  5. 与指数阶相反,对数阶反映了“每轮缩减到一半”的情况。时间复杂度为 O(log2⁡n) ,简记为 O(log⁡n)

image-20240221103815310

常见的时间复杂度类型

1.1.4 最差、最佳、平均时间复杂度

算法的时间效率往往不是固定的,而是与输入数据的分布有关。同样的一个算法会根据输入的数据不同,而体现不同的运算效率。

  • 输入最适合的数据时,达到最佳时间复杂度 Ω(1)
  • 输入的数据最差时,达到最差时间复杂度 O(n)

值得说明的是,我们在实际中很少使用最佳时间复杂度,因为通常只有在很小概率下才能达到,可能会带来一定的误导性。而最差时间复杂度更为实用,因为它给出了一个效率安全值,让我们可以放心地使用算法。

相比之下,平均时间复杂度可以体现算法在随机输入数据下的运行效率,用 Θ 记号来表示。

但对于较为复杂的算法,计算平均时间复杂度往往比较困难,因为很难分析出在数据分布下的整体数学期望。在这种情况下,我们通常使用最差时间复杂度作为算法效率的评判标准


1.2 空间复杂度

1.2.1 算法相关空间

  • 输入空间:用于存储算法的输入数据。
  • 暂存空间:用于存储算法在运行过程中的变量、对象、函数上下文等数据。
    • 暂存数据:用于保存算法运行过程中的各种常量、变量、对象等。
    • 栈帧空间:用于保存调用函数的上下文数据。系统在每次调用函数时都会在栈顶部创建一个栈帧,函数返回后,栈帧空间会被释放。
    • 指令空间:用于保存编译后的程序指令,在实际统计中通常忽略不计。
  • 输出空间:用于存储算法的输出数据。
/* 类 */
class Node {int val;Node next;Node(int x) { val = x; }
}/* 函数 */
int function() {// 执行某些操作...return 0;
}int algorithm(int n) {        // 输入数据final int a = 0;          // 暂存数据(常量)int b = 0;                // 暂存数据(变量)Node node = new Node(0);  // 暂存数据(对象)int c = function();       // 栈帧空间(调用函数)return a + b + c;         // 输出数据
}

一般情况下,空间复杂度的统计范围是“暂存空间”加上“输出空间”。所以在分析一段程序的空间复杂度时,我们通常统计暂存数据、栈帧空间和输出数据三部分

image-20240221104324312

1.2.2 推算方法

空间复杂度的推算方法与时间复杂度大致相同,只需将统计对象从“操作数量”转为“使用空间大小”。

而与时间复杂度不同的是,我们通常只关注最差空间复杂度。“最差”有两层含义。

  • 以最差输入数据为准
  • 以算法运行中的峰值内存为准

在递归函数中,需要注意统计栈帧空间

  • 循环loop()的时间复杂度为 O(n) ,空间复杂度 O(1)
  • 递归函数 recur() 虽然时间复杂度为 O(n) ,但在运行过程中会同时存在 n 个未返回的 结果recur() ,从而占用 O(n) 的栈帧空间。

1.2.3 常见的类型

  1. 常量、变量、对象占用 O(1) 空间
  2. 循环中的变量和函数占用 O(1) 空间
  3. 递归中的变量和函数占用 O(n) 空间
  4. 长度为 n 的数组/列表/哈希表占用 O(n) 空间
  5. 矩阵、二维列表占用 O(n2) 空间
  6. 层数为 n 的“满二叉树”的节点数量为 2n−1 ,占用 O(2n) 空间:
  7. 常用于分治算法,占用O(log⁡n) 的栈帧空间,

image-20240221110041530

常见的空间复杂度类型

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

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

相关文章

用HTML和CSS打造跨年烟花秀视觉盛宴

目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>跨年烟花秀</title><meta name"viewport" content"widthdevi…

【JavaEE】_form表单构造HTTP请求

目录 1. form表单的格式 1.1 form表单的常用属性 1.2 form表单的常用搭配标签&#xff1a;input 2. form表单构造GET请求实例 3. form表单构造POST请求实例 4. form表单构造法的缺陷 对于客户端浏览器&#xff0c;以下操作即构造了HTTP请求&#xff1a; 1. 直接在浏览器…

腾讯云宝塔Linux安装Mysql5.7

一、下载官方mysql包 wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm二、安装mysql包 rpm -ivh mysql-community-release-el7-5.noarch.rpm三、安装mysql yum install mysql-community-server -y四、启动数据库 systemctl start mysqld.service…

JDBC简介

JDBC体系结构 Java Data Base Connectivity&#xff08;JDBC&#xff09;&#xff0c;Java数据库连接。 JDBC重要的类和接口 JDBC API 定义了一组用于与数据库进行通信的接口和类&#xff0c;这些接口和类都定义在Java.sql包中。 类或接口作用DriverManager处理驱动程序的加…

el-table同时固定左列和右列时,出现错误情况

最近遇到一个问题,就是需求是要求表格同时固定序号列和操作列,我们用的是饿了么组件库的el-table,如下图,出现了错误情况: 解决方法就是使用doLayout方法: 如果使用了keep-alive,可以在activated里执行doLayout方法: activated() {this.$nextTick(() => {this.$ref…

Jmeter接口测试+压力测试

Jmeter-http接口脚本 一般分五个步骤:&#xff08;1&#xff09;添加线程组 &#xff08;2&#xff09;添加http请求 &#xff08;3&#xff09;在http请求中写入接入url、路径、请求方式和参数 &#xff08;4&#xff09;添加查看结果树 &#xff08;5&#xff09;调用接口、…

【ChatIE】论文解读:Zero-Shot Information Extraction via Chatting with ChatGPT

文章目录 介绍ChatIEEntity-Relation Triple Extration (RE)Named Entity Recognition (NER)Event Extraction (EE) 实验结果结论 论文&#xff1a;Zero-Shot Information Extraction via Chatting with ChatGPT 作者&#xff1a;Xiang Wei, Xingyu Cui, Ning Cheng, Xiaobin W…

MySQL-----多表操作

介绍 实际开发中&#xff0c;一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系&#xff0c;接下来我们将在单表的基础上&#xff0c;一起学习多表方面的知识。 一 多…

深入解析SDRAM:从工作原理到实际应用

深入解析SDRAM&#xff1a;从工作原理到实际应用 在众多内存技术中&#xff0c;同步动态随机访问存储器&#xff08;SDRAM&#xff09;因其出色的性能和广泛的应用而备受关注。本文将从SDRAM的工作原理入手&#xff0c;探讨其性能优化策略和在现代电子设备中的应用。 SDRAM工作…

linux上安装bluesky的步骤

1、设备上安装的操作系统如下&#xff1a; orangepiorangepi5b:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.2 LTS Release: 22.04 Codename: jammy 2、在用户家目录下创建一个目录miniconda3目录&a…

MATLAB 导出可编辑的eps格式图像

任务描述&#xff1a;部分期刊要求提交可编辑的eps格式图像&#xff0c;方便美工编辑对图像进行美化 我试了直接print或者在figure窗口导出&#xff0c;发现导出的文件放到Adobe AI中并不能编辑&#xff0c;经Google找到解决办法&#xff1a; %EPS exportgraphics(gcf,myVect…

【书生·浦语大模型实战营】第6节:OpenCompass 大模型评测(笔记版)

OpenCompass 大模型评测 1.关于评测的三个问题 为什么需要评测&#xff1a;模型选型、能力提升、应用场景效果测评。测什么&#xff1a;知识、推理、语言&#xff1b;长文本、智能体、多轮对话、情感、认知、价值观。怎样测&#xff1a;自动化客观测评、人机交互测评、基于大…

Day31文件IO

文章目录 1.什么是文件IO1.1 概念1.2 特点1.3 操作 2.函数接口2.1 打开文件 open()2.2 关闭文件2.3 读写文件2.3.1 读文件2.3.2 写文件 2.4 文件的定位操作 标准IO和文件IO总结 1.什么是文件IO 1.1 概念 又称系统IO&#xff0c;是系统调用&#xff0c;是操作系统提供的接口函…

【漏洞复现】大华智慧园区综合管理平台信息泄露漏洞

Nx01 产品简介 大华智慧园区综合管理平台是一款综合管理平台&#xff0c;具备园区运营、资源调配和智能服务等功能。该平台旨在协助优化园区资源分配&#xff0c;满足多元化的管理需求&#xff0c;同时通过提供智能服务&#xff0c;增强使用体验。 Nx02 漏洞描述 大华智慧园区…

typescript 索引签名类型

ts索引类型简介 在TypeScript中&#xff0c;索引签名类型&#xff08;Index Signature Type&#xff09;是一种特殊的类型&#xff0c;它定义了对象中键的类型以及相应的值的类型。通过使用索引签名类型&#xff0c;我们可以表示一个对象&#xff0c;该对象的键可以是任意类型…

数据结构--红黑树详解

什么是红黑树 红黑树(Red Black Tree)是一种自平衡二叉查找树。它是在 1972 年由 Rudolf Bayer 发明的,当时被称为平衡二叉 B 树(symmetric binary B-trees)。后来,在 1978 年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。 由于其自平衡的特性,保证…

记一次 .NET某列控连锁系统 崩溃分析

一&#xff1a;背景 1. 讲故事 过年喝了不少酒&#xff0c;脑子不灵光了&#xff0c;停了将近一个月没写博客&#xff0c;今天就当新年开工写一篇吧。 去年年初有位朋友找到我&#xff0c;说他们的系统会偶发性崩溃&#xff0c;在网上也发了不少帖子求助&#xff0c;没找到自…

【regex】正则表达式

集合 [0-9.] [0-9.\-] 例子 正则表达式&#xff0c;按照规则写&#xff0c;写的时候应该不算困难&#xff0c;但是可读性差 不同语言中regex会有微小的差异 vim 需要转义&#xff0c; perl/python中不需要转义 锚位 \b am\b i am 命名 / 命名捕获组 ( 捕获组&#xff08;…

Commonjs 和 Es Module详解

一 前言 今天我们来深度分析一下 Commonjs 和 Es Module&#xff0c;希望通过本文的学习&#xff0c;能够让大家彻底明白 Commonjs 和 Es Module 原理&#xff0c;能够一次性搞定面试中遇到的大部分有关 Commonjs 和 Es Module 的问题。 带上疑问开始今天的分析&#xff1a; …

PyTorch深度学习实战(37)——CycleGAN详解与实现

PyTorch深度学习实战&#xff08;37&#xff09;——CycleGAN详解与实现 0. 前言1. CycleGAN 基本原理2. CycleGAN 模型分析3. 实现 CycleGAN小结系列链接 0. 前言 CycleGAN 是一种用于图像转换的生成对抗网络(Generative Adversarial Network, GAN)&#xff0c;可以在不需要配…
推荐文章