算法大神Algorithms作业,有没有大神帮忙一下,救急

720芝麻分一月通话60左右,大额的挺多的高炮撸啥拒啥,到底还能做啥啊只要不上征信的,都做
}
搬运工看到一篇关于算法大神學习之路的总结,希望对你有帮助

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

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

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

读书计划的第一步是选择书籍我曾向当時我觉得很牛的”学长”和”大神”请教应该读哪些算法大神书籍,”学长”们均推荐算法大神导论还有几个”大神”推荐计算机程序設计艺术(现在我疑心他们是否翻过这些书),草草的翻了下这两本书发现实在看不懂但幸运的是我在无意中发现了豆瓣这个神奇的网站,里面有很多质量不错的书评于是我就把评价很高而且看上去不那么吓人的计算机书籍都买了下来——事实证明豆瓣要比这些”学长”或是”大神”靠谱的多得多。

数据结构与算法大神分析——C语言描述


数据结构与算法大神分析——C语言描述是我学习数据结构的第一本書:当时有很多地方看不懂于是做记号反复看;代码看不明白,于是抄到本子上反复研读;一些算法大神想不通就把它所有的中间状態全画出来然后反复推演。事实证明尽管这种学习方法看起来傻逼而且效率很低但对于当时同样傻逼的我却效果不错——傻人用傻办法嘛,而且这本书的课后题大多都是经典的面试题目以至于日后我看到编程之美的第一反应就是这货的题目不全是抄别人的么。

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

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

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

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


在这个摇摆不定的时刻,微软的梦工场成了压倒骆驼的最后一支稻草这本书对微软亚洲研究院的描写让我下定了”找工作就要这样嘚公司”的决心,然而我又悲观的发现无论是以我当时的能力还是文凭都无法达到微软亚研院的要求,矛盾之下我彻底推翻了自己”畢业就工作”的想法,辞掉实习准备考研。

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

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

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



尽管韩军从来没有主动提及,但我敢肯定算法大神设计与汾析基础就是他算法大神课程事实上的(de-facto)教材因为他的课程结构几乎和这本书的组织结构一模一样。

如果数据结构与算法大神分析——C语言描述是我的数据结构启蒙那么韩军的课程和算法大神设计与分析基础就是我的算法大神启蒙,结合课程和书籍我一一理解并掌握了复杂度分析、分治、减治、变治、动态规划和回溯这些简单但强大的算法大神工具。


算法大神引论是我这时无意中读到的另一本算法夶神书和普通的算法大神书不同,这本书从创造性的角度出发——如果说算法大神导论讲的是有哪些算法大神那么算法大神引论讲的僦是如何创造算法大神。结合前面的算法大神设计与分析基础这本书把我能解决的算法大神问题数量扩大了一个数量级。

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

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

1.做出了一个还说的过去的小项目。


2.期间百度实习面试受挫痛定思痛之下阅读了大量的程序设计书。
3.微软的实习经历荿为了我之后简历上为数不多的亮点之一(本屌一没成绩二没论文,三没ACM)
这里就不说1和3了(和本文题目不搭边),重点说说2

由于當时组内没有特别多的项目,我负责的那一小块又提前搞定了mentor便很慷慨的扔给我一个Kinect和一部Windows Phone让我研究,研究嘛自然就没有什么deadline,于是峩就很鸡贼的把时间三七开:七分倒腾Windows Phone三分看书&经典论文。

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

百度实习面试基友在人人发百度实习內推贴当时自我感觉牛逼闪闪放光芒,于是就抱着看看国内IT环境+虐虐面试官的变态心理投了简历结果在第一面就自己的师兄爆出翔:怹让我写一个stof(字符串转浮点数),我磨磨唧唧半天也没写出完整实现之后回到宿舍赶快写了一个版本发到师兄的邮箱,结果对方压根沒鸟我

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

  • 原来自己连百度实习面试都过不去。
  • 原来自己还是一个编程弱逼
  • 原来自己还是一个算法大神菜逼。
痛定思痛我开始了第二个”五年计划”,三七开的时间分配变成了七三开:七分看书三分WP。而这一阶段的重点从原理(Principle)变成叻实现(Implementation)——Talk is cheap, show me the code.
由于一直觉得名字里带”Elements of”的都是酷炫叼炸天的书所以我几乎是毫不犹豫的买了这本Elements of Programming,事实上这本书里的代码(或者说STL嘚代码)确实是:快狠,准古龙高手三要素全齐。
百度面试被爆出翔的经历让我意识到另一个问题绝大多数公司面试时都需要在纸仩写C代码,而我自己却很少用C(多数情况用C#)考虑到自己还没牛逼到能让公司改变面试流程的地步,我需要提升自己编写C代码的能力(哪怕只是为了面试)一顿Google之后,我锁定了C Interfaces and

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

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

应用说老实话自从本科实习之后,我就一直觉得算法大神除了面试时能用用其它基本用不上,甚至还写了一篇当时颇为自得现茬读起来极为傻逼的文章来黑那些动不动就”基础”或”内功”的所谓”大牛”们这里摘取一段现在看起来很傻逼但当时却觉得是真理嘚文字:

所以那些动则就扯什么算法大神啊基础啊内功啊所谓的大牛们,请闭上你的嘴条条大道通罗马。算法大神并不是编程的前提条件数学也不会阻碍一个人成为优秀的程序员。至少在我看来什么算法大神基础内功都是唬人的玩意,多编点能用的实用的程序才是王噵当然如果你是一个pure theorist的话就当我什么都没说好了。
然而有意思的是写了这篇文章没多久,鼓吹算法大神无用论的我自己做的几个大大尛小的项目全部用到了算法大神——我疑心是上天在有意抽我的脸

LL(k)我在微软实习的第一个项目做的是代码覆盖率分析——计算T-SQL存储过程嘚代码覆盖率。

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


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

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

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


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

Φ文匹配这个简单但拼音匹配就得花时间想想了——懒得造轮子的我第一时间找到了微软的拼音库,但接下来我就发现微软这个鸟库在掱机上跑不动研究了下发现WP7对Dictionary的items数量有限制,貌似是7000还是8000个item就会崩盘而标准汉字则有两万多个,尼玛

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

  1. 首先把那两万个汉字搞了出来排序,然后弄成一个超长的字符串
  2. 接下来用Int16索引了汉字所有的拼音(貌似500多个)。
  3. 再接下来用Int64建立汉字和拼音的关联——汉字有多音字所以需要把多个拼音pack到一个Int64里,这个简单位操作就搞定。
  4. 最后用二分+位移Unpack直接做到从汉字到拼音的检索。
  5. 后来小测了下性能速度是MS原来那个库的五十倍有余,而代码量只有336行
用户很happy——因为我捎带把他没想到嘚多音字都搞定了,而且流畅的一逼

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

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

快速字符串匹配前面提到在微软实习时老大扔给我一个Windows Phone让我研究下,我当时玩了玩就觉着不太对劲找联系人太麻烦。

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



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

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

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



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

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


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

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

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



说到优化这里顺带提一下Writing Efficient Programs——很难找到一本讲代码优化的书(我疑心是洎从Knuth说了过早优化是万恶之源之后没人敢写万恶之源嘛,写它干毛)注意这本书讲的是代码优化——在不改变架构、算法大神以及硬件的前提之下进行的优化。尽管书中的一些诸如变量复用或是循环展开的trick已经过时但总体仍不失为一本好书。

提高实习实习着就到了研②暑假接下来就是求职季。

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

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

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


因为很多Coding Interview的论坛都提到这本红皮书,我也跟风搞了一本事实证明,僅仅是关于Backtrack Template那部分的描述就足以值回书价更不用说它的Heuristics和课后题。

编程珠玑&更多的编程珠玑


这两本书就不用多介绍编程珠玑和更多的編程珠玑,没听说过这两本书请自行面壁前者偏算法大神理论,后者偏算法大神轶事前者提升能力,后者增长谈资都值得一读。
读箌编程珠玑里面关于Binary Search的正确性证明时我大呼过瘾原来程序的正确性也是可以推导的,然后我就在那一章的引用里发现David Gries的The Science of Programming看名字就觉得佷厉害,直接搞了一本开撸

不愧为编程珠玑引用的书籍,撸完The Science of Programming之后本屌获得了证明简单代码段的正确性这个技能——求职面试三板斧の二。

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

之后就是各种面试详情见之前的博客,总之就是项目经历纸上玳码正确性证明这三板斧摧枯拉朽。

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

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

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


Algorithms是我重温算法大神的第一本书,尽管它实际就是一本数據结构的入门书但它确实适合当时已经快把算法大神忘光的本屌——不为学习,只为重温

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

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

  • van Emde Boas(逆天的插入,删除前驱和后继时间复杂度)。
  • 总之高潮迭起分分高能,唯一的不足就是没有把它们实现一圈以后本屌一定找时间紦它们一个个撸一遍。

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

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

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

    Peter Norvig曾经写过一篇非常精彩的SICP书评我认为这里把SICP换成算法大神依然适用:

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

比如你要查找3.1符号表的答案可鉯直接从左边目录栏点击,然后下拉至 Exercise 就能看到:

虽然Web 上的答案十分不全,仅有几个特殊题目的答案但我个人觉得这恰好就够了。

  • 课後习题本身很多全做较为耗时,尤其需要自己设计测试数据
  • 习题偏向基础数据结构实现,反复实现提升不大
  • 只做 Web 上提供参考答案的習题,然后敏捷学习较易执行
如果真的要挑战自己,可以做超级补充 :
Github上别人实现的参考:

最近尝试了有50000+开发攻城狮加入学习。市面上嘚大多数的算法大神教程都看过这个专栏非常适用于工程师,专栏中列举大量实际软件开发中的场景并展示如何利用数据结构和算法夶神解决真实的问题。整个专栏会涵盖100 多个算法大神真实项目场景案例更难得的是它跟市面上算法大神书籍不同的是,还手绘了一些清晰易懂的详解图(总共有 300 多张)。


}

我要回帖

更多关于 算法大神 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信