SICP——构造程序抽象(四)

1.增长的阶

是用来描述不同的计算过程在消耗计算资源的速率上的差异

  • 令n是一个参数,作为问题规模的一个度量
  • 令R(n)是一个计算过程在处理规模n的问题时所需要的资源量

我们称R(n)具有θ(f(n))的增长阶,记为:

R(n) = θ(f(n))

如果存在与n无关的整数k1和k2,使得:k1f(n) <= R(n) <= k2f(n)

对于足够大的n,值R(n)总位于k1f(n)k2f(n)之间

增长的阶为我们提供了对计算过程行为的一种很粗略的描述,也为预期一个计算过程的行为变化提供了有用的线索

2.求幂

从对一个给定的数计算乘幂的问题入手,这一过程的参数为基数b和一个正整数的指数n,过程计算出b^n,定义如下:

b^n = b * b^(n-1)
b^0 = 1

可以直接转为一个线性的递归计算过程:

(define (expt b n)
    (if (= n 0)
        1
        (* b (expt b (- n 1)))))

上面过程需要θ(n)步和θ(n)空间,还可以转为一个等价的线性迭代:

(define (expt b n)
    (expt-iter b n 1))
(define (expt-iter b counter sum)
    (if (= counter 0)
        sum
        (expt-iter b
                   (- counter 1)
                   (* b sum))))

这一版本需要θ(n)步和θ(1)空间
此外,我们还可以借助于连续求平方去完成一般的乘幂计算:

b^n = (b^(n/2))^2      # n为偶数
b^n = b * b^(n-1)      # n为奇数

将上面规则定义为过程:

(define (fast-expt b n)
    (cond ((= n 0) 1)
          ((even? n) (square (fast-expt b (/ n 2))))
          (else (* b (fast-expt b (- n 1))))))

(define (even? n)
    (= (remainder n 2) 0))

这一过程的增长的阶是对数增长的

3.最大公约数(GCD)

两个整数a和b的最大公约数定义为:能除尽这两个数的那个最大的整数

找到两个整数的GCD除了因式分解,还有下面的著名算法:
基本思想:如果r是a除以b的余数,那么a和b的公约数正好是b和r的公约数
GCD(a, b) = GCD(b, r)

从任意两个正整数开始反复执行这种归约,最终将产生出一个数对,其中第二个数是0,第一个数则为GCD,这一计算方法称为欧几里得算法,写成过程如下:

(define (gcd a b)
       (if (= b 0)
           a
           (gcd b (remainder a b))))

这将产生一个迭代计算过程,其步数依所涉及的数的对数增长

lame定理:如果欧几里得算法需要用k步计算出一对整数的GCD,那么这对数中较小的那个数必然大于或者等于第k个斐波那契数

根据lame定理,可以做出欧几里得算法的增长阶估计:

  • n为较小数
  • k为计算过程所需步数
  • 得出n >= Fib(k)≈φ^k / √ ̄5

这样,步数k的增长就是n的对数(底为φ),算法增长阶为θ(log n)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 软件工程大师能够组织好自己的程序,预先发现自己程序的行为方式,即使发生问题也能很快的排出错误,就像一部汽车一样,拥...
    唐鱼的学习探索阅读 1,297评论 0 2
  • 第一章数和数的运算 一概念 (一)整数 1整数的意义 自然数和0都是整数。 2自然数 我们在数物体的时候,用来表示...
    meychang阅读 2,583评论 0 5
  • 这个星期的话题成长率确实好难。 回头审视自己,发现还是一无所获。所以,觉得自己对自己的要求实在不高。 三月份读了莎...
    许之欢喜阅读 240评论 4 1
  • 今天我终于开始写日记了,虽然只有短短的三百来字,虽然花了我一个小时的时间才完成,但是我还是很高兴,因为我终于动笔去...
    同风直上阅读 145评论 0 0
  • 妞妞已经完全好了,昨天各方面表现的很正常,但是养一只狗狗真的就像养一个小孩子一样,要时刻关注它是否吃坏了东西,是否...
    我叫纠总结阅读 183评论 0 0