概念:算法效率的度量是通过时间复杂度和空间复杂度来描述的。
时间复杂度:
概念:
1)一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记作T(n),它是该算法问题规模n的函数,时间复杂度主要分析T(n)的数量级。
2)算法中基本运算(注:基本运算是指最深层循环内的语句)的频度与T(n)同数量级,故我们通常 用算法中基本运算的频度f(n)来分析算法的时间复杂度。
表示:
1)算法的时间复杂度记为:T(n)=O(f(n))
2)其中"O"的定义:若T(n)和f(n)是定义在正整数集合上的两个函数,则存在正常数C和n0,使得当n>=n0时,都满足0<=T(n)<=C*f(n)
3)取f(n)中随n增长最快的项(并将其系数置为1)作为时间复杂度的度量。
eg:若f(n)=a*n^3 + b*n^2 + c*n ,则该算法的时间复杂度为O(n^3)
4)在分析一个程序的时间复杂度时,一般遵循以下两条规则:
1>加法规则
T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))
2>乘法规则
T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O(f(n)*g(n))
常见的时间复杂度:
O(1)<O(logN)<O(N)<O(NlogN)<O(N^2)<O(N^3)<O(2^N)<O(N!)<O(N^N)
1)常数级别:O(1)
典型代码:普通语句
eg: a = b + c; // 该语句的运行时间不依赖于N
2)对数级别:O(logN)
典型代码:二分查找
说明:
若a^x=N,则x叫做以a为底N的对数,记作:x=logaN,其中a叫做对数的底数,N叫做真数。
对数的底数和增长的数量级无关(因为不同的底数相当于一个常数因子,即:loga N = b/a * Logb N),故我们用logN表示对数增长级别。
3)线性级别:O(N)
典型代码:单层for循环
eg:找出集合中的最大元素。
4)线性对数级别:O(NlogN)
典型代码:分治法
eg:归并排序
5)平方级别:O(N^2)
典型代码:两层循环
eg:选择排序、插入排序
6)立方级别:O(N^3)
典型代码:三层循环
7)指数级别:O(2^N)
典型代码:分治法
eg:归并排序
注意:一般总是考虑最坏的时间复杂度,以保证算法的运行时间不会比它更长。
空间复杂度:
概念:
1)算法所消耗的存储空间是问题规模n的函数,我们使用该函数来分析算法的空间复杂度。
表示:
1)算法的空间复杂度记为:S(n)=O(g(n))