SICP 习题 (2.11)解题总结:区间乘法的优化
优化 总结 习题 区间 乘法 解题 2.11
2023-09-11 14:14:09 时间
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秒,这样我们做这个优化就有意义的,尽管我们写的代码丑非常多,麻烦非常多,只是代码执行效率就比較高了。
相关文章
- 我们用50次游戏性能的深度优化,总结出了五条“毒鸡汤”
- js - 总结一下条件语句优化
- php性能优化(一)压力測试工具篇
- 在SIMULINK实现各类优化类算法的仿真——粒子群算法、细菌觅食、
- linux性能优化从入门到大师怎么学?
- Android应用性能优化最佳实践.2.3 布局优化
- Linux性能优化3.3 本章小结
- Elasticsearch索引和检索优化与压测监控总结
- Hbase框架原理及相关的知识点理解、Hbase访问MapReduce、Hbase访问Java API、Hbase shell及Hbase性能优化总结
- hive优化之------控制hive任务中的map数和reduce数
- JS 数组中找到与目标值最接近的数字,记一次工作中关于二分查找的算法优化
- 《提高转化率!网页A/B测试与多变量测试实战指南》一第1章 关于优化测试1.1 优化测试
- OpenCV常见的优化方法和技巧总结
- canvas性能优化总结
- 数据库SQL优化大总结之 百万级数据库优化方案
- vue实战入门后台篇九:springboot+mybatis实现网站后台-代码整合及重构优化
- 实用TCP协议(2):TCP 参数优化
- JDBC优化策略总结
- DP的优化总结
- 如何进行seo优化要点总结
- JavaScript性能优化小知识总结
- MySQL数据库的性能优化总结
- 性能优化5--网络优化
- 【Verilog基础】PPA优化问题总结(含面积优化、速度优化)
- Unity3D优化总结
- ASP.NET Aries 4.0 开源发布:已完成基础功能优化重写
- 前端开发性能优化方案大总结