文章目录

  • 如何判断程序的复杂程度:时间和空间复杂度
    • 1. 时间复杂度:
      • 如何判断一段代码的时间复杂度
      • 小练习1:求和计算1~n的和
      • 小练习2:求斐波那契数列
      • 主定理
        • 常用算法中的应用
    • 2. 空间复杂度
      • 如何判断一段代码的空间复杂度
    • 3. 数组和链表的时间复杂度分析
      • 数组
      • 链表
      • 跳表

如何判断程序的复杂程度:时间和空间复杂度

1. 时间复杂度:

使用大O表示法来表示程序的时间复杂度

常见的7种时间复杂度(复杂度由低到高排序)

  1. O(1):常数时间复杂度

  2. O(log(n): 对数时间复杂度

  3. O(n): 线性时间复杂度

  4. O(n^2):平方时间复杂度

  5. O(n^3):立方时间复杂度

  6. O(k^n):指数时间复杂度,k表示常数

  7. O(n!):阶乘时间复杂度

ps:

  1. 这里我们并不考虑前边的系数;O(1) 并不表示复杂度为1,也可以 是2、3等常数;O(n)表示程序运行了n次或者2n、3n次;以此类推其他时间复杂度

  2. 时间复杂度的判断,以一段代码的最高复杂度为准;

如何判断一段代码的时间复杂度

简而言之就是看内部某段代码的执行次数

  1. O(1):常数复杂度

    • int n = 1;
      System.out.println(n);
      
    • int n = 1;
      System.out.println(n);
      System.out.println(n+1)
      System.out.println(n+2)
      
  2. O(n):线性时间复杂度

    • for (int j = 0; j < n; j++) {System.out.println(j);
      }
      
    • for (int i = 0; i < n; i++) {System.out.println(i);
      }
      for (int j = 0; j < n; j++) {System.out.println(j);
      }
      
  3. O(n^2):平方时间复杂度

    • for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {System.out.println(i + j);}
      }
      
  4. O(n^3):立方时间复杂度

    • for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {for (int k = 0; k < n; k++) {System.out.println(i + j);}}
      }
      
  5. O(log(n)): 对数时间复杂度

    这里演示的是以2为底n的对数

    • for (int i = 0; i < n; i = i * 2) {System.out.println(i);
      }
      
  6. O(2^n):指数时间复杂度

    • /*** 递归求斐波那契数列的第n项;可以通过画运行树的方式获得时间复杂度*/
      int fib(int n) {if (n < 2) return n;return fib(n - 1) + fib(n - 2);
      }
      
  7. O(n!):阶乘时间复杂度

    • todo

小练习1:求和计算1~n的和

  1. O(n)

    int y = 2;
    for (int i = 0; i < n; i++) {y+=i;
    }
    
  2. O(1)

    使用了求和公式:sum = n(n+1)/2

    int y = 2;
    for (int i = 0; i < n; i++) {y+=i;
    }
    

小练习2:求斐波那契数列

  1. O(2^n):

    int fib(int n) {if (n < 2) return n;return fib(n - 1) + fib(n - 2);
    }
    
  2. O(n):该方法比递归要快得多

    int fib2(int n) {if (n == 1 || n == 2) {return 1;}int a = 1, b = 1, result = 0;for (int i = 3; i <= n; i++) {result = a + b;a = b;b = result;}return result;
    }
    

主定理

主定理(英语:master theorem)提供了用渐近符号(大O符号)表示许多由分治法得到的递推关系式的方法

常用算法中的应用

算法 递回关系式 运算时间
二分搜寻算法
二叉树遍历
最佳排序矩阵搜索(已排好序的二维矩阵)
合并排序

所有排序的最优算法都是O(nlog(n))

2. 空间复杂度

如何判断一段代码的空间复杂度

主要通过两部分进行判断:

  1. 数组的长度

    如果代码中应用了数组,那么数组的长度,基本上就是空间复杂度;
    e:一维数组的空间复杂度是O(n);二维数组的空间复杂度是O(n^2)

  2. 递归的深度

    如果代码中有递归,那么递归的深度,就是代码的空间复杂度的最大值

ps:如果代码中既有数组,又有递归,那么两者的最大值就是代码的空间复杂度

leecode有个爬楼梯的复杂度分析情况;可以进行练习

3. 数组和链表的时间复杂度分析

数组

随机增加:O(n)
随机查询:O(1)
随机删除:O(n)

链表

随机增加:O(1)
随机查询:O(n)
随机删除:O(1)

跳表

跳跃表(skiplist)是一种随机化的数据, 由 William Pugh 在论文《Skip lists: a probabilistic alternative to balanced trees》中提出, 跳跃表以有序的方式在层次化的链表中保存元素, 效率和平衡树媲美 —— 查找、删除、添加等操作都可以在对数期望时间下完成, 并且比起平衡树来说, 跳跃表的实现要简单直观得多。

简单来说,跳跃表是有序链表的一种扩展,在有序列表的基础上进行了升维处理


以上图片来自公众号:程序员小灰

随机增加:O(log(n))
随机查询:O(log(n))
随机删除:O(log(n))

如何判断程序的复杂程度:时间和空间复杂度相关推荐

  1. 微信小程序获取当前系统时间以及判断周几

    微信小程序获取当前系统时间以及判断周几 首先获取当前日期 在utils文件加中创建问价util.js function formatTime(date) {var year = date.getFul ...

  2. 千万不要相信程序员在加班时间写的代码!

    其中最重要的就是这条:不要相信一个程序员在加班时间写出来的代码. (软件工程的学说表明,连正常时间好好写的代码,也不要太相信.不过这不是本文的重点,略过不提.) (不懂代码的人,看到本文中的Java代 ...

  3. 不要相信程序员在加班时间写的代码

    http://www.cocoachina.com/programmer/20161215/18359.html 不要相信程序员在加班时间写的代码 2016-12-15 00:01 编辑: suili ...

  4. java开发有不加班的吗_千万不要相信程序员在加班时间写的代码!

    作为一个最底层的程序员,我先记录一些只有底层程序员才会知道的事情.如果多年后,我违背自己进入这个行业的初心,走上管理岗位,也能回想起一些禁忌,避免一些错误. 其中最重要的就是这条:不要相信一个程序员在 ...

  5. (转载)不要相信程序员在加班时间写的代码

    作为一个最底层的程序员,我先记录一些只有底层程序员才会知道的事情.如果多年后,我违背自己进入这个行业的初心,走上管理岗位,也能回想起一些禁忌,避免一些错误. 其中最重要的就是这条:不要相信一个程序员在 ...

  6. 判断程序是否已经运行

    近段时间,需要写一个小功能,就是需要判断程序是否已经运行. 某个程序安装后,也许被多个用户运行.那怎样判断当前用户已经运行了此程序了呢? 下面是Insus.NET的做法,就是: <VB.NET ...

  7. 有经验的面试官都是如何快速判断程序员能力的?

    程序员是一个技术含量特别高的职位,优秀的程序员对每个公司来讲同样可遇不可求.而这就需要技术面试官的火眼精金,为企业挖掘人才. 程序员面试者那么多,如何快速分辨他们的能力,为双方都节省时间和精力,也成为 ...

  8. 微信小程序实现缓存过期时间

    微信小程序实现缓存过期时间 前言 一.设置缓存 二.得到缓存 总结 前言 先来看看官方文档 wx.setStorageSync(string key, any data) 将数据存储在本地缓存中指定的 ...

  9. HR怎么通过简历判断程序员是否优秀?

    阅过无数技术简历,仍然做不好技术招聘. 技术面试官无数次强调要从简历中判断是否为技术大牛,可是大牛.小牛真的可以从简历上判断吗? 为此,很多HR都会有这样的想法:看到有卓越的项目经历,哇!这个人肯定是 ...

最新文章

  1. [MySQL FAQ]系列 -- Too many open files
  2. draw.io创建自定义形状
  3. jQuery选择器之可见性过滤选择器Demo
  4. python numpy官网_Python Numpy 教程(上)
  5. 现代谱估计:多窗口谱
  6. 小米笔记本服务器系统,小米笔记本Pro GTX版
  7. windows7系统适合哪个python_Python3.6.4在Windows7系统下安装配置教程
  8. Linux: chmod 和 chown用法小结
  9. c语言解数独算法递归,How to think:递归和数独试探算法
  10. oracle 查表的用户名和密码,查看Oracle数据库中的所有用户名
  11. 在linux桌面上显示图标
  12. python3读文件编码格式_使用不同的编码格式读取文件系统标准在Python3中
  13. 杭电2002(我们没有什么不同)
  14. 《HTML5+CSS3网页设计入门必读》——1.11 小结
  15. 有限元分析法matlab,用MATLAB进行结构的有限元法分析
  16. SAP官方考试认证报名,如何报名?
  17. 罗永浩“吓尿”大会上,我裤子真湿了
  18. ionic 3 http htpps
  19. Remix-IDE安装开发环境与使用文档(Windows环境)
  20. 数据库构造器之查询构造器构建

热门文章

  1. express 什么是中间件(浅显易懂)
  2. php-使用函数array_walk_recursive处理多维数组的键值后返回一个新数组
  3. 北航程序设计决赛(虽然。。。。但是)补题。
  4. uniapp mx-datepicker时间范围选择器禁用部分时间
  5. 1. Hello World!
  6. 第一次投稿(Elsevier)爱斯维尔期刊经验(持续更新)
  7. 核雕图案的寓意(下)
  8. 2020最新智能客服|聊天机器人算法、架构及应用分享
  9. 官方也无力回天?“SharedPreferences 存在什么问题?”
  10. 刷题总结——松鼠的新家(bzoj3631)