1.23 代码修改非常easy, 关键是时间。 电脑上算了一下。 100000000下面全是0。 開始还以为代码写错了。

最后没办法, 用1e10 1e11来计算。 发现比 1e11 1e12快1.2-1.5之间。

比2小。

想了半天也给不出非常合理的解析。

開始以为是对3 5 7 取余数 比 4 6 8 要慢, 測试了一下,发现也不是这么一回事。网上有人怀疑是函数调用花了一定时间做if 推断, 老实说这东西性能影响也不应有这么大。

如今唯一想到的,就是编译器做了一些优化,导致性能不全然取决于调用次数。

这题目。网上也没找到非常合理的分析。

1.24  也非常遗憾。 開始将times设为10。 计算时间1e10下面全然是0. 后面没办法,将times设为10000, 结果发现时间也非常漂浮不定。

有时候, 1e12-1e13 比 1e11-1e12计算速度还快。

仅仅能说random导致性能非常随机了。

1.25 理论上肯定是对的, 时间上就悲剧了。我这边运行 100000000 1000000000区间,直接死机。

根本原因,还是我们的CPU是32或64位的。 不是无限位。

1.26 这个题目算法导论有清晰的解析。套用算法导论的公式T(n) = 2T(n/2) 可知道 T(n) = Theta(n)

坦率地说, SICP不是学算法的好书。 也不是讲数据结构的好书。

个人代码例如以下:

1.23

(define (search-for-primes-new start end count)

    (define (timed-prime-test n)

(newline)

        (display n)

(start-prime-test n (runtime)))

    (define (start-prime-test n start-time)

(if (prime? n)

   (report-prime (- (runtime) start-time))

   0))

    (define (report-prime elapsed-time)

(display " *** ")

        (display elapsed-time)

1)

    (define (prime? n)

(= n (smallest-divisor-new n)))

    (define (smallest-divisor-new n)

(define (find-divisor n test-divisor)

   (cond ((> (square test-divisor) n) n)

 ((divides? test-divisor n) test-divisor)

 (else (find-divisor n (next test-divisor)))))

      (define (divides?

a b)

 (= (remainder b a) 0))

      (define (next test-divisor)

 (if (= test-divisor 2)

     3

     (+ test-divisor 2)))

      (find-divisor n 2))

    (define (search-iter start end count)

(if (or (> start end) (= count 0))

   0

   (if (= (timed-prime-test start) 1)

(search-iter (+ start 1) end (- count 1))

(search-iter (+ start 1) end count))))

    (search-iter start end count))

1.24

(define (search-for-primes-new start end count)

    (define (timed-prime-test n)

(newline)

        (display n)

(start-prime-test n (runtime)))

    (define (start-prime-test n start-time)

(if (fast-prime? n 10000)

   (report-prime (- (runtime) start-time))

   0))

    (define (report-prime elapsed-time)

(display " *** ")

        (display elapsed-time)

1)

    (define (search-iter start end count)

(if (or (> start end) (= count 0))

   0

   (if (= (timed-prime-test start) 1)

(search-iter (+ start 1) end (- count 1))

(search-iter (+ start 1) end count))))

    (search-iter start end count))

(define (expmod base exp m)

(cond ((= exp 0) 1)

     ((even? exp)

      (remainder (square (expmod base (/ exp 2) m))

 m))

     (else

      (remainder (* base (expmod base (- exp 1) m))

 m))))

(define (fast-prime?

n times)

(cond ((= times 0) true)

     ((fermat-test n) (fast-prime?

n (- times 1)))

     (else false)))

(define (fermat-test n)

(define (try-it a)

   (= (expmod a n n) a))

      (try-it (+ 1 (random (- n 1)))))

1.25

(define (search-for-primes-25 start end count)

    (define (timed-prime-test n)

(newline)

        (display n)

(start-prime-test n (runtime)))

    (define (start-prime-test n start-time)

(if (fast-prime? n 10000)

   (report-prime (- (runtime) start-time))

   0))

    (define (report-prime elapsed-time)

(display " *** ")

        (display elapsed-time)

1)

    (define (search-iter start end count)

(if (or (> start end) (= count 0))

   0

   (if (= (timed-prime-test start) 1)

(search-iter (+ start 1) end (- count 1))

(search-iter (+ start 1) end count))))

    (search-iter start end count))

(define (expmod base exp m)

    (remainder (fast-expt base exp) m))

(define (fast-expt base exp)

(cond ((= exp 0) 1)

     ((even?

exp)

      (square (fast-expt base (/ exp 2))))

     (else

      (* base (fast-expt base (- exp 1))))))

(define (fast-prime? n times)

(cond ((= times 0) true)

     ((fermat-test n) (fast-prime?

n (- times 1)))

     (else false)))

(define (fermat-test n)

(define (try-it a)

   (= (expmod a n n) a))

      (try-it (+ 1 (random (- n 1)))))

SICP 1.23-1.26体会的更多相关文章

  1. Part 23 to 26 Routing in Angular

    Part 23 AngularJS routing tutorial In general, as the application becomes complex you will have more ...

  2. ZJOI2019Day2余姚中学游记(4.23~4.26)

    前言 \(Day2\),又是一场噩梦. 前段时间去做了挺多十二省联考和\(HNOI2019\)的题目,还订正掉了\(Day1\)的\(T1\)和\(T2\)(\(T3\)动态\(DP\)完全不想订正啊 ...

  3. SICP 1.21 1.22 体会

    1.21 简单的将书上代码敲了一遍. 非常顺利就过了. 1.22 就悲剧了. 先按书本的意思.代码非常快就写完了.但计算的时间在机子上漂浮不定. 3-5倍之间. 代码例如以下: (define (se ...

  4. SICP 习题1.16-1.19体会

    首先反思一下, 昨天做1.14的时候犯了一个严重错误.思维定式了,导致花了非常多无用功. 1.14的关键是要想到2个物理意义. 一个是广度优先, 也就是仅仅考虑问题递归树的第一层子数.那么必定有公式 ...

  5. 26. 60s快速定位服务器性能问题

    60s迅速发现性能问题 uptime dmesg | tail vmstat 1 mpstat -P ALL 1 pidstat 1 iostat -xz 1 free -m sar -n DEV 1 ...

  6. 最佳vim技巧

    最佳vim技巧----------------------------------------# 信息来源----------------------------------------www.vim ...

  7. 【1414软工助教】团队作业4——第一次项目冲刺(Alpha版本) 得分榜

    题目 团队作业4--第一次项目冲刺(Alpha版本) 作业提交情况情况 所有团队都在规定时间内完成了七次冲刺. 往期成绩 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目 ...

  8. 斐波那契数列的三种C++实现及时间复杂度分析

    本文介绍了斐波那契数列的三种C++实现并详细地分析了时间复杂度. 斐波那契数列定义:F(1)=1, F(2)=1, F(n)=F(n-1) + F(n-2) (n>2) 如何计算斐波那契数 F( ...

  9. Alpha冲刺(10/10)——追光的人

    1.队友信息 队员学号 队员博客 221600219 小墨 https://www.cnblogs.com/hengyumo/ 221600240 真·大能猫 https://www.cnblogs. ...

随机推荐

  1. java.lang.RuntimeException: com.intellij.ide.plugins.PluginManager

    描述: 在mac电脑上的Android Studio.因为项目需求,加载plugins中的dart和Flutter插件.经过***后,依然无法从AS中加载进来. 曲折到Jetbrains官网下载了da ...

  2. Ubuntu下查看APT安装的软件安装路径和版本

    1.查询安装路径 dpkg -L 软件名 例如:dpkg -L gedit dpkg -L gedit /. /usr /usr/bin /usr/bin/gedit /usr/share /usr/ ...

  3. rdlc报表集锦

    rdlc报表动态生成实例 http://blog.csdn.net/fwj380891124/article/details/8803844  rdlc报表动态生成公共类 http://blog.cs ...

  4. redis节点管理-新增从节点

    原文:http://blog.sina.com.cn/s/blog_53b45c4d0102wg12.html 新增从节点 新增一个节点7008节点,使用add-node --slave命令. [pl ...

  5. JAVA常见集合类

    菜鸟教程 http://www.runoob.com/java/java-collections.html TreesSet原理: https://blog.csdn.net/wangyunpeng0 ...

  6. JavaScript基础入门教程(二)

    说明 前一篇博客介绍了js以及一些关于js基本类型的简单知识,本篇博客将详细介绍js的基础类型,捎带介绍对象类型,更详细的对象类型的说明将后续再讲. js中类型的说明 js中的类型分为基本类型和对象类 ...

  7. 使用moment.js管理时间

    如果在nodejs下 npm install moment 引用模块: var moment = require('moment'); 用法: 当前时间:2015-11-07 18:00:51 mom ...

  8. Android从开源到碎片化 开发者叛离的真相

    Android从诞生开始就受到热捧,并日益普及.它有别于以往的手机及移动终端操作系统,其独具的开源性.系统廉价性和提供给第三方大自由度的创新空间,以及不受硬件约束的优势,获得了广大开放社群的支持.但是 ...

  9. java >>> 和 >>>=的区别

    java >> 和 >>> 以及 >>>= 的区别 可能大家都知道java中>> 和 >>> 的区别,那这里我也啰嗦一下, ...

  10. [转]SQL Server表分区

    本文转自:http://www.cnblogs.com/knowledgesea/p/3696912.html 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区 ...