数据结构与算法之美
王争
前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 天攻克数据结构与算法
免费
数据结构与算法之美
登录|注册

开篇词 | 从今天起,跨过“数据结构与算法”这道坎

王争 2018-09-17
00:00
08:12
讲述:修阳 大小:3.76M
你好,我是王争,毕业于西安交通大学计算机专业。现在回想起来,本科毕业的时候,我的编程水平其实是很差的。直到读研究生的时候,一个师兄给了我一本《算法导论》,说你可以看看,对你的编程会很有帮助。
没想到,从此我对算法的“迷恋”便一发不可收拾。之后,我如饥似渴地把图书馆里几乎所有数据结构和算法书籍都读了一遍。
我常常边读边练。没多久,我就发现,写代码的时候,我会不由自主考虑很多性能方面的问题。我写出时间复杂度高、空间复杂度高的垃圾代码越来越少了,算法能力提升了很多,编程能力也有了质的飞跃。得益于此,研究生毕业后,我直接进入 Google,从事 Google 翻译相关的开发工作。
这是我自己学习数据结构与算法的经历,现在,你可以想想你的情况。
是不是从学校开始,你就觉得数据结构难学,然后一直没认真学?
工作中,一遇到数据结构这个坑,你又发自本能地迅速避让,因为你觉得自己不懂,所以也不想深究,反正看起来无关大局?
当你想换工作面试,或者研究某个开源项目源码,亦或者和团队讨论某个非框架层面的高可用难题的时候,你又发现,自己的基础跟不上别人的节奏?
如果你是这种情况,其实你并不孤独,这不是你一个人遇到的问题。工作十年间,我见过许多程序员。他们有着各种各样的背景,有很多既有潜力又非常努力,但始终无法在自己现有水平上更进一步。
在技术圈里,我们经常喜欢谈论高大上的架构,比如高可用、微服务、服务治理等等。鲜有人关注代码层面的编程能力,而愿意沉下心来,花几个月时间啃一啃计算机基础知识、认认真真夯实基础的人,简直就是凤毛麟角。
我认识一位原来腾讯 T4 的技术大牛。在区块链大潮之前,他在腾讯工作了 10 多年,长期负责手机 QQ 后台整体建设。他经历了手机 QQ 从诞生到亿级用户在线的整个过程。后来他去了微众银行,有一天老板让他去做区块链。他用了不到半年时间,就把区块链的整个技术脉络摸清楚了。 现在,他是微众银行的区块链负责人,微众科技创新产品部的老总。你说厉害不?你可以花半年时间就能精通一个新的领域吗?为什么他就可以做到?
我觉得这其中最重要的就是基础足够扎实。他曾经跟我说,像区块链、人工智能这些看似很新的技术,其实一点儿都不“新”。最初学编程的时候,他就把那些基础的知识都学透了。当面临行业变动、新技术更迭的时候,他不断发现,那些所谓的新技术,核心和本质的东西其实就是当初学的那些知识。掌握了这个“规律”之后,他学任何东西都很快,任何新技术都能快速迎头赶上。这就是他快速学习并且获得成功的秘诀。
所以说,基础知识就像是一座大楼的地基,它决定了我们的技术高度。而要想快速做出点事情,前提条件一定是基础能力过硬,“内功”要到位
那技术人究竟都需要修炼哪些“内功”呢?我觉得,无外乎就是大学里的那些基础课程,操作系统、计算机网络、编译原理等等,当然还有数据结构和算法。
可是,我们都知道,像《算法导论》这些经典书籍,虽然很全面,但是过于理论,学起来非常枯燥;而市面很多课程大多缺失真实的开发场景,费劲学完感觉好像还是用不上,过不了几天就忘了。
所以,我尝试做一个让你能真正受用的数据结构与算法课程,希望给你指明一个简洁、高效的学习路径,教你一个学习基础知识的通用方法 。那么,关于专栏内容,我是怎样设计的呢?
我根据自己研读数十本算法书籍和多年项目开发的经验,在众多的数据结构和算法中,精选了最实用的内容进行讲解。
我不只会教你怎么用,还会告诉你,我们为什么需要这种数据结构和算法,一点点帮你捋清它们背后的设计思想,培养你举一反三的能力。
对于每种数据结构和算法,我都会结合真实的软件开发案例来讲解,让你知道,数据结构和算法,究竟应该如何应用到实际的编码中。
为了由浅入深地带你学习,我把专栏分成四个递进的模块。
入门篇
时间、空间复杂度分析是数据结构和算法中非常重要的知识点,贯穿整个专栏的学习过程。但同时也是比较难掌握的,所以我用了 2 节课来讲这部分内容,而且还举了大量的实例,让你一边学一边练,真正能掌握复杂度分析,为后面的学习铺路。
我希望通过这一模块,你能掌握时间、空间复杂度的概念,大 O 表示法的由来,各种复杂度分析技巧,以及最好、最坏、平均、均摊复杂度分析方法。之后,面对任何代码的复杂度分析,你都能游刃有余、毫不畏惧!
基础篇
这部分是专栏中篇幅最大的内容,也是我们学习的重点,共有 26 节内容,涵盖了最基础、最常用的数据结构和算法。针对每种数据结构和算法,我都会结合具体的软件开发实例,由浅入深进行讲解,并适时总结一些实用“宝典”,保证你印象深刻、学有所用。
比如递归这一节,我会讲到,为什么递归代码比较难写?如何避免堆栈溢出?如何避免递归冗余计算?如何将递归代码转化为非递归代码?
高级篇
这部分我会讲一些不是那么常用的数据结构和算法。虽然不常用,但是这些内容你也需要知道。设置这一部分的目的,是为了让你开拓视野,强化训练算法思维、逻辑思维。如果说学完基础部分可以考 80 分,那掌握这一部分就能让你成为尖子生!
实战篇
我们整个专栏都是围绕数据结构和算法在具体软件实践中的应用来讲的,所以最后我会通过实战部分串讲一下前面讲到的数据结构和算法。我会拿一些开源项目、框架或者系统设计问题,剖析它们背后的数据结构和算法,让你有一个更加直观的感受。
人生路上,我们会遇到很多的坎。跨过去,你就可以成长,跨不过去就是困难和停滞。而在后面很长的一段时间里,你都需要为这个困难买单。对于我们技术人来说,更是这样。既然数据结构和算法这个坎,我们总归是要跨过去,为什么不是现在呢?
我很感激师兄当年给我的那本《算法导论》,这是我人生中为数不多的转折点之一。没有那本书,也可能就没有今天的我。我希望这个专栏也能成为你的一个人生转折点。
我希望,通过这个专栏,不仅能帮你跨过数据结构与算法这个坎,还能帮你掌握一种学习知识和技能的方法,帮你度过职场甚至人生的重要时刻!一起加油吧!
取消
完成
0/1000字
划线
笔记
复制
unpreview
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《数据结构与算法之美》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(695)

  • shupian418 置顶
     作者回复

    迈不过去你找我退钱

    冲这句话,我相信这么有信心的作者!
    2018-09-17
    6
    588
  • 郭蕾 置顶
    9 月 21 日起正式更新,更新时间为每周一三五。
    2018-09-17
    117
  • YJ、 置顶
    作为程序员,学习就是我的使命。
    2018-09-17
    86
  • 动物园园长 置顶
    有两个问题想咨询一下:1、编程语言基础:只会简单的python语言,练习课程中的练习基础够不够?
    2、能否大致讲一下学习这门课程的思路?是否有必要将所有练习都全部一一用语言实现一遍?

    作者回复: 你问的很到位 后面01 02会详细讲这个专栏怎么学 简单python会就够了 很多大学生学这门课的时候根本不会编程 照样也学了

    2018-09-17
    47
  • 笑容 置顶
    算法需要有高等数学基础吧

    作者回复: 实际上 初中就够了 搞信息学竞赛的都是些初中生

    2018-09-17
    35
  • #仙豆 置顶
    课程用的什么语言?

    作者回复: 不限语言 java go python 甚至javascript都可以

    2018-09-17
    1
    24
  • 置顶
    关注「极客时间」服务号,回复关键词「算法」,提前获取专栏学习思维脑图。
    2018-09-19
    3
    21
  • LAMBO 置顶
    早上车系列。
    早点把基础学好学深,就能更快地写出更好的代码,就能更早走上人生巅峰。
    期待大神的点拨。
    2018-09-18
    17
  • Leung 置顶
    请问,每一节都会有相应的材料输出吗?

    作者回复: 材料输出你是指?每节课开篇都有思考题 课后还有思考题 内容也结合实际的软件开发场景来讲

    2018-09-17
    7
  • glenny
    上车,希望这次能迈过这个坎儿

    作者回复: 迈不过去你找我退钱

    2018-09-17
    1
    382
  • 趁此生未老~~~
    买的人 这么多,希望作者不要被金钱冲昏头脑。认真对待!对的起大家!说的可能重了点。莫怪!

    作者回复: 怎么会呢 我也不缺这点钱 写这个主要还是想提高一下国内程序员的整体水平

    2018-09-18
    4
    159
  • 程序媛shirley
    .NET程序媛来报道~

    作者回复: 比心

    2018-09-18
    3
    84
  • 一直
    用伪代码讲解的话,那确定我们用自己学过的语言可以实现吗老师??

    作者回复: 实在不行我就开个github账号 把代码实现一遍放上去给你看

    2018-09-19
    4
    70
  • Woong
    看到有留言说系统作者不要被金钱冲昏头脑,我只想说,希望大家多订阅,作者多赚钱,有动力写出更好的文章,然后带大家一起多赚钱。钱是个好东西!

    作者回复: 是的 感谢理解 我也听到一些质疑的声音 不过我花了半年的时间把我积累了这么多年的经验 心得 分享出来 难道还不止一顿饭钱吗?知识这个东西 就是你觉得它对你没用 那它一文不值 如果它对你有用 那就不止值68 甚至680 6800 6万8....

    2018-09-19
    60
  • 飞灰湮儿灭
    忘了是不是陈皓一个文章里写的,程序员两条腿,一条是算法,一条是英文,想跑的更远,这两条腿都不能弱。。。英文已经补了三个月了,算法,迟早要还的债,也得逼自己一把补补课了。
    2018-09-17
    2
    37
  • Codery
    师傅,算法靠你了,你要好好开车啊。千万别翻车,哈哈
    2018-09-18
    33
  • 何欢
    建议用代码实现比较好,然后把代码放到github上面,我们可以拿来学习。
    2018-09-20
    30
  • Meteor
    数据结构和算法永远无法绕开的坑,绕不过就去填上,坐等大佬开讲。

    作者回复: 你的选择没错 池老师说了 数据结构和算法是 程序员的金线 一个普通程序员和一个优质高潜程序员 永远的区分线

    2018-09-17
    2
    28
  • hxx1221
    我之前也看过算法 可是我敲了几年代码 除了业务中用了个递归 真没有用到什么算法 我现在在跟学一遍 我就是特别好奇 这算法什么时候用 工作中 我真没怎么用到 带着一颗好奇心去学呀 希望老师能多讲解讲解工作中的实例

    作者回复: 我太懂你了 99%的人都觉得算法 数据结构没啥用 顶多用个数组 链表 散列 排序 那还都是直接调包 用语言提供的容器 函数

    2018-09-19
    1
    26
  • Pingkoko
    可以的话,希望老师在github上把实例写上去,java或者python都可以,可以搞个点赞看用哪种语言,谢谢!
    2018-09-20
    25
收起评论
99+
99+
返回
顶部