算法的复杂度

算法的复杂度:算法

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

时间复杂度:

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

排序:函数

内部排序(只使用内存):
	交换排序:
		冒泡排序
		快速排序
		
	选择排序:
		简单选择排序
		堆排序
		
	插入排序:
		直接插入排序
		希尔排序
		
	归并排序

外部排序(内存和外存结合使用)
相关文章
相关标签/搜索