广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >如何掌握时间复杂度与空间复杂度
  • 138
分享到

如何掌握时间复杂度与空间复杂度

2024-04-02 19:04:59 138人浏览 泡泡鱼
摘要

这篇文章主要讲解了“如何掌握时间复杂度与空间复杂度”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何掌握时间复杂度与空间复杂度”吧!前言算法(AlGorit

这篇文章主要讲解了“如何掌握时间复杂度与空间复杂度”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何掌握时间复杂度与空间复杂度”吧!

前言

算法(AlGorithm)是指用来操作数据、解决程序问题的一组方法。算法是大厂、外企面试的必备项,也是每个高级程序员的必备技能。针对同一问题,可以有很多种算法来解决,但不同的算法在效率和占用存储空间上的区别可能会很大。

那么,通过什么指标来衡量算法的优劣呢?其中,上面提到的效率可以用算法的时间复杂度来描述,而所占用的存储空间可以用算法的空间复杂度来描述。

  • 时间复杂度:用于评估执行程序所消耗的时间,可以估算出程序对处理器的使用程度。

  • 空间复杂度:用于评估执行程序所占用的内存空间,可以估算出程序对计算机内存的使用程度。

在实践中或面试中,我们不仅要能够写出具体的算法来,还要了解算法的时间复杂度和空间复杂度,这样才能够评估出算法的优劣。当时间复杂度和空间复杂度无法同时满足时,还需要从中选取一个平衡点。

一个算法通常存在最好、平均、最坏三种情况,我们一般关注的是最坏情况。最坏情况是算法运行时间的上界,对于某些算法来说,最坏情况出现的比较频繁,也意味着平均情况和最坏情况一样差。

通常,时间复杂度要比空间复杂度更容易出问题,更多研究的是时间复杂度,面试中如果没有特殊说明,讲的也是时间复杂度。

时间复杂度

要获得算法的时间复杂度,最直观的想法是把算法程序运行一遍,自然可以获得。但实践中往往受限于测试环境、数据规模等因素,直接测试算法要么难以实现,要么误差较大,而且理论上也没必要对每个算法都进行一遍测试,只需要找到一种评估指标,获得算法执行所消耗时间的基本趋势即可。

时间频度

通常,一个算法所花费的时间与代码语句执行的次数成正比,算法执行语句越多,消耗的时间也就越多。我们把一个算法中的语句执行次数称为时间频度,记作T(n)。

渐进时间复杂度

在时间频度T(n)中,n代表着问题的规模,当n不断变化时,T(n)也会不断地随之变化。那么,如果我们想知道T(n)随着n变化时会呈现出什么样的规律,那么就需要引入时间复杂度的概念。

一般情况下,算法基本操作的重复执行次数为问题规模n的某个函数,也就是用时间频度T(n)表示。如果存在某个函数f(n),使得当n趋于无穷大时,T(n)/f(n)的极限值是不为零的常数,那么f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称为时间复杂度。

渐进时间复杂度用大写O表示,所以也称作大O表示法。算法的时间复杂度函数为:T(n)=O(f(n));

T(n)=O(f(n))表示存在一个常数C,使得在当n趋于正无穷时总有 T(n) ≤ C *  f(n)。简单来说,就是T(n)在n趋于正无穷时最大也就跟f(n)差不多大。也就是说当n趋于正无穷时T(n)的上界是C *  f(n)。其虽然对f(n)没有规定,但是一般都是取尽可能简单的函数。

常见的时间复杂度有:O(1)常数型;O(log n)对数型,O(n)线性型,O(nlog  n)线性对数型,O(n2)平方型,O(n3)立方型,O(nk)k次方型,O(2n)指数型。

如何掌握时间复杂度与空间复杂度

上图为不同类型的函数的增长趋势图,随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。

常见的算法时间复杂度由小到大依次为:&Omicron;(1)<&Omicron;(log n)<&Omicron;(n)<&Omicron;(nlog  n)<&Omicron;(n2)<&Omicron;(n3)<&hellip;<&Omicron;(2^n)<&Omicron;(n!)。

值得留意的是,算法复杂度只是描述算法的增长趋势,并不能说一个算法一定比另外一个算法高效。这要添加上问题规模n的范围,在一定问题规范范围之前某一算法比另外一算法高效,而过了一个阈值之后,情况可能就相反了,通过上图我们可以明显看到这一点。这也就是为什么我们在实践的过程中得出的结论可能上面算法的排序相反的原因。

如何推导时间复杂度

上面我们了解了时间复杂度的基本概念及表达式,那么实践中我们怎么样才能通过代码获得对应的表达式呢?这就涉及到求解算法复杂度。

求解算法复杂度一般分以下几个步骤:

  • 找出算法中的基本语句:算法中执行次数最多的语句就是基本语句,通常是最内层循环的循环体。

  • 计算基本语句的执行次数的数量级:只需计算基本语句执行次数的数量级,即只要保证函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,使注意力集中在最重要的一点上:增长率。

  • 用大&Omicron;表示算法的时间性能:将基本语句执行次数的数量级放入大&Omicron;记号中。

其中用大O表示法通常有三种规则:

  • 用常数1取代运行时间中的所有加法常数;

  • 只保留时间函数中的最高阶项;

  • 如果最高阶项存在,则省去最高阶项前面的系数;

下面通过具体的实例来说明以上的推断步骤和规则。

时间复杂度实例

常数阶O(1)

无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是O(1),如:

int i = 1; int j = 2; int k = 1 + 2;

上述代码执行时,单个语句的频度均为1,不会随着问题规模n的变化而变化。因此,算法时间复杂度为常数阶,记作T(n)=O(1)。这里我们需要注意的是,即便上述代码有成千上万行,只要执行算法的时间不会随着问题规模n的增长而增长,那么执行时间只不过是一个比较大的常数而已。此类算法的时间复杂度均为O(1)。

对数阶O(log n)

先来看对应的示例代码:

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

在上述代码中,语句①的频度为1,可以忽略不计。

语句②我们可以看到它是以2的倍数来逼近n,每次都乘以2。如果用公式表示就是122*2&hellip;*2  <=n,也就是说2的x次方小于等于n时会执行循环体,记作2^x <=  n,于是得出x<=logn。也就是说上述循环在执行logn次之后,便结束了,因此上述代码的时间复杂度为O(log n)。

其实上面代码的时间复杂度公式如果精确的来讲应该是:T(n) = 1 + O(log  n),但我们上面已经讲到对应的原则,“只保留时间函数中的最高阶项”,因此记作O(log n)。

线性阶O(n)

示例代码:

int j = 0; // ① for (int i = 0; i < n; i++) { // ②    j = i; // ③    j++; // ④ }

上述代码中,语句①的频度为1,②的频度为n,③的频度为n-1,④的频度为n-1,因此整个算法可以用公式T(n)=1+n+(n-1)+(n-1)来表示。进而可以推到T(n)=1+n+(n-1)+(n-1)=3n-1,即O(n)=3n-1,去掉低次幂和系数即O(n)=n,因此T(n)=O(n)。

在上述代码中for循环中的代码会执行n遍,因此它消耗的时间是随着n的变化而成线性变化的,因此这类算法都可以用O(n)来表示时间复杂度。

线性对数阶O(nlogN)

示例代码:

for (int m = 1; m < n; m++) {    int i = 1; // ①    while (i <= n) {       i = i * 2; // ②    } }

线性对数阶要对照对数阶 O(log  n)来进行理解。上述代码中for循环内部的代码便是上面讲到对数阶,只不过在对数阶的外面套了一个n次的循环,当然,它的时间复杂度就是n*O(log  n)了,于是记作O(nlog n)。

平方阶O(n&sup2;)

示例代码:

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

平方阶可对照线性阶来进行理解,我们知道线性阶是一层for循环,记作O(n),此时等于又嵌套了一层for循环,那么便是n * O(n),也就是O(n *  n),即O(n^2)。

如果将外层循环中的n改为m,即:

int k = 0; for (int i = 0; i < m; i++) {    for (int j = 0; j < n; j++) {       k++;    } }

那么,对应的时间复杂度便为:O(m * n)。

同理,立方阶O(n&sup3;)、K次方阶O(n^k),只不过是嵌套了3层循环、k层循环而已。

排序算法对比

上面介绍了各种示例算法的时间复杂度推理过程,对照上面的时间复杂度以及算法效率的大小,来看一下我们常见的针对排序的几种算法的时间复杂度对比。

如何掌握时间复杂度与空间复杂度

空间复杂度

最后,我们再了解一下空间复杂度。空间复杂度主要指执行算法所需内存的大小,用于对程序运行过程中所需要的临时存储空间的度量,这里的空间复杂度同样是预估的。

程序执行除了需要存储空间、指令、常数、变量和输入数据外,还包括对数据进行操作的工作单元和存储计算所需信息的辅助空间。存储空间通常包括:指令空间(即代码空间)、数据空间(常量、简单变量)等所占的固定部分和动态分配、递归栈所需的可变空间。其中可变空间与算法有关。

一个算法所需的存储空间用f(n)表示。S(n)=O(f(n))其中n为问题的规模,S(n)表示空间复杂度。

下面看两个常见的空间复杂度示例:空间复杂度O(1)和O(n)。

空间复杂度 O(1)

空间复杂度为O(1)的情况的示例代码与时间复杂度为O(1)的实例代码一致:

int i = 1; int j = 2; int k = 1 + 2;

上述代码中临时空间并不会随着n的变化而变化,因此空间复杂度为O(1)。总结一下就是:如果算法执行所需要的临时空间不随着某个变量n的大小而变化,此算法空间复杂度为一个常量,可表示为  O(1),即 S(n) = O(1)。

空间复杂度 O(n)

示例代码:

int j = 0; int[] m = new int[n]; for (int i = 1; i <= n; ++i) {    j = i;    j++; }

上述代码中,只有创建int数组分配空间时与n的大小有关,而for循环内没有再分配新的空间,因此,对应的空间复杂度为S(n) = O(n)。

感谢各位的阅读,以上就是“如何掌握时间复杂度与空间复杂度”的内容了,经过本文的学习后,相信大家对如何掌握时间复杂度与空间复杂度这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 如何掌握时间复杂度与空间复杂度

本文链接: https://www.lsjlt.com/news/84083.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何掌握时间复杂度与空间复杂度
    这篇文章主要讲解了“如何掌握时间复杂度与空间复杂度”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何掌握时间复杂度与空间复杂度”吧!前言算法(Algorit...
    99+
    2022-10-19
  • JavaScript时间复杂度和空间复杂度
    目录前言时间复杂度空间复杂度前言 在上一篇文章中介绍了算法和数据结构的基本概念,这篇文章来介绍一下时间复杂度和空间复杂度。 时间复杂度和空间复杂度是衡量一个算法是否优秀的标准,通常我...
    99+
    2022-11-13
  • Java 精炼解读时间复杂度与空间复杂度
    目录前言:一、算法效率二、时间复杂度1.时间复杂度概念2.大O的渐进表示法计算时间复杂度  三、空间复杂度 总结:前言: 所谓的复杂度就是衡量算法的效率,衡量算发...
    99+
    2022-11-13
  • Java时间复杂度与空间复杂度实例分析
    本篇内容主要讲解“Java时间复杂度与空间复杂度实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java时间复杂度与空间复杂度实例分析”吧!一、算法效率算法效率分析分为两种:第一种是时间效...
    99+
    2023-06-29
  • 算法分类 ,时间复杂度 ,空间复杂度,优
        今天给大家带来一篇关于算法排序的分类,算法的时间复杂度,空间复杂度,还有怎么去优化算法的文章,喜欢的话,可以关注,有什么问题,可以评论区提问,可以与我私信,有什么好的意见,欢迎提出. 前言: 算法的复杂度分为时间复杂度与空间复杂...
    99+
    2023-01-30
    复杂度 算法 时间
  • 数据结构与算法—时间复杂度和空间复杂度
    目录 1. 什么是数据结构? 2.什么是算法? 3、算法的复杂度 4、时间复杂度 (1) 时间复杂度的概念:  (2) 大O的渐进表示法:  六个例题: (3) 时间复杂度对比:  两个例题:  OJ题分析时间复杂度 5、空间复杂度 (1...
    99+
    2023-10-24
    数据结构
  • C语言详细解析时间复杂度与空间复杂度
    目录一、概念1.1、算法效率1.2、时间复杂度1.3、空间复杂度二、计算2.1、大O的渐进表示法2.2、时间复杂度计算2.3、空间复杂度计算三、有复杂度要求的习题一、概念 1.1、算...
    99+
    2022-11-13
  • C语言时间复杂度与空间复杂度实例分析
    这篇文章主要介绍“C语言时间复杂度与空间复杂度实例分析”,在日常操作中,相信很多人在C语言时间复杂度与空间复杂度实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言时间复杂度与空间复杂度实例分析”的疑...
    99+
    2023-06-29
  • Java时间复杂度、空间复杂度的深入详解
    目录算法效率时间复杂度什么是时间复杂度推导大 O 阶的方法算法情况计算冒泡排序的时间复杂度计算二分查找的时间复杂度计算阶乘递归的时间复杂度计算斐波那契递归的时间复杂度空间复杂度计算冒...
    99+
    2022-11-12
  • JavaScript时间复杂度和空间复杂度实例分析
    本篇内容主要讲解“JavaScript时间复杂度和空间复杂度实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript时间复杂度和空间复杂度实例分析”吧!前言时间复杂度和空间复杂...
    99+
    2023-07-02
  • C语言三分钟精通时间复杂度与空间复杂度
    目录一、时间复杂度1)O(n)的含义2)复杂表达式的简化3)O(n)不一定优于O(n^2)​4)递归的时间复杂度二、空间复杂度1)O(1)空间复杂度​2)​​​​​​​O(n)空间复...
    99+
    2022-11-13
  • Java 数据结构之时间复杂度与空间复杂度详解
    目录算法效率时间复杂度什么是时间复杂度推导大 O 阶的方法算法情况计算冒泡排序的时间复杂度计算二分查找的时间复杂度计算阶乘递归的时间复杂度计算斐波那契递归的时间复杂度空间复杂度计算冒...
    99+
    2022-11-12
  • 如何解析Java 数据结构中时间复杂度与空间复杂度
    这篇文章给大家介绍如何解析Java 数据结构中时间复杂度与空间复杂度,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。算法效率在使用当中,算法效率分为两种,一是时间效率(时间复杂度),二是空间效率(空间复杂度)。时间复杂度...
    99+
    2023-06-25
  • C语言算法的时间复杂度和空间复杂度
    目录1.算法效率1.1 如何衡量一个算法的好坏1.2算法的复杂度2.时间复杂度2.1 时间复杂度的概念2.2 大O的渐进表示法2.3常见时间复杂度计算举例 3.空间复杂度4...
    99+
    2022-11-13
  • Java 关于时间复杂度和空间复杂度的深度刨析
    目录1.算法效率2.时间复杂度2.1时间复杂度的概念2.2大O的渐进表示法2.3常见时间复杂度计算2.3.1常用的时间复杂度量级2.3.2常见示例举例2.3.2示例答案及分析3.空间...
    99+
    2022-11-12
  • 数据结构--算法的时间复杂度和空间复杂度
    文章目录 算法效率时间复杂度时间复杂度的概念大O的渐进表示法计算实例 时间复杂度实例 常见复杂度对比例题 算法效率 算法效率是指算法在计算机上运行时所消耗的时间和资源。这是衡量算法...
    99+
    2023-09-08
    算法 数据结构 时间效率 复杂度
  • web算法的时间复杂度和空间复杂度是什么
    这篇文章主要介绍了web算法的时间复杂度和空间复杂度是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇web算法的时间复杂度和空间复杂度是什么文章都会有所收获,下面我们一起来...
    99+
    2022-10-19
  • Java数据结构通关时间复杂度和空间复杂度
    目录算法效率时间复杂度空间复杂度小结算法效率 算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被 称作空间复杂度。 时间复杂度主要衡量的...
    99+
    2022-11-13
  • C语言时间复杂度和空间复杂度实例分析
    今天小编给大家分享一下C语言时间复杂度和空间复杂度实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.时间复杂度:首先...
    99+
    2023-06-30
  • C语言数据结构的时间复杂度和空间复杂度
    目录一、数据结构前言        1.什么是数据结构:        2.什么是...
    99+
    2023-05-15
    C语言时间复杂度和空间复杂度 C语言时间复杂度 C语言空间复杂度
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作