算法学习之道,应有三重境界
前言
本文从互联网上整理而来,其说法很有条理,故此站长很认同,在原文的框架之上,站长做了很多的修订。虽然这么好的方法摆在大家眼前,但是仁者见仁智者见智,未必大多数真正的能掌握和学好数据结构和算法。站长觉得:第一重境界非常重要,要狠狠地做好,然后才能有惯性,后面的二三重境界就容易实现。
正文
王国维先生在《人间词话》中写道:古今之成大事业、大学问者,必经过三种境界:
(1)昨夜西风凋碧树。独上高楼,望尽天涯路。此第一境也,望尽天涯。
(3)衣带渐宽终不悔,为伊消得人憔悴。此第二境也,为伊憔悴。
(4)众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。此第三境也,蓦然回首,融会贯通。
算法的学习之道也是如此,也分为三步走。
第一重境界:望尽天涯,群书多读,多学概念,夯实根基
在最初的阶段,算法世界的大门刚刚打开,这个时候要多读书,读多书,爬上算法的高楼,爬上算法的高楼,做到大格局,做到"望尽天涯路"。
从一个算法萌新入门,第一步便在于打牢根基。推荐阅读书籍:
(1)《算法第 4 版》
(2)《大话数据结构》
(3)《算法图解》
(4)《算法导论》
《算法第 4 版》适合初学者入门。《大话数据结构》和《算法图解》这两本书的特点是有趣、易理解,也非常适合初学者。《算法导论》的特点是全面,它是一本算法的百科全书,着重在于开阔算法视野,适合有一定算法基础后再去学习。
入门阶段是看一些天赋的,花费时间因人而异,大约在 3~6 月之间,将上述提到的书籍选择其中一本看完基本就能入门了。在这个阶段中,需要了解几类常用的算法:
其中,暴力枚举、贪心算法容易理解,可以很快上手。数论相关的算法需要用到一些数学技巧,包括位运算、幂函数、求模等等性质。二分算法和深度优先搜索算法相对有些技巧性,好在他们都有固定的模板。另外,不得不提的是,深度优先搜索算法的思想非常重要,而且深度优先搜索是动态规划、分治和回溯的基础,需要重点掌握。
第二重境界:题海战术,为伊憔悴
学习算法理论如同阅读了一本武功秘籍,然而仅仅掌握理论是不够的,接下来就要进入到实际练习阶段。
题海战术非常重要,不经过实战练习,理论仅仅是纸上谈兵。程序员说到底也是手艺人,这一个字符的改动,正是"台上一分钟,台下十年功"的体现,需要在大量的练习中才能理解两者之间的不同作用。
这一阶段花费的时间将会很长很长,伴随着不断地摔倒、爬起,你会对每类算法为伊憔悴。好在这一阶段是不看天赋只看勤奋的,每次从坑里爬起,都是献给成长的一份力量。
推荐的进阶书籍有《编程珠玑》,本书探讨了程序设计人员面对一系列的实际问题以及解决问题的措施(解决方案的代码以 C/C++ 语言编写)。书中选取了许多具有典型意义的复杂编程和算法问题,并阐述和总结了许多独特精妙的设计原则、思考和解决问题的方法以及实用的程序设计技巧。
第三重境界:蓦然回首,融会贯通,推陈出新
事实上,大量程序员停留在第二重境界就无法再进一步。当提到某一类算法时,你可以说:"我知道"、"我会用"、"踩过坑",但能说出"我完全理解其思想"、甚至"我能想办法改进"的人却很少很少。
这一步仿佛武学中的攻守之道,当你掌握到这一层,便可不再拘泥于一刀一剑、一招一式,如武侠小说所说:飞花摘叶皆可伤人、草木竹石均可为剑。
开创算法的过程是艰难又孤独的。每一个经典算法的诞生都伴随着"一将功成万骨枯"。
现在我们在很多语言中都可以直接调用 Collection.sort() 实现快速排序,而在快速排序算法出现之前,曾有一段时间仅有冒泡、选择、插入三种排序算法。直到 1959 年,希尔提出"希尔排序"算法,或许现在知道此算法的人已经很少了。但它是首个突破 O(n^2)复杂度的排序算法。
希尔排序算法较为晦涩难懂,而且并不是最优的排序算法,现在已经被后来的快速排序算法给淘汰了。然而不可否认希尔对排序算法的演进具有开创性贡献,在攀越算法高峰的路上,每一步都走得战战兢兢,我们只有铭记这些伟大的引路人,以此激励自己不断前行。
提醒:系统化学习才是最关键
现在网上有很多资源、博客、论坛可供我们更方便地学习知识片段。然而这种类似兵来将挡、水来土掩般的学习方法虽然有用,却并不特别的好。这里推荐大家在网上寻找一些系统的学习教程,以帮助自己由浅入深,一路成长。
算法学习之道非一日之功,在技术提升的路上,系统化学习就会一直助你前行。