当前位置: 首页 > 科技观察

大O符号与代码效率:花最少的力气得到最多的输出

时间:2023-03-16 14:44:20 科技观察

本文转载自公众号《读书芯》(ID:AI_Discovery)。首先,什么是代码效率?这个流行语在各种会议、讲座和博客中被过度使用。它广泛用于描述代码的速度和可靠性,与软件的算法效率和运行时执行速度密切相关。在这个人工智能、可扩展性和机器学习处于软件开发前沿的时代,这个话题反复出现。那么什么是大O表示法呢?在计算机科学领域,它是用来描述算法的性能和效率以及分析整体性能的工具。它用于确定完成算法执行所需的最坏情况时间或空间。大O表示法是一种非常宝贵的工具,可用于根据性能确定函数的最佳实现,提供一种正式的方式来讨论算法的运行时间如何随输入而变化。时间复杂度与空间复杂度大O符号用于衡量时间复杂度和空间复杂度。时间复杂度:完成整个操作必须执行的小操作的数量。空间复杂度:运行算法中的代码所需的额外内存量——通常称为辅助空间复杂度,这意味着它仅指算法占用的空间,而不是输入占用的空间。复杂度的类型时间复杂度可以分为几种不同的类型。以下是一些比较常见的类型:Constant-order/O(1):无论数据集有多大,总是在同一时间或空间执行。对数阶数/O(logn):为了得到给定的数据,固定数据必须提升的幂次。线性阶数/O(n):复杂度与输入数据的大小直接相关。线性对数阶/O(nlogn):对输入中的每一项执行O(logn)操作。平方阶/O(n2):性能与输入数据的平方大小成正比。图片来源:ColtSteele的JavaScriptAlgorithmsandDataStructuresMasterclass帮助确定时空复杂度的一般规则这些规则是可以奏效的方向,但不能保证每次都奏效。确定时间复杂度:算术运算常量变量赋值是常量访问数组(按索引)或对象(按键)中的元素是常量在循环中,复杂度是循环的长度乘以循环内发生的任何事情的复杂度环形。确定空间复杂度:大多数原语都是常量空间。(布尔常量、数字、未定义变量、空。)字符串需要O(n)空间,其中n是字符串的长度。引用类型通常是O(n),其中n是对象的数组长度或键数。让我们看一些例子。资料来源:ColtSteele的JavaScript算法和数据结构大师班至于空间复杂度,addUpToN有2个变量赋值(total和i)。这些变量在循环完成其操作时被重新分配,但无论输入数据集的大小如何,这些变量占用的空间都保持不变。空间复杂度将是常数阶/O(1)。这里有3个简单的操作(乘、加、除)。无论n的大小如何,操作数都保持不变。addUpToNAgain的时间复杂度是常数阶/O(1)。此时只会返回一个值。输入值不会改变分配给这个函数的空间。因此,空间复杂度也是线性阶/O(1)。这里,有一个线性顺序O(n)操作嵌套在另一个O(n)操作中。随着n的输入值缩放,运行时间相应地变化。sumEachPair的时间复杂度是平方阶/O(n2)。回顾上面描述的一般规则,这种情况对应其中之一:引用类型一般是O(n),所需的空间大小与输入值直接相关。空间复杂度为线性阶/O(n)。如果要分析算法的性能,可以使用大O表示法来帮助分析。大O表示法可以加深对算法时空要求的理解。总之,程序员必须了解自己编写的代码的时空复杂度,这样才能保证最快的运行时间和执行速度,同时保证代码始终保持在操作系统的物理存储范围内,并“练”成高效的节目员。