上一学期系里安排讲算法,大言不惭地接下来,坎坎坷坷也算是基本完成了任务。此一门课程甚是困难,讲起来自然费力,但也给了自己很多时间和机会去研究以前从未想过的问题。
一般都想在做完一件事情后,写写总结和体会。
算法是计算机中的高层建筑,学习起来是比较困难的,但如果能掌握事情的本质,也是比较轻松的。
国外的算法课本都是公式加伪代码,然后就是各种分析。看着那样的书,我们一般都会想到数学,但以现在的知识量又不能用数学去很好的消化,好像我们无法把这门课归类或者引申在我们以前见过的任何一门学科中,所以,读起来如同嚼蜡。
那回过头来想想算法是研究什么的,事情就可以得到解决。算法研究的是如何高效地使用计算机,以解决复杂的问题。它很难上手的原因是理论性强,难以理解。我们现在看的算法只所以使用伪代码或者不使用代码的原因是,语言并不重要,只要把算法的步骤描述出来就可以了,重要的是算法思想。而算法还有一个很重要的方面是算法分析,我们不仅需要掌握算法的基本思想,还要学会去分析算法的效率。这两点是算法着重讨论的。
但是直接看这些内容会不知其所以然。
那我们回头看一看。算法研究的是什么?研究的是计算机解决问题的能力。所以,算法必须基于计算机的思维,而不是人。计算机的计算能力很高,但也有很多缺陷,如没有记忆能力,计算完成的很多数值如果不分配存放地方的话,会被直接覆盖掉,函数返回值只是存放在一个寄存器中。但我们解决的很多问题是需要基于原始数值的,所以,需要开辟内存空间来存放这些数值。这就是所谓的以空间来换取时间,这时间其实是重复计算的时间。
计算机和人最大的区别是没有思维,所以,我们必须用程序性语言去和计算机打交道。既然计算机不具备思维,那我们可以通过程序来实现简单的思维选择,如有些问题在寻找最优解的时候和我们人脑是很相似的,比如,贪心算法中所涉及到的问题,进而引申,可以看到在很多问题上贪心算法大放异彩。
算法中涉及到的很多问题不是利用了计算机的优势,恰恰是为了避免计算机的硬件缺点。而很多问题成为不能用多项式去解的问题也是因为计算机的硬件约束所导致的。
所以,算法最先依赖的不是语言,而是硬件基础。硬件基础,决定了它所能解决问题的高度。
如此看来,算法就是计算机科学中的哲学,动态规划更像是一个理性主义者,而随机化就成为了机会主义的代名词。
理解各类算法的思想必须结合计算机的基础架构,同样在做算法分析的时候,我们是在验证这种观念在计算机中是否能被接受。如同一种价值观是否能被某人所认同和接受一样。
国内的教材大都泛泛,所讲不过是按部就班。学习算法比较好的方法,我觉得是,阅读实现算法的优秀代码,去抄袭别人到底是如何写的。如同我们学习一种价值观一样,不去研究它本身,而是看它到底是如何作用于人,影响人的。
算法在找一种通用所有问题的解法,以此来规约到多项式复杂度,以我来看,是在找一种计算机世界的普世价值观,找到找不到那就和基础的硬件设施密切相关。