程序员的数学基础学习笔记:第十六讲

1、时间和空间复杂度基本概念

一、影响系统性能的因素有哪些?

影响系统性能的因素有不少,把这些因素分为三大类java

一、算法理论上的计算复杂度
二、开发实现的方案和硬件设备的规格
三、算法理论上的计算复杂度、开发实现的方案和硬件设备的规格算法

二、复杂度是什么?

算法复杂度是一个比较抽象的概念,一般只是一个估计值,它用于衡量程序在运行时所须要的资源用于比较不一样算法的性能好坏数组

咱们一般所说的时间复杂度是指渐进时间复杂度,标识程序运行时间随着问题复杂度增长而变化的规律缓存

空间复杂度是指渐进空间复杂度,标识程所须要的存储的存储空间复杂度增长而变化的规律服务器

2、复杂度分析的6个通用法则

一、四则运算法则

代码的添加,觉得着计算机操做的增长,也就是时间复杂度的增长
若是代码是平行增长的,就是加法
若是是循环、嵌套或者函数的嵌套,那么就是乘法函数

加法

好比二分查找中
一、第一步是对长度为n的数组排序,时间复杂度是O(nlogn)
二、第二步是在这个已排序的数组中进行查找 时间复杂度是 O(logn)
这两部分是平行的,因此计算时间复杂度时可使用加法,因此时间复杂度是:O(nlogn)+O(logn)。性能

你还记得在第3讲我讲的查字典的例子吗?

String[] dictionary = {"i", "am", "one", "of", "the", "authors", "in", "geekbang"};
		
Arrays.sort(dictionary);  // 时间复杂度为 O(nlogn)

String wordToFind = "i";
		
boolean found = Lesson3_3.search(dictionary, wordToFind); // 时间复杂度 O(logn)
if (found) {
  System.out.println(String.format(" 找到了单词 %s", wordToFind));
} else {
  System.out.println(String.format(" 未能找到单词 %s", wordToFind));
}

一、Arrays.sort(dictionary),我用了Java 自带的排序函数,时间复杂度为 O(nlogn),优化

二、而Lesson3_3.search 是我本身实现的二分查找,时间复杂度为 O(logn)
spa

三、二者是并行的,并以此执行,所以总的时间复杂度是二者相加

对于空间复杂度,一样如此,设计

须要注意的是,空间复杂度看的是对内存空间的使用,而不是计算的次数,若是语句中没有新开辟空间,那么不管是平行增长仍是嵌套增长代码,都不会增长空间复杂度

二、主次分明法则

这个法则主要是运用了数量级和运算法则优先级的概念,在刚刚介绍的第一个法则中,咱们会对代码不一样部分所产生的复杂度进行相加或相乘

使用加法或减法时,你可能会遇到不一样数量级的复杂度,这个时候,咱们只须要看最高数量级的,而忽略常量、系数和较低数量级的复杂度

这个法则对于空间复杂度,一样使用

注意,这个法则对于乘法或除法并不使用,由于乘法和除法会改变参与运算的复杂度的数量级

三、齐头并进法则

这个法则主要运用了多元变量的概念,其核心思想是复杂度可能受到多个因素的影响,在这种状况下,咱们要同时考虑全部因素,并在复杂度公式中体现出来

使用动态规划解决编辑距离问题,从解决方案的推导和代码能够看出,这个问题设计两个因素

一、参与比较的第一个字符串的长度n和第二个字符串的长度m
二、代码使用了两次嵌套循环,第一层循环的长度是n,第二层循环的长度为m
三、根据乘法法则,时间复杂度为O(n*m)。而空间复杂度,很容易从推导结果的状态转移表得出,也是O(n*m)

四、排列组合法则

排列组合的思想不只出如今数学模型的设计中,一样也会出如今复杂度分析中,它常常会用在最好、最坏和平均复杂度分析中

五、一图千言法则

一、归并排序为例

一、数据切分阶段

二、数据合并阶段


两个极端加起来的时间复杂度为O(n-1)+nlog2n,最终简化为 nlogn。是否是很直观?

咱们在放出咱们以前讲的二分查找所用的图,你能够结合这个例子进一步理解

 

二、动态规划

动态规划的时候咱们常常要画出状态转移的表格,看到这类表格,


咱们能够很容易地得出该算法的时间复杂度和空间复杂度,m 为第一个字符串的长度,n 为第二个字符串的长度。

因此,咱们很快就能得出这种算法的时间复杂度为O(3m*n),简写为 O(m*n),空间复杂度为 O(m*n)


六、时空互换法则

在给定的计算量下,一般时间复杂度和空间复杂度呈现数学中的反比关系。这就说明,若是咱们无法下降总体的计算量,

那么也许能够经过增长空间复杂度来达到下降时间复杂度的目的或者反之,经过藏家时间复杂度来下降空间复杂度

缓存系统

在没有缓存系统的时候,每次请求都要服务器来处理,所以时间复杂度比较高,若是使用了缓存系统
那么咱们会消耗更多的内存空间,可是下降了请求相应的时间

说道这、你也许会问,在使用广度优先策略优化聚合操做的时候,不管是时间仍是空间复杂度,都大幅下降了啊?请注意,

这里的互换法则有个前提条件,就是计算两固定,而聚合操做的优化,是利用了广度优先的特色,大幅减小了总体的计算量,

所以能够保证时间和空间复杂度都的到下降

3、思考题

请尝试使用本次介绍的规则,分析一下双向广度优先搜索的时间和空间复杂度

思考题感受要根据具体图的状况来看具体时间复杂是多少,就以前的六度关系的例子,假设把关系看做是一个树,每一个结点都有 n 个子结点,要确认两我的是几度好友,

也就是确认两个结点相距多少层,若是是单向广度优先搜索,时间复杂度 O(n^degree),双向能够运用加法法则,两边同时出发,时间复杂度 2 * O(n^(degree/2)),

空间复杂度是队列中暂存的结点的最大值,和时间复杂度同样

相关文章
相关标签/搜索