Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >复杂度分析的套路及常见的复杂度

复杂度分析的套路及常见的复杂度

作者头像
彤哥
发布于 2020-07-28 07:46:39
发布于 2020-07-28 07:46:39
6900
举报
文章被收录于专栏:彤哥读源码彤哥读源码

关注公众号“彤哥读源码”,解锁更多源码、基础、架构知识!

前言

你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人。

上一节,我们一起学习了表示复杂度的几个符号,我们说,通常使用大O来表示算法的复杂度,不仅合理,而且书写方便。

那么,使用大O表示法评估算法的复杂度有没有什么套路呢?以及常见的复杂度有哪些呢?

本节,我们就来解决这两个问题。

前情回顾

在正式讲解套路之前,我们先回忆一下前面几节讲到的内容。

在第2节,我们学习了渐近分析法,将算法的复杂度与输入规模挂钩,随着输入规模的增大,算法执行的时间将呈现一种什么样的趋势,将这个趋势用函数表示,再去除低阶项和常数项,就得到了算法的时间复杂度。

在第3节,我们分别从最坏、平均、最好三种情况来分析了算法的复杂度,得出结论,一般使用最坏情况来评估算法的复杂度。

在第4节,我们通过动态数组的插入元素及经典快速排序的时间复杂度,解释了有的时候不能使用最坏情况来评估算法的复杂度。

在第5节,我们从读音、数学、通俗理解三个方面分析了各种表示算法复杂度的符号,得出结论还是使用大O比较香,大O代表了算法的上界,它与前面讲到的最坏情况往往是对应的。

所以,这里所说的套路也是针对大部分情况,也就是最坏情况,对于一些个例,比如经典快排,我们虽然也是使用大O表示他们的复杂度,但是,其实是一种均摊的复杂度。

好了,让我们看看计算算法复杂度的套路到底是什么吧。

套路

我将计算算法复杂度的套路归纳为以下五步:

  1. 明确输入规模n;
  2. 考虑最坏情况或均摊情况,如果最坏情况为个例,那就是均摊;
  3. 计算算法执行的次数与n的关系,并用函数表示出来;
  4. 去除低阶项;
  5. 去除常数项;

比如,对于在数组中查找指定元素的操作:

  1. 输入规模为数组的长度n;
  2. 考虑最坏情况为目标元素不在数组中;
  3. 算法的执行次数为遍历所有数组元素,也就是n次,用函数表示f(n) = n;
  4. 去除低阶项,没有低阶项,还是n;
  5. 去除常数项,没有常数项,还是n;

所以,在数组中查找指定元素的时间复杂度为O(n)。

OK,使用这种方式可以很快的计算出算法的复杂度,也不需要进行额外的计算,非常快捷高效。

常见的复杂度

上面我们说了,复杂度的计算就是计算与输入规模n的关系,所以,我们想想数学中关于n的函数就能得出常见的复杂度了,我绘制了一张表格:

与n的关系

英文释义

复杂度

示例

常数(不相关)

Constant

O(1)

数组按索引查找元素

对数相关

Logarithmic

O(logn)

二分查找

线性相关

Linear

O(n)

遍历数组的元素

超线性相关

Superlinear

O(nlogn)

归并排序、堆排序

多项式相关

Polynomial

O(n^c)

冒泡排序、插入排序、选择排序

指数相关

Exponential

O(c^n)

汉诺塔

阶乘相关

Factorial

O(n!)

行列式展开

n的n次方

O(n^n)

不知道有没有这种算法

在这张表中,复杂度是依次增加的,可以看到常数复杂度O(1)无疑是最好的,让我们用一张图来直观感受下:

后记

本节,我们一起学习了复杂度分析的套路以及常见的复杂度,到目前为止,我们不管是举例还是讲解基本上都在说时间复杂度。

那么,空间复杂度又是什么呢?空间与时间之间如何权衡呢?

下一节,我们接着聊。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 彤哥读源码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
针对封装数组的简单复杂度分析
此处的复杂度分析主要是指时间复杂度分析,算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否。
wfaceboss
2019/04/08
3590
针对封装数组的简单复杂度分析
Python 算法基础篇:大O符号表示法和常见时间复杂度分析
在分析和比较算法的性能时,时间复杂度是一项重要的指标。而大 O 符号表示法是用来描述算法时间复杂度的常见表示方法。本篇博客将为你介绍大 O 符号表示法的概念以及常见的时间复杂度分析,同时通过 Python 代码示例来演示它们的应用。
小蓝枣
2023/07/24
6530
Python 算法基础篇:大O符号表示法和常见时间复杂度分析
深入理解时间与空间复杂度分析
时间与空间复杂度分析是计算机科学领域中的重要概念,对于算法和数据结构的学习以及编程性能优化至关重要。本文将更深入地探讨时间与空间复杂度,并介绍它们在实际编程中的应用。
海拥
2023/09/15
2590
深入理解时间与空间复杂度分析
什么情况下不能使用最坏情况评估算法的复杂度?
上一节,我们从最坏、平均、最好三种情况分析了算法的复杂度,得出结论,通常来说,使用最坏情况来评估算法的复杂度完全够用了。
彤哥
2020/07/23
5750
算法时间复杂度分析(一)
金庸武侠中描述一种武功招式的时候,经常会用到 “快、准、狠” 这3个字眼。同样,在计算机中我们衡量一种算法的执行效率的时候也会考量3个方面:“快、省、稳”。
全栈程序员站长
2022/08/28
4960
算法时间复杂度分析(一)
解惑3:时间频度,算法时间复杂度[通俗易懂]
要理解时间复杂度,需要先理解时间频度,而时间频度简单的说,就是算法中语句的执行次数。
全栈程序员站长
2022/09/23
8210
解惑3:时间频度,算法时间复杂度[通俗易懂]
时间复杂度、空间复杂度、算法的稳定性说明以及示例
时间复杂度是评估算法性能的一种方式,主要衡量的是算法在运行时所需要的时间或者操作的次数。在计算机科学中,我们通常用大O表示法来描述时间复杂度。
红目香薰
2023/12/08
4360
时间复杂度、空间复杂度、算法的稳定性说明以及示例
【数据结构】复杂度的重要性—–决定程序运行的效率
在我们写算法的时候,常常会需要考虑一个问题:这个算法好不好?而这个“好”实际上就取决于是算法的复杂度。
Skrrapper
2024/06/18
940
「时间」与「空间」复杂度
算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,比如排序就有前面的十大经典排序和几种奇葩排序,虽然结果相同,但在过程中消耗的资源和时间却会有很大的区别,比如快速排序与猴子排序:)。
小小詹同学
2019/11/12
6800
佩奇学编程 | 复杂度分析原来这么简单
-------------------------------------------
小小詹同学
2019/11/12
6010
关于时间复杂度和空间复杂度的问题
对于程序员来说,了解算法的时间复杂度和空间复杂度是至关重要的。时间复杂度和空间复杂度是评估算法性能的指标,可以帮助我们预估算法的执行时间和资源消耗情况。
一条晒干的咸鱼
2024/11/19
1030
关于时间复杂度和空间复杂度的问题
来来来,让咱重新认识一下算法的复杂度!
大家好,我是多选参数的程序锅,一个正在“研究”操作系统(主要是容器这块)、学数据结构和算法以及 Java 的硬核菜鸡。今天这篇主要是讲算法的时间、空间复杂度,参考来源主要是王争老师的专栏《数据结构与算法之美》以及程序锅去年上课时老师的课件。
syy
2020/10/27
4540
来来来,让咱重新认识一下算法的复杂度!
数据结构初阶——算法复杂度超详解
数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用,所以我们要学各式各样的数据结构, 如:线性表、树、图、哈希等
fhvyxyci
2024/09/24
1870
数据结构初阶——算法复杂度超详解
如何从最坏、平均、最好的情况分析复杂度?
但是,如果遵循严格的渐近分析法,需要掌握大量数学知识,这无疑给我们评估算法的优劣带来了很大的挑战。
彤哥
2020/07/22
1.1K0
【初阶数据结构】算法复杂度
对于我们所要解决的问题来说,解决的方法各有不同,每个人各有各的道理,并且受制于所用的设备的性能环境不同,我们很难精确比较一些方法不太明显的差别,因此,如何脱离环境直接衡量一个算法本身的好坏呢?比如对于以下斐波那契数列:
ZLRRLZ
2024/12/13
1240
【初阶数据结构】算法复杂度
算法笔记(七):复杂度分析(一)
   以输入规模n为自变量建立的时间复杂度实际上还是较复杂的,例如an2+bn+c+1,不仅与输入规模有关,还与系统a、b和c有关。此时对该函数进一步抽象,仅考虑运行时间的增长率或称为增长的量级,如忽略上式中的常量、低阶项、高阶项的系数,仅考虑n2。当输入规模大到只有与运行时间的增长量级有关的时,就是在研究算法的渐进效率。也就是说,从极限角度看,只关心算法运行时间如何随着输入规模的无限增长而增长。
free赖权华
2018/10/15
6080
【数据结构与算法基础】——算法复杂度
算法在编写成可执行程序后,运行时消耗时间和空间资源。因此,一般从时间和空间两个维度来衡量,即时间复杂度和空间复杂度。
星辰与你
2024/10/17
1090
【数据结构与算法基础】——算法复杂度
数据结构与算法:复杂度
实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。
用户11029103
2024/03/19
1640
数据结构与算法:复杂度
深入理解算法效率:时间复杂度与空间复杂度
在现代计算机科学和编程中,算法的效率至关重要。算法效率不仅影响程序的运行时间,还直接关系到程序的内存使用情况。为了评估和优化算法,我们常用两个主要指标:时间复杂度和空间复杂度。本文将详细介绍这两个概念,并通过C语言示例来解释它们的实际应用。
平凡之路.
2024/10/09
3780
深入理解算法效率:时间复杂度与空间复杂度
【C语言入门数据结构】时间复杂度和空间复杂度
数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组方法”。 数据结构是为算法服务的,算法是要作用在特定的数据结构上的。
阿伟@t
2023/10/10
3250
【C语言入门数据结构】时间复杂度和空间复杂度
相关推荐
针对封装数组的简单复杂度分析
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档