SICP的增长顺序定义中涉及哪些常数?

时间:2019-05-04 13:58:46

标签: big-o sicp

在1.2.3节中,程序的结构和解释给出了增长顺序的正式定义:

  

我们说R(n)具有增长顺序Θ(f(n)),写为R(n)=Θ(f(n))   (发音为“ f(n)的θ”),如果存在正常数k 1 并且   k 2 与n无关,使得k 1 f(n)≤R(n)≤k 2 f(n) n的值(换句话说,对于大的n,值R(n)夹在k 1 f(n)和k 2 f(n)之间。)

常数k 1 和k 2 的意义是什么?我很难将这个正式定义映射到现实世界的例子中,因为常量没有再被提及。

也许k 1 f(n)≤R(n)意味着有一些可观察到的增长?也许R(n)≤k 2 f(n)意味着f(n)是增长的上限?但是如果R(n)=Θ(f(n))并且k 1 是一个正常数,那么k 1 f(n)何时会小于R( n)?似乎仅当k 1 为1时,条件成立。

1 个答案:

答案 0 :(得分:0)

R和f是完全不同的函数,除了它们相对于n的增长方式外没有其他共同之处,因此没有理由使f(n)等于R(n)。 R是“处理大小为n的问题所需的资源量”。 f是无关的数学函数。

使Θ的定义特别令人困惑的是,它不是指R正在测量资源,也不是指正在使用该资源的过程。

R(n)的示例可能是:

  • 用于对n个数字求和的寄存器数。
  • 用于转码n GB视频的磁盘
  • 发射n架无人机所花费的时间。

但是Θ的定义没有提到资源(寄存器,磁盘,时间),也没有提及处理(求和,转码或启动)。

如果我们的“过程”是一个称为p的软件过程,那么我们就有三个截然不同的“功能”:

p(n) - a procedural function that programmers work with.
R(n) - a measuring function like ones used by engineers.
f(n) – a 'pure' mathematical function.

如果我们使用阶乘过程作为示例,该过程相对于时间具有Θ(n)增长,那么我们将:

p(n) = (define (factorial n) (if (= n 1) 1 (* n (factorial (- n 1)))))
R(n) = The time in seconds for (factorial n) to complete.
f(n) = n  

R(n)= f(n)表示(阶乘17)运行仅需要17秒,这不太可能。

θ(n)的定义是说k和k 2存在,所以一旦n足够大:

k₁ * n <= "Time taken for (factorial n) to run in seconds" <= k₂ * n

在现代计算机上,k₁* n要小于实际运行时间,k₁必须很小。

对于树递归斐波那契过程,增长为Θ(1.618ⁿ),因此我们具有:

p(n) = (define (fib n) (cond ((= n 0) 0) ((= n 1) 1)  (else ... )))
R(n) = The time in seconds for (fib n) to complete.
f(n) = 1.618ⁿ

并且定义是说k₁和k²存在,所以:

k₁ * 1.618ⁿ <= "Time taken for (fib n) to run" <= k₂ * 1.618ⁿ)

(我用“ 1.618”代替黄金配比“φ”)