1. 大 O 表示法

O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度。大 O 表示法指出了最糟情况下的运行时间。大 O 表示法在讨论运行时间时,log 指的都是 log2

2. 复杂度概念

复杂度是一个关于输入数据量 n 的函数。假设你的代码复杂度是 f(n),那么就用个大写字母 O 和括号,把 f(n) 括起来就可以了,即 O(f(n))。例如,O(n) 表示的是,复杂度与计算实例的个数 n 线性相关;O(logn) 表示的是,复杂度与计算实例的个数 n 对数相关。

通常,复杂度的计算方法遵循以下几个原则:

  • 复杂度与具体的常系数无关;

例如 O(n)O(2n) 表示的是同样的复杂度。我们详细分析下,O(2n) 等于 O(n+n),也等于 O(n) + O(n)。也就是说,一段 O(2n) 复杂度的代码只是先后执行两遍 O(n),其复杂度是一致的。

  • 多项式级的复杂度相加的时候,选择高者作为结果;

例如 O(n²)+O(n)O(n²) 表示的是同样的复杂度。具体分析一下就是,O(n²)+O(n) = O(n²+n)。随着 n 越来越大,二阶多项式的变化率是要比一阶多项式更大的。因此,只需要通过更大变化率的二阶多项式来表征复杂度就可以了。

  • O(1) 也是表示一个特殊复杂度,含义为某个任务通过有限可数的资源即可完成。此处有限可数的具体意义是,与输入数据量 n 无关。

例如,你的代码处理 10 条数据需要消耗 5 个单位的时间资源,3 个单位的空间资源。处理 1000 条数据,还是只需要消耗 5 个单位的时间资源,3 个单位的空间资源。那么就能发现资源消耗与输入数据量无关,就是 O(1) 的复杂度。

3. 常见复杂度

常见的复杂度结论:

  • 一个顺序结构的代码,时间复杂度是 O(1)
  • 二分查找,或者更通用地说是采用分而治之的二分策略,时间复杂度都是 O(logn)
  • 一个简单的 for 循环,时间复杂度是 O(n)
  • 两个顺序执行的 for 循环,时间复杂度是 O(n)+O(n)=O(2n),其实也是 O(n)
  • 两个嵌套的 for 循环,时间复杂度是 O(n²)

下面按从快到慢的顺序列出了经常会遇到的 5 种时间复杂度:

  • O(log n),也叫对数时间,这样的算法包括二分查找;
  • O(n),也叫线性时间,这样的算法包括简单查找;
  • O(n*logn),这样的算法包括快速排序 —— 一种速度较快的排序算法;
  • O(n2),这样的算法包括选择排序 —— 一种速度较慢的排序算法;
  • O(n!),这样的算法包括旅行商问题的解决方案 —— 一种非常慢的算法;

3.1 O(1)

比如操作一步到位这是常数级别的时间复杂,即为 O(1)

a = 100 / 2 + 101 * 10 + 5

3.2 O(logn)

如下操作,每次 n 会被除以 3,遍历次数等于以 3 为底 logn 次。在大 O 标记体系中,以 3 为底和以 5 为底没有区别,所以统一标记为 O(logn)

def f(n):while n > 0:print(n)n /= 3

3.3 o(n)

线型复杂度也是很理想的情况,如下面的操作,每次遍历,n 减去 3,这样总共遍历 (n-1)/3 + 1 次后算法终止,根据大 O 标记法,算法的时间复杂为 O(n)

def f(n):while n > 0:print(n)n -= 3

3.4 O(nlogn)

如下面所示的两层循环,复杂度便是 nlogn。外层循环的运行次数为 n,里层循环的运行次数为 logn 次,所以一共需要 nlogn 次。

def f(n):for i in range(n):n /= 2for j in range(1,n):print(i*j)

3.5 O(n^2)

O(n^2) 是多项式时间复杂度的代表,此类算法的时间复杂度已经难以划分到高效算法集合中,它只能是问题的有效解,而不是高效解。如下两层for 循环,时间复杂度就是 O(n^2)

def f(n):for i in range(n):for j in range(n):print(i*j)

3.6 O(2^n)

时间复杂度为 O(2^n) 的算法是指数级增长的,此类复杂度下求解的问题往往都是难题,因为随着问题规模 n的增长,指数级的增长速度是惊人的。

例如经典的旅行商问题,商人要去 n个地方拜访,如何规划拜访顺序才能使得旅行距离最短。如果仅拜访肉眼可见的两三个地方时,我们还能穷举所有拜访的组合,进而找到最短路径。

但是当问题规模 n 变大时,目前所有的计算机资源总和都难以在有限的时间里计算出最优的最短路径,这类问题的时间复杂度都为指数级,属于 NP 难问题。

数据结构(01)— 算法复杂度概念及常见的复杂度计算相关推荐

  1. 考研数据结构笔记--数据结构和算法的基本概念

    考研数据结构笔记--数据结构和算法的基本概念 数据结构的基本概念 算法的基本概念 数据结构的基本概念 数据 数据是对客观事物的符合表示,在计算机科学中是指所有能输入到计算机中并且被计算机程序处理的符合 ...

  2. 【python版本数据结构与算法】基本概念(10-1)

    参考书: <数据结构与算法(Python语言描述)> 最原始的方法:枚举法 那么数据结构和算法是什么?答曰:兵法! 我们可以不看兵法在战场上肉搏,如此,可能会胜利,可能会失败.即使胜利,可 ...

  3. java 中的数据元素的定义_Java数据结构和算法的基础概念

    一.基本的概念 1.数据            是客观描述事物的符号,是计算机中操作的对象,是能被计算机识别.并输入给计算机处理的集合 2.数据元素        是组成数据的,有一定意义的基本单位. ...

  4. 数据结构开山篇——数据结构和算法的基本概念

    绪论 文章目录 绪论 为甚要学习数据结构? 数据结构研究的内容 计算机进行数值计算的研究过程 计算机如何进行非数值运算 基本概念和术语 数据 数据元素 数据项 数据对象 数据构成 数据结构 数据类型 ...

  5. 天勤计算机考研高分笔记(一)绪论4数据结构与算法的基本概念

    1.3.1数据结构的基本概念 1.数据 数据是一种对客观事物的符号表示,是可以输入计算机中,并被计算机程序处理的符号的总称.(整数,实数,字符串) 2.数据元素(数据项< <数据结构,数据 ...

  6. 数据结构和算法的基本概念

    我们要想开发出高效率的软件就要建立合适的数据结构和设计较好的算法来提高程序执行效率,而学习数据结构和算法的目的就是提高程序执行效率. "算法+数据结构=程序"这是某位科学家的观点. ...

  7. python【数据结构与算法】关于树和二叉树的探索与计算

    文章目录 1 树的基本概念 2 树的存储结构 2.1 双亲表示法 2.2 孩子表示法 2.3 孩子兄弟表示法 3 二叉树 4 二叉树的基本操作 5 二叉树各种计算公式 1 树的基本概念 节点:节点包括 ...

  8. 数据结构与算法基础 基本概念

    文章目录 数据结构研究内容 基本概念和术语 数据 (Data) 数据元素(Data Element) 数据项 (Data Item) 数据对象(Data Object) 数据结构(Data Struc ...

  9. 数据结构与算法的基本概念

    数据的基本概念: 数据:是描述客观事物的符号,是计算机可以操作的对象,能被计算机识别. //可以这么说二进制文件都可以称为数据 数据元素:组成数据的,有一定意义的基本单位 //人类-人 数据项:数据不 ...

最新文章

  1. Android移动开发之【Android企业级项目实战教程】DAY1-图表库HelloCharts
  2. socket()函数详解!
  3. 高级编程学习笔记day01(知识点篇)
  4. 光速OFFER,为AI奔赴,商汤2022届校招提前批正式启动!
  5. oralce load的时候使用触发器会导致load慢吗_一次FGC导致CPU飙高的排查过程
  6. Goodbye 2017 B
  7. TransactionTemplate和@Transactional注解的区别
  8. python快速处理ppt_人生苦短,我用 Python 之快速遍历 PPT
  9. 【渝粤教育】国家开放大学2018年春季 0025-22T数据结构 参考试题
  10. K-Means ++ 算法
  11. vue如何和PHP交互,VUE中如何使用Vue-resource完成交互
  12. 在UITableView中使用自动布局以获取动态单元格布局和可变的行高
  13. 深度学习笔记(一)——初步理解yoloV3原理
  14. 【老牌系统】如何增大C盘空间
  15. PMP澳门机考3A学员考试攻略
  16. java 动态爱心代码_java swing实现动态心形图案的代码下载
  17. 从0开始实现一个直播礼物系统
  18. matlab:研究二阶系统中开环参数的影响
  19. 把代码和环境做成docker镜像_Jenkins把GitHub项目做成Docker镜像
  20. Java Web实战详细教程(十一)贯穿项目搭建+CSS修饰前端页面

热门文章

  1. 基于Golang的CLI 命令行程序开发
  2. Go 知识点(16)— 将枚举值转换为字符串
  3. 前端Vue学习之路(一)-初识Vue
  4. 那还剩下多少学习激情?
  5. SQL case when
  6. pytorch中如何处理RNN输入变长序列padding
  7. Python List extend()方法
  8. Thrift协议与传输选择
  9. linux7怎样搭建zabbix,Centos7.0 搭建Zabbix环境
  10. Git Bash Here 中文显示乱码,有遮挡, 的处理方法