14天阅读挑战赛
努力是为了不平庸~
算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!欢迎记录下你的那些努力时刻(算法学习知识点/算法题解/遇到的算法bug/等等),在分享的同时加深对于算法的理解,同时吸收他人的奇思妙想,一起见证技术er的成长~
广大码农同学们大多都有个共识,认为算法是个硬骨头,很难啃,悲剧的是啃完了还未必有用——除了面试和考试的时候。
算法为什么这么难学?
一个原因是,算法本身具有一定的复杂性。另一个原因是,讲得不到位!
(1)我们学习了那些经典的算法,在惊叹它们奇妙的同时,难免疑虑重重:这些算法是怎么被想到的?这可能是最费解的地方。高手讲,学算法要学它的来龙去脉,包括种种证明。但对菜鸟来说,这简直比登天还难,他们很可能花费很多时间也无法搞清楚。对大多数人来说,这条路是行不通的,那怎么办呢?下功夫去记忆书上的算法?记住这些算法的效率?这样做看似学会了,其实两手空空,遇到新问题时仍无从下手。但这偏偏又是极为重要的,无论是做研究还是做实际工作,计算机专业人士最重要的能力就是解决问题——解决那些不断从实际应用中冒出来的新问题。
(2)算法作为一门学问,有两条几乎平行的线索。一条是数据结构(数据对象)︰数、矩阵、集合、串、排列、图、表达式、分布等。另一条是算法策略:贪心策略、分治策略、动态规划策略、线性规划策略、搜索策略等。这两条线索是相互独立的:对于同一个数据对象上不同的问题(如单源最短路径和多源最短路径),就会用到不同的算法策略(如贪心策略和动态规划策略);而对于完全不同的数据对象上的问题(如排序和整数乘法),也许就会用到相同的算法策略(如分治策略)。
两条线索交织在一起,该如何表述呢?还没有哪一本算法书能够很好地解决这两个困难,传统的算法书大多注重内容的收录,却忽视思维过程的展示,因此我们虽然学习了经典的算法,却费解于算法设计的过程。
所以说,绝大多数算法书在作为培养算法设计者的角度来说是失败的,比数学教育更失败。
大多数人学完了初中平面几何都会做证明题(数学书不会要求你记住几何所有的定理),但很多人看完了—本算法书还是一团浆糊,不会证明一些起码的算法,我们背了一坨又一坨结论,非但这些结论许多根本用不上,就连用上的那些也不会证明。为什么会出现这样的差异?因为数学教育的理想目的是为了让你成为能够发现新定理的科学家,而码农系的算法教育的目的却更现实,是为了让你成为能够使用算法做事情的工程师。然而,事情真的如此简单么?如果真是这样的话干脆连算法结论都不要背了,只要知道算法做的是什么事情,时空复杂度各是多少即可。
第一本书强烈建议不要把自己想的太“强大”,初学者不要上来直接撸《算法导论》!具体选什么书就自己的水平,纯小白的建议先打好编程基础再去学习算法。
纸上得来终觉浅,绝知此事要躬行!对于算法和数据结构,最好的检验学习成果的方式,就是刷题!
所以推荐大家学习一个知识点后,去刷一点对应知识点的题目巩固和加深一下理解。学习算法的套路很简单,多看、多写、多上机,既然是思想的集合,看得多了,自然无师自通。
有的时候一下想到时间复杂度最低的解法是很难的,就像一口吃不成胖子。
所以我们可以先从简单暴力(时间复杂度高)的方法入手,可以发现一些题目的线索,为后面想到时间复杂度最低的方法打下基础。
题目通过了,我们应该总结一下这道题考察的知识点、切入的角度、同类型的题目等,还要思考有没有更优的办法,代码还能不能更加简洁一些。做到以上几点,一道题的就学习的很透彻了,遇到同类型的题目也可以举一反三。