时间复杂度
由力扣算法题转而查资料记录,链接为https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-solution/
描述该算法的运行时间。通常使用算法的最坏情况复杂度,记为T(n)。有着T(n) =O(n) 的算法被称作“线性时间算法”,我工作中最常使用的就是O(n)。
概述
一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
复杂度
算法复杂度分为时间复杂度和空间复杂度。计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度。但是现在考虑计算机的空间资源已经显得不那么重要了,所以我们一般重点考虑时间复杂度对于我们的影响。
常数时间
若对于一个算法, T(n)的上界与输入大小无关,则称其具有常数时间,记作 O(1) 时间。一个例子是访问数组中的单个元素,因为访问它只需要一条指令。但是,找到无序数组中的最小元素则不是,因为这需要遍历所有元素来找出最小值。这是一项线性时间的操作,或称 O(n) 时间。
对数时间
常见的具有对数时间的算法有二叉树的相关操作和二分搜索。
递归地将字符串砍半并且输出是这个类别函数的一个简单例子。它需要O(log n)的时间因为每次输出之前我们都将字符串砍半。 这意味着,如果我们想增加输出的次数,我们需要将字符串长度加倍。
若算法的T(n) =O(logn),则称其具有对数时间。由于计算机使用二进制的记数系统,对数常常以2为底(即log2n,有时写作lgn)。然而,由对数的换底公式,logan和logbn只有一个常数因子不同,这个因子在大O记法中被丢弃。因此记作O(logn),而不论对数的底是多少,是对数时间算法的标准记法。