• SICP 习题 (2.11)解题总结:区间乘法的优化


    SICP 习题 2.11又出现Ben这个人了,如曾经说到的,仅仅要是Ben说的一般都是对的。


    来看看Ben说什么。他说:“通过监測区间的端点,有可能将mul-interval分解为9中情况,每种情况中所须要的乘法都不超过两次”。

    所以这个叫Ben的人建议Allysa重写mul-interval过程。


    究竟是啥意思呢。我们先来看看曾经的mul-interval过程:

    (define (mul-interval x y)
      (let (( p1 (* (lower-bound x) (lower-bound y)))
    	( p2 (* (lower-bound x) (upper-bound y)))
    	( p3 (* (upper-bound x) (lower-bound y)))
    	( p4 (* (upper-bound x) (upper-bound y))))
        (make-interval (min p1 p2 p3 p4)
    		   (max p1 p2 p3 p4))))


    能够发现,这里使用了4次乘法。然后取4此乘法的最小值为起点,最大值为终点。

    按Ben的意思,我们能够将这4次乘法降低为两次,前提是对区间的端点进行推断。


    事实上我们自己想一想大概能够明确Ben这段神奇的话。 比方,假设相乘的两个区间都是全然大于零的区间。两个区间的起点相乘肯定是4次乘法中最小的值,而两个终点相乘肯定是4次乘法中的最大的,这样我们仅仅须要计算两个起点相乘,还有就是两个终点相乘就能够了。

    这样我们就能够使用2次乘法完毕工作,而不用4次。


    只是,对我们程序猿来讲工作就复杂非常多了,我们须要取推断这9中情况,分别想好9种情况种选用什么作为结构的起点和终点。最后写出来的代码例如以下,巨烦琐:

    (define (mul-interval x y)
      (if (> (lower-bound x) 0)
          (if (> (lower-bound y) 0)
    	  (make-interval (* (lower-bound x) (lower-bound y)) (* (upper-bound x) (upper-bound y)))
    	  (if (> (upper-bound y) 0)
    	      (make-interval (* (upper-bound x) (lower-bound y)) (* (upper-bound x) (upper-bound y)))
    	      (make-interval (* (lower-bound x) (upper-bound y)) (* (lower-bound x) (upper-bound y)))))
          (if (> (upper-bound x) 0)
    	  (if (> (lower-bound y) 0)
    	      (make-interval (* (lower-bound x) (upper-bound y)) (* (upper-bound x) (upper-bound y)))
    	      (if (> (upper-bound y) 0)
    		  (make-interval (* (lower-bound x) (lower-bound y)) 
    				 (* (upper-bound x) (upper-bound y)))
    		  (make-interval (* (lower-bound x) (lower-bound y))
    				 (* (upper-bound x) (upper-bound y)))))
    	  (if (> (lower-bound y) 0)
    	      (make-interval (* (lower-bound x) (lower-bound y)) (* (upper-bound x) (upper-bound y)))
    	      (if (> (upper-bound y) 0)
    		  (make-interval (* (lower-bound x) (lower-bound y)) 
    				 (* (upper-bound x) (upper-bound y)))
    		  (make-interval (* (lower-bound x) (lower-bound y)) 
    				 (* (upper-bound x) (upper-bound y))))) )))



    有人可能会问。把原来那个如此优雅的过程写成如今这样有意思吗?一堆丑陋的推断。

    这里须要理解的就是。假设系统中乘法是一个消耗非常大的操作。比方每一个乘法消耗2秒,这样我们做这个优化就有意义的,尽管我们写的代码丑非常多,麻烦非常多,只是代码执行效率就比較高了。



  • 相关阅读:
    PE文件捆绑实现二:(远程线程注入)
    C++中Vector清空
    ttrss更新到最新版本后发访问非80和443端口规避
    Git配置https_proxy访问github失败
    Haproxy配置拦截指定src的连接
    synology git管理程序添加
    ActiveMQ深入浅出系列 (一)
    sl4fj日志级别
    HTTP上传文件解析
    linux下jcmd无法获取jvmdump
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7029007.html
Copyright © 2020-2023  润新知