我的算法学习之路Luc

严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的。

第一次接触数据结构是在大二下学期的数据结构课程。然而这门课程并没有让我入门——当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾——反正最后考试划个重点也能过,于是这门整个计算机专业本科最重要的课程就被傻逼的我直接忽略过去了。

直到大三我才反应过来以后还要找工作——而且大二的折腾证明了我并没有什么商业才能,以后还是得靠码代码混饭吃,我当时惊恐的发现自己对编程序几乎一无所知,于是我给自己制订了一个类似于建国初期五年计划的读书成长计划,其中包括C语言基础、数据结构以及计算机网络等方面的书籍。

至今记得,这本书为了说明算法是多么重要,在开篇就拿最大子序列和作为例子,一路把复杂度从O(N3)杀到O(N2)再到O(NlgN)最后到O(N),当时内心真的是景仰之情=如滔滔江水连绵不绝,尼玛为何可以这么屌,

此外,我当时还把这本书里图算法之前的数据结构全手打了一遍,后来找实习还颇为自得的把这件事放到简历里,现在想想真是傻逼无极限。

凭借这个读书成长计划中学到的知识,我总算比较顺利的找到了一份实习工作,这是后话。

我的实习并没有用到什么算法(现在看来就是不停的堆砌已有的API,编写一堆自己都不知道对不对的代码而已),在发现身边的人工作了几年却还在和我做同样的事情之后,我开始越来越不安。尽管当时我对自己没什么规划,但我清楚这绝壁不是我想做的工作。

考研的细节无需赘述,但至今仍清楚的记得自己在复试时惊奇且激动的发现北航宿舍对面就是微软西格玛大厦,那种离理想又进了一步的感觉简直爽到爆。

我的研究生生涯绝对是一个反面典型——翘课,实习,写水论文,做水研究,但有一点我颇为自得——从头到尾认真听了韩军教授的算法设计与分析课程。

韩军给我印象最深的有两点:课堂休息时跑到外面和几个学生借火抽烟;讲解算法时的犀利和毫不含糊。

之后,在机缘巧合下,我进入微软亚洲工程院实习,离理想又近了一步,自我感觉无限牛逼。

在微软工程院的实习是我研究生阶段的一个非常非常非常重要的转折点:

这里就不说1和3了(和本文题目不搭边),重点说说2。

然而一件事打断了这段安逸的生活——

这件事对我产生了很大的震动——

严格来说上面两本书都不是传统的算法书,因为它们侧重的都不是算法,而是经典算法的具体实现(Implementation),然而这正是我所需要的:因为算法的原理我能说明白,但要给出优雅正确简练的实现我就傻逼了,哪怕是stof这种简单到爆的"算法"。

依然是以前的傻逼学习方法:反复研读+一遍又一遍的把代码抄写到本子上,艰难的完成了这两本书后,又读了相当数量的编程实践(ProgrammingPractice)书籍,自我感觉编程能力又大幅提升,此外获得新技能——纸上编码。这也成为了我之后找工作面试的三板斧之一。

所以那些动则就扯什么算法啊基础啊内功啊所谓的大牛们,请闭上你的嘴,条条大道通罗马。算法并不是编程的前提条件,数学也不会阻碍一个人成为优秀的程序员。至少在我看来,什么算法基础内功都是唬人的玩意,多编点能用的实用的程序才是王道,当然如果你是一个puretheorist的话就当我什么都没说好了。

阅读了块覆盖的定义后,我发现我需要对T-SQL进行语法分析,在没有找到一个好用的T-SQLParser的情况下,只能自己动手搞一个:

于是,自己自己就照着T-SQL的官方EBNF,三下五除二撸了一个T-SQL存储过程的LL(k)Parser,把代码转换成AST,然后用一个ExternalASTWalker生成代码块覆盖的HTML报表,全部过程一周不到。

老大自然是很满意——我疑心他的原计划是花两三个月来完成这个项目,因为这个项目之后的两个月我都没什么活干,天天悠哉游哉。

拼音索引是我接的一个手机应用私活里的小模块,用户期待在手机文本框可以根据输入给出智能提示:

比如说输入中国:

同样,输入拼音也应给出提示:

痛骂MS坑爹+汉字坑爹之余,还是得自己撸一个库出来:

用户很happy——因为我捎带把他没想到的多音字都搞定了,而且流畅的一逼。

我也很happy,因为没想到自己写的库居然比MS的还要快几十倍,同时小十几倍。

从这个事情之后我变得特别理解那些造轮子的人——你要想想,如果你需要一个飞机轮子但市场上只有自行车轮子而且老板还催着你交工,你能怎么搞。

前面提到在微软实习时老大扔给我一个WindowsPhone让我研究下,我当时玩了玩就觉着不太对劲,找联系人太麻烦。

比如说找"张晓明",WP只支持定位到Z分类下——这意味着我需要在Z分类下的七十多个联系人(姓张的姓赵的姓钟的等等)里面线性寻找,每次我都需要滑动四五秒才能找到这个张姓少年。

这TMD也太傻逼了,本屌三年前的老破NOKIA都支持首字母定位,996->ZXM->张晓明,直接搞定,尼玛一个新时代WindowsPhone居然会弱到这个程度。

搜了一下发现没有好用的拨号程序,于是本屌就直接撸了一个支持首字母匹配的拨号程序出来扔到WP论坛里。

结果马上就有各种问题出现——最主要的反映是速度太慢,一些用户甚至反馈按键有时要半秒才有反应。本屌问了下他的通讯录大小:大概3000多人。

吐槽怎么会有这么奇葩的通讯录之余,我意识到自己的字符串匹配算法存在严重的性能问题:读取所有人的姓名计算出拼音,然后一个个的匹配——结果如果联系人数量太多的话,速度必然拙计。

于是我就开始苦思冥想有没有一个能够同时搜索多个字符串的高端算法,以至于那两天坐地铁都在嘟囔怎么才能把这个应用搞的快一些。

具体细节不多说,总之换了算法之后,匹配速度快了大约九十多倍,而且代码还短了几十行。哪怕是有10000个联系人,也能在0.1秒内搞定,速度瓶颈就这样愉快的被算法搞定。

之后又做了若干个项目,多多少少都用到了"自制"的算法或数据结构,最奇诡的一次是写一个电子书阅读器里的分页,我照着模拟退火(SimulatedAnnealing)的原理写了一个快速分页算法,事实上这个算法确实很快——但问题是我都不知道为啥它会这么快。

总之,算法是一种将有限计算资源发挥到极致的武器,当计算资源很富余时算法确实没大用,但一旦到了效率瓶颈算法绝壁是开山第一刀(因为算法不要钱嘛!要不还得换CPU买SSD升级RAM,肉疼啊!!)。一些人会认为这种说法是有问题,因为编写新算法的人力成本有时比增加硬件的成本还要高——但别忘了增加硬件提升效率也是建立在算法是Scalable的基础上——说白了还是得撸算法。

实习实习着就到了研二暑假,接下来就是求职季。

求职季时我有一种莫名的复仇感——尼玛之前百度实习面试老子被你们黑的漫天飞翔,这回求职老子要把你们一个个黑回来,尼玛。

现在回想当时的心理实属傻逼+幼稚,但这种黑暗心理也起了一定的积极作用:我丝毫不敢有任何怠慢,以至于在5月份底我就开始准备求职笔试面试,比身边的同学早了两个月不止。

我没有像身边的同学那般刷题——而是继续看书抄代码学算法,因为我认为那些难得离谱的题面试官也不会问——事实上也是如此。

证明简单代码段的正确性是一个很神奇的技能——因为面试时大多数公司都会要求在纸上写一段代码,然后面试官检查这段代码,如果你能够自己证明自己写的代码是正确的,面试官还能挑剔什么呢?

求职毕业季之后就是各种Happy,Happy过后本屌发现即将面临另一个问题:算法能力不足。

因为据说以后的同事大多是ACM选手,而本屌从来没搞过算法竞赛,而且知道的算法和数据结构都极为基础:像那些元胞自动机、斐波那契堆或是线段树这些高端数据结构压根只是能把它们的英文名称拼写出来,连用都没用过,所以心理忐忑的一逼。

为了不至于到时入职被鄙视的太惨烈,加上自己一贯的算法自卑症,本屌强制自己再次学习算法:

这本书最大的亮点在于它把Visualization和Formatting做到了极致——也许它不是最好的数据结构入门书,但它绝壁是我读过的排版最好的书,阅读体验爽的一逼;当然这本书的内容也不错,尤其是红黑树那一部分,我想不会有什么书会比此书讲的更明白。

这门课包含各种让本屌世界观崩坏的奇诡数据结构和算法,它们包括但不限于:

从接触算法到现在,大概七年:初学时推崇算法牛逼论,实习后鼓吹算法无用论,读研后再被现实打回算法牛逼论。

怎么这么像辩证法里的肯定到否定再到否定之否定。

现在来看,相当数量的鼓吹算法牛逼论的人其实不懂算法的重要性——如果你连用算法解决实际问题的经历都没有,那你如何可以证明算法很有用?而绝大多数鼓吹算法无用论的人不过是低水平码农的无病呻吟——他们从未碰到过需要用算法解决的难题,自然不知道算法有多重要。

Touseananalogy,ifalgorithmswereaboutautomobiles,itwouldbeforthepersonwhowantstoknowhowcarswork,howtheyarebuilt,andhowonemightdesignfuel-efficient,safe,reliablevehiclesforthe21stcentury.Thepeoplewhohatealgorithmsaretheoneswhojustwanttoknowhowtodrivetheircaronthehighway,justlikeeveryoneelse.

Ifyouwanttobecomeagoodprogrammer,youcanspend10yearsprogramming,orspend2yearsprogrammingandlearningalgorithms.

总而言之,如果你想成为一个码农或是熟练工(CodeMonkey),你大可以不学算法,因为算法对你确实没有用;但如果你想成为一个优秀的开发者(Developer),扎实的算法必不可少,因为你会不断的掉进一些只能借助算法才能爬出去的坑里。

THE END
1.算法学习攻略总结:入门至进阶,通关之路指南51CTO博客学算法、刷 LeetCode 绝非一蹴而就,它需要一个循序渐进的过程。 导读 1. 初学者的常见误区 2. 新手小白如何有效刷算法题 2.1. 没有接受自己是算法小白的事实 2.2. 没有合理的刷题方法 3. 正确的算法学习路径 3.1. 基础数据结构与算法知识 3.2. 常见算法思想 https://blog.51cto.com/u_16542656/12047317
2.入门必看算法基础知识讲解小白都也能看得懂上一节中提到:算法就是解决某个或者某类问题的办法,但是,这只是对算法的一个笼统的描述。一个真正的算法,包含以下5大特性:输入、输出、有穷性、确定性、可行性。 输入输出:算法具有零个或者多个输入,至少一个或者多个输出。输入可以为零,但是必须存在输出,输出的形式可有为确定的返回值或者日志的的打印等,如果没https://blog.csdn.net/m0_63174618/article/details/138362160
3.算法入门:从零开始学习算法的简单教程本文介绍了算法入门的基础知识,包括算法的基本概念、重要性及其应用领域。文章详细解释了如何描述和分析算法,并列举了常见的算法类型及其应用场景,适合希望从零开始学习算法的读者。 算法入门:从零开始学习算法的简单教程 算法基础概念介绍 什么是算法 算法是一组定义明确的指令,用于解决特定问题或完成特定任务。算法可https://www.imooc.com/article/357937
4.吴师兄学算法五分钟学算法吴师兄学算法(www.cxyxiaowu.com)提供许多数据结构与算法学习的基础知识, 涵盖 LeetCode 题解、剑指 Offer 题解、数据结构等内容。https://www.cxyxiaowu.com/
5.算法干货主动学习算法学习笔记主动学习方法被提出以有效地处理这类问题。主动学习(Active Learning)是指通过自动的机器学习算法,从数据集中自动筛选出合适的候选集给人工标注的过程。有效的主动学习数据选择策略可以有效地降低训练的代价并同时提高模型的识别能力。在主动学习中,学习器能够主动地选择包含信息量大的未标注样例并将其交由专家进行标注,然https://developer.aliyun.com/article/1177917
6.趣学算法(陈小玉著)带目录完整pdf[95MB]电子书下载第1章 算法之美 1 1.1 打开算法之门 2 1.2 妙不可言—算法复杂性 2 1.3 美不胜收—魔鬼序列 9 1.4 灵魂之交—马克思手稿中的数学题 16 1.5 算法学习瓶颈 21 1.6 你怕什么 22 第2章 贪心算法 24 2.1 人之初,性本贪 25 2.1.1 贪心本质 25 https://www.jb51.net/books/635507.html
7.超详细算法岗的学习路线大总结!机器学习 or 深度学习基础 论文or 项目介绍 其他问题 & 向面试官提问 本文将从以上四点进行展开。 一、数据结构&算法题 随着算法岗越来越卷,Coding几乎成了面试必考的一项,而且在面评中的权重也越来越高,根据个人面试经验,如果这一环节没有很顺利得完成的话,几乎必挂,尤其对于非科班转行的同学,需要特别重视。 https://leetcode.cn/circle/discuss/SX3aa6/
8.算法数据结构体系学习班马士兵教育官网注意原“算法与数据结构基础班”已经过期。所有内容都被现在的“算法数据结构体系学习班”重新讲述,还增加了内容,增加了题目练习。原“算法与数据结构基础班”的所有内容,对应现在的“算法数据结构体系学习班”的1-23节。 注意原“算法与数据结构进阶班”已经过期。所有内容已经被现在的“算法数据结构体系学习班”和“https://www.mashibing.com/course/339
9.机器学习算法原理详解机器学习算法原理详解 机器学习作为人工智能的一个重要分支,其目标是通过让计算机自动从数据中学习并改进其性能,而无需进行明确的编程。本文将深入解读几种常见的机器学习算法原理,包括线性回归、逻辑回归、支持向量机(SVM)、决策树和K近邻(KNN)算法,探讨它们的理论基础、算法流程、优缺点及应用场景。https://www.elecfans.com/d/3669550.html
10.科学网—[转载]进化集成学习算法综述【摘 要】进化集成学习结合了集成学习和进化算法两方面的优势,并在机器学习、数据挖掘和模式识别等领域被广泛应用。首先对进化集成学习算法的理论基础、组成结构及分类情况进行了概述。然后根据进化算法在集成学习中的优化任务,从样本选择、特征选择、集成模型参数组合优化、集成模型结构优化以及集成模型融合策略优化几个方面https://wap.sciencenet.cn/blog-951291-1312816.html
11.机器学习十大经典算法入门[通俗易懂]腾讯云开发者社区机器学习十大经典算法入门[通俗易懂] 大家好,又见面了,我是你们的朋友全栈君。 一,SVM(Support Vector Machine)支持向量机a. SVM算法是介于简单算法和神经网络之间的最好的算法。 b. 只通过几个支持向量就确定了超平面,说明它不在乎细枝末节,所以不容易过拟合,但不能确保一定不会过拟合。可以处理复杂的非线性https://cloud.tencent.com/developer/article/2098380
12.深度学习高手笔记卷1:基础算法本书通过扎实、详细的内容和清晰的结构,从算法理论、算法源码、实验结果等方面对深度学习算法进行分析和介绍。本书共三篇,第一篇主要介绍深度学习在计算机视觉方向的一些卷积神经网络,从基础骨干网络、轻量级 CNN、模型架构搜索 3 个方向展开,介绍计算机视觉方向的里程碑算法;第二篇主要介绍深度学习在自然语言处理方向的https://www.epubit.com/bookDetails?id=UB7d8623610d375
13.python机器学习笔记:深入学习决策树算法原理这些技术都使用一种学习算法(learning algorithm)确定分类模型,该模型能够很好的拟合输入数据中类标号和属性集之间的联系,学习算法得到的模型不仅要很好地拟合输入数据,还要能够正确的预测未知样本的类标号。因此,训练算法的主要目标就是建立具有很好泛化能力模型,即建立能够准确的预测未知样本类标号的模型。https://www.flyai.com/article/622
14.轻松看懂机器学习十大常用算法(附实例)八、Adaboost 算法 九、神经网络 十、马尔可夫 一、决策树 根据一些 feature 进行分类,每个节点提一个问题,通过判断,将数据分为两类,再继续提问。这些问题是根据已有数据学习出来的,再投入新数据的时候,就可以根据这棵树上的问题,将数据划分到合适的叶子上。 https://mse.xauat.edu.cn/info/1038/2182.htm
15.轻松看懂机器学习十大常用算法通过本篇文章可以对ML的常用算法有个常识性的认识,没有代码,没有复杂的理论推导,就是图解一下,知道这些算法是什么,它们是怎么应用的,例子主要是分类问题。 每个算法都看了好几个视频,挑出讲的最清晰明了有趣的,便于科普。 以后有时间再对单个算法做深入地解析。 https://www.jianshu.com/p/55a67c12d3e9
16.《常用算法之智能计算(三)》:机器学习计算因为机器学习计算中涉及了大量的统计学理论,机器学习与统计推断的联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习计算关注可以实现的、行之有效的学习算法,很多推论问题具有无程序可循的难度,所以部分的机器学习研究是开发简单、处理容易的近似算法。http://www.kepu.net/blog/zhangjianzhong/201903/t20190327_475625.html