渐进时间复杂度的计算_第1页
渐进时间复杂度的计算_第2页
渐进时间复杂度的计算_第3页
免费预览已结束,剩余10页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

时间复杂度计算首先了解一下几个概念。 一个是时间复杂度, 一个是渐近时间复杂度。 前者是某个算法的时间耗费, 它是该算法所求解问题规模n 的函数, 而后者是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。当我们评价一个算法的时间性能时, 主要标准就是算法的渐近时间复杂度, 因此, 在算法分析时,往往对两者不予区分,经常是将渐近时间复杂度t(n)=o(f(n) 简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度。此外,算法中语句的频度不仅与问题规模有关, 还与输入实例中各元素的取值相关。但是我们总是考虑在最坏的情况下的时间复杂度。 以保证算法的运行时间不会比它更长。常见的时间复杂度,按数量级递增排列依次为:常数阶o(1)、对数阶 o(log2n)、线性阶 o(n)、线性对数阶 o(nlog2n)、平方阶 o(n2)、立方阶 o(n3)、k 次方阶o(nk)、指数阶 o(2n)。1. 大 o 表示法定义设一个程序的时间复杂度用一个函数t(n) 来表示,对于一个查找算法,如下:int seqsearch( int a, const int n, const int x)-可编辑修改 -int i = 0;for (; ai != x & i n ; i+ ); if ( i = n) return -1;else return i;这个程序是将输入的数值顺序地与数组中地元素逐个比较,找出与之相等地元素。在第一个元素就找到需要比较一次,在第二个元素找到需要比较2 次, 在第 n 个元素找到需要比较n 次。对于有 n 个元素的数组, 如果每个元素被找到的概率相等,那么查找成功的平均比较次数为:f(n) = 1/n (n + (n-1) + (n-2) + . + 1) = (n+1)/2 = o(n)这就是传说中的大o 函数的原始定义。用大 o 来表述要全面分析一个算法, 需要考虑算法在最坏和最好的情况下的时间代价,和在平均情况下的时间代价。对于最坏情况,采用大o 表示法的一般提法(注意,这里用的是 “一般提法 ”)是:当且仅当存在正整数c 和 n0,使得 t(n) = n0都成立。则称该算法的渐进时间复杂度为t(n) = o(f(n) 。这个应该是高等数学里面的第一章极限里面的知识。这里 f(n) = (n+1)/2,那么 c * f(n) 也就是一个一次函数。就是在图象上看就是如果这个函数在c*f(n)的下面,就是复杂度为 t(n) = o(f(n) 。对于对数级,我们用大o 记法记为 o(log2n)就可以了。规则1) 加法规则t(n,m) = t1(n) + t2(n) = o ( max (f(n), g(m) )2) 乘法规则t(n,m) = t1(n) * t2(m) = o (f(n) * g(m) 3)一个特例在大 o 表示法里面有一个特例,如果t1(n) o?, c 是一个与 n 无关的任意常数, t2(n) = o ( f(n) )则有t(n) = t1(n) * t2(n) = o ( c*f(n) ) = o( f(n) ).也就是说,在大o 表示法中,任何非0 正常数都属于同一数量级,记为o(1)。4)一个经验规则有如下复杂度关系c log2n n n * log2n n2 n3 2n 3n n!其中 c 是一个常量,如果一个算法的复杂度为c 、 log2n 、n 、 n*log2n ,那么这个算法时间效率比较高,如果是2n , 3n ,n!,那么稍微大一些的n 就会令这个算法不能动了,居于中间的几个则差强人意.1) 基本知识点:没有循环的一段程序的复杂度是常数,一层循环的复杂度是o(n),两层循环的复杂度是o(n2)? (我用 2 表示平方,同理3 表示立方);2) 二维矩阵的标准差,残差,信息熵,fft2,dwt2,dct2 的时间复杂度 : 标准差和残差可能 o(n),fft2 是 o(nlog(n),dwt2 可能也是 o(nlog(n);信息熵要求概率, 而 dct 的过程和 jpeg 一样。因为和 jpeg一样,对二难矩阵处理了 .y=t*x*t , z=y.*mask,这样子 ,还有分成 8*8 子图像了 ;3) example:1、设三个函数 f,g,h 分别为 f(n)=100n3+n2+1000 , g(n)=25n3+5000n2 , h(n)=n1.5+5000nlgn请判断下列关系是否成立:( 1) f(n)=o(g(n)( 2) g(n)=o(f(n)( 3) h(n)=o(n1.5)( 4) h(n)=o(nlgn)这里我们复习一下渐近时间复杂度的表示法t(n)=o(f(n) ,这里的 o 是数学符号,它的严格定义是 若 t(n)和 f(n)是定义在正整数集合上的两个函数,则t(n)=o(f(n) 表示存在正的常数c 和 n0 ,使得当 n n0 时都满足 0t(n)c?f(n)。 用容易理解的话说就是这两个函数当整型自变量n 趋向于无穷大时,两者的比值是一个不等于0 的常数。这么一来,就好计算了吧。 (1)成立。题中由于两个函数的最高次项都是n3,因此当 n时,两个函数的比值是一个常数,所以这个关系式是成立的。 ( 2)成立。与上同理。 ( 3)成立。与上同理。 ( 4)不成立。由于当n时 n1.5 比 nlgn 递增的快,所以h(n)与 nlgn 的比值不是常数,故不成立。2、设 n 为正整数,利用大 o 记号,将下列程序段的执行时间表示为n 的函数。(1) i=1; k=0while(i1while (x=(y+1)*(y+1)y+;解答: t(n)=n1/2, t(n)=o(n1/2) ,最坏的情况是y=0,那么循环的次数是n1/2次,这是一个按平方根阶递增的函数。(3) x=91; y=100;while(y0)if(x100)x=x-10;y-;else x+;解答: t(n)=o(1),这个程序看起来有点吓人, 总共循环运行了 1000 次,但是我们看到 n 没有? 没。这段程序的运行是和n 无关的,就算它再循环一万年,我们也不管他,只是一个常数阶的函数。同一问题可用不同算法解决, 而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。1、时间复杂度(1) )时间频度一个算法执行所耗费的时间, 从理论上是不能算出来的, 必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多, 哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中 语句的执行次数成正比例, 哪个算法中语句执行次数多,它花费时间就多。 一个算法中的语句执行次数称为语句频度或时间频度。记为t(n)。(2) )时间复杂度在刚才提到的时间频度中,n 称为问题的规模,当n 不断变化时,时间频度t(n) 也会不断变化。 但有时我们想知道它变化时呈现什么规律。为此, 我们引入时间复杂度概念。一般情况下, 算法中基本操作重复执行的次数是问题规模n 的某个函数, 用 t(n) 表示,若有某个辅助函数f(n),使得当 n 趋近于无穷大时, t(n)/f(n) 的极限值为不等于零的常数,则称 f(n)是t(n)的同数量级函数。记作 t(n)= (f(n),称 (f(n) 为算法的渐进时间复杂度,简称时间复杂度。在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为o(1), 另外,在时间频度不相同时,时间复杂度有可能相同,如t(n)=n2+3n+4 与t(n)=4n2+2n+1 它们的频度不同,但时间复杂度相同,都为o(n2)。按数量级递增排列,常见的时间复杂度有:常数阶 o(1),对数阶 o(log2n),线性阶 o(n),线性对数阶 o(nlog2n),平方阶 o(n2),立方阶 o(n3),.,k 次方阶 o(nk),指数阶 o(2n)。随着问题规模n 的不断增大,上述时间复杂度不断增大,算法的执行效率越低。2、空间复杂度与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。记作 :s(n)=o(f(n)我们一般所讨论的是除正常占用内存开销外的辅助存储单元规模。讨论方法与时间复杂度类似,不再赘述。(3) 渐进时间复杂度评价算法时间性能主要用算法时间复杂度的数量级(即算法的渐近时间复杂度)评价一个算法的时间性能。【例 37】有两个算法 a1 和 a2 求解同一问题,时间复杂度分别是t1(n)=100n2, t2(n)=5n3。(1) 当输入量 n20 时,有 t1(n)t2(n),后者花费的时间较少。(2) 随着问题规模n 的增大,两个算法的时间开销之比5n3/100n2=n/20 亦随着增大。即当问题规模较大时,算法a1 比算法 a2 要有效地多。它们的渐近时间复杂度o(n2)和 o(n3)从宏观上评价了这两个算法在时间方面的质量。在算法分析时, 往往对算法的时间复杂度和渐近时间复杂度不予区分,而经常是将渐近时间复杂度t(n)=o(f(n) 简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度。【例 38】算法 matrixmultiply 的时间复杂度一般为t(n)=o(n3),f(n)=n3 是该算法中语句 (5)的频度。下面再举例说明如何求算法的时间复杂度。【例 39】交换 i 和 j 的内容。temp=i; i=j; j=temp;以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模 n 无关的常数。算法的时间复杂度为常数阶,记作t(n)=o(1)。如果算法的执行时间不随着问题规模n 的增加而增长,即使算法中有上千条语句, 其执行时间也不过是一个较大的常数。此类算法的时间复杂度是 o(1)。【例 310】变量计数之一。(1) x=0;y=0;(2) for(k-1;k=n;k+)(3)x+;(4) for(i=1;i=n;i+)(5)for(j=1;j=n;j+)(6)y+;一般情况下, 对步进循环语句只需考虑循环体中语句的执行次数,忽略该语句中步长加 1、终值判别、控制转移等成分。因此,以上程序段中频度最大的语句是 (6),其频度为 f(n)=n2,所以该程序段的时间复杂度为t(n)=o(n2)。当有若干个循环语句时, 算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。【例 311】变量计数之二。(1) x=1;(2) for(i=1;i=n;i+)(3)for(j=1;j=i;j+)(4)for(k=1;k=0&(ai!=k)(3)i-;(4)return i;此算法中的语句 (3)的频度不仅与问题规模n 有关,还与输入实例中 a 的各元素取值及k 的取值有关 :若 a 中没有与 k 相等的元素,则语句 (3)的频度 f(n)=n ;若 a 的最后一个元素等于k,则语句 (3)的频度 f(n)是常数 0。(5) 最坏时间复杂度和平均时间复杂度最坏情况下的时间复杂度称最坏时间复杂度。一般不特别说明, 讨论的时间复杂度均是最坏情况下的时间复杂度。这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,这就保证了算法的运行时间不会比任何更长。【例 319】查找算法【例 18】在最坏情况下的时间复杂度为t(n)=0(n),它表示对于任何输入实例,该算法的运行时间不可能大于0(n)。平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,算法的期望运行时间。常见的时间复杂度按数量级递增排列依次为:常数0(1)、对数阶 0(log2n)、线形

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论