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

时间复杂度和空间复杂度

常数操作:

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

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

  • 链表的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!)
  • 时间复杂度非常重要,可以直接判断某个方法能不能通过一个题目,根据数据量猜解法。

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

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

相关文章

颠沛流离学二叉树(完结撒花篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

MT2083 屠龙勇者

思路&#xff1a; 跟上题类似&#xff0c;贪心策略&#xff1a;w从小到大排序&#xff0c;每个头找到第一个>d的w 代码&#xff1a; #include <bits/stdc.h> using namespace std; #define ll long long const int N 1e5 10; int n, m; int d[N]; int w[N]; int …

Spring Security 注册过滤器关键点与最佳实践

在 Spring Security 框架中&#xff0c;注册过滤器是实现身份验证和授权的关键组件。正确配置和使用注册过滤器对于确保应用程序的安全性至关重要。以下是一些关于 Spring Security 注册过滤器的注意事项和最佳实践。 过滤器链顺序&#xff1a; 注册过滤器通常位于过滤器链的末…

[next.js]pwa缓存

配置Next.js (v14 App Router模式) 使其支持PWA缓存&#xff0c;配置server worker和mainfest.json&#xff0c;让项目支持离线访问和可安装。 安装依赖next-pwa npm i next-pwa配置next.config.js const path require(path);const withPWAInit require(next-pwa);// 判断…

想要成长就要持续地学习,而如何学习更有效率呢

为什么很多人学了知识&#xff0c;但是总感觉记不住&#xff0c;用不上呢&#xff1f; 在学习的过程中&#xff0c;为什么总感觉没什么进步呢&#xff1f; 看了很多书&#xff0c;为什么总感觉没什么用呢&#xff1f; 要说明这些问题&#xff0c;首先我们要知道一个好的、完整的…

Chrome跳转新的标签页自动打开控制台设置方法

Chrome跳转新的标签页自动打开控制台设置方法 文章目录 Chrome跳转新的标签页自动打开控制台设置方法1. 首先打开控制台2. 点击设置3. 选择Preferences -> Global -> 选中 Auto-open DevTools for popups4. 回到控制台勾选 preserve log保留日志![请添加图片描述](https:…

图像背景去除工具:removebg

文章目录 简介面向不同用户价格 简介 removebg&#xff0c;就是remove background&#xff0c;是一款智能图片背景去除工具。 在免费使用时&#xff0c;用到的是本地的CPU。我第一次试用时&#xff0c;图片刚上传之后&#xff0c;电脑的帧率便直线下降&#xff0c;鼠标都拖不…

硬件26、EDA绘制板框

1、放置-板框-矩形 2、在pcb上绘制出需要大小的板框 3、设置板框四个角为圆弧状&#xff0c;在右侧属性栏设置圆角半径

计算机网络—交换机综合实验

一、实验内容 交换机基本配置设置虚拟局域网VLAN跨交换机实现VLAN2台交换机间用2条链路连接&#xff0c;实现2条链路聚合 二、实验环境 Cisco Packet Tracer 三、实验拓扑 1、 设置虚拟局域网VLAN 2、跨交换机实现VLAN 3、2台交换机间用2条链路连接&#xff0c;实现2条链…

像图一样交流:为大语言模型编码图

译者 | 高永祺 单位 | 东北大学自然语言处理实验室 原文链接&#xff1a;https://blog.research.google/2024/03/talk-like-graph-encoding-graphs-for.html 1.作者介绍 Bahare Fatemi&#xff0c;谷歌蒙特利尔研究部门的研究科学家&#xff0c;专门从事图表示学习和自然语言…

智能推荐算法应用:如何提升淘宝在线扭蛋机用户购物体验

在淘宝的在线扭蛋机平台上&#xff0c;用户的购物体验至关重要。为了提升这一体验&#xff0c;我们引入了智能推荐算法&#xff0c;帮助用户发现他们可能感兴趣的扭蛋产品。这一技术的应用不仅提高了用户的购物效率&#xff0c;还大大增强了用户的购物乐趣。 一、智能推荐算法…

做抖音小店卖什么最赚钱?精准锁定爆款的技巧!新手商家必看

哈喽~我是电商月月 做抖音小店的核心就是选品&#xff0c;商品好&#xff0c;出单的几率就多&#xff0c;那么怎么选中一个好的商品&#xff0c;就是每个商家必须细琢的一个技巧&#xff01; 为了解答这个疑惑&#xff0c;今天月月就给大家介绍几个赚钱的类别&#xff0c;并教…

semaphore | 使用web界面的ansible来批量运维 linux、windows主机

Ansible 的现代化 UI &#xff0c;可以轻松管理和运行 Ansible playbook&#xff0c;功能强大&#xff0c;操作简单&#xff0c;支持中文。 文章目录 一、系统功能说明二、系统安装2.1 直接安装2.2 docker 安装 三、系统使用3.1 建立存储库3.2 编写代码3.3 建立主机配置3.3 建立…

南卡、韶音、Cleer、漫步者开放式耳机好用吗?最强开放式耳机对比揭秘!

在挑选开放式耳机时&#xff0c;个人经验和实际需求应当优先考虑&#xff0c;而非盲目追随潮流或品牌效应。投资耳机前务必慎重&#xff0c;毕竟高价值商品若无法退换&#xff0c;难免造成遗憾。为了帮助大家做出更加明智的决策&#xff0c;我亲自出资购买并测试了市面上多款主…

重生奇迹mu魔剑士

1、魔剑士低端装备-SF10(升级)亚特传说等S-S(PK)亚特奔雷魔神等。评价:优越的极品双属卓越,极其高的性价比,造福穷人玩家的装。 2、中端装备(只适合力魔剑士)-SF10S-S天魔斗神评价&#xff1a;与低级亚特等一样不过由于成本,装备PVP属性等原因,价钱稍贵点。 3、中端套装(只适合…

【阿里前端面试题】聊聊前端性能优化的方案,解决过什么样的性能问题?

大家好&#xff0c;我是“寻找DX3906”。每天进步一点。日积月累&#xff0c;有朝一日定会厚积薄发&#xff01; 前言&#xff1a; 前面已经和大家分享了4篇面试题&#xff1a; 《【阿里前端面试题】浏览器的加载渲染过程》 《【阿里前端面试题】客户端和服务器交互&#xff…

IO流----字节流

字节流 字节流&#xff1a;操作&#xff1a;文件字节输入输出流 &#xff1a;写入数据&#xff1a;读取数据&#xff1a;文件拷贝&#xff1a; 带缓冲区的字节输入输出流&#xff1a;拷贝文件&#xff1a;写入数据&#xff1a;读取数据: 深入 带缓冲区的字节输出流 &#xff1a…

【论文阅读】Point2RBox (CVPR’2024)

paper:https://arxiv.org/abs/2311.14758 code:https://github.com/yuyi1005/point2rbox-mmrotate

阿里云sls 采集日志安装记录

参考阿里云给的安装文档 阿里云安装Logtail组件 注意这里&#xff0c;选择地域&#xff0c;是中国地域选中国&#xff0c;海外选海外即可 按照文档继续下去 修改配置文件./alibaba-cloud-log-all/values.yaml 所有的操作完成后&#xff0c;去控制台配置 以上操作的前提是…

[WWW2024]轻量数据依赖的异常检测重训练方法LARA

开篇 近日&#xff0c;由阿里云计算平台大数据基础工程技术团队主导&#xff0c;与浙江大学合作的论文《LARA: ALight and Anti-overfitting Retraining Approach for Unsupervised Time Series Anomaly Detection 》被WWW2024收录&#xff0c;该方法解决了云服务正常模式随时…