数据结构与算法之美

数据结构与算法之美 / 为工程师量身打造的数据结构与算法私教课

王争 前Google工程师
  • 课程目录
  • 课程介绍
  • 在线阅读:开篇词 | 从今天起,跨过“数据结构与算法”这道坎

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

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

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

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

    觉得数据结构与算法难学?可能是你没有找到好的学习方法。今天我就带你来划重点,告诉你如何高效地学习数据结构与算法。

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

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

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

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

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

    尽管数组看起来非常基础、简单,但是我估计很多人都没有真正理解这个基础数据结构的精髓。

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

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

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

    链表代码写得好坏,可以看出一个人写代码是否细心,考虑问题是否全面,思维是否缜密。

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

    栈是一种操作受限的数据结构,只支持入栈和出栈操作。后进先出是它最大的特点。

  • 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,你怎么样呢?

  • 第2季回归 | 这一次,我们一起拿下设计模式!

    设计模式之美,欢迎你的到来!

  • 结课测试|这些数据结构与算法,你真的掌握了吗?

    为了帮助你检验自己的学习效果,我特别给你准备了一套结课测试题。这套测试题共有20道题目,都是单选题,满分100分。

  • 课程迭代|全新交付71讲音频

    希望这次全新迭代的音频,能带给你不一样的学习体验。也欢迎你继续提出问题、分享经验,我们一起学习、一起进步。

  • 在线阅读:打卡召集令 | 60 天攻克数据结构与算法

    为了带你彻底拿下“数据结构与算法”这座大山,我发起了“60 天攻克算法行动”,一起登顶!

  • 打卡召集令 | 第一阶段知识总结

    根据学习计划,目前第一阶段已经结束。恭喜你,坚持下来了!

  • 打卡召集令 | 第二阶段知识总结

    根据学习计划,目前第二阶段已经结束。继续坚持!

  • 打卡召集令 | 第三阶段知识总结

    根据学习计划,目前第三阶段已经结束。继续坚持!

  • 打卡召集令 | 第四阶段知识总结

    根据学习计划,目前第四阶段已经结束。第一期打卡结束,恭喜你坚持了下来!

81讲

你将获得

  • 轻松搞定BAT的面试通关秘籍。


讲师介绍

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

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


课程介绍

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

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

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

专栏分为4个由浅入深的模块。

  • 入门篇

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

  • 基础篇

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

  • 高级篇

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

  • 实战篇

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


课程目录


特别放送

免费领取福利


限时活动推荐


订阅须知

随机推荐

澳雪珍奢小苍兰精油香氛沐浴露1100ml简单易上手吗?功能评测介绍...

澳雪珍奢小苍兰精油香氛沐浴露1100ml评测值得买吗?这就是评测结...

秋田满满婴幼儿米粉益生菌高铁罐装米糊入手怎么样?使用情况报告...

OLD ORDEROG SNEAKER SKATER 001入手怎么样?全方位评测分享!

OLD ORDEROG SNEAKER SKATER 001评测值得买吗?深度爆料评测分享...

胜莱特多层落地家用置物架实用性高,购买推荐吗?测评大揭秘!