你把前三章弄懂个六七成,就能超越95%的程序员……
不是说这书多难,而是说很多人不了解程序员这行业低水平者占比率有多高。就像去年总理说中国有6亿人月收入不到1000,让很多声称北上广月入两万不如狗的人瞠目结舌。
很多半路出家甚至大学计算机专业出身、干了好几年的程序员,这辈子仅有的认真学技术的经历也就是培训班的三个月(科班四年学了个寂寞最后还得去培训班的情况太常见了)之后就是百度CSDN复制粘贴代码了。
学算法是不可能的,这辈子都不会学算法。用现成的库不香吗?效率低就换一个,最后粘在一起勉强能用就行。反正熬两三年当个主管或转产品或售前,这辈子就再也不会写一行代码了。混不上去的话,宁可转行也不会再浪费时间深造的。
没法子,这是国内现状,既然绝大多数IT企业成功靠的都不是技术超越同行,而是玩金融、骗投资、搞垄断、拼销售、拉关系,那轻视技术就是个普遍现象。愿意提高自己算法能力并真正得到重视的也只是几个技术小圈子,而非广大程序员群体。
至于算法导论这本书么,其实跟大多数公认优秀的技术书籍一样,不是什么武林秘籍,咬着牙反复读几遍就能脱胎换骨。建议初读时跳过太艰深啃不动的细节,多尝试理解一些概念和算法本身要解决的问题,日后遇到刷不懂的算法题或者实际项目中的难点,不妨回来当工具书参考一下,很可能就恍然大悟茅塞顿开了。
别说算法导论了,当你工作几年就会明白,,以下几个任何一个都可以超过90%程序员:
1.把事情想明白,说清楚,跟别人商量好
2.写代码,注意边界条件和编码规范,写单测,基本做到无bug提测
3.工作中做好计划和进度跟踪,沟通和汇报,不把问题遗留到变成事故
4.思考和分析,如何优化目前的工作流程,引入工具和方法,提升生产效率
5.把自己工作中用到的技术用熟,搞清楚原理,优点短处,适用场景
6.不断接触新技术思想和工具,完善自身知识体系结构
7.深入学习至少一个常用开源项目,源码层面系统掌握这项技术
8.持续坚持学习和技术内容输出,每个星期产出2篇原创技术文章
被 @白如冰 冰神的回答吸引了,来回答一下
问题是“为什么有人说弄懂了《算法导论》的90%,就超越了90%的程序员?”
问“为什么”之前,先回答“是不是”。
答案是“是”,而且不仅仅是超越了90%的程序员,还超越了90%以算法为主的研究生
理由如下
这门课在mit要开三到四节refer这本书的课,课时,内容和方法都不一样
分别是1,Introduction to Algorithms(绝大多数用此书的人都有且仅有看过这堂课)
视频(为了方便大家我只放b站链接)
2,Design and Analysis of Algorithms(少数人还看过这堂课)
3,Advanced Algorithms(录制的少了两堂课,不知道以后会不会有更新的版本)
你会发现course sequences这里标明了这是这三堂课的第三部分
4or3,Advanced Data Structures
这门课的参考如下
四门课我基本上都大致上了一边,也根据course materials上机将近100个小时(后面两堂课我至少有30%没弄懂)
我的评价是,如果你要做算法相关的研究,这本书(以及配套课程)相当好,给我的感觉像是folland那本实分析或者是munkres的拓扑还有Boyd的凸优化,虽然我只会用到这里面小部分的知识,但是我增长了世面,知道未来如果我有这方面的问题应该向哪个方向是思考。
但是如果你仅仅是学会如何使用算法的知识来编写程序,我不推荐你看这个书
如果你是国内(以c语言为基础的在校学生)
我推荐这本书
这本书是Robert Sedgewick写的(那本以java为基础的红色算法书就是他写的),分上下两册,下册是图算法,建议有图论基础在进行学习
此外,我推荐两本离散的小册子,一本书北大在培养方案中refer的书
A Course in Discrete Structure————Rafael Pass and Wei -Lung Dustin Tseng
这本书告诉你离散数学中最基础的概念,集合论,证明,数论,组合,概率,逻辑,图论和有限自动机(理论上来说这个应该归类在计算理论中)
另一本是世图引进的图论小册子
Introduction to Graph ——————Robin.J.Wilson
这两本书都只有150页左右,非常薄,慢慢读一周可以读完
我建议初学者可以阅读这些书,较快的建立自己的框架,然后补充阅读一些东西,没必要一上来阅读五百多页的离散数学,容易丢了西瓜,捡了芝麻
如果你感觉自己的C语言掌握不好
我推荐这本书作为你的辅助阅读
算法导论是知乎上经常被拿来CM的书了,关于这本书我回应几点。
可以不看数学证明吗?
看算法导论不看数学推导,犹如下了一部___电影却跳过了___。
算导这本书最大的特点就是对书中几乎所有的算法都给出了正确性的证明和复杂度的分析,这一切其实是深入学习、研究算法的基础。毕竟当算法困难到一定程度你就不太可能直观判断它是否正确、复杂度究竟如何了。比如我最近在看的计算几何,也是通过构造恰当的循环不变式来证明正确性,通过摊还分析等手段给出算法复杂度。
当然对最基本的算法,不通过数学手段,而是直观的理解其正确性、复杂度也是可以的,但是这种情况下算导其实算不上最佳选择;而且事实上某些算法算导的实现会略有区别,就是因为它有一些用于证明推导的辅助变量。
就算啃完了算导也只是学会了算法?
当然指望看完算导一本书就大包大揽的学会一切那是不现实的,但是要说看完算导只学会了算法那也是很扯的。
一个最基本的问题是,算导的后续章节经常把一个问题转化为前面章节的问题,然后说这个问题前面已经研究清楚了,但是你大概率会发现之前写的代码在这种情况下要么根本没法用要么还有一坨bug。在反反复复的修改完善之中,代码的可扩展性、可维护性会得到极大地提升,并且合理的组织代码的能力也会得到很大的提高。
上学的时候,跟你一样傻,以为看的书多而全,就肯定比别人强。
我大学时候也很傻,为了校招,看了不下于五本算法书,加上LeetCode,刷了大半年。
总共一两千道题啊……不刷怕考到……忘了刷,刷了忘……毛都快掉没了……
现在工作近十年,辗转几个大厂,由当年的应试者变成了出题人,才知道,完全不必这么辛苦。
任何事情都遵循28原则,我们只要把握住那20%,就能拿到80分!
凡事都讲究性价比!
如果单纯只是为了应对校招、巩固基础知识,杀鸡何必用牛刀???
省下来的时间,谈个女朋友,它不香么???!!!
这里把我这些年的出题经验告诉大家,希望大家知道哪些是重点,应该怎么学数据结构和算法。
直接上干货,我花了两天的时间做了一张图,涵盖数据结构和算法书籍中都会讲到的知识点。并给出了常用算法的平均时间复杂度,对于必须要学的内容前面加了星标
这里面涉及到了近二十种数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;超四十种常见算法思想:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。
掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就会非常容易、非常快。
需要高清无水印思维导图源文件的小伙伴,可以点击这里获取:
目录:
很多同学搞不明白,数据结构与算法有什么区别,甚至有些同学以为数据结构中就包含了算法。
其实,是字面意思就能知道个大概,数据结构主要讲解数据的组织形式,换句话说,我就是我们要怎样把这些数据存储起来,所以有列表、堆、栈、树、图,这是数据结构的重点。
而算法,则注重的是思想,比如列表里的元素怎么排序、怎么在当前的存储结构中找到最大的数和最小的数?等等,说白了就是解决现实中问题的思想。所以才会有分治思想、贪心思想、动态规划这些经典算法。
关于数据结构,我想说的是,它是这四大件中最简单、最基础的一个。离开了数据结构,几乎任何的程序都会失效,所以在讨论数据结构的时候,常常要把算法也连带着说一说。
要单纯地掌握常见的数据结构,就如同拆解一个个精妙的仪器件一样有趣和简单。正因为数据结构这个东西在程序中的作用,和仪器部件特别相像,不同的数据结构有着不同的特性,因此要想学好数据结构,图解是必备武器!
这里强推中国大学上,浙江大学的开设的《数据结构》课程,涵盖了常用的数据结构和算法。
辅以教材参考书,强推《大话数据结构》,光看封面你就知道这本书的风格了
没错,这就是大名鼎鼎的《大话设计模式》的作者出的,绝对顶。
算法课常常和数据结构课放在一起,在有些高校中,会存在“数据结构与算法”和“算法设计与分析”这样的两门课。
学习算法的套路很简单,多看、多写、多上机,既然是思想的集合,看得多了,自然无师自通。
至于刷题,很多同学都知道要刷LeetCode。
LeetCode题库:(2123题)
总共两千多道题,而且有些题,非常难,就算每天10题,也至少刷半年。这显然不适合绝大部分同学。
所以,我们要找到最核心、最重要的题集,即可
比如,如果时间紧张,可以先刷《程序员面试宝典》里的题目,总共109题。
刷完以后,有时间,可以再刷《剑指offfer》的题目,共75题。
因为这两本书,都是面向面试的高频题汇总,自然有很多题目是重合的。这也正能说明这两本书的重要性。
如果专攻面试的话,还有两本不错的书推荐:
《编程珠玑》这本书的豆瓣评分非常高,有 9 分。
这本书最大的特色就是讲了很多针对海量数据的处理技巧。这个可能是其他算法书籍很少涉及的。面试的时候,海量数据处理的问题也是经常会问的,特别是校招面试。不管是开拓眼界,还是应付面试,这本书都很值得一看。
《编程之美》这本书有多位作者,其中绝大部分是微软的工程师,所以书的质量很有保证。不过,这里面的算法题目稍微有点难,也不是很系统,这也是我把它归到面试这一部分的原因。如果你有一定基础,也喜欢钻研些算法问题,或者要面试 Google、Facebook 这样的公司,可以拿这本书里的题,先来自测一下。
当然,我也有一本谷歌师兄总结的高频面试算法习题集,包含了常见的数据结构和算法汇总,无论是排版还是内容,都是非常棒。
所有这些书,我都为大家找到并下载好了,需要的小伙伴可以直接领取。这回得帮我点赞了吧
算法的难点在于,根本没办法在脑子里抽象出它的步骤啊
对于做个几何题都费劲的男孩子来说,那更是要了他的亲命了。
今天,我就给大家推荐几个算法可视化的网站。
没错,就是写了代码以后,可以看见他们是怎么一步步求出结果的。
目前网站支持中文,印尼文,日文等多语言版本。
最关键的是,它几乎包含了所有算法!!!!
在搜索选项中你可以根据关键词查找到你想要的算法。
点进去一个具体的算法之后,会有两种方式的可视化呈现方式,一种是电子讲座模式,一种是示例模式。其中示例模式是以动画方式呈现,你可以控制动画的快进与倒退,电子讲座模式是以知识点讲解模式呈现,你可以手动控制页面的进度。两种方式都可以帮助你演示每个步骤的过程代码。
接下来我们演示一下冒泡排序的执行过程,如下图所示:
另外,你还可以创建一组自定义的数,然后让动画显示“你的算法”。
除此之外,还支持在线测试哟~
在Algorithm Visualizer,大家可以很清楚的看到算法运行的整个过程,很直观,便于大家学习。
大家可以很清楚的看到,网站分为三部分,最左边是算法目录,大家可以选择自己感兴趣的算法,目前已经包括了很多算法了,比如二叉树、图、排序算法、动态规划等等经典算法 。中间区域主要是算法演示以及运行log。右侧是代码以及算法运行按钮。
我们用它来演示一下冒泡排序的执行过程,如下图所示:
同时它是开源的,目前有35K个star,足以可见该项目的欢迎程度,这里推荐给要学习算法的各位。
https:// github.com/algorithm-vi sualizer/algorithm-visualizer
3、 Data Structure Visualization
目前已经有很多常用的数据结构与算法的可视化,如:常见的数组、链表、队列、二叉搜索树、红黑树、各种排序等,如下图所示:
比如,我们用它来模拟一个二叉搜索树,如下图所示:
我们再用它来演示一下快速排序算法,如下图所示:
把这些内容学会,算法应该说是非常牢固了,无论是校招还是工作,都已经非常够用了。
但程序员的人生不是只有算法的学习,我们还有校招、面试、青春饭等等的困惑,我把我这些年的所知所得,整理成了一本书,开源到github上了。相信会对大家很有帮助,大家可以去看.
目前还在持续更新,欢迎大家star。
github地址: https:// github.com/harvic/Fight ingCoder
gitee备份地址:harvic/FightingCoder
好了,这篇就到这了,希望大家毕业都能找到好工作。
我翻译下“不针对任何国家”的意思:
“不是……不要误会,我不是针对你,我是说在座的各位……都是**。”