数据结构与算法之美 / 为工程师量身打造的数据结构与算法私教课
王争
前Google工程师
 
  • 课程目录
  • 课程介绍
  • 开篇词 | 从今天起,跨过“数据结构与算法”这道坎

    基础知识就像是一座大楼的地基,它决定了我们的技术高度。要想快速做出点事情,前提条件一定是基础能力过硬,“内功”要到位。

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

    你为什么要学习数据结构与算法呢?在过去的软件开发中,数据结构和算法在哪些地方帮到了你?

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

    如果你觉得数据结构与算法很难学,可能是因为你没有找到好的学习方法,没有抓住学习的重点。今天我就带你划一划咱们这门课的重点,并告诉你如何高效地学习数据结构与算法。

  • 03 | 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

    复杂度分析是算法的精髓。只要掌握了它,数据结构和算法的内容,基本就掌握了一半。

  • 04 | 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度

    今天我继续给你讲四个复杂度分析方面的知识点,最好情况时间复杂度、最坏情况时间复杂度、平均情况时间复杂度、均摊时间复杂度。

  • 不定期福利第一期 | 数据结构与算法学习书单

    你好,我是王争。欢迎来到不定期更新的周末福利时间。今天我们来聊聊数据结构和算法学习过程中的必读书单。

  • 05 | 数组:为什么很多编程语言中数组都从0开始编号?

    数组不仅是一种编程语言中的数据类型,还是一种最基础的数据结构。尽管数组看起来非常基础、简单,但是我估计很多人都没有真正理解这个基础数据结构的精髓。

  • 06 | 链表(上):如何实现LRU缓存淘汰算法?

    链表和数组有什么不同?我们通过这两者的对比,来解析常见的三种链表:单链表、双向链表和循环链表。

  • 07 | 链表(下):如何轻松写出正确的链表代码?

    链表代码写得好坏,可以看出一个人写代码是否细心,考虑问题是否全面,思维是否缜密。因此我总结了写链表代码的六个技巧,分享给你。

  • 08 | 栈:如何实现浏览器的前进和后退功能?

    栈是一种操作受限的数据结构,只支持入栈和出栈操作。后进先出是它最大的特点。不管基于数组还是链表来实现栈,入栈和出栈的时间复杂度都为O(1)。

  • 09 | 队列:队列在线程池等有限资源池中的应用

    队列最大的特点就是先进先出,主要的两个操作是入队和出队。我主要讲几种常见的队列:循环队列、阻塞队列和并发队列。

  • 10 | 递归:如何用三行代码找到“最终推荐人”?

    什么样的问题可以用递归来解决?如何快速写出优秀的递归代码?

  • 11 | 排序(上):为什么插入排序比冒泡排序更受欢迎?

    分析一个排序算法,要从执行效率、内存消耗和稳定性三个方面来看。这一节我带你分析三种排序算法:冒泡排序、插入排序、选择排序。

  • 12 | 排序(下):如何用快排思想在O(n)内查找第K大元素?

    归并排序和快速排序是两种稍微复杂的排序算法,它们用的都是分治的思想,代码都通过递归来实现,过程非常相似。

  • 13 | 线性排序:如何根据年龄给100万用户数据排序?

    桶排序和计数排序的排序思想是非常相似的,都是针对范围不大的数据,将数据划分成不同的桶来实现排序。基数排序算法要借助桶排序或者计数排序来完成每一个位的排序工作。

  • 14 | 排序优化:如何实现一个通用的、高性能的排序函数?

    今天是排序算法的最后一节,会贯穿前面几节的内容。我会讲快速排序的优化策略,比如合理选择分区点、避免递归太深等,还会带你分析C语言中qsort()的底层实现原理。

  • 15 | 二分查找(上):如何用最省内存的方式实现快速查找功能?

    二分查找的思想非常简单,但是看似越简单的东西往往越难掌握好,想要灵活应用就更加困难。

  • 16 | 二分查找(下):如何快速定位IP对应的省份地址?

    变体的二分查找算法写起来非常烧脑,很容易因为细节处理不好而产生Bug,这些容易出错的细节有:终止条件、区间上下界更新方法、返回值选择。

  • 17 | 跳表:为什么Redis一定要用跳表来实现有序集合?

    很多操作红黑树和跳表一样可以完成,甚至时间复杂度也是一样的,那我们为什么要选择跳表,而不是红黑树呢?

  • 18 | 散列表(上):Word文档中的单词拼写检查功能是如何实现的?

    散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。可以说,如果没有数组,就没有散列表。

  • 19 | 散列表(中):如何打造一个工业级水平的散列表?

    打造一个工业级水平的散列表,需要考虑三个问题:如何设计散列函数?如何根据装载因子动态扩容?如何选择散列冲突解决方法?

  • 20 | 散列表(下):为什么散列表和链表经常会一起使用?

    散列表是动态数据结构,不停地有数据的插入、删除。如果要按顺序遍历散列表中的数据,都要先排序,效率就会很低,因此我们会将散列表和链表放在一起使用。

  • 21 | 哈希算法(上):如何防止数据库中的用户信息被脱库?

    今天我会告诉你,在实际的开发中,我们该如何用哈希算法解决问题。

  • 22 | 哈希算法(下):哈希算法在分布式系统中有哪些应用?

    今天我讲三种哈希算法在分布式系统中的应用,它们分别是:负载均衡、数据分片、分布式存储。

  • 23 | 二叉树基础(上):什么样的二叉树适合用数组来存储?

    今天我们讲最常见的非线性表结构,树。

  • 24 | 二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树?

    我们今天来学习二叉查找树。

  • 25 | 红黑树(上):为什么工程中都用红黑树这种二叉树?

    前面提了那么多次红黑树,今天我们就来讲它。

  • 26 | 红黑树(下):掌握这些技巧,你也可以实现一个红黑树

    这节我们来看红黑树的实现过程,可能会比较复杂。

  • 27 | 递归树:如何借助树来求解递归算法的时间复杂度?

    今天我们用递归树分析递归代码的时间复杂度。

  • 不定期福利第二期 | 王争:羁绊前行的,不是肆虐的狂风,而是内心的迷茫

    今天我想分享的几个关于学习的认知。

  • 28 | 堆和堆排序:为什么说堆排序没有快速排序快?

    今天我们讲另一种完全二叉树,堆。

  • 29 | 堆的应用:如何快速获取到Top 10最热门的搜索关键词?

    今天我们来看,堆的三个非常重要的应用:优先级队列、求Top K和求中位数。

  • 30 | 图的表示:如何存储微博、微信等社交网络中的好友关系?

    今天我们学习图这种非线性表数据结构及其存储方式。

  • 31 | 深度和广度优先搜索:如何找出社交网络中的三度好友关系?

    深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。

  • 32 | 字符串匹配基础(上):如何借助哈希算法实现高效字符串匹配?

    今天我们讲两种字符串匹配算法,BF算法和RK算法。

  • 33 | 字符串匹配基础(中):如何实现文本编辑器中的查找功能?

    今天我们讲另一种字符串匹配算法,BM算法。

  • 34 | 字符串匹配基础(下):如何借助BM算法轻松理解KMP算法?

    在所有的字符串匹配算法里,要说最知名的一种的话,那就非KMP算法莫属。

  • 35 | Trie树:如何实现搜索引擎的搜索关键词提示功能?

    Trie树是一种解决字符串快速匹配问题的数据结构。

  • 36 | AC自动机:如何用多模式串匹配实现敏感词过滤功能?

    AC自动机是基于Trie树的一种改进算法,它跟Trie树的关系,就像单模式串中,KMP算法与BF算法的关系一样。

  • 37 | 贪心算法:如何用贪心算法实现Huffman压缩编码?

    贪心算法的最难的一块是如何将要解决的问题抽象成贪心算法模型,只要这一步搞定之后,贪心算法的编码一般都很简单。

  • 38 | 分治算法:谈一谈大规模计算框架MapReduce中的分治思想

    今天我们讲两种分治算法的典型的应用场景,一个用来指导编码,降低问题求解的时间复杂度,另一个解决海量数据处理问题。

  • 不定期福利第三期 | 测一测你的算法阶段学习成果

    专栏进行三个月了,基础篇也快要结束了。来做个期中测试吧!

  • 39 | 回溯算法:从电影《蝴蝶效应》中学习回溯算法的核心思想

    回溯算法的原理非常简单,但是它的应用场景却非常多,可以解决很多问题。

  • 40 | 初识动态规划:如何巧妙解决“双十一”购物时的凑单问题?

    动态规划很不好理解,但是它不难。为了让你更容易理解,我分成三节来讲,分别是:初识动态规划、动态规划理论、动态规划实战。

  • 不定期福利第四期 | 刘超:我是怎么学习《数据结构与算法之美》的?

    我是刘超。今天我来分享一下我学习算法专栏的方法。

  • 41 | 动态规划理论:一篇文章带你彻底搞懂最优子结构、无后效性和重复子问题

    什么样的问题可以用动态规划解决?解决动态规划问题的一般思考过程是什么样的?

  • 42 | 动态规划实战:如何实现搜索引擎中的拼写纠错功能?

    学完这一节,一般的动态规划问题,你都可以应付了。

  • 43 | 拓扑排序:如何确定代码源文件的编译依赖关系?

    从今天开始,我们就进入专栏的高级篇。

  • 44 | 最短路径:地图软件是如何计算出最优出行路径的?

    今天我们讲最短路径算法中最重要的一种图算法,Dijkstra最短路径算法。

  • 45 | 位图:如何实现网页爬虫中的URL去重功能?

    今天我们从散列表讲到位图,再讲到布隆过滤器,带你一站式解决爬虫网页去重问题。

  • 46 | 概率统计:如何利用朴素贝叶斯算法过滤垃圾短信?

    今天我由浅入深,带你学习三种过滤垃圾短信的方法。

  • 47 | 向量空间:如何实现一个简单的音乐推荐系统?

    今天我们用简单的向量空间欧几里得距离,求解一个看似复杂的问题。

  • 48 | B+树:MySQL数据库索引是如何实现的?

    我会从二叉查找树讲起,看它是如何一步一步被改造成B+树的。

  • 49 | 搜索:如何用A*搜索算法实现游戏中的寻路功能?

    启发式搜索算法利用估价函数,避免“跑偏”,贪心地朝着最有可能到达终点的方向前进。它能很好地平衡路线质量和执行效率,在实际的软件开发中的应用非常广泛。

  • 50 | 索引:如何在海量数据中快速查找某个数据?

    实际上,常用来构建索引的数据结构,就是我们之前讲过的几种支持动态数据集合的数据结构。

  • 51 | 并行算法:如何利用并行处理提高算法的执行效率?

    算法的目的就是为了提高代码执行的效率。当算法无法再继续优化的情况下,我们该如何来进一步提高执行效率呢?

  • 52 | 算法实战(一):剖析Redis常用数据类型对应的数据结构

    同样是看源码,为什么有些人只能看个热闹,了解一些皮毛,有些人就能形成自己的知识结构,并且化为己用呢?

  • 53 | 算法实战(二):剖析搜索引擎背后的经典数据结构和算法

    如何用学过的数据结构和算法设计一个小型搜索引擎?

  • 54 | 算法实战(三):剖析高性能队列Disruptor背后的数据结构和算法

    “并发”,实际上就是多线程安全的意思。

  • 55 | 算法实战(四):剖析微服务接口鉴权限流背后的数据结构和算法

    今天我们来看跟微服务相关的接口鉴权和限流功能的实现思路。(另外,今天文末还有个彩蛋哦!)

  • 56 | 算法实战(五):如何用学过的数据结构和算法实现一个短网址系统?

    我们讲两种短网址服务的实现方法。

  • 春节7天练 | Day 1:数组和链表

    数据结构与算法期末测试正在进行,来测一测你的学习成果……

  • 春节7天练 | Day 2:栈、队列和递归

    今天是七天练的第二篇。参与答题,还可获得春节加油礼包哦!

  • 春节7天练 | Day 3:排序和二分查找

    今天是7天练的第三篇。

  • 春节7天练 | Day 4:散列表和字符串

    今天我们来练习散列表和字符串代码实现。

  • 春节7天练 | Day 5:二叉树和堆

    第五篇,我们来练习二叉树和堆几个必知必会的代码实现。

  • 春节7天练 | Day 6:图

    今天我们来练习图相关的代码实现,建议你自己亲手写写看。

  • 春节7天练 | Day 7:贪心、分治、回溯和动态规划

    到此为止,七天的练习就结束了。这些题目都是我精选出来的,如果一遍搞不定,你可以多看几遍,反复练习,直到能全部搞定为止。

  • 用户故事 | Jerry银银:这一年我的脑海里只有算法

    我们来看看,别人是怎么学算法的?

  • 用户故事 | zixuan:站在思维的高处,才有足够的视野和能力欣赏“美”

    zixuan:我来谈谈自己学习这个专栏的体会、方法和收获。

  • 总结课 | 在实际开发中,如何权衡选择使用哪种数据结构和算法?

    工程上的问题,远比课本上的要复杂。所以,我今天总结了六条经验,希望你能把数据结构和算法用在刀刃上,恰当地解决实际问题。

  • 结束语 | 送君千里,终须一别

    专栏到今天就要结束了,我实现了最初给自己立下的flag,你怎么样呢?

  • 《数据结构与算法之美》学习指导手册

    专栏虽然已经结束,学习的同学源源不断。我对专栏内容重新做了一次梳理,希望给你一份具体、明确、有效的专栏学习指导。

特别放送

第一期:数据结构与算法学习书单 第二期:争哥独家学习心得 第三期:算法实战测试题 第四期:大咖的专栏学习方法 用户故事1:这一年我的脑海里只有算法 用户故事2:只有站在思维的高处,才有足够的视野和能力欣赏美

专栏简介

踏上了编程之路,也就意味着你选择了一种终身学习的生活方式。每一个程序员都要练就十八般武艺,而掌握数据结构与算法就像修炼了九阳神功。换句话说,掌握了数据结构与算法,你的内功修炼速度就会有质的飞跃。

无论你是从事业务开发,想要评估代码性能和资源消耗;还是从事架构设计,想要优化设计模式;或者想要快速玩转热门技术,比如人工智能、区块链,都要先搞定数据结构与算法。因为,任凭新技术如何变化,只要掌握了这些计算机科学的核心“招式”,你就可以见招拆招,始终立于“不败之地”。

那怎样才能真正掌握数据结构与算法呢?是把常用的数据结构与算法背得滚瓜烂熟吗?即便如此,面对现实世界的千变万化,你也不太可能照搬某个算法解决即将遇到的下一个问题。因此,就像学习设计模式、架构模式一样,学习数据结构与算法的关键,在于掌握其中的思想和精髓,学会解决实际问题的方法

王争,前Google工程师,从事Google翻译相关系统的开发,深入研究算法十余年。现任某金融公司核心系统资深系统架构师,负责公司核心业务的架构设计和开发。

他将采用最适合工程师的学习方式,不拘泥于某一特定编程语言,从实际开发场景出发,由浅入深教你学习数据结构与算法的方法,帮你搞懂基本概念和核心理论,深入理解算法精髓,帮你提升使用数据结构和算法思维解决问题的能力。

特别提醒: 专栏内容相关代码,均随更新进度上传至GitHub,点击这里,即可查看。

专栏模块

专栏共56期,分为4个由浅入深的模块。

  • 入门篇

为什么要学习数据结构与算法?数据结构与算法该怎么学?学习的重点又是什么?这一模块将为你指明数据结构与算法的学习路径;并着重介绍贯穿整个专栏学习的重要概念:时间复杂度和空间复杂度,为后面的学习打好基础。

  • 基础篇

将介绍最常见、最重要的数据结构与算法。每种都从“来历”“特点”“适合解决的问题”“实际的应用场景”出发,进行详细介绍;并配有清晰易懂的手绘图解,由浅入深进行讲述;还适时总结一些实用“宝典”,教你解决真实开发问题的思路和方法。

  • 高级篇

将从概念和应用的角度,深入剖析一些稍复杂的数据结构与算法,推演海量数据下的算法问题解决过程;帮你更加深入理解算法精髓,开拓视野,训练逻辑;真正带你升级算法思维,修炼深厚的编程内功。

  • 实战篇

将通过实战案例串讲前面讲到的数据结构和算法;并拿一些开源项目和框架,剖析它们背后的数据结构和算法;并带你用学过的内容实现一个短网址系统;深化对概念和应用的理解,灵活使用数据结构和算法。

你觉得怎么样?期待您评价: