编程珠玑感悟<1>

编程珠玑感悟<1>

第一章

准确的描述问题

在我们解决一个实际问题的时候,直觉上也许我们觉得将问题抽象化也许会有点大费周章,但是我们若想将

一个问题更精确的考虑,那么将问题抽象化便成为了必不可少的一步,将问题抽象化,实际上是将无关的线

索抛弃,而着手于问题的核心和本质。

抽象化如下:

  • 输入

    一个做多包含n个整数的文件,每个数都小于 N ,其中N=107.如果在输入文件没有重复的整数。

  • 输出

    按升序排列输入整数的列表。

  • 约束

    最多有1MB的内存可用,有充足的磁盘空间可用运行时间最多几分钟,若达到10秒则绝对满足要求。


解决问题
大概有点基础的人都知道用桶排(又称计数排序),但有以下注意点:
  • 所有的元素只出现一次,所以在空间大大不够多情况下,我们可以用一个位来表示一个数的有无。

  • 从外部读入数据,不同与我们做题,数据只能读入一遍,在空间不够的情况下,我们可以用时间换空间。


习题

此处摘录了一些很有意思的习题:

  • 1.6.4如何生成 0N1 之间K个随机整数,我想了好几个方法都不是很优美,要么有一定顺序,要么

    更依赖于运气,答案给出了极好的解法,他通过将前K个数与 N1 个数随机交换来解决,swap()展现

了她的魅力,因为无论如何swap(),都不会有一个新的数生成。

  • 1.6.7也许在ACM中绝大部分的输入都是符合一定规范的,但是在实际问题中,这种不规范的输入却是经

    常发生,在实际的程序设计中我们要相当注意对数据输入的规范性检查。

  • 1.6.9额,额,我只大致看出这是一个动态初始化的过程,不太看得懂,有看懂的请您不吝赐教了。

  • 1.6.10,11,12 那是一个相当久远的年代了,现在电脑的普及,使得这三个问题解决的太轻松了,不过第十题还是很有启发意义的。


感悟

这一章我们看到了技术排序的威力,当然更重要的是这一章如何将死板的更贴近公式化的算法,灵活的机巧

的应用到解决实际问题中,已知每个数仅仅会出现一次,我们可以压缩计数所用空间的大小,在空间不够的

情况下,如何用时间换取空间,而这往往是很少有算法书上提到的。

当然作为本书第一章,我感觉更重要的意义在于,作者展现的是在解决问题中,我们分析问题,明确问题的

思路,简单至简的设计思路和一颗追求更简单解决问题的心灵。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优化这段代码<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>图书购物车</title> <style> </style> <script src="js/vue.js"></script> </head> <body> <div id="demo"> <table border="1"> <tr> <td></td> <td>书籍名称</td> <td>出版日期</td> <td>价格</td> <td>购买数量</td> <td>操作</td> </tr> <tr> <td></td> <td>{{books1.name}}</td> <td>{{books1.date}}</td> <td>¥{{books1.price}}</td> <td><button @click="down(books1)">-</button>{{books4.count}}<button @click="up(books1)">+</button></td> <td><button @click="del">移除</button></td> </tr> <tr> <td></td> <td>{{books2.name}}</td> <td>{{books2.date}}</td> <td>¥{{books2.price}}</td> <td> <button @click="down(books2)">-</button>{{books4.count}}<button @click="up(books2)">+</button> </td> <td><button @click="del">移除</button></td> </tr> <tr> <td></td> <td>{{books3.name}}</td> <td>{{books3.date}}</td> <td>¥{{books3.price}}</td> <td> <button @click="down(books3)">-</button>{{books4.count}}<button @click="up(books3)">+</button> </td> <td><button @click="del">移除</button></td> </tr> <tr> <td></td> <td>{{books4.name}}</td> <td>{{books4.date}}</td> <td>¥{{books4.price}}</td> <td> <button @click="down(books4)">-</button>{{books4.count}}<button @click="up(books4)">+</button> </td> <td><button @click="del">移除</button></td> </tr> </table> <div>总价: ¥{{sum}}</div> </div> <!-- js部分 --> <script> const vm = new Vue({ el: "#demo", data: { books1: { name: '《算法导论》', date: '2006-9', price: 85.00, count: 1 }, books2: { name: '《UNIX编程艺术》', date: '2006-2', price: 59.00, count: 1 }, books3: { name: '《编程珠玑》', date: '2008-10', price: 39.00, count: 1 }, books4: { name: '《代码大全》', date: '2006-3', price: 128.00, count: 1 } }, computed: { sum () { return this.books1.price * this.books1.count + this.books2.price * this.books2.count + this.books3.price * this.books3.count + this.books4.price * this.books4.count } }, methods: { down (books1) { this.books1.count = books1.count - 1; } } }) </script> </body> </html>
04-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值