算法学习第一季-读《算法设计与分析基础》

大学修的计算机专业,毕业之时,《数据结构》《计算方法》《操作系统》《编译原理》等如同课本一样,永远的被打包起来。工作以来,一直在做Java的开发,Web开发和服务端应用,总是零星的涉及到些许数组、链表、树等数据结构,也主要以线性数据结构为主;算法基本上就是“经典”的数据结构书上所讨论的几种算法,JDK都有实现,在应用中早已无需我们思考太多。重要的是我们要把应用按着需求实现了,重要的是我们一步一步把应用带向我们认为简单务实美的方向前进。闲暇思索,对于虚拟机的看法不过是面试的话语;对于开发的认识同样如此,多是面试的谈资;对于一个更有经验的Java应用开发者,能够在开发提供一套解决方案,组合解决问题的模式积攒起来一段可预期时间内解决一系列问题,也许有人将这归之为架构师,谁又能说这不是一条Java应用架构师之路呢?有一天,恍然大悟,其实Java应用开发者比拼的是各自的开发经验、领域知识、开阔的思路、强悍的执著;事情总没有唯一的,以前和dreamhead讨论过业务,当然也有无数的把应用开发者的需求作为业务的Java开发“仁人志士”。而对于一个从事了几年Java应用开发的人来说,那么我们的激情下一个积攒点在哪儿呢?虽然刚开始接触计算机,就知道一句名言“程序=算法+数据结构”,现实中这几年算法对于我,如同鲁迅先生笔中的故乡,“愈远了”,“渐渐远离了我”,“模糊了”。
人生有多少个十年,人生有几多青春,对于一个个体,又有几多沉淀?
一如我刚毕业的青春年少无知,对于技术这个词汇激情澎湃,几乎认为是自己生命的全部。对于人来说,最重要的不是你能否学技术,学了多少技术,掌握了多少技术功底;而是一个人前进的方向是什么,你的人生想要的是什么,你的人生在计算机这个舞台你如何定位思考、如何的目标的?想好了再前行,前行了就不再犹豫。
算法是否总给人一种严肃的科学的概念,我相信,算法并不严肃,可以嬉笑怒骂,可以轻轻松松的和我们很多一线开发人员在一起。
非常感谢作者Anay Levitin著书《Introduction to the Design and Analysis of Algorithms》,感谢译者潘彦翻译这么好的书籍《算法设计与分析基础》,特别感谢dreamhead五一来沈阳一聚并送这本书给我。
虽然序言前言部分往往都有精髓的思想语句,然后对于算法无知的我决定直切正题,从绪论开始阅读。
为什么要学习算法?
由于“微积分”“算法”被并成为科学殿堂两大宝石的论断,很为大家熟知,至于算法是如何的英明神武,在现实中也许需要细细体会,我并未有多少深深体会悍然汗然。
作者直接扔出了为什么学习算法这个话题,一个是计算机专业人士必备,另外一个是能开发人们的分析能力。如果能有选择,我宁愿选择第二个,我想必备意味着用这个东西现在或者未来要解决切实的问题,我现在并不是先有棘手的问题—没有棘手的问题而去学习本身未必不是一个棘手的问题;如果籍此能够在具备计算机人士必须具备的基础之外,成就一下自己分析能力的增强,真是不错。
什么是算法?
该书中,对于算法的定义是“一系列解决问题的清晰指令,即对于符合一定规范的输入,能够在有限时间内获得所要求的输出。”可以看到算法,有输入,有输出,有指令,当然有执行这些指令的环境,也许第一个想到是计算机,对,计算机,但是也许是从事数学计算的人。定义等同于算法是解决问题的办法。
所以既然是解决问题,当然有问题域/值域;算法本身如何表达描述,算法自己的优劣之分;等等。
第一个例子是关于“计算两个整数的最大公约数”问题,记得在SICP一书中也阐述了这个例子。解决这个问题首先寻找的是“最大公约数的定义”,并仔细描述了欧几里得算法、连续整数检测算法、“艾拉托色尼筛”算法;并采用了结构化描述和伪码两种方式描述算法细节。
该书以如此简洁的言语和例子为我们打开了算法的道路。在接下来的一章节,会首先看到“算法是问题的程序化解决方案”,是的,我们就是要去寻找问题的程序化解决方案的。