时间复杂度与计算机硬件有关,时间复杂度计算

时间复杂度计算

算法的运行时间是指一个算法在计算机上运算所花费的时间。它大致等于计算机执行简单操作(如赋值操作,比较操作等)所需要的时间与算法中进行简单操作次数的乘积。通常把算法中包含简单操作次数的多少叫做“算法的时间复杂性”。它是一个算法运行时间的相对量度,一般用数量级的形式给出。度量一个程序的执行时间通常有以下两种方法:

① 一种是“事后统计”的方法。因为很多计算机内部都有计时功能,有的甚至可精确到毫秒级,不同算法的程序可通过一组或若干组相同的统计数据以分辨优劣。但这种方法有两个缺陷:一是必须先运行依据算法编制的程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。因此人们常常采用另一种“事前分析估算”的方法。

“事前分析估算”的方法基于:一个用高级程序语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:

a、依据的算法选用何种策略。不同算法、不同策略所消耗的 CPU 时间显然是不同的;

b、 问题的规模。例如求

100 以内还是 1 000 000 以内的素数;

c、书写程序的语言。对于同一个算法,实现语言的级别越高,执行效率就越低;

d、编译程序所产生的机器代码的质量:编译器的区别、版本会有所不同;

e、机器执行指令的速度。

显然,同一个算法用不同的语言实现,或者用不同的编译程序进行编译,或者在不同的计算机上运行时,效率均不相同。这表明使用绝对的时间单位衡量算法的效率是不合适的。撇开这些与计算机硬件、软件有关的因素,可以认为一个特定算法“运行工作量”的大小,只依赖于问题的规模(通常用整数量

n 表示),或者说,它是问题规模的函数。

一个算法是由控制结构(顺序、分支和循环三种)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。为了便于比较同一问题的不同算法,通常的做法是,从算法中选取一种对于所研究的问题(或算法类型)来说是基本运算的原操作,以该基本操作重复执行的次数作为算法的时间度量。

例如,在如下所示的两个

N*N 的矩阵相乘的算法中,“乘法”运算是“矩阵相乘问题”的基本操作。整个算法的执行时间与该基本操作(乘法)重复执行的次数 n 3

成正比,记作

T ( n ) =O ( n^ 3 )。

for i:=1 to n

do

for j:=1 to

n do

begin

c[i , j]:=

0;

for k:=1 to

n do c[i , j]:= c[i , j]+a[i , k] * b[k , j]

end;

一般情况下,算法中基本操作重复执行的次数是问题规模 n

的某个函数 f ( n ),算法的时间量度记作:

T ( n ) = O ( f ( n ))

它表示问题规模 n 的增大、算法执行时间的增长率和 f ( n

)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。

显然,被称作问题的基本操作的原操作应是其重复执行次数和算法的执行时间成正比的原操作,多数情况下它是最深层循环内的语句中的原操作,它的执行次数和包含它的语句的频度相同。语句的频度指的是该语句重复执行的次数,例如:在下列三个程序段中,

x:=x+1

for i:=1 to n

do x:=x+1;

for j:=1 to n

do

for k:=1 to

n do x:=x+1

含基本操作“ x 增 1 ”的语句 x:=x+1 的频度分别为

1 , n 和 n^2 ,则这三个程序段的时间复杂度分别为 O ( 1 ), O ( n ), O ( n^2

),分别称为常量阶、线性阶和平方阶。算法还可能呈现的时间复杂度有:对数阶 O ( log n ),指数阶 O ( 2^n )等。在 n

很大时, 不同数量级时间复杂度显然有 O ( 1 ) < O ( n^3 )

一般情况下,对一个问题 ( 或一类算法 )

只需选择一种基本操作来讨论算法的时间复杂度即可,有时也需要同时考虑几种基本操作,甚至可以对不同的操作赋以不同权值,以反映执行不同操作所需的相对时间,这种做法便于综合比较解决同一问题的两种完全不同的算法。

由于算法的时间复杂度考虑的只是对于问题规模 n

的增长率,则在难以计算基本操作执行次数 ( 或语句频度 ) 的情况下,只需求出它关于 n

的增长率或阶即可,一般可忽略常数项、底阶项、甚至系数。

例如,在下列程序段中 :

for i:=2 to n do

for j:=2 to i-1 do x:=x+1

语句 x:=x+1 执行次数关于 n 的增长率为 n 2 ,它是语句频度表达式 (n-1)(n-2)/2

中增长最快的一项。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值