一、算法效率
算法效率分析分为两种:时间效率和空间效率

时间效率

时间效率被称为时间复杂度,主要时衡量一个算法的运行速度。

空间效率

空间效率被称为空间复杂度,主要衡量一个算法所需要的额外空间。

二、时间复杂度

1. 概念

一个算法所花费的时间与其中语句的执行次数成正比,故将算法中的基本操作的执行次数,作为算法的时间复杂度。

并且时间复杂度其实还可以分成三种情况:

最坏情况:任意输入规模的最大运行次数
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数

而在实际中一般关注的是算法的最坏运行情况。

2. 大 O 的渐进表示法

实际在我们计算时间复杂度时,并不一定要计算精确的执行次数,而只需要大概执行次数,故我们使用大 O 的渐进表示法(大 O 符号是用于描述函数渐进行为的数学符号)。

使用方法

用常数1取代运行时间中的所有加法常数。
在修改后的运行次数函数中,只保留最高阶项。
如果最高阶项存在且不为1,则去除与这个项目相乘的常数。
如某个算法的基本操作次数为 F(N) = N^2^ + 2*N + 10,用大 O 的渐进表示法为:O(N)。

3. 练习

在这里放入两个递归函数的练习,我们来试着推导其的时间复杂度。

练习一:计算阶乘递归 factorial 的时间复杂度

long factorial(int N) {return N < 2 ? N : factorial(N-1) * N;
}

这题很简单,结果为:O(N)。

练习二:计算斐波那契递归 fibonacci 的时间复杂度

int fibonacci(int N) {return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2);
}

这题可以结合画图类似于二叉树去思考,结果为:O(N2)

注意

递归的时间复杂度 = 递归的次数 * 每次递归内容要执行的次数

三、空间复杂度

1. 概念

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,它不是计算程序占用了多少 byte 的空间,而是计算变量的个数。(空间复杂度也使用大 O 的渐进表示法)。

2. 练习

练习一:计算 bubbleSort 的空间复杂度

void bubbleSort(int[] array) {for (int end = array.length; end > 0; end--) {boolean sorted = true;for (int i = 1; i < end; i++) {if (array[i - 1] > array[i]) {Swap(array, i - 1, i);sorted = false;}}if (sorted == true) {break;}}
}

因为只使用了常数个额外空间,故结果为:O(1)。

练习二:计算 fibonacci 的空间复杂度

int[] fibonacci(int n) {long[] fibArray = new long[n + 1];fibArray[0] = 0;fibArray[1] = 1;for (int i = 2; i <= n ; i++) {fibArray[i] = fibArray[i - 1] + fibArray [i - 2];}return fibArray;
}

因为动态开辟了 N 个空间,故结果为:O(N)。

练习三:计算阶乘递归 Factorial 的时间复杂度

long factorial(int N) {return N < 2 ? N : factorial(N-1)*N;
}

因为递归调用了 N 次,开辟了 N 个栈帧,每个栈帧使用了常数个空间,故结果为:O(N)。

希望能对大家有所帮助,欢迎三连。

时间和空间复杂度概述【Java _demo版】相关推荐

  1. Java时间和空间复杂度

    文章目录 前言 一.如何衡量一个算法的好坏 二. 算法效率 三. 时间复杂度 3.1 时间复杂度的概念 3.2 大O的渐进表示法 3.3 推导大O阶方法 3.4 常见时间复杂度计算举例 四. 空间复杂 ...

  2. 终于,把十大经典排序算法汇总了!(Java实现版)

    转载自  终于,把十大经典排序算法汇总了!(Java实现版) 最近几天在研究排序算法,看了很多博客,发现网上有的文章中对排序算法解释的并不是很透彻,而且有很多代码都是错误的,例如有的文章中在" ...

  3. Java基础-Java概述-Java语言概述

    Java工程师知识树 / Java基础 文章目录 Java语言概述 概述: 发展历程 1.发展概述 2.JDK 版本更新历史及技术点 编程开发 编程环境 编程工具 语言特点 1.简单性 2.面向对象 ...

  4. java 解析日期格式_日期/时间格式/解析,Java 8样式

    java 解析日期格式 自Java 几乎 开始以来,Java开发人员就通过java.util.Date类(自JDK 1.0起)和java.util.Calendar类(自JDK 1.1起 )来处理日期 ...

  5. 日期/时间格式/解析,Java 8样式

    自Java 几乎 开始以来,Java开发人员就通过java.util.Date类(自JDK 1.0起)和java.util.Calendar类(自JDK 1.1起 )来处理日期和时间. 在这段时间内, ...

  6. java老版手机游戏剑魂_剑魂自动训练第3部分

    java老版手机游戏剑魂 In this article, we will finally put an end to the "Automating Swords & Souls& ...

  7. 【算法】时间和空间复杂度

    文章目录 前言 一.时间复杂度 二.空间复杂度 三.常见的案例和示例 1. 线性查找(Linear Search) 2. 快速排序(Quick Sort) 3.动态规划(Dynamic Program ...

  8. java web聊天室论文_基于Java网页版聊天室的设计与实现毕业论文含开题报告及文献综述(样例3)...

    <基于Java网页版聊天室的设计与实现毕业论文含开题报告及文献综述.doc>由会员分享,可免费在线阅读全文,更多与<基于Java网页版聊天室的设计与实现毕业论文含开题报告及文献综述& ...

  9. java 1.13 快照下载_Minecraft Java快照版18w15a下载

    来源:游戏园日期:2019-01-06 04:00:47 就在今天凌晨mojang发布了最新的Minecraft Java快照版18w15a,在此版本中加入了许多新的内容,想第一时间体验的玩家别忘了下 ...

最新文章

  1. spring与memcache的集成
  2. 5大架构:细数数据平台的组成与扩展
  3. JavaScript强化教程——AJAX
  4. nginx+lua+redis 灰度发布实现方案
  5. 学习使用资源文件[2] - Ico
  6. 微软企业库调用Oracle分页存储过程
  7. opencv roberts算子_图像之HOG特征描述算子-行人检测
  8. JavaScript基本数据类型和引用数据类型
  9. 可视化编程真的有那么糟糕?
  10. iso linux 内核版本号_Linux发行版和Linux内核的区别
  11. 2. 知识图谱-命名实体识别(NER)详解
  12. Atitit.阿里云c盘 系统盘爆满解决方案
  13. 【读书笔记】--SQL基础概念复习
  14. Python得到字符的阿斯克码值 chr ord
  15. C++模板编程(18)---模板实例化instantiation
  16. windows无法格式化u盘_U 盘格式化提示 windows 无法完成格式化的解决办法
  17. 音视频格式大全:stream type
  18. robots里屏蔽百度和GG以外的蜘蛛
  19. 日本区块链联盟助推日本区块链发展
  20. Jackson之ObjectMapper对象的使用

热门文章

  1. linux怎么开ssh端口,如何查看linux中的ssh端口开启状态
  2. python数据库操作sqlite_Python操作mysql和sqlite
  3. mfc中嵌入python_Python 中的 Hook 钩子函数
  4. D3js(一): d3js和DOM
  5. java 枚举类型enum
  6. js中函数的参数为函数的情况即回调函数
  7. Git学习总结(一)
  8. 华为0基础——(练习用)挑7
  9. 给那些被墙困扰着,找不到库的孩子们
  10. Java基础之字符串String: