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. bootstrapTable定位行固定滚动条

    写在前面: 当页面table列表数据有修改后,用户需要再次回到修改的行位置. 1.当修改行数据后,table刷新,行数据位置前后不发生改变 ,可使用下面这种方法: /*获取当前滚动条的位置*/ var ...

  2. web安全之如何防止CSRF跨站请求伪造

    CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站 ...

  3. FORM动态LIST ITEM

    DECLARE rg_list_item recordgroup; ret_code NUMBER; BEGIN --SQL里必做是以值键两个字段顺序,并且都要为字符串类型 rg_list_item ...

  4. Apache的Order Allow,Deny详解

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

  5. mysql 数据库缓存调优之解决The total number of locks exceeds the lock table size错误

    环境: mysql5.6.2  主从同步(备注:需操作主库和从库) 一.InnoDB表执行大批量数据的更新,插入,删除操作时会出现这个问题,需要调整InnoDB全局的innodb_buffer_poo ...

  6. python之epoll服务器源码分析

    #!/usr/bin/env python # -*- coding: utf8 -*- import socket, select EOL1 = b'/r/n' EOL2 = b'/r/n/r/n' ...

  7. 项目部署问题:xftp无法连接服务器、Nginx403 Forbidden解决、nginx反向代理解决前端跨域问题

    一.xftp无法连接服务器 在xftp中配置正确的ip,用户名和密码后,居然无法连接 解决方案:将协议里面的FTP换成SFTP,注意换成SFTP后端口就默认换成22,要还是原来的21就还是连不上的哈 ...

  8. Eclipse代码布局怎么使用退格和缩进快捷键?

    Eclipse代码布局怎么使用退格和缩进快捷键? 好的程序,不仅要运行快速准确,而且还要易于理解.研究表明,清晰的代码布局可以提高程序猿的理解能力.何为代码布局?其实就是代码的缩进.留白等.为了保证清 ...

  9. yaha分词

    yaha分词:https://github.com/jannson/yaha

  10. 最简单的方式用上https

    1.在这个网站申请ssl证书 https://www.sslforfree.com 2.下载的证书使用这个脚本处理一下 #!/bin/bash HOST_NAME=$1 cp certificate. ...