大O符号和代码效率:花最少的精力得到最大的产出

    科技2026-06-09  3

    全文共1654字,预计学习时长5分钟

    图源:unsplash

     

    首先,什么是代码效率?这个热门术语在各种会议、讲座和博客中已经被用滥了。它被广泛用于描述代码的速度和可靠性,与软件的算法效率和运行时执行速度密切相关。在当下,这个人工智能、可扩展性和机器学习处于软件开发前沿的时代,这个话题始终被反复提及。

     

    那么什么是大O符号呢?在计算机科学领域中,它是用来描述算法的性能和效率以及分析整体性能的工具,被用于确定完成算法执行所需时间或空间的最坏情况。大O符号是基于性能来确定函数最佳实现的宝贵工具,它提供了一种正式的说法,用于讨论算法的运行时间如何根据输入而变化。

     

    时间复杂度vs空间复杂度

     

    大O符号用于度量时间复杂度和空间复杂度。

     

    ·        时间复杂度:为完成整体操作而必须执行的小操作的数量。

    ·        空间复杂度:运行算法中的代码所需的额外内存量——通常被称为辅助空间复杂度,也就是说它仅指代算法所占用的空间,不包括输入所占用的空间。

     

    复杂度类型

     

    时间复杂度可以分为几种不同的类型。下列是几种较常见类型:

     

    ·        常数阶/O(1):无论数据集多大,始终在相同的时间或空间中执行。

    ·        对数阶/O(log n):为获得给定数据,固定数据所必须增加的幂。

    ·        线性阶/ O(n):复杂度与输入数据的大小直接相关。

    ·        线性对数阶/ O(nlog n):对输入中的每一项执行O(log n)操作。

    ·        平方阶/O(n²):性能与输入数据的平方大小成正比。

     

    图源:Colt Steele的JavaScript算法和数据结构大师班

     

    有助于确定时空复杂度的一般规则

     

    这些规则是可以起作用的方向,但不保证每次都有效果。

     

    确定时间复杂度:

     

    ·        算术运算恒定

    ·        变量赋值为常数

    ·        数组(通过索引)或对象(通过键)中的访问元素是常量

    ·        在循环中,复杂度是循环的长度乘以循环内发生的任何事情的复杂度。

     

    确定空间复杂度:

     

    ·        大多数基元是常量空间。(布尔常量,数字,未定义变量,空。)

    ·        字符串需要O(n)空间,其中n是字符串的长度。

    ·        引用类型通常为O(n),其中n是对象的数组长度或键数。

    来看一些例子

     

     

    在上面的例子中,操作数量与n大致成比例增长。因此,如果n是100,那么i将被加到100倍。addUpToN的时间复杂度将是线性阶/O(n)。

     

    至于空间复杂度,addUpToN有2个变量赋值(total和i)。当循环完成其操作时,这些变量会被重新分配,但无论输入数据集的大小如何,这些变量占用的空间都保持不变。空间复杂度将为常数阶/O(1)。

     

     

    这里有3个简单的运算(乘、加、除)。不管n的大小如何,操作的数量保持不变。addUpToNAgain的时间复杂度为常数阶/O(1)。

     

    此时只会返回一个值。输入值不会改变分配给此函数的空间。因此,空间复杂度也是线性阶/O(1)。

     

     

    在这里,有一个线性阶O(n)运算嵌套在另一个O(n)运算中。当输入的n值缩放时,运行时间随之发生变动。sumEachPair的时间复杂度是平方阶/O(n²)。

     

    回顾一下前文所述的一般规则,这个案例正好对应了其中一条:引用类型一般是O(n),其所需的空间量与输入值直接相关。空间复杂度则为线性阶/O(n)。

     

    想分析算法的性能,可以使用大O符号帮助分析,大O符号可以加深对算法的时间和空间要求的理解。

     

    总之,程序员要理解好所编写的代码的时空复杂度,进而确保运行时间和执行速度达到最快,同时保证代码始终保持在其运行系统的实体存储范围内,“修炼”成一个高效的程序员。

     

    推荐阅读专题

    留言点赞发个朋友圈

    我们一起分享AI学习与发展的干货

    编译组:郝岩君、黄壹格

    相关链接:

    https://medium.com/swlh/be-an-effective-and-efficient-programmer-aabde20c673e

    如转载,请后台留言,遵守转载规范

    推荐文章阅读

    ACL2018论文集50篇解读

    EMNLP2017论文集28篇论文解读

    2018年AI三大顶会中国学术成果全链接

    ACL2017论文集:34篇解读干货全在这里

    10篇AAAI2017经典论文回顾

    长按识别二维码可添加关注

    读芯君爱你

    Processed: 0.010, SQL: 9