算法时间复杂度计算示例

合集下载

算法的时间复杂度和空间复杂度-总结分析

算法的时间复杂度和空间复杂度-总结分析

算法的时间复杂度和空间复杂度-总结通常,对于一个给定的算法,我们要做两项分析。

第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式、数学归纳法等。

而在证明算法是正确的基础上,第二部就是分析算法的时间复杂度。

算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否。

因此,作为程序员,掌握基本的算法时间复杂度分析方法是很有必要的。

算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。

而度量一个程序的执行时间通常有两种方法。

一、事后统计的方法这种方法可行,但不是一个好的方法。

该方法有两个缺陷:一是要想对设计的算法的运行性能进行评测,必须先依据算法编制相应的程序并实际运行;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优势。

二、事前分析估算的方法因事后统计方法更多的依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。

因此人们常常采用事前分析估算的方法。

在编写程序前,依据统计方法对算法进行估算。

一个用高级语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:(1). 算法采用的策略、方法;(2). 编译产生的代码质量;(3). 问题的输入规模;(4). 机器执行指令的速度。

一个算法是由控制结构(顺序、分支和循环3种)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。

为了便于比较同一个问题的不同算法,通常的做法是,从算法中选取一种对于所研究的问题(或算法类型)来说是基本操作的原操作,以该基本操作的重复执行的次数作为算法的时间量度。

1、时间复杂度(1)时间频度一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。

但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。

并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。

算法时间复杂度的计算公式

算法时间复杂度的计算公式

算法时间复杂度的计算公式算法时间复杂度是算法效率的一种度量方式,通常用大O符号来表示,例如O(1)、O(n)、O(n^2)等。

在计算算法时间复杂度时,需要考虑算法中各种操作的时间复杂度,并将它们合并为总时间复杂度。

以下是常见的算法操作时间复杂度:1. 常数级别:O(1)2. 对数级别:O(logn)3. 线性级别:O(n)4. 线性对数级别:O(nlogn)5. 平方级别:O(n^2)6. 立方级别:O(n^3)7. 指数级别:O(2^n)计算总时间复杂度的公式如下:1. 顺序执行的操作,时间复杂度直接相加。

例如,若有操作A、B、C,它们的时间复杂度分别为O(a)、O(b)、O(c),则总时间复杂度为O(a + b + c)。

2. 嵌套执行的操作,时间复杂度取最大值。

例如,若有操作A、B,操作A执行了n次,每次的时间复杂度为O(n),操作B的时间复杂度为O(nlogn),则总时间复杂度为O(n*nlogn),即O(n^2logn)。

3. 分支语句的时间复杂度为其中时间复杂度最大的分支的时间复杂度。

例如,若有分支语句,分别包含操作A和操作B,它们的时间复杂度分别为O(a)、O(b),则分支语句的时间复杂度为O(max(a,b))。

4. 循环结构的时间复杂度为循环次数乘以循环体的时间复杂度。

例如,若有循环结构,循环次数为n,循环体包含操作A和操作B,它们的时间复杂度分别为O(a)、O(b),则循环结构的时间复杂度为O(n*max(a,b))。

综上所述,计算算法总时间复杂度需要考虑各个操作的时间复杂度以及它们的执行顺序、嵌套关系、分支和循环结构。

时间复杂度计算的例题详解

时间复杂度计算的例题详解

时间复杂度计算的例题详解计算时间复杂度是对算法运行时间的一种评估,它可以帮助我们比较不同算法的效率。

下面以几个例题为例,详细解释如何计算时间复杂度。

例题一:计算数组中所有元素的和```pythondef sum_array(arr):total = 0for num in arr:total += numreturn total```在这个例子中,我们遍历了数组 `arr` 中的每个元素,并将它们相加得到总和。

考虑到 `for` 循环的操作次数取决于数组的长度,我们可以说这个算法的时间复杂度是 O(n),其中 n 是数组的长度。

例题二:查找数组中的最大值```pythondef max_array(arr):max_val = arr[0]for num in arr:if num > max_val:max_val = numreturn max_val```在这个例子中,我们遍历了数组 `arr` 中的每个元素,并与变量 `max_val` 比较,如果当前元素比 `max_val` 大,则更新`max_val`。

和前一个例子类似,这个算法的时间复杂度也是O(n),其中 n 是数组的长度。

例题三:计算斐波那契数列的第 n 个数```pythondef fibonacci(n):if n <= 1:return nelse:return fibonacci(n-1) + fibonacci(n-2)```这个例子是一个递归算法,它计算斐波那契数列的第 n 个数。

在这个算法中,每次调用 `fibonacci` 函数都会导致两次递归调用,因此函数的复杂度是指数级别的。

具体而言,这个算法的时间复杂度是O(2^n),其中n 是要计算的斐波那契数的索引。

例题四:冒泡排序算法```pythondef bubble_sort(arr):n = len(arr)for i in range(n-1):for j in range(n-1-i):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]return arr```这个例子是一个冒泡排序算法,它通过不断交换相邻的元素来将数组中的元素排序。

算法时间复杂度的计算公式

算法时间复杂度的计算公式

算法时间复杂度的计算公式
算法时间复杂度是衡量算法效率的重要指标,它是指算法运行时间随着问题规模的增大而增长的速度。

计算算法时间复杂度需要考虑以下几个因素:
1. 循环结构的次数:算法中循环结构执行的次数是影响时间复杂度的重要因素之一。

2. 嵌套循环结构:如果算法中有多个嵌套循环结构,那么时间复杂度的计算就要考虑这些循环的嵌套次数。

3. 条件判断语句:如果算法中有条件判断语句,那么时间复杂度的计算需要根据条件的判断次数进行计算。

4. 递归调用:如果算法中有递归调用,那么时间复杂度的计算需要根据递归的次数进行计算。

算法时间复杂度的计算公式可以表示为:
T(n) = O(f(n))
其中,T(n)表示算法的时间复杂度,f(n)表示算法执行的时间,O表示算法的渐进时间复杂度。

根据算法的实际情况,可以通过分析算法中循环结构的次数、嵌套次数、条件判断次数、递归次数等因素,来确定算法的时间复杂度。

- 1 -。

最大公约数的三种算法-复杂度分析-时间计算

最大公约数的三种算法-复杂度分析-时间计算

昆明理工大学信息工程与自动化学院学生实验报告( 2011 —2012 学年第 1 学期)课程名称:算法设计与分析开课实验室:信自楼机房444 2011 年10月 12日一、上机目的及内容1.上机内容求两个自然数m和n的最大公约数。

2.上机目的(1)复习数据结构课程的相关知识,实现课程间的平滑过渡;(2)掌握并应用算法的数学分析和后验分析方法;(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。

二、实验原理及基本技术路线图(方框原理图或程序流程图)(1)至少设计出三个版本的求最大公约数算法;(2)对所设计的算法采用大O符号进行时间复杂性分析;(3)上机实现算法,并用计数法和计时法分别测算算法的运行时间;(4)通过分析对比,得出自己的结论。

三、所用仪器、材料(设备名称、型号、规格等或使用软件)1台PC及VISUAL C++6.0软件四、实验方法、步骤(或:程序代码或操作过程)实验采用三种方法求最大公约数1、连续整数检测法。

2、欧几里得算法3、分解质因数算法根据实现提示写代码并分析代码的时间复杂度:方法一:int f1(int m,int n){int t;if(m>n)t=n;else t=m;while(t){if(m%t==0&&n%t==0)break;else t=t-1;}return t;}根据代码考虑最坏情况他们的最大公约数是1,循环做了t-1次,最好情况是只做了1次,可以得出O(n)=n/2;方法二:int f2(int m,int n){int r;r=m%n;while(r!=0){m=n;n=r;r=m%n;}return n;}根据代码辗转相除得到欧几里得的O(n)= log n方法三:int f3(int m,int n){int i=2,j=0,h=0;int a[N],b[N],c[N];while(i<n){if(n%i==0){j++;a[j]=i;n=n/i;}else i++;}j++;a[j]=n;i=1;int u;u=j;while(i<=j){//printf("%d ",a[i]);i++;}i=2;j=0;while(i<m){if(m%i==0){j++;b[j]=i;m=m/i;}else i++;}j++;b[j]=m;i=1;while(i<=j){//printf("%d ",b[i]);i++;}int k=1;for(i=1;i<=j;i++){for(k=1;k<=u;k++){if(b[i]==a[k]){h++;c[h]=a[k];//printf("%d ",c[h]);a[k]=a[k+1];break;}}}k=1;while(h>1){k=k*c[h]*c[h-1];h=h-2;}if(h==1){k=k*c[1];return k;}else return k;}根据代码分解质因子算法O(n)=n2+n/2为了计算每种算法运行的次数所用的时间,我将代码稍加改动添加代码如下:其中计数器采用的是没做一次循环就加1;计时器是记住开始时间和结束时间,用结束时间减开始时间。

算法时间复杂度计算公式

算法时间复杂度计算公式

算法时间复杂度计算公式算法(Algorithm)是指⽤来操作数据、解决程序问题的⼀组⽅法。

对于同⼀个问题,使⽤不同的算法,也许最终得到的结果是⼀样的,但在过程中消耗的资源和时间却会有很⼤的区别。

那么我们应该如何去衡量不同算法之间的优劣呢?主要还是从算法所占⽤的「时间」和「空间」两个维度去考量。

时间维度:是指执⾏当前算法所消耗的时间,我们通常⽤「时间复杂度」来描述。

空间维度:是指执⾏当前算法需要占⽤多少内存空间,我们通常⽤「空间复杂度」来描述。

因此,评价⼀个算法的效率主要是看它的时间复杂度和空间复杂度情况。

然⽽,有的时候时间和空间却⼜是「鱼和熊掌」,不可兼得的,那么我们就需要从中去取⼀个平衡点。

下⾯我来分别介绍⼀下「时间复杂度」和「空间复杂度」的计算⽅式。

⼀、时间复杂度我们想要知道⼀个算法的「时间复杂度」,很多⼈⾸先想到的的⽅法就是把这个算法程序运⾏⼀遍,那么它所消耗的时间就⾃然⽽然知道了。

这种⽅式可以吗?当然可以,不过它也有很多弊端。

这种⽅式⾮常容易受运⾏环境的影响,在性能⾼的机器上跑出来的结果与在性能低的机器上跑的结果相差会很⼤。

⽽且对测试时使⽤的数据规模也有很⼤关系。

再者,并我们在写算法的时候,还没有办法完整的去运⾏呢。

因此,另⼀种更为通⽤的⽅法就出来了:「⼤O符号表⽰法」,即 T(n) = O(f(n))我们先来看个例⼦:for(i=1; i<=n; ++i){j = i;j++;}通过「⼤O符号表⽰法」,这段代码的时间复杂度为:O(n) ,为什么呢?在⼤O符号表⽰法中,时间复杂度的公式是: T(n) = O( f(n) ),其中f(n) 表⽰每⾏代码执⾏次数之和,⽽ O 表⽰正⽐例关系,这个公式的全称是:算法的渐进时间复杂度。

我们继续看上⾯的例⼦,假设每⾏代码的执⾏时间都是⼀样的,我们⽤ 1颗粒时间来表⽰,那么这个例⼦的第⼀⾏耗时是1个颗粒时间,第三⾏的执⾏时间是 n个颗粒时间,第四⾏的执⾏时间也是 n个颗粒时间(第⼆⾏和第五⾏是符号,暂时忽略),那么总时间就是 1颗粒时间 + n颗粒时间 + n颗粒时间,即 (1+2n)个颗粒时间,即: T(n) = (1+2n)*颗粒时间,从这个结果可以看出,这个算法的耗时是随着n的变化⽽变化,因此,我们可以简化的将这个算法的时间复杂度表⽰为:T(n) = O(n)为什么可以这么去简化呢,因为⼤O符号表⽰法并不是⽤于来真实代表算法的执⾏时间的,它是⽤来表⽰代码执⾏时间的增长变化趋势的。

最大公约数的三种算法复杂度分析时间计算

最大公约数的三种算法复杂度分析时间计算

最大公约数的三种算法复杂度分析时间计算1.辗转相除法(欧几里得算法)辗转相除法是一种基于递归的算法,它通过不断地用两个数中较大的数除以较小的数,直到两个数相等为止。

这时,较小的数就是最大公约数。

例如,求解49和28的最大公约数:-49÷28=1 (21)-28÷21=1 (7)-21÷7=3 0所以最大公约数为7辗转相除法的时间复杂度分析如下:设两个数中较大的数为a,较小的数为b,a mod b 的结果为r。

- 最好情况:当b能够整除a时,时间复杂度为O(loga),因为每次递归时a和b的值都会减少至原来的一半。

-最坏情况:当a和b互质时,时间复杂度为O(a/b)。

例如,当a=2n 时,每次递归的b的值都会减少至1- 平均情况:时间复杂度是O(logab)的。

2.更相减损术更相减损术是一种基于减法的算法,它通过不断地用两个数中较大的数减去较小的数,直到两个数相等为止。

这时,较小的数就是最大公约数。

例如,求解49和28的最大公约数:-28-21=7-21-7=14-14-7=7所以最大公约数为7更相减损术的时间复杂度分析如下:设两个数中较大的数为a,较小的数为b。

- 最好情况:当a和b的差值为1时,时间复杂度为O(logb),因为每次减法操作后的差值都会减少一半。

-最坏情况:当a和b互质时,时间复杂度为O(a-b)。

例如,当a=2n 时,每次减法操作的差值都会减少至1-平均情况:时间复杂度为O(a-b)的。

3. Stein算法(二进制法)Stein算法是一种基于位运算的算法,它通过在两个数中同时除去2的因子,直到两个数都变为奇数。

然后,继续用较小的数减去较大的数,直到两个数相等为止。

这时,较小的数就是最大公约数的2的因子。

例如,求解49和28的最大公约数:-49÷2=24-28÷2=14-24÷2=12现在两个数都是奇数,继续减法操作:-7-12=-5-12-7=5所以最大公约数为5Stein算法的时间复杂度分析如下:设两个数中较大的数为a,较小的数为b。

算法时间复杂度怎么算

算法时间复杂度怎么算

算法时间复杂度怎么算一、概念时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数)比如:一般总运算次数表达式类似于这样:a*2^n+b*n^3+c*n^2+d*n*lg(n)+e*n+fa !=0时,时间复杂度就是O(2^n);a=0,b<>0 =>O(n^3);a,b=0,c<>0 =>O(n^2)依此类推eg:(1) for(i=1;i<=n;i++) //循环了n*n次,当然是O(n^2)for(j=1;j<=n;j++)s++;(2) for(i=1;i<=n;i++)//循环了(n+n-1+n-2+...+1)≈(n^2)/2,因为时间复杂度是不考虑系数的,所以也是O(n^2)for(j=i;j<=n;j++)s++;(3) for(i=1;i<=n;i++)//循环了(1+2+3+...+n)≈(n^2)/2,当然也是O(n^2) for(j=1;j<=i;j++)s++;(4) i=1;k=0;while(i<=n-1){k+=10*i; i++; }//循环了n-1≈n次,所以是O(n)(5) for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;//循环了(1^2+2^2+3^2+...+n^2)=n(n+1)(2n+1)/6(这个公式要记住哦)≈(n^3)/3,不考虑系数,自然是O(n^3)另外,在时间复杂度中,log(2,n)(以2为底)与lg(n)(以10为底)是等价的,因为对数换底公式:log(a,b)=log(c,b)/log(c,a)所以,log(2,n)=log(2,10)*lg(n),忽略掉系数,二者当然是等价的二、计算方法1.一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法时间复杂度计算示

Company number:【WTUT-WT88Y-W8BBGB-BWYTT-19998】
基本计算步骤?
示例一:?
(1) int num1, num2;
(2) for(int i=0; i<n; i++){?
(3) num1 += 1;
(4) for(int j=1; j<=n; j*=2){?
(5) num2 += num1;
(6) }
(7) }?
分析步骤
Step1.分析各条语句执行时间,得到算法(实际)复杂性
语句int num1, num2;的频度为1;
语句i=0;的频度为1;
语句i<n; i++; num1+=1; j=1; 的频度为n;
语句j<=n; j*=2; num2+=num1;的频度为n*log2n;
算法(实际)复杂性:T(n) = 2 + 4n + 3n*log2n
step2. 计算渐进复杂性
忽略掉T(n)中的常量、低次幂和最高次幂的系数,得到
f(n) = n*log2n
{ 可省略:
lim(T(n)/f(n)) = (2+4n+3n*log2n) / (n*log2n)
= 2*(1/n)*(1/log2n) + 4*(1/log2n) + 3
当n趋向于无穷大,1/n趋向于0,1/log2n趋向于0,极限等于3。

}
T(n) = O(n*log2n)
简化的计算步骤?
再来分析一下,可以看出,决定算法复杂度的是执行次数最多的语句,这里是num2 += num1,一般也是最内循环的语句。

并且,通常将求解极限是否为常量也省略掉
于是,以上步骤可以简化为:?
1. 找到执行次数最多的语句?
2. 计算语句执行次数的数量级
3. 用大O来表示结果?
继续以上述算法为例,进行分析:
1.
执行次数最多的语句为num2 += num1
2. T(n) = n*log2n
f(n) = n*log2n
3. 列循环的复杂度分析?
将各个嵌套循环的时间复杂度相加。

例如:
for (i=1; i<=n; i++)
x++;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
x++;
解:
第一个for循环
T(n) = n
f(n) = n
时间复杂度为Ο(n)
第二个for循环
T(n) = n2
f(n) = n2
时间复杂度为Ο(n2)
整个算法的时间复杂度为Ο(n+n2) = Ο(n2)。

2.函数调用的复杂度分析?
例如:
public void printsum(int count){
int sum = 1;
for(int i= 0; i<n; i++){
sum += i;
}
}
分析:
记住,只有可运行的语句才会增加时间复杂度,因此,上面方法里的内容除了循环之外,其余的可运行语句的复杂度都是O(1)。

所以printsum的时间复杂度 = for的O(n)+O(1) = 忽略常量 = O(n)
*这里其实可以运用公式 num = n*(n+1)/2,对算法进行优化,改为:
public void printsum(int count){
int sum = 1;
sum = count * (count+1)/2;
}
这样算法的时间复杂度将由原来的O(n)降为O(1),大大地提高了算法的性能。


3.混合情况(多个方法调用与循环)的复杂度分析?
例如:
public void suixiangMethod(int n){
printsum(n);O(1)?
交换i和j的内容
temp=i;
i=j;
j=temp; ?
以上三条单个语句的频度为1,该程序段的执行时间是一个与问题规模n无关的常数。

算法的时间复杂度为常数阶,记作T(n)=O(1)。

如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。

此类算法的时间复杂度是O(1)。

示例3. O(n2)?
sum=0; /* 执行次数1 */
for(i=1;i<=n;i++) ?
for(j=1;j<=n;j++)?
sum++; /* 执行次数n2 */
解:T(n) = 1 + n2 = O(n2)
for (i=1;i<n;i++)
{?
y=y+1; ①
for (j=0;j<=(2*n);j++) ?
x++; ②?
}
解:语句1的频度是n-1
语句2的频度是(n-1)*(2n+1) = 2n2-n-1
T(n) = 2n2-n-1+(n-1) = 2n2-2
f(n) = n2
lim(T(n)/f(n)) = 2 + 2*(1/n2) = 2
T(n) = O(n2).
示例4. O(n) ?
a=0;
b=1; ①
for (i=1;i<=n;i++) ②
{ ?
s=a+b;③
b=a;④?
a=s;⑤
}
解:语句1的频度:2, ?
语句2的频度:n, ?
语句3的频度:n, ?
语句4的频度:n, ?
语句5的频度:n, ?
T(n) = 2+4n
f(n) = n
lim(T(n)/f(n)) = 2*(1/n) + 4 = 4
T(n) = O(n).

示例5. O(log2n)?
i=1; ①
while (i<=n)
i=i*2; ②
解:语句1的频度是1, ?
设语句2的频度是t, 则:n t<=n; t<=log2n
考虑最坏情况,取最大值t=log2n,
T(n) = 1 + log2n
f(n) = log2n
lim(T(n)/f(n)) = 1/log2n + 1 = 1
T(n) = O(log2n)
示例6. O(n3)?
for(i=0;i<n;i++)
{ ?
for(j=0;j<i;j++) ?
{
for(k=0;k<j;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)/2次
T(n) = n(n+1)(n-1)/2 = (n3-n)/2
f(n) = n3
所以时间复杂度为O(n3)。

相关文档
最新文档