数据结构与算法之美
王争
前Google工程师
立即订阅
71638 人已学习
课程目录
已完结 75 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 从今天起,跨过“数据结构与算法”这道坎
免费
入门篇 (4讲)
01 | 为什么要学习数据结构和算法?
02 | 如何抓住重点,系统高效地学习数据结构与算法?
03 | 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?
04 | 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度
基础篇 (38讲)
05 | 数组:为什么很多编程语言中数组都从0开始编号?
06 | 链表(上):如何实现LRU缓存淘汰算法?
07 | 链表(下):如何轻松写出正确的链表代码?
08 | 栈:如何实现浏览器的前进和后退功能?
09 | 队列:队列在线程池等有限资源池中的应用
10 | 递归:如何用三行代码找到“最终推荐人”?
11 | 排序(上):为什么插入排序比冒泡排序更受欢迎?
12 | 排序(下):如何用快排思想在O(n)内查找第K大元素?
13 | 线性排序:如何根据年龄给100万用户数据排序?
14 | 排序优化:如何实现一个通用的、高性能的排序函数?
15 | 二分查找(上):如何用最省内存的方式实现快速查找功能?
16 | 二分查找(下):如何快速定位IP对应的省份地址?
17 | 跳表:为什么Redis一定要用跳表来实现有序集合?
18 | 散列表(上):Word文档中的单词拼写检查功能是如何实现的?
19 | 散列表(中):如何打造一个工业级水平的散列表?
20 | 散列表(下):为什么散列表和链表经常会一起使用?
21 | 哈希算法(上):如何防止数据库中的用户信息被脱库?
22 | 哈希算法(下):哈希算法在分布式系统中有哪些应用?
23 | 二叉树基础(上):什么样的二叉树适合用数组来存储?
24 | 二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树?
25 | 红黑树(上):为什么工程中都用红黑树这种二叉树?
26 | 红黑树(下):掌握这些技巧,你也可以实现一个红黑树
27 | 递归树:如何借助树来求解递归算法的时间复杂度?
28 | 堆和堆排序:为什么说堆排序没有快速排序快?
29 | 堆的应用:如何快速获取到Top 10最热门的搜索关键词?
30 | 图的表示:如何存储微博、微信等社交网络中的好友关系?
31 | 深度和广度优先搜索:如何找出社交网络中的三度好友关系?
32 | 字符串匹配基础(上):如何借助哈希算法实现高效字符串匹配?
33 | 字符串匹配基础(中):如何实现文本编辑器中的查找功能?
34 | 字符串匹配基础(下):如何借助BM算法轻松理解KMP算法?
35 | Trie树:如何实现搜索引擎的搜索关键词提示功能?
36 | AC自动机:如何用多模式串匹配实现敏感词过滤功能?
37 | 贪心算法:如何用贪心算法实现Huffman压缩编码?
38 | 分治算法:谈一谈大规模计算框架MapReduce中的分治思想
39 | 回溯算法:从电影《蝴蝶效应》中学习回溯算法的核心思想
40 | 初识动态规划:如何巧妙解决“双十一”购物时的凑单问题?
41 | 动态规划理论:一篇文章带你彻底搞懂最优子结构、无后效性和重复子问题
42 | 动态规划实战:如何实现搜索引擎中的拼写纠错功能?
高级篇 (9讲)
43 | 拓扑排序:如何确定代码源文件的编译依赖关系?
44 | 最短路径:地图软件是如何计算出最优出行路径的?
45 | 位图:如何实现网页爬虫中的URL去重功能?
46 | 概率统计:如何利用朴素贝叶斯算法过滤垃圾短信?
47 | 向量空间:如何实现一个简单的音乐推荐系统?
48 | B+树:MySQL数据库索引是如何实现的?
49 | 搜索:如何用A*搜索算法实现游戏中的寻路功能?
50 | 索引:如何在海量数据中快速查找某个数据?
51 | 并行算法:如何利用并行处理提高算法的执行效率?
实战篇 (5讲)
52 | 算法实战(一):剖析Redis常用数据类型对应的数据结构
53 | 算法实战(二):剖析搜索引擎背后的经典数据结构和算法
54 | 算法实战(三):剖析高性能队列Disruptor背后的数据结构和算法
55 | 算法实战(四):剖析微服务接口鉴权限流背后的数据结构和算法
56 | 算法实战(五):如何用学过的数据结构和算法实现一个短网址系统?
加餐:不定期福利 (6讲)
不定期福利第一期 | 数据结构与算法学习书单
不定期福利第二期 | 王争:羁绊前行的,不是肆虐的狂风,而是内心的迷茫
不定期福利第三期 | 测一测你的算法阶段学习成果
不定期福利第四期 | 刘超:我是怎么学习《数据结构与算法之美》的?
总结课 | 在实际开发中,如何权衡选择使用哪种数据结构和算法?
《数据结构与算法之美》学习指导手册
加餐:春节7天练 (7讲)
春节7天练 | Day 1:数组和链表
春节7天练 | Day 2:栈、队列和递归
春节7天练 | Day 3:排序和二分查找
春节7天练 | Day 4:散列表和字符串
春节7天练 | Day 5:二叉树和堆
春节7天练 | Day 6:图
春节7天练 | Day 7:贪心、分治、回溯和动态规划
加餐:用户学习故事 (2讲)
用户故事 | Jerry银银:这一年我的脑海里只有算法
用户故事 | zixuan:站在思维的高处,才有足够的视野和能力欣赏“美”
结束语 (3讲)
结束语 | 送君千里,终须一别
第2季回归 | 这一次,我们一起拿下设计模式!
打卡召集令 | 60 天攻克数据结构与算法
免费
数据结构与算法之美
登录|注册

01 | 为什么要学习数据结构和算法?

王争 2018-09-21
你是不是觉得数据结构和算法,跟操作系统、计算机网络一样,是脱离实际工作的知识?可能除了面试,这辈子也用不着?
尽管计算机相关专业的同学在大学都学过这门课程,甚至很多培训机构也会培训这方面的知识,但是据我了解,很多程序员对数据结构和算法依旧一窍不通。还有一些人也只听说过数组、链表、快排这些最最基本的数据结构和算法,稍微复杂一点的就完全没概念。
当然,也有很多人说,自己实际工作中根本用不到数据结构和算法。所以,就算不懂这块知识,只要 Java API、开发框架用得熟练,照样可以把代码写得“飞”起来。事实真的是这样吗?
今天我们就来详细聊一聊,为什么要学习数据结构和算法。

想要通关大厂面试,千万别让数据结构和算法拖了后腿

很多大公司,比如 BAT、Google、Facebook,面试的时候都喜欢考算法、让人现场写代码。有些人虽然技术不错,但每次去面试都会“跪”在算法上,很是可惜。那你有没有想过,为什么这些大公司都喜欢考算法呢?
校招的时候,参加面试的学生通常没有实际项目经验,公司只能考察他们的基础知识是否牢固。社招就更不用说了,越是厉害的公司,越是注重考察数据结构与算法这类基础知识。相比短期能力,他们更看中你的长期潜力。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《数据结构与算法之美》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(714)

  • 姜威
    为什么学习数据结构和算法?我认为有3点比较重要
    1.直接好处是能够有写出性能更优的代码。
    2.算法,是一种解决问题的思路和方法,有机会应用到生活和事业的其他方面。
    3.长期来看,大脑思考能力是个人最重要的核心竞争力,而算法是为数不多的能够有效训练大脑思考能力的途径之一。

    作者回复: 写的很好 同学们把这条回复顶上去

    2018-09-21
    1
    2585
  • HouShangLing
    一定要动手写

    作者回复: 你掌握了学这门课的最有效的方法。看十遍也没自己实现一遍学的牢。同学们这条也帮忙顶上去

    2018-09-21
    1
    1241
  • wistbean
    其实问题的所在就是现在有很多现成的框架,器又大活又好,拿来就用,还不用太担心性能的问题。就好像那些建楼的工程师不需要懂砖瓦的构成,也能盖楼。司机不需要懂汽车引擎的原理,也能当顺风车司机载美女兜风。

    遇到不会的上 Google,懒了就上 GitHub 找框架。所以写了这么多年代码,一直是个菜鸟。

    或许是时候修炼自己的内功了。一直 CURD 有意思么?把设计模式,网络原理,数据结构和算法捡起来,或许就没那么容易菜鸟了。怼人也更加自信了。跳槽也不用畏畏缩缩的了。

    为了不当菜鸟,我和我的小伙伴们就加入了哇!

    作者回复: 写的太好了

    2018-09-21
    300
  • 裴海港
    年近40的大叔也有一颗积极向上的心

    作者回复: 终身学习 多大年纪也不晚

    2018-09-21
    2
    158
  • 两颗小虎牙
    可不可以每次多发布几篇?
    2018-09-21
    133
  • tdytaylor
    老师,就像你说的,工作中其实好多都和业务挂钩,基本上都是针对业务做增删改查,很难把所学的算法应用起来,我平时也时不时学习算法,但总感觉学了就忘,忘了又学,如此反复,老师,这种到底是没了解算法的原理导致不会灵活应用,还是写的少导致的,感觉学习算法很少能应用起来

    作者回复: 1. 客观的讲,有些项目确实涉及的数据结构和算法少一些,你可以再看下我文章里写的。
    2. 你提到学了又忘,我觉得一方面你是没有掌握学习的方法,学习的重点,走马观花的看肯定比较容易忘;我们02节会具体讲;
    3. 不会灵活应用?那估计还是没有好的教材教你如何应用,还有可能就是确实还没掌握太牢,只是懂点皮毛,很浅,灵活应用是一个比较的境界,需要一段时间的沉淀学习。
    4. 学习算法并不是为了记住几个排序、二分查找、二叉树遍历,他还能锻炼你的逻辑思维、性能意识,而且,如果你写代码能力还有欠缺,你还可以通过把学到的数据结构和算法都实现一遍,这是一种很好很好的锻炼编程能力的方法。所以不要过度追求一定要在项目里手写快排、手写二叉树才能算是用上。

    2018-09-21
    128
  • 五岳寻仙
    老师好!看到专栏第一眼就果断订阅了。我是一个菜鸟程序员,半年的工作经验让我感受到数据结构和算法太重要了!讲一个自己亲身经历的例子。
    入职不久,就遇到一个需求,需要建立一个3G(30亿)条键值对映射,已供后续检索。听上去很简单的问题,用python的字典就可以解决。但在实现的过程中,很快就遇到了问题:字典是基于hash的,对于每条键值对要多消耗50个字节的内存维持这种结构(即便使用redis也需要这个内存花销),再加上键值存储消耗的内存,我大约需要3G×70=210G内存,超过服务器内存了。
    后来,想到了可以根据键排序后线性存储,使用二分查找,解决了这个问题,大约消耗的内存也就3G×10=30G左右。
    看似简单的问题,当规模大到一定程度,不借助算法和数据结构,就无法解决了。

    作者回复: 哈哈 你要是看到我讲的散列那一篇你就知道了 像java里的hashmap是比较耗内存的 你用到的解决方案是一种用时间复杂度换空间复杂度的思路 我们专栏也会讲的 不过你现在的解决办法还可以更高效 利用hash函数 我们专栏也会讲到 还有二分是logn的时间复杂度 是非常高效的一种时间复杂度 2的64次方个有序数据二分查找也顶多循环64次 有没有觉得logn这个复杂度很奇妙

    2018-09-21
    121
  • Haoz
    一、数据结构和算法是什么

    1、数据结构是指一组数据的存储结构
    2、算法就是操作数据的方法
    3、数据结构和算法是相辅相成的,数据结构是为算法服务的,而算法要作用在特定的数据结构之上

    二、学习的重点在什么地方

    数据结构和算法解决的是如何更省、更快地存储和处理数据的问题,因此,我们就需要一个考量效率和资源消耗的方法,这就是复杂度分析方法。在学习数据结构和算法的过程中,要学习它的「来历」、「自身的特点」、「适合解决的问题」以及「实际的应用场景」。

    1、数据结构和算法学习的精髓-复杂度分析
    2、最常用的、最基础的数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树
    3、最常用的算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法

    感谢老师的分析,一直以来数据结构和算法都是我的硬伤,学了很多次,也放弃了很多次,可能是方法不对,但更多的是因为自己之前的毅力不够。

    在此立下 flag:从本篇文章开始,将老师的文章根据自己的理解进行输出相应的总结和思考,发表成留言,并将每周三篇文章中涉及的数据结构和算法用 Java 实现一次。

    作者回复: 写的很好👍

    2018-09-25
    93
  • DDT
    就是想升工资吧 我知道学技术必须要拿出十年磨一剑的精神 从头开始...

    作者回复: 十年磨一剑说的太好了。我也是这么认为的。做技术就是不要浮躁。要耐得住寂寞。沉得下心。

    2018-09-21
    40
  • 阿康
    老师,我是一名iOS开发,怎么听完你这篇文章还是觉得算法对于我开发来说不是那么重要😂后面我有点怕自己听不懂,而且动手写,我该如何下笔,感觉自己很迷茫……

    作者回复: 1. 假设我们现在要做这样一个功能,我们希望在app上存储一个多级地址列表,用户可以一层一层的选择地址列表中的地址,来设置自己的所在的省份、市、区,如果这个地址列表不是经常变动的,我们希望保存在app端,这样就不需要每次操作地址列表都要跟后台交互,如果让你存储这个多级地址列表,你会怎么存储呢?
    2. 如果地址列表也并不是一直都不变的,如果地址列表改变了,我们又不希望发新版,那如何更新app上的地址列表呢?如果地址列表比较大,我们不希望app重新全量的从服务器再拉一次,那又如何来做呢?
    3. 我会用一种语言来实现 你可以翻译成object c

    2018-09-21
    36
  • 邵峰
    记得以前看金庸小说,一个人练降龙十八掌,一个人练全真教内功,刚开始练内功的被吊打,十年后练内功的依然被吊打,但是20年后,降龙十八掌就怎么也打不过练内功的了,算法和数据结构就是内功,降龙十八掌我觉得就是各种框架,再怎么熟悉框架,也不如了解它内部的算法和数据结构

    作者回复: 太形象了:)

    2018-09-21
    1
    33
  • lane
    现实,都是面相领导编程…………一言难尽…

    作者回复: 没事的 如果工作不满意 不顺心 更要卧薪尝胆 提高能力 沉淀自己。总有一天 机会会到来 你做好充分的抓住它的准备就好。人在职场中 只要抓住一两次大的机会 就能做到很高的职位 就怕的是机会来了我们也抓不住

    2018-09-21
    31
  • 小麦2018
    我还是觉得王争老师自己读的音频好,亲切,有听作者亲自讲解的感觉。
    2018-09-21
    29
  • Chevins
    今天去面试。数据结构与算法。6道题。一道都不会。我说我3年开发经验,呵呵,自己都觉得可笑。不过无所谓,我会追上来的,加油,菜鸟。
    2018-09-22
    26
  • Liar
    不做一个没有追求的码农,那些说过了35就不行的码农大部分都是不求上进的人。

    作者回复: 说得好 不管哪个行业都会淘汰不求上进的人 it也不例外

    2018-09-21
    25
  • xuan zhu
    年近40的大妈也有一颗积极向上的心
    2018-09-22
    23
  • grandcool
    没理解统计业务接口99%响应时间啥意思

    作者回复: 举一个例子 你写了一个接口 每天有成千上万的访问 你如何知道这个接口够不够快?响应时间是1s还是5s?如何统计度量?用平均值?显然不是太适合?那用什么值来统计度量呢?你可以自己搜索研究下

    2018-09-21
    2
    20
  • saber
    https://github.com/saber/algorithm
    这是我 19年 3月底开始学习专栏到现在的所有笔记&代码,持续更新中 ......

    目前学习的课程还很少还很基础,为了后来跟我一样的初学者更好的学习该专栏,我在代码中加上了详细的注释,复杂度分析等等,代码按照一定的规范进行书写,该项目中包含了我学习的代码规范(文字版+代码版),适合跟我一样的初学者学习码更好更漂亮的代码。笔记格式按照中文排版格式进行书写。可以作为复习的资料。

    希望老师和大家顶我上去,让更多的初学者能够看到。
    2019-05-05
    14
  • NoN
    我个人觉得学习数据结构不说其他,真的非常锻炼一个人的思维能力,大学时候参加过学校的ACM集训队,学了一年多算法(上一届获过奖大牛学长带,基本属于纯自学),我们班加上我有五个人,给我的感觉就是,凡是参加过集训的,学习能力都要比班里边其他人强,也是那时被算法吸引,由于是自学,有时候一个问题想不明白就得困扰很长时间,清晰记得当初被动态规划折磨的日子,这次看到这个课程,就选择了,希望能跟着老师系统学习一下这门课!
    2018-09-21
    14
  • demo
    双非,不是CS专业的本科生,学校里边学的太少了。自己虽然有坚持刷leetcode,但是好多都是先看人家的思路才可以写出来的。自己一个自学,压力大,效率低吧.希望通过这个课程开阔自己的视野。
    之后不管考研还是找工作,数据结构都是重中之重。所以 我一定要好好学。
    2018-09-21
    14
收起评论
99+
返回
顶部