时间复杂度,在衡量算法效率时,经常被提及。
作为衡量算法效率的重要指标,我们需要对时间复杂度有一个更清晰和系统的认识。
本文主要介绍了时间复杂度的含义及其的计算方法。
算法基本概念
一个算法的效率主要从两方面来衡量,即执行所需的时间长短和所需的存储空间大小。也就是算法中的两个复杂度:
- 时间复杂度:评估执行程序所需的时间,可以估算出程序对处理器的使用程度。
- 空间复杂度:评估执行程序所需的存储空间,可以估算出程序对计算机内存的使用程度。
在算法的效率研究中,因为时间复杂度比空间复杂度更容易产生问题。因此主要研究的是时间复杂度,在不特别说明的情况下,算法的复杂度通常是指算法的时间复杂度。
时间复杂度
时间频度
一个算法花费的时间与算法中语句的执行次数成正比。可将算法中的语句执行次数称为时间频度或语句频度。记为T(n)
。其中n
为问题的规模,类似需要排序的数组的长度,需要查询的元素的多少等。
当n
不断变化时,时间频度T(n)
也不断变化。也就是说时间频度T(n)
是关于问题规模n
的一个函数。
时间复杂度
为了呈现时间频度T(n)
随问题规模n
的变化而变化时呈现出的规律,引入了时间复杂度的概念。
若存在某个辅助函数f(n)
,使得当n
趋近于无穷大时,T(n)/f(n)
的极限值为不为0的常数,则称f(n)
为T(n)
的同数量级函数(最高阶数相同)。而此时有T(n)=O(f(n))
,将O(f(n))
称为算法的渐进时间复杂度,简称时间复杂度。表示随着问题规模n
的增大,算法执行所需要的时间的增长可以用O(f(n))
表示。
在判断
f(n)
函数随n
的变化而变化的规律时,最好和最准确的方法当然是求出函数的一阶导数。但在算法上,因为只需要大体了解算法的优劣即可,因此可以直接考虑f(n)
函数中对增长速度影响最大的一项,即函数的最高阶数来评估算法的优劣。大O符号O()
就是这样一种运算符号,作用为去除其他低阶项和与最高阶项相乘的常数,只保留最高阶项。
时间复杂度的计算
计算时间复杂度时,根据O(f(n))
的定义,可得,f(n)
去掉低阶项和最高阶项的常数后,即可得出时间复杂度。一般最高阶项可能值如下:
- 常数阶
O(1)
- 线性阶
O(n)
- 平方阶
O(n²)
- 平方根阶
O(√n)
- 立方阶
O(n³)
- 对数阶
O(logn)
- 指数阶
O(2ⁿ)
- 线性对数阶
O(nlogn)
- 阶乘阶
O(n!)
各阶数下时间频度和问题规模的曲线如下:
常用时间复杂度按照所需时间从小到大排序为:
1 | O(1) < O(logn) < O(n) < O(nlogn) < O(n²) < O(n³) < O(2ⁿ) < O(n!) |