概念:算法效率的度量是经过时间复杂度和空间复杂度来描述的。算法
时间复杂度:函数
概念: 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) 注意:通常老是考虑最坏的时间复杂度,以保证算法的运行时间不会比它更长。
空间复杂度:code
概念: 1)算法所消耗的存储空间是问题规模n的函数,咱们使用该函数来分析算法的空间复杂度。 表示: 1)算法的空间复杂度记为:S(n)=O(g(n))