算法的复杂度

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

	时间复杂度:

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

		
		注意:一般总是考虑最坏的时间复杂度,以保证算法的运行时间不会比它更长。
		
		
	空间复杂度:

		概念:
			1)算法所消耗的存储空间是问题规模n的函数,我们使用该函数来分析算法的空间复杂度。

		表示:
			1)算法的空间复杂度记为:S(n)=O(g(n)) 
			
			
	
	
排序:
	
	内部排序(只使用内存):
		交换排序:
			冒泡排序
			快速排序
			
		选择排序:
			简单选择排序
			堆排序
			
		插入排序:
			直接插入排序
			希尔排序
			
		归并排序
	
	外部排序(内存和外存结合使用)
		
		
		
		
		
		
		


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值