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

02 | 如何抓住重点,系统高效地学习数据结构与算法?

王争 2018-09-24
你是否曾跟我一样,因为看不懂数据结构和算法,而一度怀疑是自己太笨?实际上,很多人在第一次接触这门课时,都会有这种感觉,觉得数据结构和算法很抽象,晦涩难懂,宛如天书。正是这个原因,让很多初学者对这门课望而却步。
我个人觉得,其实真正的原因是你没有找到好的学习方法没有抓住学习的重点。实际上,数据结构和算法的东西并不多,常用的、基础的知识点更是屈指可数。只要掌握了正确的学习方法,学起来并没有看上去那么难,更不需要什么高智商、厚底子。
还记得大学里每次考前老师都要划重点吗?今天,我就给你划划我们这门课的重点,再告诉你一些我总结的学习小窍门。相信有了这些之后,你学起来就会有的放矢、事半功倍了。

什么是数据结构?什么是算法?

大部分数据结构和算法教材,在开篇都会给这两个概念下一个明确的定义。但是,这些定义都很抽象,对理解这两个概念并没有实质性的帮助,反倒会让你陷入死抠定义的误区。毕竟,我们现在学习,并不是为了考试,所以,概念背得再牢,不会用也就没什么用。
虽然我们说没必要深挖严格的定义,但是这并不等于不需要理解概念。 下面我就从广义和狭义两个层面,来帮你理解数据结构与算法这两个概念。
从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《数据结构与算法之美》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(1673)

  • 1、所有数据结构与算法用C++实现一遍;
    2、所有数据结构与算法用Python实现一遍;
    3、学完就辞职。
    2018-09-24
    68
    1917
  • wean
    是什么:
    数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组方法”。
    数据结构是为算法服务的,算法是要作用再特定的数据结构上的。
    学什么:
    1. 效率和资源消耗的度量衡--复杂度分析。
    2. 最常用、最基础的20个数据结构与算法,学习他们的:“来历”、“特点”、“适合解决什么问题”和“实际的应用场景”。
    数据结构:数组、链表、栈、队列、散列表、二叉树‘、堆、跳表、图、Tire树
    算法: 递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法
    怎么学
    1. 边学边练,每周花 1~2 小时集中攻关三节课涉及的数据结构和算法,全部写出来。
    2. 主动提问、多思考、多互动。在留言区增加自己的留言。
    3. 自我激励,每次学习完做一篇学习笔记。
    4. 沉下心不要浮躁,先把这些基础的数据结构和算法,还有学习方法熟练掌握后,再追求更高层次。
    ------------
    flag:每篇文章必写学习笔记,每周必实现一次该周代码。
    2018-09-24
    2
    865
  • $Jason
    BAT我明年年初一定进入一个
    2018-09-24
    26
    466
  • 187J3X1
    https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
    此网站可以将指定算法可视化,能方便理解。麻烦顶上去让更多人看到,谢谢。
    2018-10-01
    13
    392
  • 一条咸鱼
    非科班。。马上就28岁了,一直有个计算机梦。来这学习不为别的,只为能慢慢成为一位合格的计算机人
    2018-09-24
    5
    361
  • zyzheng
    “学习最好的方法是,找到几个人一起学习,一块儿讨论切磋,有问题及时寻求老师答疑。”
    老师说的这个方法非常赞同,之前在学其他内容时经常遇到个人单独学习坚持不下来的问题。这次和公司里有兴趣的同事一起成立了一个五人学习小组,计划每周组织一个小时交流会,每人讲10分钟,自由讨论10分钟,希望能对自己和大家的学习都有帮助,希望能坚持下去✊

    作者回复: 太赞太用心了

    2018-09-24
    198
  • EidLeung
    敲代码,回想起自己大学的时候,课本上的每一段代码都敲一边!甚至敲完了整本《C++ primer》😓
    2018-09-24
    4
    172
  • 觉良
    当我们要谈一个事物/概念的时候,需要问自己三个终极问题--是什么?为什么?怎么样?

    什么是数据结构和算法
    数据结构,就是一组数据的存储结构。
    算法,就是操作数据的一组方法。
    数据结构是为算法服务的,算法要作用在特定的数据结构之上。

    为什么需要数据结构和算法
    来谈谈应用层面的原因。在计算机科学和互联网迅猛发展下,需要计算的数据量越来越庞大。但是计算机的计算能力是有限的,这么大量的数据计算,需要越来越多的计算机,需要越来越长的计算时间,注重效率的我们需要尽可能的提高计算效率。其中重要的一项,就是使用合适的数据结构和算法。选用合适的数据结构和算法,特别是在处理体量非常庞大的数据的时候,可以极大提高计算效率。那么,第三个问题来了,我们怎么选用合适的数据结构和算法?有什么衡量标准吗?

    怎么样衡量数据结构和算法
    需要引入一个衡量的标准(metric)---时间复杂度和空间复杂度。
    学习数据结构和算法的基石,就是要学会`复杂度分析`。知道怎么去分析复杂度,才能作出正确的判断,在特定的场景下选用合适的正确的算法。而不是盲目的死记烂背,机械操作。

    在本专栏中,重点学习20个最常用的最基础的数据结构和算法,需要我们逐一攻克。
    10个数据结构: 数组,链表,栈,队列,散列表,二叉树,堆,跳表,图,Trie树
    10个算法: 递归,排序,二分查找,搜索,哈希算法,贪心算法,分治算法,回溯算法,动态规划,字符串匹配算法

    作者回复: 写的好!

    2018-09-24
    2
    163
  • 吉祥
    Flag: 课程内容用 python 实现一遍,有不懂的及时留言提问,每周写总结。
    2018-09-24
    60
  • zeta
    35岁瓶颈失业程序员过来报道,继续精进,顺便当怪给新同学点点赞
    2018-09-27
    4
    58
  • 墨墨
    对于比较笨的我来说,我的学习方法就是边学边练,这个方法务实有效。在此立下flag,不学会数据结构与算法,就掉光头发!哈哈
    2018-09-24
    1
    54
  • 与路同飞
    完美主义在作怪。在看《算法》这本书的时候,总想着做完所有习题在看后面的章节。导致后面没坚持下去
    2018-09-24
    1
    46
  • 黄海娜
    学习了,也理解了,当时可以写出代码来,但是长时间就忘记了😣,这个难道真的如果日常不用的话,的确会忘记,那是不是就要先当公式一样记下来再说?

    作者回复: 完全不需要死记硬背的,我也记不住快排,红黑树,但是只要你掌握分析的能力,等你真的需要的时候,花不到半个小时就弄懂了。你要记住的是,这些算法的特点,应用场景,用到了能想到他就好了。

    2018-09-24
    45
  • Joshua 兆甲
    需要教材吗?老师?
    自己学习的方法: 排个队想到队列,火车进站想到堆栈,看到树上开花想到树的某些指标,导航想到贪心,将生活场景与算法和数据结构的场景结合起来。
    遇到的困难: 应用和实践不行。你看树是数据结构,而大众有更约定俗成的固有看法,切磋估计不大可行,且自己学习,首先需要一个代码开发的条件,不断思考练习,不易坚持。
    数据结构不容易可视化呈现。靠画图建立初始的结构,靠脑补数据变化的过程,再靠心算将结果呈现为“可视”图景。中间,一般在机器上就是简单plain text输入输出.不是第一信号系统,接受收效率慢。
    没有大图景,只有片面观察。即便会了一招半式,获得敢不强,信心不足,真正应用中,或许没有直接上两个循环嵌套来得直接,明了,易懂。容易生出百无一用是书生的瞎想
    以上。老师中秋快乐!循环链表代表我的心。

    作者回复: 写得好 你可以看看大话数据结构和算法图解。里面的学习方法跟你的很相似

    2018-09-25
    44
  • 王宇
    我的学习法:
    1.从老师这里获取知识
    2.学习理解知识,继续思考,提出疑问,先自己解决,实在想不出了问老师
    3.总结知识
    4.运用知识,解决问题
    5.写博客教别人学到的知识
    已经意识到算法对面试工作的重要性,也喜欢锻炼自己的思维,想体验不知道哪一天解决了个什么事,突然发现自己变聪明了的快感
    2018-09-24
    29
  • lxb
    我想问问用JavaScript真能实现这些算法跟数据结构吗?

    作者回复: 我觉得能 后面如果你觉得不能你就再给我留言吧

    2018-09-24
    1
    28
  • Silence
    Flag:在这几个月内一定要掌握并学会运用文中提到的算法,不管多难都要坚持看下去,这次,不想再逃了!
    2018-09-24
    3
    23
  • SeLiNnnn
    现在几乎都是一个人学习 在工作室一待就是一天 因为很有目标和动力 现在不存在坚持不下去的状态 有没有人和我一起都无所谓 享受孤独 孤独让人顽强。况且我就是想提升编程能力 锻炼逻辑 并不是为了考试而学 就是我喜欢我愿意花时间和精力 我非常想变得优秀。加油加油!!我就好好学好好练 每天都鼓励自己。

    作者回复: 加油💪

    2018-09-25
    3
    22
  • Yafei
    大学学这门课的时候,一碰到那种递归求复杂度就懵逼,这次一定搞定它!
    2018-09-24
    21
  • 确认过眼神
    本人学的Java,想通过这个课程学习如何把数据结构和算法切实的用到编程中,来实现用空间换时间。
    1、提高每个接口的访问速度,可否实现?
    2、时间复杂度越高,执行效率越低吗?
    3、两张表联查后再遍历查询第三张表是否比三张表联查效率高?利用数据结构和算法是否有更优的解决方案?
    希望老师给出三个问题的答案,伙伴们一起讨论。

    作者回复: 1. 学习的过程可以锻炼你的性能意识,写代码的时候会不自觉的考虑性能问题,所以写出低效代码的情况就少了
    2. 理论上是的,但实际上时间复杂度与执行时间并不划等号,我后面会讲到,有时候O(logn)的算法要比O(1)算法还快
    3. 这个没有确切的场景我也不好说,你可以自己测试一下。 一般来说,海量数据的存储一般都是分库分表,所以join操作可能就无法用上了。

    2018-09-24
    1
    21
收起评论
99+
返回
顶部