前言
算法的效率主要取决于时间复杂度和空间复杂度,我们一步一步来搞懂算法时间复杂度。
定义
在计算机科学中,算法的时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。——维基百科
有点没搞懂?我们来用C++
简单举例来说明。
实例
include<iostream>
using namespace std;
int main()
{
int n = 10;
for (int k = 0; k < n; k++) {
cout<<"Hello World"<<endl;
}
return 0;
}
单位运行时间
为了计算时间复杂度,我们通常会估计算法的操作单元数量,每个单元运行的时间都是相同的。——维基百科
这段代码包括了5条语句,分别是int n = 10
、int k = 0
、k < n
、k++
、cout<<"Hello World"
。
前面已经讲了,时间复杂度是描述程序运行时间的,那我们就约定赋值语句int n = 10
每执行一次消耗的时间为1
个单位时间。由于判断语句n < k
总共要进行n+1
次,所以消耗时间为n+1
。同理可以得出:
在程序运行完后,总时间 T = 3*n+3
。
时间复杂度是一个函数
算法的时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。——维基百科
由于 T = 3*n+3
,所以T(n)可以看作是关于 n
的一个函数。n
可以认为是输入的字符数量,即自变量。
时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。——维基百科
但大多数程序的算法可没有那么简单,所以就要对函数进行简化。,这里涉及到一点极限思想。当输入值(可认为是输入的字符数量)是无穷的时候,我们 只需要定性的描述,不考虑函数的较低阶项和最高项系数 ,所以函数就变为 T(n)=n
。我们用大 O
来表示这种关系,即 O(n)
。
常见时间复杂度
时间复杂度可以用函数 T(n) 的自然特性加以分类,比如有着 T(n) = O(n)
的算法被称作“线性时间算法”
复杂度比较: O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!)
时间复杂度的计算
暂未更新...
声明
文章首发于 算法(1)之时间复杂度
本文参考了 维基百科-时间复杂度