Program Structure 笔记7 (执行效率介绍)
(作者:colinboy Email:cybbh@163.com) 2008.5.12
(内容难免出现错误或一些专业词汇使用不当,只是个人笔记,能理解总体内容就好)
效率:
(define (square x) (* x x))
(define (squares sent)
(if (empty? sent)
'()
(se (square (first sent))
(squares (bf sent)) )))
对于se、first、+、-、*、/等一些操作,我们称他们执行花费的时间为常量时间,有时也把一些花费常量时间执行的一组操作的执行时间设为常量时间。
对于上述例子,每一次的squares调用花费常量时间。
squares总执行的次数为输入的sent的大小,设输入的大小为n,squares总共需要执行n次,与输入数据大小成比例,效率为Θ(n)
插入排序:
(define (sort sent)
(if (empty? sent)
'()
(insert (first sent)
(sort (bf sent)))))
(define (insert num sent)
(cond ((empty? sent) (se num))
((< num (first sent)) (se num sent))
(else (se (first sent)
(insert num (bf sent))))))
以上排序算法的效率为:
对于每次insert过程的调用:
最好情况为Θ(1)
最差情况为Θ(n)
平均情况为Θ(n)
sort算法总共需要执行n次(n为sent的大小),每次调用sort都要执行一次insert,所以sort算法的效率为Θ(n^2),为平方级增长。
一些数学定义:
对于一些不同的计算过程随着数据量的增加可能在消耗的计算机资源上存在着很大区别,为了表示这种差别,一般使用增长的阶(Orders of Growth)或者称为增长率(Rate of Growth)的记法。
我们称R(n)具有Θ(f(n))的增长阶,记为R(n)=Θ(f(n)),如果存在着与n无关的整数k1和k2,使:
k1f(n) <= R(n) <= k2f(n)
对于任何足够大的n都成立。
上面的定义也许并不是十分正确,也许应该记为R(n)∈(f(n))。
详细定义:
如果存在正常数c和n使得当N>=n时,T(N)<=cf(N),则记为T(N)=O(f(N)。 这表示T(N)的增长率小于等于f(N)的增长率。
如果存在正常数c和n使得当N>=n时,T(N)>=cf(N),则记为T(N)=Ω(f(N)。 这表示T(N)的增长率大于等于f(N)的增长率。
如果T(N)=O(f(N)且T(N)=Ω(f(N),则T(N)=Θ(f(n))。 这表示T(N)的增长率等于f(N)的增长率。
一些常见增长率:
C 常数级
logN 对数级
N 线性
N^2 平方级
N^3 立方级
2^N 指数级