算法的复杂度

概念:算法效率的度量是通过时间复杂度和空间复杂度来描述的。

时间复杂度:

概念:
	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))

猜你喜欢

转载自my.oschina.net/u/1399755/blog/1650246