PART ONE
高德纳奠定了计算机算法的基础,程序=数据结构+算法,要想写好一个计算机程序,一个好的算法需要经过不断的打磨,需要有深厚的数学功底,同时对计算的数学本质有清晰的认识。
“冯·诺依曼体系结构”,将计算机系统分为软件系统和硬件系统,硬件系统又由存储器,运算器,控制器,总线,输入输出设备,在其设计该计算机时,提出在计算机科学中,更多时候是需要顶层设计的,而不是从经验出发归纳总结,那么什么是顶层设计?怎样进行顶层设计呢?
1.1节后半部分介绍了算法基础的奠基人--高德纳的五大贡献,比如提出衡量一个算法好坏的大O阶的方法,以及编写了计算机科学领域的“圣经”——《计算机程序设计艺术》一书,很好地讲述了程序设计的基本算法,对计算数学的前路产生了重大影响,为我们深入理解算法的艺术和数学的计算之美提供了一条捷径等等。虽然冯·诺依曼发明计算机体系结构和高德纳编写TeX程序似乎都是偶然为之的结果,但为什么这些大师们偶然为之的工作比二流人才穷其一生的发现有时还有影响力呢?因为除了能力的差异外,他们还有着遇到问题时解决问题的积极态度。任何人在前进的过程中都会遇到问题,但是对待问题的态度决定了个人的命运,他们总是积极思考,能够清晰地洞察问题的本质,从而找出异于常人的最优方案,因而能成为前沿科学与技术的开创者,这是值得我们学习的。
冯*诺依曼体系结构,软件从计算机科学中分离出来。由于软件和硬件系统的分离,从而使得我们能够在不清楚其硬件结构时也能实现应用软件的开发·。(在基于系统软件的情况下)
思考题1.1
世界上还有什么产品类似于计算机,是软硬件分离的?( 难度系数1颗星)
嵌入式系统,实行软件与硬件分开设计
PART TWO
苏联著名的物理学家、诺贝尔奖获得者朗道把物理学家分为了五级。一级的能力和贡献是二级的10倍,二级又是三级的10倍,就这样,每一级之间差一个数量级,朗道的这个划分方法也适用与计算机科学与的学者和工程师,一级能够开创一个产业,二级能够成为科学和技术的先驱,三级可以把自己的技术和产品做到世界第一,这要求学者能对计算机内在的逻辑有深刻的理解并且能学会权衡,四级能够独立负责一个大型项目,能够提出比一般人要好的方案或者算法,五级需要能够独立完成一些技术性的工作,能够利用计算机解决所有日常问题,要想达到一定的高度,最为关键的应当是对计算机科学的理解与其本质的认识。
生活环境的限制使得人们对计算资源的认识也具有了一定的局限性,特别由于时代的进步和科技的迅速发展,人们天生对计算机资源没有概念,总觉得它的速度无穷大,内存用不完,因此很多人会无端浪费很多资源,因而在硬件资源一定时,软件的差异成为了计算机学者需要考虑的问题,要衡量算法的好坏,就必须先明确算法的衡量标准以及测试的方法,算法复杂度应运而生,成为对算法进行分析的重要方式。
算法分析核心思想:
1.在比较算法的快慢时,只需要考虑数据量特别大,大到近乎无穷大时的情况,因为计算机的发明就是为了处理大量数据的,而且在当今这个数据爆炸的时代,数据越处理越多,这要求我们必须要考虑大数的情况。
2.决定算法快慢的因素虽然可能有很多,但是所有的因素都可以被分为两类:第一类是不随数据量变化的因素,第二类是随数据量变化的因素。但是我们衡量算法好坏时,只需要考虑N近乎无穷大的情况。(为什么这么考虑问题呢?因为计算机的任务是处理远远超出我们想象的规模的数据量,而我们的认知其实很难想象那样规模的数据有多少。)
书中有俩个有趣的例子,特别是例2,不可能在巨大的多维空间中进行语音识别,故而统计语言模型的提出极大的缩减了其搜索的空间,降低了其对计算资源的高额要求,即使这样,我们依然可以通过思考来提出更好的算法。
3.两种算法在复杂度上相差哪怕只有一点点,N很大之后,效率可能就差出万亿倍了,如果选择的算法在复杂度的数量级上相差那么一点点,代码执行的效率就有天壤之别,这是由算法本质所决定的,因而要想做到能处理大量数据,就必须要从计算的本质出发,要将注意力放在数量级的差异上,从而更好地提升计算性能。
思考题1.2
如果一个程序只运行一次,在编写它的时候,你是采用最直观但是效率较低的算法,还是依然寻找复杂度最优的算法?(难度系数2颗星)
这需要从程序所需的计算资源和计算机本身所有的计算资源来分析;如果计算机本身的资源不能满足该程序的运行,那么显然是需要寻找最优算法的,但是如果计算机能够满足程序运行所需的资源的话,考虑到代码并没有重用性,不需要保存于计算机中再次运行,我们是可以采用最直观但是效率较低的算法,但是我个人更倾向于寻找复杂度最优的算法,这既是对我们自身数学能力的一种培养,也是对算法一种负责任的态度,只有在积极的思考的过程中,我们才能由新的发现。