快速掌握算法复杂度分析

简介: 快速掌握算法复杂度分析

在数据结构与算法的学习过程中,如果只学会了其特点,用法,而并没有掌握算法复杂度的分析,那就相当于只学会了皮毛,而没有掌握其灵魂。


由于算法复杂度的分析较为重要,该部分会分为两篇文章:今天会介绍怎么分析算法复杂度,以及常见的复杂度分析。


首先会教大家怎么去***分析算法复杂度***,算法复杂度主要有两类:


时间复杂度

空间复杂度


算符复杂度的表示一般采用***大O复杂度表示法***。


时间复杂度分析


时间复杂度的全称是监禁时间复杂度,表示算法的执行时间与数据规模之间的增长关系。


首先,看下面这函数,假设每行代码的运行时间为t,那么这段代码总的运行时间为多少呢?

int Test(int n) {
  int i = 1;
  int k = 1;
  int j = 0;
  for(i = 0; i <= n; ++i) {
    k = 1;
    for(; k <= n; ++k) {
      j = j + i * k;
    }
  }
}


  • 第2、3、4行代码的运行时间分别为1t
  • 第5、6行代码的运行时间分别为n * t
  • 第7、8行代码的运行时间分别为n * n
  • 这段代码总的运行时间为


image.png

由上述代码可知,一段代码的运行时间T(n)与每行代码的执行次数n成正比,则T(n) = O(f(n))。


将上述代码的运行时间代入公式得:

image.png

这便是***大O时间复杂度表示法***。


该表示法并非表示代码的运行时间,而是将代码运行时间随数据规模增长的变化趋势表现出来。


由于公式中的低阶、常量、系数并不会左右代码运行时间的增长趋势,因此可以将它们全部忽略。


所以,上述公式又可以表示为:

image.png


加法法则


说明:程序的总复杂度等于量级最大的那段代码的复杂度


公式:

image.png


乘法法则


说明:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积


公式:


image.png

常见时间复杂度分析


  • 多项式量级

常量阶 O(1)

对数阶 O(logn)

线性阶 O(n)

线性对数阶 O(nlogn)

平方阶 O(n^2)

K方阶 O(n^k)

  • 非多项式量级

指数阶 O(2^n)

阶乘阶 O(n!)

  • 非多项式量级的算法随着数据规模n的增大,其代码执行时间会急剧增加。


O(1)


O(1)只是表示常量级时间复杂度,并不代表代只执行了一行代码。

例如下方代码的时间复杂度为O(1),而并不是O(2)

int i = 0;
int j = 1;
对数阶


image.png



示例:


int i = 1;
while(i <= n) {
  i = i * 2;
}


上述代码,当i小于等于n时,每循环一次代码,变量i的值就会乘以2。因此,变量i的取值为一个等比数列:


image.png


k值即为代码的循环次数,因此,根据公式


image.png

求解出


image.png

所以,这段代码的时间复杂度为


image.png


将上面的代码进行稍微的修改:


int i = 1;
while(i <= n) {
  i = i * 5;
}


根据之前推论,这段代码的的时间复杂度为

image.png

但是!!!这两段代码的时间复杂度都为


image.png

下面我们以 image.png为例,进行说明。


由于对数之间是可以进行互相转换的,因此image.png又可以转换为

image.png


因此,

image.png(c为常量)。在算法复杂度分析时,可以忽略常量带来的影响。

所以,

image.png


因此,在对数阶时间复杂度表示中,可以忽略其底数,将它们统一表示为

image.png

image.png则代表将时间复杂度为image.png的代码又运行了N遍。

空间杂度分析


空间复杂度全称为渐进空间复杂度,表示算法的存储空间与数据规模之间的增长关系。

每段功能完全的代码在运行过程中都会占用一些存储空间:


  • 代码本身占用的空间
  • 程序中输入与输出的数据所占用的空间
  • 程序在运行中动态申请的空间

一般程序中动态申请的空间,对空间复杂度的影响最大。



int n;
scanf("%d", &n);
int a[10];


上述代码在运行时所申请的空间并不会随着n的增大而增大。

因此该段代码的空间复杂度为O(1)

将上述代码稍作修改


int n;
scanf("%d", &n);
int a[n];


则该段代码的空间复杂度与n有关,记为O(n)

一般常见的空间复杂度为O(1)、O(n)、O(n ),

相关文章
|
13天前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
41 4
|
2月前
|
数据采集 机器学习/深度学习 算法
|
2月前
|
人工智能 算法 BI
第一周算法设计与分析 D : 两面包夹芝士
这篇文章介绍了解决算法问题"两面包夹芝士"的方法,通过找出两个数组中的最大最小值,计算这两个值之间的整数个数,包括特判不存在整数的情况。
|
2天前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
11 0
|
8天前
|
算法
PID算法原理分析及优化
【10月更文挑战第6天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
19 0
|
1月前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
44 4
|
1月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
29 1
|
1月前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
16天前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
21 0
|
2月前
|
算法
算法设计与分析作业
这篇文章是关于算法设计与分析的作业,其中包含了两个算法实现:一个是使用分治算法实现的十进制大整数相乘(包括加法、减法和乘法函数),并进行了正确性和健壮性测试;另一个是使用快速排序思想实现的分治查找第K小元素的程序,并分析了其平均和最坏时间复杂度。
算法设计与分析作业

热门文章

最新文章