首页 > 代码库 > 阅读《大道至简》第二章读后感

阅读《大道至简》第二章读后感

  这一节取得标题是懒人创造方法,实际上是一个引子,通过一些实际生动的案例说明创造方法对于提高项目效率的意义。我理解的核心是:创造更加高效的方法胜于用简陋的方法埋头苦干,“磨刀不误砍柴功”嘛!

    李冰通过观察生活现象,基于物理现象改进了开山的方法;而愚公只是用一个简单粗暴、低效的方法来移山。很明显李冰的效率很高,在有限的时间内完成任务(至少在秦国灭亡前),而愚公的结果则显得遥遥无期,肯定可以移走,但时间开销太大。对比二者,虽然都可以可行的解决方案,但显然愚公的方案比李冰的差无穷的距离,而且李冰的项目是有实际意义的,对完成项目的时间和动用的资源是有限制的。需求和条件限制迫使李冰不得不寻找更高效的方法,而不是因为懒才想方法偷懒。

  我是数学专业的,没有系统的学习过软工的课程,但是我对算法的重要性理解是十分深刻的。数学也是需要写程序的,不同于软工要搞一个应用的大项目,我们至少要能用软件代替我们进行一些计算,而这些复杂的计算是没有现成的软件的,只能自己写。在我解决的一些优化问题中,常常遇到一些寻找最优解的问题,在所有可能的解空间中寻找最优解。一个最简单暴力的先发是:遍历所有可能结果,比较大小,找到最优解,这个结果一定是最优的,没有问题。但是,当考虑的属性(或数据维数)比较大,或者需要反复迭代的算法,即时原始数据只有nn<10^3,反正不是很大)个,计算的次数的数量级都会达到10^n10^1000左右)这么多,2015年全球最快最快的超级计算机计算速度达到3.386*10^18次每秒,这尼玛什么时候能算完?

  实际中人们是用各种各样高效的算法来选取最优值,比如线性规划的单纯性法、模拟退火法、dijkstra方法、粒子群、梯度下降法等,这些方法都是经过验证的,虽然不一定取得最精确解,但可以在有限的时间内得到理想的近似解。就像愚公如果改进方法,把家搬了不就完事了?

  说回到计算机编程上的算法,文中举的例子:编程从面向过程到面向对象的改进,我觉得这其实是实际编程的需要,程序越写越大,将程序写在一个文件里已经无法在适应编程人员的操作需要,效率低下,所以人们发明了模块的概念。我觉得这是一个伟大的想法,面向过程确实可以解决一切编程(我最早学的C,面向过程)。但是当项目庞大,代码成吨的时候,在一步步的写命令就非常复杂,开发人员的效率极低。面向对象(我后来学的一点c++和现在的java)则很好的解决了这个问题:所有的大问题可以完全分解为最基本的步骤,但也可以分成一个个独立的模块,在搭建结构的时候直接把模块拿过来用就行,模块于模块可以继续组成更大的模块。就像计算1+1+1+1+1

  你可以:1+1+1+1+1=2+1+1+1=3+1+1=4+1=5

  也可以:1+1+1+1+1=1+1+1+1+1=3+2=5

    减少重复操作;

  还有:1+2+3+9+8+7

  你可以:1+2+3+9+8+7=1+2+3+9+8+7=30

  也可以:1+2+3+9+8+7=1+9+2+8+3+7=10*3=30

    当然,第二个例子对于各位大学生来说是没有什么难度,我只是举一个例子:通过合理的设置模块结构可以降低计算难度。毕竟不用进位且直接将三个相同的数相加计算更为简单。

    这就是我对计算方法的理解,毕竟不是软工的,不敢多言。

    顺便推荐一片相关博文《日学一算法---平方根倒数速算法》

    链接:http://blog.csdn.net/xiaoguohaha/article/details/21652643

    仅仅在底层算法上的改进,就使得程序运行速度大为提高,同样性能的计算机,能完成更多的计算任务。

  最近,QUAKE的开发商ID SOFTWARE 遵守GPL协议,公开了QUAKE-III的原代码,让世人有幸目睹Carmack传奇的3D引擎的原码。这是QUAKE-III原代码的下载地址: http://www.fileshack.com/file.x?fid=7547。我们知道,越底层的函数,调用越频繁。3D引擎归根到底还是数学运算。那么找到最底层的数学运算函数(在game/code/q_math.c), 必然是精心编写的。里面有很多有趣的函数,很多都令人惊奇,估计我们几年时间都学不完。在game/code/q_math.c里发现了这样一段代码。它的作用是将一个数开平方并取倒,经测试这段代码比(float)(1.0/sqrt(x))4倍:

 

        

阅读《大道至简》第二章读后感