数据结构时间复杂度讲解.docx

上传人:小飞机 文档编号:3560193 上传时间:2023-03-13 格式:DOCX 页数:7 大小:39.07KB
返回 下载 相关 举报
数据结构时间复杂度讲解.docx_第1页
第1页 / 共7页
数据结构时间复杂度讲解.docx_第2页
第2页 / 共7页
数据结构时间复杂度讲解.docx_第3页
第3页 / 共7页
数据结构时间复杂度讲解.docx_第4页
第4页 / 共7页
数据结构时间复杂度讲解.docx_第5页
第5页 / 共7页
亲,该文档总共7页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《数据结构时间复杂度讲解.docx》由会员分享,可在线阅读,更多相关《数据结构时间复杂度讲解.docx(7页珍藏版)》请在三一办公上搜索。

1、数据结构时间复杂度讲解一个算法中的语句执行次数称为语句频度或时间频度,记为T(n)。n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但是有时候,我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下,算法中基本操作重复执行的次数,是问题规模 n 的某个函数,用T(n)表示。若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=(f(n),称(f(n) 为算法的渐进时间复杂度。 时间频度不相同时,渐进时间复杂度(f(n) 有可能相同,如T(n)=n2+3n+4与T(n)

2、=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。 现在我们根据一些书本上和网络上对时间复杂度概念的描述进行一下总结: T(n),语句频度,时间频度,亦称为时间复杂度。 O(f(n),渐进时间复杂度。 前者T(n)是某个算法的时间耗费,它是该算法所求解 问题规模 n的函数,而后者O(f(n)是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。当我们评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度O(f(n),因此,在算法分析时,往往对两者不予区分,经常是将渐近时间复杂度T(n)=O(f(n)简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度。 注意:算

3、法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。但是我们总是考虑在最坏的情况下的时间复杂度。以保证算法的运行时间不会比它更长。 常见的时间复杂度,按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)或O(lbn)、线性阶O(n)、线性对数阶O(n*log2n)、 平方阶O(n2)、立方阶O(n3)、k次方阶O(nk)、指数阶O(2n)。 下面有一道题目是可以帮助同学们理解概念的: 1、设三个函数f,g,h分别为 f(n)=100*n3+n2+1000 , g(n)=25*n3+5000*n2 , h(n)=n1.5+5000*n*lgn 请判断下列关系是否成立: (

4、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 ,使得当nn0时都满足0T(n)C*f(n)。通俗一点就是这两个函数当整型自变量n趋向于无穷大时,两者的比值是一个不等于0的常数。 (1)成立。题中由于两个函数的最高次项都是n3,因此当n时,两个函数的比值是一个常数,所以这个关系式是成立的。 (2)成立。与上同理。 (3

5、)成立。与上同理。 (4)不成立。由于当n时n1.5比n*lgn递增的快,所以h(n)与nlgn的比值不是常数,故不成立。 理解完概念之后,就开始求算法的时间复杂度。 从概念中我们知道,要求时间复杂度O(f(n),就必须要知道算法中频度最大的语句频度f(n),那么要求最大的语句频度f(n)就必须要知道算法的语句频度T(n)。 一般总的思路就是:T(n)-f(n)-O(f(n)。 有时候可以直接找到算法中频度最大的语句,直接算出f(n),然后写出O(f(n)。 也有例外情况就是很难求出语句频度T(n)的 下面会用一些例子做详细的说明: O(1) 例1:Temp=i;i=j;j=temp; 以上三

6、条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。如果算法的执行时 间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。 例2:x=91; y=100; while(y0) if(x100) x=x-10;y-; else x+; 解答: T(n)=O(1), 这个程序看起来有点吓人,总共循环运行了1000次,但是我们看到n没有? 没。这段程序的运行是和n无关的,就算它再循环一万年,我们也不管他,只是一个常数阶的函数。 O(n) 例1: i=1; k=0

7、 while(in) k=k+10*i;i+; 解答:T(n)=n-1, T(n)=O(n), 这个函数是按线性阶递增的。 例2: a=0; b=1; for (i=1;i=n;i+) s=a+b; b=a; a=s; 解: 语句1的频度:2, 语句2的频度: n, 语句3的频度: n-1, 语句4的频度:n-1, 语句5的频度:n-1, T(n)=2+n+3(n-1)=4n-1=O(n). O(n2) 例1: 交换i和j的内容 sum=0; for(i=1;i=n;i+) for(j=1;j=n;j+) sum+; 解:T(n)=2n2+n+1 =O(n2) 例2: for (i=1;in;

8、i+) y=y+1; for (j=0;j=(2*n);j+) x+; 解: 语句1的频度是n-1 语句2的频度是(n-1)*(2n+1)=2n2-n-1 f(n)=2n2-n-1+(n-1)=2n2-2 该程序的时间复杂度T(n)=O(n2). O(n3) 例1: for(i=0;in;i+) for(j=0;ji;j+) for(k=0;kj;k+) x=x+2; 解:当i=m, j=k的时候,内层循环的次数为k当i=m时, j 可以取 0,1,.,m-1 , 所以这里最内循环共进行了0+1+.+m-1=(m-1)m/2次所以,i从0取到n, 则循环共进行了: 0+(1-1)*1/2+.+

9、(n-1)n/2=n(n+1)(n-1)/6所以时间复杂度为O(n3). O(log2n ) 例1: i=1; while (i=n) i=i*2; 解: 语句1的频度是1, 设语句2的频度是f(n), 则:2f(n)=n;f(n)0) if(x100) x=x-10;y-; else x+; 解答: T(n)=O(1), 这个程序看起来有点吓人,总共循环运行了1000次,但是我们看到n没有? 没。这段程序的运行是和n无关的,就算它再循环一万年,我们也不管他,只是一个常数阶的函数。 O(n) 例1: i=1; k=0 while(in) k=k+10*i;i+; 解答:T(n)=n-1, T(

10、n)=O(n), 这个函数是按线性阶递增的。 例2: a=0; b=1; for (i=1;i=n;i+) s=a+b; b=a; a=s; 解: 语句1的频度:2, 语句2的频度: n, 语句3的频度: n-1, 语句4的频度:n-1, 语句5的频度:n-1, T(n)=2+n+3(n-1)=4n-1=O(n). O(n2) 例1: 交换i和j的内容 sum=0; for(i=1;i=n;i+) for(j=1;j=n;j+) sum+; 解:T(n)=2n2+n+1 =O(n2) 例2: for (i=1;in;i+) y=y+1; for (j=0;j=(2*n);j+) x+; 解:

11、语句1的频度是n-1 语句2的频度是(n-1)*(2n+1)=2n2-n-1 f(n)=2n2-n-1+(n-1)=2n2-2 该程序的时间复杂度T(n)=O(n2). O(n3) 例1: for(i=0;in;i+) for(j=0;ji;j+) for(k=0;kj;k+) x=x+2; 解:当i=m, j=k的时候,内层循环的次数为k当i=m时, j 可以取 0,1,.,m-1 , 所以这里最内循环共进行了0+1+.+m-1=(m-1)m/2次所以,i从0取到n, 则循环共进行了: 0+(1-1)*1/2+.+(n-1)n/2=n(n+1)(n-1)/6所以时间复杂度为O(n3). O(log2n ) 例1: i=1; while (i=n) i=i*2; 解: 语句1的频度是1, 设语句2的频度是f(n), 则:2f(n)=n;f(n)=log2n 取最大值f(n)= log2n, T(n)=O(log2n )

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号