读《编程珠玑》有感
《编程珠玑》(后文简称《珠玑》)在序章中就开宗明义地提出了两个问题:一个是如何对实际问题进行抽象,找出问题的独特性质。二是一个富有意思的小题目:“如何在1MB内存内对0~10^7内若干元素组成的集合内的整数进行排序(10s内)”。一开始我想到的是归并排序,但是书中提出可以利用位图的位向量,不用考虑任何排序算法,只需要遍历两次即可,忽然就有茅塞顿开之感,从这个简单的例子中就可以对一些思想窥见一斑:位图数据结构、简单的设计、时间-空间的折中……整本书其实都是围绕这两点展开,让我大感裨益。
整本书涉及了很多东西,让我在意的首先是算法。也许是上学期“数据结构与算法”上机的后遗症,现在对于算法比较敏感。算法与其他思想地位相同,但是我认为在一般的编程层面上它具有更重要的影响。例如书中举出的例子:“给定一个英语词典,找出其中所有的变位词集合,例如pots,stop,tops互为变位词。”直接处理的话比较复杂,需要大量的计算和比较。由于我们只要找到同位词,其实只要使同位词编码相同就可以。我认为算法首先是一种有序的思想(当然需要严谨的数理逻辑证明),然而仅仅是一种思想还不够,它还需要能够高效正确地解决问题。作为一个学习算法的人,我们不应该认为算法有着标准答案。事实上,不同的问题常常有着不同适合的算法。我们所要做的不单单是简单地从已有的算法中“找”一种最佳的,还应该有着自己的想法。
那么实际问题的情况非常复杂,我们应该如何结合实际选择合适的解决方案呢?《珠玑》告诉我们:要多想。书中有很多这方面的技巧,例如粗略估算中Brooklyn Bridge的设计强度估算,代码调优等等。然而纸上谈兵是不行的,还是得依靠实践出真知。就像以前软工群里几位同学讨论的那样。让我印象深刻的是群里一位比较牛的同学的阐述,他说他时常重构自己所写的代码,因为有时他的选型有更好的选择。而同时他认为代码重构是提升自己能力的一个良好途径,我深以为然。我偶尔也重构自己的代码,然后就会发现以前的自己代码中的毛病是有多……了,也能够认识到自己应当注重的点在哪里。并且写新代码的过程也是一个锻炼自己的过程,有些东西不是说写过一遍就能保证下次就bug free的(事实上一般不能)。长此以往,不能说保证能成为牛人,但起码能在用一个还行的速度敲完代码之后说一句:“无他,唯手熟尔。”
总的体会是这样子,当中的题目我只是看了几题,并没有时间细做,也算一个小小的遗憾吧。暑假里争取能够做一做,在深刻体味一下。
原文地址:https://www.cnblogs.com/redlogic/p/8955816.html