在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时,条件成立。
答案 0 :(得分:0)
R和f是完全不同的函数,除了它们相对于n的增长方式外没有其他共同之处,因此没有理由使f(n)等于R(n)。 R是“处理大小为n的问题所需的资源量”。 f是无关的数学函数。
使Θ的定义特别令人困惑的是,它不是指R正在测量资源,也不是指正在使用该资源的过程。
R(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”代替黄金配比“φ”)