算法的复杂度分析

大家好,我是Ziph!

算法的复杂度分析

什么是复杂度分析?

  • 数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”
  • 因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能
  • 分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度
  • 复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系

为什么要进行复杂度分析?

  • 测试结果非常依赖测试环境
  • 测试结果受数据规模的影响很大
  • 和性能测试相比,复杂度分析有不依赖执行环境、成本低、效率高、易操作、指导性强的特点
  • 掌握复杂度分析,将能编写出性能更优化的代码,有利于降低系统开发和维护成本

如何进行复杂复分析?
大O复杂度表示法

int cal(int n) {
	int sum = 0;
	int j = 1;
	int i = 1;
	for (; i <= n; ++i) {
		j - 1;
		for (; j <= n; ++j) {
			sum = sum + i * j;
		}
	}
}

假设每个语句的执行时间是unit_time。那这段代码的总执行时间T(n)是多少呢?
第2、3、4行代码,每行都需要1个unit_time的执行时间,第5、6行代码循环执行了n遍,需要2n*unit_time的执行时间,第7、8行代码循环执行了n ^ 2遍,所以需要2n ^ 2 * unit_time的执行时间。所以,整段代码总的执行时间为T(n)=(2n ^ 2 + 2n + 3) * unit_time。
尽管我们不知道unit_time的具体指,但是通过这两行代码执行时间的推导过程我们就可以发现规律,那就是所有代码的执行时间T(n)与每行代码的执行次数n成正比。公式如下:
在这里插入图片描述
T(n)表示执行的时间;n表示数据规模的大小;f(n)表示每行代码执行的次数总和。因为这是一个公式,所以用f(n)来表示。而公式中的O,表示代码的执行时间T(n)与f(n)表示成正比。其实大O时间复杂度并不是表示很准确的时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫渐进时间复杂度。

注意:以时间复杂度为例,由于时间复杂度描述的是算法执行时间与数据规模的增长变化趋势,所以常量阶、低阶以及系数实际上对这种增长趋势不产生决定性影响,所以在做时间复杂度分析时忽略这些项。如果用大O表示法表示上述代码的时间复杂度,就可以记为:T(n)=O(n^2)【分析代码中最大影响的代码复杂度并用大O表示法表示,比如循环结构中分析循环次数最多的那几行代码(很重要),下面即是复杂度分析法则如下:】。

复杂度分析法则

  • 单行代码看高频,比如循环
  • 多行代码看最大,比如一段代码中有单循环和多重循环,那么取多重循环的复杂度
  • 嵌套代码求乘积,比如递归、多重循环等
  • 多个规模求加法,比如方法中有两个参数控制两个循环的次数,那么这时就取两者复杂度相加

常用的复杂度级别

  • 多项式阶:随着数据规模的增长,算法的执行时间和空间占用,按照多项式的比例增长。包括,O(1)【常数阶】、O(logn)【对数阶】、O(n)【线性阶】、O(nlogin)【线性对数阶】、O(n ^ 2)【平方阶】、O(n ^ 3)【立方阶】
  • 非多项式阶:随着数据规模的增长,算法的执行时间和空间占用暴增,这类算法性能极差。包括,O(2 ^ n)【指数阶】、O(n!)【阶乘阶】
  • 其他(两个数值的复杂度):O(m+n)、O(m*n)
  • 特殊:浅析最好、最坏、平均、均摊时间复杂度

为什要引入这特殊的复杂度呢?

  • 同一行代码在不同情况下时间复杂度会出现量级别差异,为了更全面,更精确的描述代码的时间复杂度,所以引入这4个特殊的复杂度概念
  • 代码复杂度在不同情况下出现量级差别时才需要区别这四种复杂度。大多数情况下,是不需要区别拆分它们的

鉴于特殊的复杂度呢,可以这么理解,有时候遇见的一种情况比如:数组需要遍历插入数据,最好的时间复杂度是O(1),最坏的是O(n),平均复杂度是O(1)。而最好、最坏、平均就是最理想、最坏的情况和比较均衡的分析
而均摊复杂度是什么意思呢?每一次O(n)的插入操作,都会跟着n-1次O(1)的插入操作,所以把耗时的那一次均摊到接下来的n-1次耗时少的操作上,均摊下来,这一组连续的操作的均摊时间复杂度就是O(1)。

均摊复杂度(摊还分析)的规则

  • 代码在绝大多数情况下是低级别复杂度,只有极少情况是高级别复杂度
  • 级别低和高级别复杂度出现具有时序规律。均摊结果一般都是等于低级别复杂度

在这里插入图片描述

在这里插入图片描述

有问题请留言回复!

发布了49 篇原创文章 · 获赞 94 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44170221/article/details/104342159