01 | 为什么要学习数据结构和算法?
01 | 为什么要学习数据结构和算法?
讲述:冯永吉
时长09:03大小8.29M
想要通关大厂面试,千万别让数据结构和算法拖了后腿
业务开发工程师,你真的愿意做一辈子 CRUD boy 吗?
基础架构研发工程师,写出达到开源水平的框架才是你的目标!
对编程还有追求?不想被行业淘汰?那就不要只会写凑合能用的代码!
内容小结
课后思考
赞 624
提建议
精选留言(1060)
- 姜威2018-09-21为什么学习数据结构和算法?我认为有3点比较重要 1.直接好处是能够有写出性能更优的代码。 2.算法,是一种解决问题的思路和方法,有机会应用到生活和事业的其他方面。 3.长期来看,大脑思考能力是个人最重要的核心竞争力,而算法是为数不多的能够有效训练大脑思考能力的途径之一。
作者回复: 写的很好 同学们把这条回复顶上去
共 17 条评论4107 - HouShangLing2018-09-21一定要动手写
作者回复: 你掌握了学这门课的最有效的方法。看十遍也没自己实现一遍学的牢。同学们这条也帮忙顶上去
共 4 条评论2116 - 小帅b2018-09-21其实问题的所在就是现在有很多现成的框架,器又大活又好,拿来就用,还不用太担心性能的问题。就好像那些建楼的工程师不需要懂砖瓦的构成,也能盖楼。司机不需要懂汽车引擎的原理,也能当顺风车司机载美女兜风。 遇到不会的上 Google,懒了就上 GitHub 找框架。所以写了这么多年代码,一直是个菜鸟。 或许是时候修炼自己的内功了。一直 CURD 有意思么?把设计模式,网络原理,数据结构和算法捡起来,或许就没那么容易菜鸟了。怼人也更加自信了。跳槽也不用畏畏缩缩的了。 为了不当菜鸟,我和我的小伙伴们就加入了哇!展开
作者回复: 写的太好了
共 11 条评论554 - 裴海港2018-09-21年近40的大叔也有一颗积极向上的心
作者回复: 终身学习 多大年纪也不晚
共 12 条评论305 - 五岳寻仙2018-09-21老师好!看到专栏第一眼就果断订阅了。我是一个菜鸟程序员,半年的工作经验让我感受到数据结构和算法太重要了!讲一个自己亲身经历的例子。 入职不久,就遇到一个需求,需要建立一个3G(30亿)条键值对映射,已供后续检索。听上去很简单的问题,用python的字典就可以解决。但在实现的过程中,很快就遇到了问题:字典是基于hash的,对于每条键值对要多消耗50个字节的内存维持这种结构(即便使用redis也需要这个内存花销),再加上键值存储消耗的内存,我大约需要3G×70=210G内存,超过服务器内存了。 后来,想到了可以根据键排序后线性存储,使用二分查找,解决了这个问题,大约消耗的内存也就3G×10=30G左右。 看似简单的问题,当规模大到一定程度,不借助算法和数据结构,就无法解决了。展开
作者回复: 哈哈 你要是看到我讲的散列那一篇你就知道了 像java里的hashmap是比较耗内存的 你用到的解决方案是一种用时间复杂度换空间复杂度的思路 我们专栏也会讲的 不过你现在的解决办法还可以更高效 利用hash函数 我们专栏也会讲到 还有二分是logn的时间复杂度 是非常高效的一种时间复杂度 2的64次方个有序数据二分查找也顶多循环64次 有没有觉得logn这个复杂度很奇妙
共 7 条评论223 - Haoz2018-09-25一、数据结构和算法是什么 1、数据结构是指一组数据的存储结构 2、算法就是操作数据的方法 3、数据结构和算法是相辅相成的,数据结构是为算法服务的,而算法要作用在特定的数据结构之上 二、学习的重点在什么地方 数据结构和算法解决的是如何更省、更快地存储和处理数据的问题,因此,我们就需要一个考量效率和资源消耗的方法,这就是复杂度分析方法。在学习数据结构和算法的过程中,要学习它的「来历」、「自身的特点」、「适合解决的问题」以及「实际的应用场景」。 1、数据结构和算法学习的精髓-复杂度分析 2、最常用的、最基础的数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树 3、最常用的算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法 感谢老师的分析,一直以来数据结构和算法都是我的硬伤,学了很多次,也放弃了很多次,可能是方法不对,但更多的是因为自己之前的毅力不够。 在此立下 flag:从本篇文章开始,将老师的文章根据自己的理解进行输出相应的总结和思考,发表成留言,并将每周三篇文章中涉及的数据结构和算法用 Java 实现一次。展开
作者回复: 写的很好👍
共 2 条评论216 - tdytaylor2018-09-21老师,就像你说的,工作中其实好多都和业务挂钩,基本上都是针对业务做增删改查,很难把所学的算法应用起来,我平时也时不时学习算法,但总感觉学了就忘,忘了又学,如此反复,老师,这种到底是没了解算法的原理导致不会灵活应用,还是写的少导致的,感觉学习算法很少能应用起来
作者回复: 1. 客观的讲,有些项目确实涉及的数据结构和算法少一些,你可以再看下我文章里写的。 2. 你提到学了又忘,我觉得一方面你是没有掌握学习的方法,学习的重点,走马观花的看肯定比较容易忘;我们02节会具体讲; 3. 不会灵活应用?那估计还是没有好的教材教你如何应用,还有可能就是确实还没掌握太牢,只是懂点皮毛,很浅,灵活应用是一个比较的境界,需要一段时间的沉淀学习。 4. 学习算法并不是为了记住几个排序、二分查找、二叉树遍历,他还能锻炼你的逻辑思维、性能意识,而且,如果你写代码能力还有欠缺,你还可以通过把学到的数据结构和算法都实现一遍,这是一种很好很好的锻炼编程能力的方法。所以不要过度追求一定要在项目里手写快排、手写二叉树才能算是用上。
共 2 条评论202 - 两颗小虎牙2018-09-21可不可以每次多发布几篇?138
- xuan zhu2018-09-22年近40的大妈也有一颗积极向上的心共 3 条评论98
- lane2018-09-21现实,都是面相领导编程…………一言难尽…
作者回复: 没事的 如果工作不满意 不顺心 更要卧薪尝胆 提高能力 沉淀自己。总有一天 机会会到来 你做好充分的抓住它的准备就好。人在职场中 只要抓住一两次大的机会 就能做到很高的职位 就怕的是机会来了我们也抓不住
共 8 条评论89 - 阿康2018-09-21老师,我是一名iOS开发,怎么听完你这篇文章还是觉得算法对于我开发来说不是那么重要😂后面我有点怕自己听不懂,而且动手写,我该如何下笔,感觉自己很迷茫……
作者回复: 1. 假设我们现在要做这样一个功能,我们希望在app上存储一个多级地址列表,用户可以一层一层的选择地址列表中的地址,来设置自己的所在的省份、市、区,如果这个地址列表不是经常变动的,我们希望保存在app端,这样就不需要每次操作地址列表都要跟后台交互,如果让你存储这个多级地址列表,你会怎么存储呢? 2. 如果地址列表也并不是一直都不变的,如果地址列表改变了,我们又不希望发新版,那如何更新app上的地址列表呢?如果地址列表比较大,我们不希望app重新全量的从服务器再拉一次,那又如何来做呢? 3. 我会用一种语言来实现 你可以翻译成object c
共 5 条评论80 - saber2019-05-05https://github.com/saber/algorithm 这是我 19年 3月底开始学习专栏到现在的所有笔记&代码,持续更新中 ...... 目前学习的课程还很少还很基础,为了后来跟我一样的初学者更好的学习该专栏,我在代码中加上了详细的注释,复杂度分析等等,代码按照一定的规范进行书写,该项目中包含了我学习的代码规范(文字版+代码版),适合跟我一样的初学者学习码更好更漂亮的代码。笔记格式按照中文排版格式进行书写。可以作为复习的资料。 希望老师和大家顶我上去,让更多的初学者能够看到。展开共 4 条评论73
- DDT2018-09-21就是想升工资吧 我知道学技术必须要拿出十年磨一剑的精神 从头开始...
作者回复: 十年磨一剑说的太好了。我也是这么认为的。做技术就是不要浮躁。要耐得住寂寞。沉得下心。
共 3 条评论61 - 邵峰2018-09-21记得以前看金庸小说,一个人练降龙十八掌,一个人练全真教内功,刚开始练内功的被吊打,十年后练内功的依然被吊打,但是20年后,降龙十八掌就怎么也打不过练内功的了,算法和数据结构就是内功,降龙十八掌我觉得就是各种框架,再怎么熟悉框架,也不如了解它内部的算法和数据结构
作者回复: 太形象了:)
共 7 条评论55 - Chevins2018-09-22今天去面试。数据结构与算法。6道题。一道都不会。我说我3年开发经验,呵呵,自己都觉得可笑。不过无所谓,我会追上来的,加油,菜鸟。共 22 条评论54
- Liar2018-09-21不做一个没有追求的码农,那些说过了35就不行的码农大部分都是不求上进的人。
作者回复: 说得好 不管哪个行业都会淘汰不求上进的人 it也不例外
43 - 小麦20182018-09-21我还是觉得王争老师自己读的音频好,亲切,有听作者亲自讲解的感觉。共 1 条评论37
- grandcool2018-09-21没理解统计业务接口99%响应时间啥意思
作者回复: 举一个例子 你写了一个接口 每天有成千上万的访问 你如何知道这个接口够不够快?响应时间是1s还是5s?如何统计度量?用平均值?显然不是太适合?那用什么值来统计度量呢?你可以自己搜索研究下
共 11 条评论32 - demo2018-09-21双非,不是CS专业的本科生,学校里边学的太少了。自己虽然有坚持刷leetcode,但是好多都是先看人家的思路才可以写出来的。自己一个自学,压力大,效率低吧.希望通过这个课程开阔自己的视野。 之后不管考研还是找工作,数据结构都是重中之重。所以 我一定要好好学。共 2 条评论26
- 嘻哈2018-09-21场景:给文章加锚链,最多匹配5个词语,优先匹配最长的词,文章根据后台配置的词和链接,将匹配到的词动态用a标签包含,并跳转到匹配词的链接上。 分析:如果循环关键词匹配,考虑如果词无限多的话,那么一次匹配太浪费资源,不利于匹配词的扩展。因此考虑下文的结构,并启动加载到内存中,同时将匹配词的结果放到redis缓存(1个小时),功能已上线,关键字2w,系统平稳,CPU表示毫无压力 将每个词拆成单个字,如"你好吗"数据结构是 { "depth": 0, "matcherMap": { "你": { "depth": 0, "matcherMap": { "你好": { "depth": 1, "matcherMap": { "你好吗": { "result": "xxx", "depth": 2, "matcherMap": { }, "keyword": "你好吗" } } } } } } } 每一层对象都放到HashMap中,然后拿整篇文章逐个字从hashMap中匹配对象,此时每次截取的步长为1,如果单个字获能取到对象,将步长加1,继续匹配,通过查result判断是否查找到结果存到到缓存中,下次遇到自己拿出匹配的结果,直接替换即可。 问题: 1.我的这种方式是否可行,有什么推荐的算法,有那些需要优化的地方 2.如果关键词是海量的,每次启动加载肯定特别慢,遇到这种场景我是否考虑将这些数据外置,如放到redis的Map中,还是可以有其他方式?展开
作者回复: 1. 你需要不要考虑分词呢?从你的描述感觉不需要。 2. 从实战的角度来说,2w的关键词,是可以直接放到内存中的,并不多,即便每个关键词用的你结构存储1KB的话,那也用不了20MB 3. 如果有太多关键词,内存都放不下,这种情况不大可能吧,你想想一个按照我们上面的假设推理,8GB内存可以放下800万的关键词,会有那么多吗? 4. 如果真的要放不下,我建议通过hash分片存储,多机器并行匹配说的很粗略,不知道你能听懂吗? 5. 还有,对于你的算法,从实战的角度,没有问题,但是还有一些解决思路:trie树、多模式串匹配等,这个要具体看你的关键词的特点。 6. 你要自己做些benchmark,然后再benchmark的基础上做优化,否则,再换个解决思路,你也不知道是不是更好了
22