我的算法学习之路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.《Python算法教程》笔记nums.insert(i)是什么意思本文是《Python算法教程》的笔记,涵盖了图与树的基础知识,如图论基础、无环图与森林的概念,以及算法性能分析。探讨了列表和动态数组的性能差异,渐近记法的重要性,以及Python中timeit和cProfile模块的使用。此外,还介绍了图的邻接列表和邻接矩阵的实现方式。 https://blog.csdn.net/kudou1994/article/details/92797698
2.算法基础Coursera算法代表着用系统的方法描述解决问题的策略机制,北京大学《算法基础》课程将带你一一探索枚举、二分、贪心、递归、深度优先搜索、广度优先搜索、动态规划等经典算法,体会他们巧妙的构思,感受他们利用计算解决问题的独特魅力。顺利完成本课程,你将不但能够掌握这些算法的原理,还能够对这些算法进行灵活应用以及准确实现。本https://www.coursera.org/learn/suanfa-jichu
3.算法计算机教程.pdf算法 计算机教程.pdf,About eTextWizard | 首页 |产品 | 下载 | 帮助 | | |注册 Language 更新信息 国华软件 Guohua Soft 产品信息 软件下载 电子文档处理器(eTextWizard): 帮助文件 常见问题 中文名 电子文档处理器 称: 我要注册 英文名 eTextWizard 意见反馈 称: https://max.book118.com/html/2023/1228/5201340211011032.shtm
4.推荐算法视频教程推荐算法 已有20143人点击分享 √视频√源码√笔记√课件 课程下载 本套教程及资料一键下载 微信领取 百战程序员 在线学习-辅导-闯关-督学 10大专业全系列课程 在线学习 技术交流 与帅哥、美女同学共同进步 我要加入 学习线路图 系统化学习,打造阶梯学习https://www.bjsxt.com/down/9497.html
5.01《算法入门教程》算法简介比如我们在学习 Java 语言的时候,发现里面有很多关于数组(Array),集合(Set),哈希表(Map)等数据结构,这些数据结构的实现底层都涉及到了算法知识。学习算法知识有助于我们可以更好地理解编程语言的一些内部实现,帮助我们理解其中的函数设计思路及底层代码实现逻辑。https://www.jianshu.com/p/6efeecac23f2
6.初学者必学的算法基础教程初学者必学的算法基础教程 标签: 算法 算法与数据结构 收藏 概述 本文介绍了算法的基本概念和重要性,涵盖了算法的组成部分和不同类型,如搜索算法、排序算法和图算法。文章还解释了算法的时间复杂度和空间复杂度,并提供了示例代码和学习资源,帮助读者更好地理解和应用算法。 算法基础知识简介 什么是算法 算法是一https://www.imooc.com/article/362340
7.算法竞赛教程各种算法(排序、动态规划等)、数据结构(树论、图论、计算几何等),OI、ACM、蓝桥杯竞赛教程大全!https://www.dotcpp.com/course/algorithm
8.算法助手使用教程自从发布算法助手以来,收到了许多的反馈,其中有很多大佬的宝贵建议,也有很多小白的使用求助,因为平时也没有太多的时间,一一回复肯定是不现实的,所以写下此篇教程,希望能够对大家有所帮助。 这里也给没用过算法助手的兄弟们再介绍一下算法助手,文档尾部也会放下载地址! https://www.360doc.cn/article/30583588_1095511518.html
9.python算法教程pdf下载python算法教程电子版下载pdpython算法教程电子版是一本pdf文档类型的Python语言的基础教程,由挪威Python领域大牛赫特兰(Magnus Lie Hetland)编著。本书内容丰富翔实,知识点清晰,语言简洁,全书利用Python语言来讲解算法的分析和设计,主要关注经典的算法,帮助读者理解基本算法问题和解决问题打下很好的基础,非常适合对Python算法感兴趣的初中级用户阅读和https://www.ddooo.com/softdown/109008.htm
10.算法技术手册(书籍)《算法技术手册》是2010年机械工业出版社出版的图书,作者是:George T. Heineman、Gary Pollice、Stanley Selkow。通过《算法技术手册》,您能学到如何提升算法的性能,这将是您的软件应用程序走向成功的关键。内容简介 开发健壮的软件需要高效的算法,然后程序员们往往直至问题发生之时,才会去求助于算法。《算法技术https://baike.baidu.com/item/%E7%AE%97%E6%B3%95%E6%8A%80%E6%9C%AF%E6%89%8B%E5%86%8C/56645308
11.GitHubdunwu/algorithm algorithm-tutorial 是一个数据结构与算法教程。 掌握数据结构与算法,你看待问题的深度,解决问题的角度就会完全不一样。 项目同步维护:Github | Gitee 电子书阅读:Github Pages | Gitee Pages 内容综合 数据结构和算法指南 复杂度分析 - 关键词:时间复杂度、空间复杂度、大O 表示法、复杂度量级https://github.com/dunwu/algorithm-tutorial
12.算法分析入门教程实战篇及应用篇曾经夸下海口,要写一篇关于算法分析入门教程的文章。新春佳节之际,祝各位破友心情愉快,破解顺利,破解技术节节高。顺便在看雪论坛上又浏览了一圈,发现算法分析的文章确实都很好,但似乎没有一位对算法分析进行系统、全面的阐述的,对初学算法分析的人的实战困惑解答很少。倒是发现了一位好同志laomms的好文章自效验,读https://www.pediy.com/kssd/pediy10/59537.html
13.R语言实现KMeans聚类算法实例教程R语言在执行算法之前需要指定聚类数量对异常值敏感 总结 本文我们讨论了kmeans算法的概念,并在R中给详细实现示例和步骤。 总结 到此这篇关于R语言实现KMeans聚类算法教程的文章就介绍到这了,更多相关R语言KMeans聚类算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 您可能感兴趣的https://www.jb51.net/article/253819.htm
14.数据结构与算法分析视频教程北京大学张铭数据结构与算法是计算机专业一门相当重要的专业必修课,同时数据结构与算法也是电气电子类等一些需要涉及到编程的专业学生一门很重要的基础课程。 本套数据结构与算法分析 视频教程由北京大学老师张铭主讲,主要内容包括:数据结构的知识与应用、计算机算法的设计与分析方..查看详细 http://v.dxsbb.com/jisuanji/516/
15.《学习JavaScript数据结构与算法第3版》([巴西]洛伊安妮·格罗纳数据结构与算法教程书籍 用JavaScript深度学习常用的数据结构与算法核心技术 高效解决计算机网络编程常见问题 作者:[巴西]洛伊安妮·格罗纳(LoianeGroner)出版社:人民邮电出版社出版时间:2019年05月 手机专享价 ¥ 当当价降价通知 ¥46.30 定价 ¥69.00 http://product.dangdang.com/27872612.html
16.点云处理算法整理(超详细教程)腾讯云开发者社区区域蔓延分割区域生长分割算法广泛应用于图像分割中,二维图像常常采取区域生长分割算法实现图像分割,由于其分割的高效性,现已被应用于3D分割中,PCL中的类pcl::RegionGrowing用来实现点云的区域生长分割。区域生长分割是基于点云法线的分割算法,算法的主要思路如下: (1)根据点的曲率值对点云进行排序,曲率最小的点叫做初https://cloud.tencent.com/developer/article/1809685
17.计算机图形学实践教程60个源程序计算机图形学原理及算法教程 计算机图形学原理及算法教程 上传者:Augusdi时间:2010-08-28 计算机图形学基础教程(Vc++)第二版课后题 孔令德 课上列题源程包含书上有的和没有的程序,有第三章课后习题部分源程序,有课后习题部分题目。 上传者:qq_42112605时间:2019-05-05 https://www.iteye.com/resource/qq_41543488-10876089
18.2023黑马新版Java数据结构与算法视频教程在线观看2023黑马新版Java数据结构与算法视频教程 - 数据结构算法 黑马程序员2023新版Java数据结构与算法视频教程 ├──代码 |└──代码.rar407.96kb ├──视频(上篇) |├──1、基础数据结构 | | ├──Java数据结构与算法课程导学.mp435.17M | | ├──基础数据结构-001-二分查找-算法描述.mp444.38M https://www.meipian.cn/4zo7me86
19.使用OpenSearch行业算法版构建搜索服务试用教程试用中心教程简介 教程提供在阿里云OpenSearch行业算法版-共享型通用系规格实例中构建及使用搜索服务的指引。OpenSearch-行业算法版是基于阿里巴巴自主研发的大规模分布式搜索引擎搭建的一站式智能搜索业务开发平台,目前为包括淘宝、天猫在内的阿里集团核心业务提供搜索服务支持。通过内置各行业的查询语义理解、机器学习排序算法等能力,提https://help.aliyun.com/document_detail/613962.html
20.C语言程序中递归算法的使用实例教程当C程序中调用了一个函数时,栈中会分配一块空间来保存与这个调用相关的信息,每一个调用都被当作是活跃的。栈上的那块存储空间称为活跃记录或者栈帧 栈帧由5个区域组成:输入参数、返回值空间、计算表达式时用到的临时存储空间、函数调用时保存的状态信息以及输出参数,参见下图: https://www.xiuzhanwang.com/a1/Cyuyan/2350.html