算法学习笔记——时间复杂度和空间复杂度

时间复杂度和空间复杂度

常数操作:

  • 固定时间的操作,执行时间和数据量无关

  • 位运算 > 算数运算 > 寻址 > 哈希运算,都是常数操作,哈希运算操作时间最慢

  • 链表的get(i)方法不是常数操作,因为链表不是连续的存储空间,靠着指针链接着,要靠头节点一个个的往下查,是一定要查找这么多个数的

  • 例如:

    int a=3, b=5相加的时间和int a=3000万,b=20亿相加的时间差不多

    寻址中拿到a[1007]和a[1007万]时间也是差不多,因为是靠偏移量来查找的

时间复杂度:

  • 一个和数据量有关、只要高阶项、不要低价项、不要常数项的操作次数的表达式
  • O(...)表示趋向那个级别的规模
  • 忽略常数项原因:当N->无穷时常数项已经不重要了,例如:y = x^2, y = k*x,无论K多大,最终x^2的曲线最终会超过k*N的直线
  • 忽略低价项的原因:影响整体级别的规模是高阶项
  • 选择排序,是(0~N-1),到(1~N-1),再到(2~N-1)等,所以是N+(N-1)+(N-2)+(N-3)+...+1,这是一个等差数列,首项是1,公差是1,因为只要高阶项,所以时间复杂度是O(n^2),冒泡排序也类似

等差数列求和公式:

S = n / 2 * (2 * a1 + (n - 1) * d)

其中,S是等差数列的和;n是项数;a1是首项;d是公差。

也可以认为任何等差数列的都符合:

a * n^2 + b * n + c,其中a、b、c都是常数

  • 严格固定流程的算法,一定要强调最差情况!比如插入排序
  • 算法流程上利用随机行为作为重要部分的,要看平均或者期望的时间复杂度,因为最差的时间复杂度无意义,比如:生成相邻值不同的数组,从[0~3]之间中随机出来,组成相邻值不同的数组,单次随机为O(1),最差情况为O(无穷)当数组第一个数是1,后面一直随机出来是1那就无法形成符合要求的数组,则获取出来的时间复杂度无意义。这期望的时间复杂度是O(n)。、
  • 时间复杂度的内涵:描述算法运行时间和数据量大小的关系,而且当数据量很大很大时,这种关系相当的本质,并且排除了低价项、常数时间的干扰

空间复杂度:

  • 强调额外空间;常数项时间,放弃理论分析、选择用实验来确定,因为不同常数操作的时间不同
  • 与入参和出参的空间无关,比如:通过设计一个算法完成这个功能,如果没有申请额外的空间去进行操作,则空间复杂度为O(1),如果申请了一个长度为N的辅助数组,则则空间复杂度为O(N)

最优解:

  • 先满足时间复杂度最优,然后尽量少用空间的解

时间复杂度的均摊:

  • 涉及动态数组,先申请一个固定大小的数组,当数组不够用时,再申请一个相应倍数的数组,把旧数组中的值拷贝到旧数组中,一共加入了N个数总代价,单次调用是O(1)
    在这里插入图片描述

  • 因为一次扩容后可能很久不会再扩容了,每次都计算整体的复杂度太麻烦就把每次扩容能分摊到的时间复杂度进行计算,看整个过程调用了多少次来估计整体的时间复杂度

  • 把每一个单次操作理解为常数操作,就可以好估计这个函数的时间复杂度

  • 并查集、单调队列、单调栈、哈希表等结构,均有这个概念

分析复杂度常见的错误:

  • 不要用代码结构来判断时间复杂度,通过两个for循环嵌套就说是时间复杂度是O(N^2)是错误的

  • 比如只有一个while的循环的冒泡排序,其实时间复杂度是O(N^2)

    // 只用一个循环完成冒泡排序
    // 但这是时间复杂度O(N^2)的!
    public static void bubbleSort(int[] arr){
        if (arr == null || arr.length < 2) {
            return;
        }
        int n = arr.length;
        int end = n - , i = 0;
        while (end > 0) {
            if (arr[i] > arr[i + 1]) {
                swap(arr, i, i + 1);
            }
            if (i < end - 1){
                i++;
            } else{
                end--;
                i = 0;
            }
        }
    }
    // 数字中交换i和j位置的数
    public static void swap(int[] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    
  • 比如:N/1 + N/2 + N/3 + ... + N/N,这个流程的时间复杂度是O(N * logN),著名的调和级数

    for (int i = 1; i <= N; i++) {
        for (int j = i; j <= N; j += i) {
            // 这两个嵌套for循环的流程,时间复杂度为O(N * logN)
            // 1/1 + 1/2 + 1/3 + 1/4 + 1/5 + ... + 1/n,也叫“调和级数”,收敛于O(logN)
            // 所以如果一个流程的表达式:n/1 + n/2 + n/3 + ... n/n
            // 那么这个流程时间复杂度O(N * logN)
        }
    }
    

    在这里插入图片描述

  • 时间复杂度只能是对算法流程充分理解才能分析出来,而不是简单的看代码结构!这个是一个常见的错误!甚至有些算法的实现用了多层循环嵌套,但时间复杂度是O(N)

常见复杂度一览:

  • O(1) O(logN) O(N) O(N*logN) O(N^2) ... O(N^K) O(2^N) ... O(K^N) ... O(N!)
  • 时间复杂度非常重要,可以直接判断某个方法能不能通过一个题目,根据数据量猜解法。

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

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

相关文章

idea如何根据路径快速在项目中快速打卡该页面

在idea项目中使用快捷键shift根据路径快速找到该文件并打卡 双击shift(连续按两下shift) -粘贴文件路径-鼠标左键点击选中跳转的路径 自动进入该路径页面 例如&#xff1a;我的实例路径为src/views/user/govType.vue 输入src/views/user/govType或加vue后缀src/views/user/go…

实验八、地址解析协议《计算机网络》

水逆退散&#xff0c;学业进步&#xff0c;祝我们都好&#xff0c;不止在夏天。 目录 一、实验目的 二、实验内容 &#xff08;1&#xff09;预备知识 &#xff08;2&#xff09;实验步骤 三、实验小结 一、实验目的 完成本练习之后&#xff0c;您应该能够确定给定 IP 地…

机器学习多场景实战

机器学习已不再局限于理论探讨&#xff0c;而是广泛渗透到我们生活的方方面面&#xff0c;成为解决复杂问题、优化决策过程的强有力工具。从智能推荐系统个性化推送你可能喜爱的电影和商品&#xff0c;到金融风控领域精准识别欺诈交易&#xff1b;每一个应用场景都是机器学习技…

15 - 有趣的电影(高频 SQL 50 题基础版)

15 - 有趣的电影 select* from cinema wheredescription!boring and id%2!0 order by rating desc;

医用腕带朔源用的条形码与二维码如何选择

在医疗环境中的医用腕带作为患者身份识别和管理的重要工具&#xff0c;做为条形码和二维码腕带上的溯源技术&#xff0c;更是为患者信息快速获取、准确传递的保障&#xff0c;实现更加高效和准确的患者身份识别和管理&#xff0c;这种技术可以大大提高医疗服务的效率和质量&…

v1.2.70-FastJson的AutoType机制研究

v1.2.70-FastJson的AutoType机制研究 最近在对接Alexa亚马逊语音技能&#xff0c;Smart Home Skill Apis时&#xff0c;有一个配置的JSON字符串是这样的&#xff1a; { "capabilityResources": {"friendlyNames": [{"type": "asset",…

如何组织基于Sqlalchemy的项目

在使用 SQLAlchemy 构建项目时&#xff0c;可以遵循一些常用的组织结构和最佳实践&#xff0c;以确保项目清晰、易于维护。下面就是我在构建项目时遇到的一些问题&#xff0c;并做了详细的记录&#xff0c;为了方便大家学习少走一些弯路。 1、问题背景 在基于Sqlalchemy的项目…

python 内置map()函数(高效处理序列数据方法,将函数应用于一个序列的每个元素)(懒加载)

文章目录 深入解析 Python 内置函数 map()函数定义与用法基本示例 map() 与列表推导式比较&#xff08;列表推导式在语法上更加简洁&#xff0c; map() 在某些情况下执行效率更高&#xff09;示例&#xff1a;将数字转化为字符串 map() 结合 lambda 函数使用多个序列结论 深入解…

边缘计算网关助力自动洗车机实现远程状态监测与即时报警

随着城市化进程的加快和人们生活水平的提高&#xff0c;自动洗车机作为一种高效、便捷的洗车设备&#xff0c;在市场上的需求日益增长。然而&#xff0c;自动洗车机作为一种高价值的自动化设备&#xff0c;其运行状态和安全性直接关系到洗车质量和顾客体验&#xff0c;因此对自…

SL4010 40V耐压 300W大功率升压IC 12V5A大功率UPS电源专用

在当今这个信息高速发展的时代&#xff0c;电力稳定已成为企业运营和个人生活的核心需求。UPS&#xff08;不间断电源&#xff09;作为电力的守护者&#xff0c;其性能和质量直接关系到我们的工作和生活能否顺畅进行。今天&#xff0c;我们为您推荐一款高性能的UPS应急电源芯片…

RPC框架原理(一)

RPC框架原理 网络和IO的关系&#xff0c;IO&#xff08;input和output&#xff09;面向的是谁&#xff1f;OSI 7层参考模型&#xff0c;TCP/IP协议为什么会出现一个会话层三次握手socket心跳keep alive四次挥手 网络IO&#xff08;IO模型&#xff09; IO框架底层 学习顺序&…

k8s学习--sessionAffinity会话保持(又称会话粘滞)详细解释与应用

文章目录 sessionAffinity简介什么是sessionAffinity模式介绍应用场景工作原理优势 应用环境步骤2. 给服务打补丁&#xff0c;增加会话粘滞 设置回sessionAffinity为None sessionAffinity简介 什么是sessionAffinity 简单理解 确保把来自同一客户的一个完整会话的请求转发至后…

喜讯丨泰迪智能科技实力中标“健康大数据与人工智能实验室建设”项目

泰迪智能科技以健康数据分析与应用为主题的实验中心&#xff0c;为学校大健康产业大数据与人工智能应用人才培养提供载体&#xff0c;并基于培养中心根据学生专业的不同&#xff0c;提供不同的健康大数据学习资源&#xff0c;实现健康大数据技术和数据分析应用能力培养普遍提升…

深入理解计算机系统 家庭作业5.13

A:关键路径在xmm0那条路,书中几条关键路径全部是xmm0,有xmm1时,xmm1也是 B:3 C:1 D:按书中的定义: 关键路径才是下界!按书上的方法根据 图5-12 算出关键路径的CPE即可. 非关键路径把它视为黑盒子.因为是乱序和超标量的,没办法搞清楚处理器具体怎么处理这些指令.

c# 开发的wpf程序闪退,无法用try catch捕获异常

之前开发的一个程序是c#wpf开发&#xff0c;基于.net framework 4.6.1的&#xff0c;一切都是正常的&#xff0c;但是在我重新装了win11后在程序logo出现后直接闪退&#xff0c;报错 返回值为 -1073740791 (0xc0000409)&#xff0c;而且定位到代码时发现是&#xff0c; publi…

LabVIEW2017破解安装教程

LabVIEW2017破解安装教程&#xff1a; 1、新版LabVIEW2017分为32位和64位两个平台&#xff0c;多种语言版本(需要LabVIEW2017中文版的朋友请选择WinChn版本)&#xff0c;大家选择自行选择符合系统的版本下载并解压 2、本次安装以Win 7 64位系统为例&#xff0c;运行“2017LV-64…

accelerate 笔记:梯度同步的时间效率

1 介绍 PyTorch 的分布式模块通过在系统中所有GPU之间进行来回通信来操作。 这种通信需要时间&#xff0c;并且确保所有进程了解彼此的状态在使用ddp模块时会在特定的触发点发生 这些触发点被添加到PyTorch模型中&#xff0c;特别是它们的 forward() 和 backward() 方法中当通…

宝德电脑文件删除了怎么恢复?提供详细恢复指南

在数字化时代&#xff0c;电脑已成为我们工作、学习和生活中不可或缺的设备。然而&#xff0c;在使用宝德电脑或其他任何品牌的电脑时&#xff0c;我们都有可能遭遇文件误删的尴尬情况。一旦重要文件丢失&#xff0c;不仅会影响我们的工作效率&#xff0c;还可能造成无法挽回的…

打开C# 大门:Hallo, World!

C# 介绍 C#&#xff08;C Sharp&#xff09;是一种面向对象的编程语言&#xff0c;由微软公司开发。它是 .NET Framework 的一部分&#xff0c;用于构建 Windows 应用程序、Web 应用程序、移动应用程序等。C# 语言的设计目标是简单、现代化、易于学习和使用。在本文中&#xf…

26、matlab多项式曲线拟合:polyfit ()函数

1、polyfit 多项式曲线拟合 语法 语法&#xff1a;p polyfit(x,y,n) 返回次数为 n 的多项式 p(x) 的系数&#xff0c;该阶数是 y 中数据的最佳拟合&#xff08;基于最小二乘指标&#xff09;。 语法&#xff1a;[p,S] polyfit(x,y,n) 还返回一个结构体 S 语法&#xff1a;[…