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. mysql设置远程访问密码

    mysql -u root -p Aaa111222 grant all privileges on *.* to root@'%' identified by 'aaa111222; Quit ln ...

  2. Word中公式从单栏排版变为双栏排版后公式和编号错开了

    如上图公式(2),把自己做的共识从通栏复制到期刊的双栏里就变成这样了(先复制过来参考文献,再复制正文,那么参考文献没事),原来一直搞不懂,今天把它显示所有标记发现多了个制表符(我原来以为是行标记),鼠 ...

  3. 【Rocket MQ】RocketMQ 在windows7 64位安装使用 +RocketMQ管理界面的安装

    参考地址:https://blog.csdn.net/yucaifu1989/article/details/80960018 参考地址:https://blog.csdn.net/u01204090 ...

  4. 【hibernate】错误:org.hibernate.HibernateException: identifier of an instance of com.agen.entity.Monthdetail was altered from xx to xx

    所报错误: org.hibernate.HibernateException: identifier of an instance of com.agen.entity.Monthdetail was ...

  5. 前端工业化工具Gulp初体验

    1. 全局安装 gulp: npm install --global gulp 2.在项目目录下,用以下命令创建一个基本的package.json文件 npm init 3.安装Gulp npm in ...

  6. openGl 基础

    最近由于手机项目中需要用到OpenGL ES的知识,所以这段时间正在研究OpenGL的相关知识.因为OpenGL ES是OpenGL的剪裁版本,所以我直接从OpenGL入手,然后再去看OpenGL E ...

  7. Apache的Order Allow,Deny详解

    Allow和Deny可以用于apache的conf文件或者.htaccess文件中(配合Directory, Location, Files等),用来控制目录和文件的访问授权. 所以,最常用的是: O ...

  8. java发送http的get和post请求

    import java.io.*; import java.net.URL; import java.util.Map; import java.net.HttpURLConnection;; pub ...

  9. 【Javascript】如何实现点的wave效果 && sinewave效果

    参考资料: sinewave效果:http://www.oneapm.com/ci/docker.html?utm_source=BaiduPaid&utm_medium=cpc&ut ...

  10. Mac Finder 显示路径和复制路径

    Mac Finder 显示路径和复制路径 学习了:https://www.jianshu.com/p/757f9ffc5acf 设置 defaults write com.apple.finder _ ...