1.2.3 时间复杂度

1.2.3 时间复杂度
前面的例子展示出在计算资源的消耗率方面,程序们有着显著的差异.
描述这种差异的一种简单方式是使用增长度的概念
来得到随着输入变大的资源需求的总度量.

让N成为度量一个问题的规模的参数,让R(N)资源的需求总量.
在我们的之前的例子中,我们让N成为给定函数中的值,但是还
有其它的可能性.例如,如果我们的目标是计算一个数的平方根的合适的值,我们
让N等于要求的精度的位数.在矩阵乘法中,我们让N成为矩阵的行数.
总之,对于一个给定的问题,有许多的问题属性可用于分析.相似的是,
R(N)可以度量寄存器的使用数,原始的机器操作执行数,等等.在计算机中,
在给定的时间里,只能做一定量的操作,要求的时间正比于原生的机器操作的执行数量

 (在一定的时间要求内,相应的是
一定量的原始机器操作 数量.)删除括号中的内容。

我们说R(n)有 theta(f(n))的增长,写作R(n)=theta(f(n)).读作 f(n)的增长。
如果有正的常数 k1和k2,使得对于很大的N,满足如下的不等式。

k1*f(n)<=R(n)<=k2*f(n)

换句话说,对于很大的N值,R(n)的值像三明治一样的夹在k1*f(n)和k2*f(n) 中间。

例如,在1。2。1部分中的斐波那些数的描述的线性递归的过程,增长的步骤数量正比于输入N。
我们也看到了空间增长要求也是theta(n). 对于迭代的斐波那些数,增长的步骤数量正比于输入N。
空间要求是1。也就是常数值。 树形递归的斐波那些数计算要求是fin(n)步骤。空间是N。
fin是1.2.2部分描述的黄金比例。

增长的情况提供的是过程的行为的一个粗略的描述。例如,一个过程要求 N*N步骤,一个过程要求
1000*N*N步骤。一个过程要求3*N*N+10*N+17步骤。它们都有theta(N*N)的增长。
另一方面,增长的时间复杂度提供了一个很有用的提示,它提示了当我们改变了问题的规模时,
我们预期的流程的行为是如何改变的。对于线性的执行过程,双倍的规模,需要使用双倍的资源。
对于一个指数的执行过程,问题大小的每一点增长,需要的资源要以某个常数的倍数进行增长。
在1.2部分的剩余内容里,我们检查两个算法,它们有对数级的增长,问题规模翻倍,
需要的资源只增长一个常数。


练习1.14
使用在1.2.2部分中的count-change程序,兑换11美分,描述一下程序生成的树形的过程。
当兑换的钱数增长时,要求的时间和空间的复杂度是什么?

练习1.15
 一个角的正弦值能被计算,如果x足够小,sinx=x 用如下的三倍角的公式
sinx=3sin(x/3)-4*(sin(x/3))^3
以减小角度的值。(对于这个练习,一个角度被认为是足够小,
是它的角度值小于等于0。1度)这个思想被集成于如下的程序中。

(define (cube x) (* x x x))
(define (p x) (- (* 3 x) (* 4 (cube x))))
(define (sine angle)
     (if  (not (> (abs angle) 0.1))
          angle
         (p (sine (/ angle 3.0)))
     )
)

a. 当(sine 12.15)被执行时,程序p应用了多少次?

b. 当 (sine a)被执行时,以a为自变量,过程执行的增长是什么?

猜你喜欢

转载自blog.csdn.net/gggwfn1982/article/details/81384814