03|复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

目录

 

为什么需要复杂度分析?

大 O 复杂度表示法

时间复杂度分析

几种常见时间复杂度

空间复杂度分析


为什么需要复杂度分析?

事后统计法:代码跑一遍,通过统计、监控,就能得到算法执行的时间和占用的内存大小。这种统计方法有非常大的局限性。

  1. 测试结果非常依赖测试环境
  2. 测试结果受数据规模的影响很大

因此,我们需要一个不用具体的测试数据来测试,就可以粗略地估计算法的执行效率的方法。

大 O 复杂度表示法

T(n)表示算法的执行时间,n表示数据规模的大小,f(n)表示每行代码执行的次数总和。公式中的 O,表示代码的执行时间 T(n) 与 f(n) 表达式成正比。

大 O 时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度。

时间复杂度分析

如何分析一段代码的时间复杂度?有三个比较实用的方法

  1. 关注循环次数最多的一段代码
  2. 加法法则:总复杂度等于量级最大的那段代码的复杂度
  3. 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

几种常见时间复杂度

1.、O(1):一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1)。

2、O(logn)、O(nlogn)对数阶时间复杂度非常常见,同时也是最难分析的一种时间复杂度。我通过一个例子来说明一下。

3、O(m+n)、O(m*n):代码的复杂度由两个数据的规模来决定

空间复杂度分析

空间复杂度全称就是渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系

我们常见的空间复杂度就是 O(1)、O(n)、O(n2 ),像 O(logn)、O(nlogn) 这样的对数阶复杂度平时都用不到。而且,空间复杂度分析比时间复杂度分析要简单很多。所以,对于空间复杂度,掌握刚我说的这些内容已经足够了。

 

 

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

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

相关文章

前端学习(1716):前端系列javascript之页面配置下

page.vue {"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages{"path" : "pages/test-page/test-page","style" : {"navigationBarTitleText":"t…

04 | 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度

// n表示数组array的长度 int find(int[] array, int n, int x) {int i 0;int pos -1;for (; i < n; i) {if (array[i] x) {pos i;break;}}return pos; } 这段代码的时间复杂度还是 O(n) 吗&#xff1f;如果数组中第一个元素正好是要查找的变量 x&#xff0c;那就不需要…

Atitit.java swing打印功能 api  attilax总结

Atitit.java swing打印功能 api attilax总结 1. 打印方式有三种&#xff1a;2 1.1. 一是不经过任何修改&#xff0c;直接调用javascript中的window.print()打印。2 1.2. 二根据客户要求的报表格式&#xff0c;编写相应格式的html&#xff0c;装载数据打印&#xff0c;同样调用…

git clone 速度过慢

由于公司内网限制&#xff0c;通过git clone mybatis的源码时速度贼慢 原来的方式&#xff1a;git clone ​​​​​​​https://github.com/mybatis/mybatis-3.git 超级慢——失败 改进方式&#xff1a;git clone https://github.com.cnpmjs.org/mybatis/mybatis-3.git 贼快…

2016/1/4 学习笔记 数据类型转换 注释 语句

⑤ 数据类型转换 自动转换&#xff1a; 一般在算术运算过程中进行自 动转换为数字类型比较大的类型 由低级到高级转换 强制转换&#xff1a;又叫做显示转换。 1&#xff0c;从高精…

前端学习(1718):前端系列javascript之生命周期上

<script>export default {onLaunch: function() {console.log(App Launch)//登录//用户信息//存储},onShow: function() {console.log(App Show)//时间戳//计算用胡得使用时间},onHide: function() {console.log(App Hide)//应用进入后台所作得得事情},onError(e){consol…

05 | 数组:为什么很多编程语言中数组都从0开始编号?

什么是数组&#xff1f; 数组&#xff08;Array&#xff09;是一种线性表数据结构。它用一组连续的内存空间&#xff0c;来存储一组具有相同类型的数据。 线性表存储结构连续内存空间存储相同类型数据 优点&#xff1a;连续内存相同类型数据数组可以实现随机访问 缺点&#…

远离你身边消极爱抱怨的人!!

跟着苍蝇你會找到厕所&#xff0c; 跟着蜜蜂你會找到花朵&#xff0c; 跟着千万赚百万&#xff0c; 跟着乞丐会要饭. 现实生活中&#xff0c; 你和谁在一起的确很重要&#xff0c; 甚至能改变你的成长轨迹&#xff0c; 决定你的人生成败。 和什么样的人在一起&#xff0c; 就会…

前端学习(1720):前端系列javascript之生命周期下

page2.vue <template><view>这是page2<button type"primary" click"open">点击跳转</button></view> </template><script>export default {data() {return {}},onLoad() {console.log(page onload2)},//页面渲…

LeetCode训练

缺失的正整数 /*** 0&#xff5e;n-1中缺失的数字*/ public class MissingNum {public int missingNumber(int[] nums) {int i 0;int j nums.length - 1;while (i < j) {int m i ((j - i) >> 2);if (nums[m] m) i m 1;else j m - 1;}return nums[i] i ? nu…

C#线程学习

齐全线程学习转载于:https://www.cnblogs.com/AiYaTou/p/5110712.html

06 | 链表(上):如何实现LRU缓存淘汰算法?

缓存 作用 缓存是一种提高数据读取性能的技术&#xff0c;在硬件设计、软件开发中都有着非常广泛的应用&#xff0c;比如常见的 CPU 缓存、数据库缓存、浏览器缓存等等。 淘汰策略 常见的策略有三种&#xff1a;先进先出策略 FIFO&#xff08;First In&#xff0c;First Ou…

C++处理一个动态规划的问题

嗯哼&#xff0c;别人问的问题&#xff0c;看的我也头晕&#xff0c;百度了一下动态规划&#xff0c;看了看才想起来该怎么做&#xff0c;今天写了写代码&#xff0c;实现了~ 要求是递归&#xff0c;动态规划&#xff0c;想了想这种方法也是最简单的~ 所谓动态规划&#xff1a;…

07 | 链表(下):如何轻松写出正确的链表代码?

目录 技巧一&#xff1a;理解指针或者引用的含义 技巧二&#xff1a;警惕指针丢失和内存泄漏 技巧三&#xff1a;利用哨兵简化实现难度 技巧四&#xff1a;重点留意边界条件处理 技巧五&#xff1a;举例画图&#xff0c;辅助思考 技巧六&#xff1a;多写多练&#xff0c;…

“睡服”面试官系列第二十篇之generator函数的异步应用(建议收藏学习)

目录 1. 传统方法 2. 基本概念 2.1异步 2.2回调函数 2.3Promise 3. Generator 函数 3.1协程 3.2协程的 Generator 函数实现 3.3Generator 函数的数据交换和错误处理 3.4异步任务的封装 4. Thunk 函数 4.1参数的求值策略 4.2Thunk 函数的含义 4.3JavaScript 语言的…

【转】成为Java顶尖程序员 ,看这10本书就够了

“学习的最好途径就是看书“&#xff0c;这是我自己学习并且小有了一定的积累之后的第一体会。个人认为看书有两点好处&#xff1a; 1.能出版出来的书一定是经过反复的思考、雕琢和审核的&#xff0c;因此从专业性的角度来说&#xff0c;一本好书的价值远超其他资料2.对着书上的…

“睡服”面试官系列第二十一篇之class基本语法(建议收藏学习)

目录 1. 简介 2. 严格模式 3. constructor 方法 4. 类的实例对象 5. Class 表达式 6. 不存在变量提升 7. 私有方法 8. 私有属性 9. this 的指向 10. name 属性 11. Class 的取值函数&#xff08;getter&#xff09;和存值函数&#xff08;setter&#xff09; 12. Cl…

08 | 栈:如何实现浏览器的前进和后退功能?

栈 后进者先出&#xff0c;先进者后出&#xff0c;这就是典型的“栈”结构。栈是一种“操作受限”的线性表&#xff0c;只允许在一端插入和删除数据。 为什么要使用到“栈”这种操作受限的数据结构&#xff1f; 事实上&#xff0c;从功能上来说&#xff0c;数组或链表确实可…

关于tag,viewWithTag

iOS SDK内置了一套搜寻机制&#xff0c;可通过tag来查找子视图。 **苹果公司很少给子视图设置tag.笔者所知范围的唯一例外出现在UIAlertView中&#xff0c;该类会给按钮分别设置值为1、2的标签 viewWithTag:可以在某视图的所有下属中根据tag来查找相关的子视图。 ** 假如有多个…

09 | 队列:队列在线程池等有限资源池中的应用

队列定义 先进者先出&#xff0c;这就是典型的“队列”。队列跟栈一样&#xff0c;也是一种操作受限的线性表数据结构。 顺序队列和链式队列 顺序队列&#xff1a;用数组实现的队列// 用数组实现的队列 public class ArrayQueue {// 数组&#xff1a;items&#xff0c;数组大…