Fork me on GitHub

算法学习(一):时间复杂度

时间复杂度,在衡量算法效率时,经常被提及。

作为衡量算法效率的重要指标,我们需要对时间复杂度有一个更清晰和系统的认识。

本文主要介绍了时间复杂度的含义及其的计算方法。

算法基本概念

一个算法的效率主要从两方面来衡量,即执行所需的时间长短所需的存储空间大小。也就是算法中的两个复杂度:

  • 时间复杂度:评估执行程序所需的时间,可以估算出程序对处理器的使用程度。
  • 空间复杂度:评估执行程序所需的存储空间,可以估算出程序对计算机内存的使用程度。

在算法的效率研究中,因为时间复杂度比空间复杂度更容易产生问题。因此主要研究的是时间复杂度,在不特别说明的情况下,算法的复杂度通常是指算法的时间复杂度。

时间复杂度

时间频度

一个算法花费的时间与算法中语句的执行次数成正比。可将算法中的语句执行次数称为时间频度语句频度。记为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

常用时间复杂度按照所需时间从小到大排序为:

1
O(1) < O(logn) < O(n) < O(nlogn) < O(n²) < O(n³) < O(2ⁿ) < O(n!)
----本文结束感谢阅读----