![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构和算法之美
文章平均质量分 91
数据结构和算法之美
浊酒南街
纵使疾风起,人生不言弃。
展开
-
数据结构与算法之美学习笔记:《数据结构与算法之美》学习指导手册
本节课程思维导图:在设计专栏内容的时候,为了兼顾不同基础的同学,我在内容上做到了难易结合,既有简单的数组、链表、栈、队列这些基础内容,也有红黑树、BM、KMP 这些难度较大的算法。但是,对于初学者来说,一下子面对这么多知识,可能还是比较懵。我觉得,对于初学者来说,先把最简单、最基础、最重要的知识点掌握好,再去研究难度较高、更加高级的知识点,这样由易到难、循序渐进的学习路径,无疑是最合理的。基于这个路径,我对专栏内容,重新做了一次梳理,希望给你一份具体、明确、有效的学习指导。原创 2024-03-26 11:38:50 · 947 阅读 · 0 评论 -
数据结构与算法之美学习笔记:不定期福利第三期 | 刘超:我是怎么学习《数据结构与算法之美》的?
本节课程思维导图:你好,我是刘超,是隔壁《趣谈网络协议》专栏的作者。今天来“串个门儿”,讲讲我学习《数据结构与算法之美》这个专栏的一些体会和感受。《数据结构与算法之美》是目前“极客时间”订阅量最多的专栏,我也是其中最早购买的一员。我之所以一看就心动了,源于王争老师在开篇词里面说的那段话:基础知识就像是一座大楼的地基,它决定了我们的技术高度。那技术人究竟都需要修炼哪些“内功”呢?我觉得,无外乎就是大学里的那些基础课程,操作系统、计算机网络、编译原理等等,当然还有数据结构和算法。原创 2024-03-14 10:54:24 · 923 阅读 · 0 评论 -
数据结构与算法之美学习笔记:不定期福利第二期 | 王争:羁绊前行的,不是肆虐的狂风,而是内心的迷茫
本节课程思维导图:专栏更新过半,我发现有些小伙伴已经掉队,虽然有人掉队也挺正常,但是我还是想尽量拉一把。于是,周末的时间,我就在想,究竟是什么原因让有些小伙伴掉队了?是内容本身太难了吗?是我讲得不够清楚吗?还是小伙伴本身基础太差、不够努力、没有掌握学习方法?我觉得都不是,让你掉队的原因,从根儿上讲,是你内心的迷茫。如果我们不那么确信能不能看懂、能不能学会的时候,当面对困难的时候,很容易就会否定自己,也就很容易半途而废。原创 2024-03-11 17:19:05 · 942 阅读 · 0 评论 -
数据结构与算法之美学习笔记:不定期福利第一期 | 数据结构与算法学习书单
本节课程思维导图:欢迎来到不定期更新的周末福利时间。专栏已经上线两周了,看到这么多人在留言区写下自己的疑惑或者观点,我特别开心。在留言里,很多同学让我推荐一些学习数据结构与算法的书籍。因此我特意跟编辑商量了,给你一个周末福利。所以这一期呢,我们就来聊一聊数据结构和算法学习过程中有哪些必读书籍。有的同学还在读大学,代码还没写过几行;有的同学已经工作数十年,这之间的差别还是挺大的。而不同基础的人,适宜看的书是完全不一样的。因此,针对不同层次、不同语言的同学,我分别推荐了不同的书。原创 2024-03-07 11:46:00 · 986 阅读 · 0 评论 -
数据结构与算法之美学习笔记:总结课 | 在实际开发中,如何权衡选择使用哪种数据结构和算法?
本节课程思维导图:今天是一篇总结课。我们学了这么多数据结构和算法,在实际开发中,究竟该如何权衡选择使用哪种数据结构和算法呢?今天我们就来聊一聊这个问题,希望能帮你把学习带回实践中。我一直强调,学习数据结构和算法,不要停留在学院派的思维中,只把算法当作应付面试、考试或者竞赛的花拳绣腿。作为软件开发工程师,我们要把数据结构和算法,应用到软件开发中,解决实际的开发问题。不过,要想在实际的开发中,灵活、恰到好处地应用数据结构和算法,需要非常深厚的实战经验积累。原创 2024-03-22 16:44:10 · 800 阅读 · 0 评论 -
数据结构与算法之美学习笔记:56 | 算法实战(五):如何用学过的数据结构和算法实现一个短网址系统?
本节课程思维导图:短网址服务你用过吗?如果我们在微博里发布一条带网址的信息,微博会把里面的网址转化成一个更短的网址。我们只要访问这个短网址,就相当于访问原始的网址。比如下面这两个网址,尽管长度不同,但是都可以跳转到我的一个 GitHub 开源项目里。其中,第二个网址就是通过新浪提供的短网址服务生成的。原始网址:https://github.com/wangzheng0822/ratelimiter4j短网址:http://t.cn/EtR9QEG。原创 2024-03-01 14:46:00 · 1007 阅读 · 0 评论 -
数据结构与算法之美学习笔记:55 | 算法实战(四):剖析微服务接口鉴权限流背后的数据结构和算法
本节课程思维导图:微服务是最近几年才兴起的概念。简单点讲,就是把复杂的大应用,解耦拆分成几个小的应用。这样做的好处有很多。比如,这样有利于团队组织架构的拆分,毕竟团队越大协作的难度越大;再比如,每个应用都可以独立运维,独立扩容,独立上线,各个应用之间互不影响。不用像原来那样,一个小功能上线,整个大应用都要重新发布。不过,有利就有弊。大应用拆分成微服务之后,服务之间的调用关系变得更复杂,平台的整体复杂熵升高,出错的概率、debug 问题的难度都高了好几个数量级。原创 2024-02-29 17:45:12 · 1214 阅读 · 0 评论 -
数据结构与算法之美学习笔记:54 | 算法实战(三):剖析高性能队列Disruptor背后的数据结构和算法
本节课程思维导图:Disruptor 你是否听说过呢?它是一种内存消息队列。从功能上讲,它其实有点儿类似 Kafka。不过,和 Kafka 不同的是,Disruptor 是线程之间用于消息传递的队列。它在 Apache Storm、Camel、Log4j 2 等很多知名项目中都有广泛应用。之所以如此受青睐,主要还是因为它的性能表现非常优秀。它比 Java 中另外一个非常常用的内存消息队列 ArrayBlockingQueue(ABS)的性能,要高一个数量级,可以算得上是最快的内存消息队列了。原创 2024-02-27 19:10:15 · 1048 阅读 · 0 评论 -
数据结构与算法之美学习笔记:53 | 算法实战(二):剖析搜索引擎背后的经典数据结构和算法
本节课程思维导图:像百度、Google 这样的搜索引擎,在我们平时的工作、生活中,几乎天天都会用到。如果我们把搜索引擎也当作一个互联网产品的话,那它跟社交、电商这些类型的产品相比,有一个非常大的区别,那就是,它是一个技术驱动的产品。所谓技术驱动是指,搜索引擎实现起来,技术难度非常大,技术的好坏直接决定了这个产品的核心竞争力。在搜索引擎的设计与实现中,会用到大量的算法。有很多针对特定问题的算法,也有很多我们专栏中讲到的基础算法。原创 2024-02-22 18:53:14 · 1018 阅读 · 0 评论 -
数据结构与算法之美学习笔记:52 | 算法实战(一):剖析Redis常用数据类型对应的数据结构
本节课程思维导图:到此为止,专栏前三部分我们全部讲完了。从今天开始,我们就正式进入实战篇的部分。这部分我主要通过一些开源项目、经典系统,真枪实弹地教你,如何将数据结构和算法应用到项目中。所以这部分的内容,更多的是知识点的回顾,相对于基础篇、高级篇的内容,其实这部分会更加容易看懂。不过,我希望你不要只是看懂就完了。你要多举一反三地思考,自己接触过的开源项目、基础框架、中间件中,都用过哪些数据结构和算法。你也可以想一想,在自己做的项目中,有哪些可以用学过的数据结构和算法进一步优化。原创 2024-02-18 16:12:41 · 1027 阅读 · 0 评论 -
数据结构与算法之美学习笔记:51 | 并行算法:如何利用并行处理提高算法的执行效率?
本节课程思维导图:时间复杂度是衡量算法执行效率的一种标准。但是,时间复杂度并不能跟性能划等号。在真实的软件开发中,即便在不降低时间复杂度的情况下,也可以通过一些优化手段,提升代码的执行效率。毕竟,对于实际的软件开发来说,即便是像 10%、20% 这样微小的性能提升,也是非常可观的。算法的目的就是为了提高代码执行的效率。那当算法无法再继续优化的情况下,我们该如何来进一步提高执行效率呢?我们今天就讲一种非常简单但又非常好用的优化方法,那就是并行计算。原创 2024-02-07 10:30:00 · 1330 阅读 · 0 评论 -
数据结构与算法之美学习笔记:50 | 索引:如何在海量数据中快速查找某个数据?
本节课程思维导图:在第 48 节中,我们讲了 MySQL 数据库索引的实现原理。MySQL 底层依赖的是 B+ 树这种数据结构。留言里有同学问我,那类似 Redis 这样的 Key-Value 数据库中的索引,又是怎么实现的呢?底层依赖的又是什么数据结构呢?今天,我就来讲一下索引这种常用的技术解决思路,底层往往会依赖哪些数据结构。同时,通过索引这个应用场景,我也带你回顾一下,之前我们学过的几种支持动态集合的数据结构。索引的概念不难理解,我想你应该已经搞明白。原创 2024-02-06 10:41:24 · 957 阅读 · 0 评论 -
数据结构与算法之美学习笔记:49 | 搜索:如何用A*搜索算法实现游戏中的寻路功能?
我们今天讲的 A* 算法属于一种启发式搜索算法(Heuristically Search Algorithm)。实际上,启发式搜索算法并不仅仅只有 A* 算法,还有很多其他算法,比如 IDA* 算法、蚁群算法、遗传算法、模拟退火算法等。如果感兴趣,你可以自行研究下。启发式搜索算法利用估价函数,避免“跑偏”,贪心地朝着最有可能到达终点的方向前进。这种算法找出的路线,并不是最短路线。但是,实际的软件开发中的路线规划问题,我们往往并不需要非得找最短路线。原创 2024-02-02 09:50:47 · 1201 阅读 · 0 评论 -
数据结构与算法之美学习笔记:48 | B+树:MySQL数据库索引是如何实现的?
本节课程思维导图:作为一个软件开发工程师,你对数据库肯定再熟悉不过了。作为主流的数据存储系统,它在我们的业务开发中,有着举足轻重的地位。在工作中,为了加速数据库中数据的查找速度,我们常用的处理思路是,对表中数据创建索引。那你是否思考过,数据库索引是如何实现的呢?底层使用的是什么数据结构和算法呢?今天,我们讲解了数据库索引实现,依赖的底层数据结构,B+ 树。它通过存储在磁盘的多叉树结构,做到了时间、空间的平衡,既保证了执行效率,又节省了内存。原创 2024-01-15 14:52:07 · 1208 阅读 · 0 评论 -
数据结构与算法之美学习笔记:47 | 向量空间:如何实现一个简单的音乐推荐系统?
本节课程思维导图:很多人都喜爱听歌,以前我们用 MP3 听歌,现在直接通过音乐 App 在线就能听歌。而且,各种音乐 App 的功能越来越强大,不仅可以自己选歌听,还可以根据你听歌的口味偏好,给你推荐可能会喜爱的音乐,而且有时候,推荐的音乐还非常适合你的口味,甚至会惊艳到你!如此智能的一个功能,你知道它是怎么实现的吗?实际上,这个问题是推荐系统(Recommendation System)里最典型的一类问题。原创 2024-01-12 11:22:16 · 1148 阅读 · 0 评论 -
数据结构与算法之美学习笔记:46 | 概率统计:如何利用朴素贝叶斯算法过滤垃圾短信?
本节课程思维导图:上一节我们讲到,如何用位图、布隆过滤器,来过滤重复的数据。今天,我们再讲一个跟过滤相关的问题,如何过滤垃圾短信?垃圾短信和骚扰电话,我想每个人都收到过吧?买房、贷款、投资理财、开发票,各种垃圾短信和骚扰电话,不胜其扰。如果你是一名手机应用开发工程师,让你实现一个简单的垃圾短信过滤功能以及骚扰电话拦截功能,该用什么样的数据结构和算法实现呢?原创 2024-01-10 17:49:02 · 1023 阅读 · 0 评论 -
数据结构与算法之美学习笔记:45 | 位图:如何实现网页爬虫中的URL去重功能?
本节课程思维导图:网页爬虫是搜索引擎中的非常重要的系统,负责爬取几十亿、上百亿的网页。爬虫的工作原理是,通过解析已经爬取页面中的网页链接,然后再爬取这些链接对应的网页。而同一个网页链接有可能被包含在多个页面中,这就会导致爬虫在爬取的过程中,重复爬取相同的网页。如果你是一名负责爬虫的工程师,你会如何避免这些重复的爬取呢?最容易想到的方法就是,我们记录已经爬取的网页链接(也就是 URL),在爬取一个新的网页之前,我们拿它的链接,在已经爬取的网页链接列表中搜索。如果存在,那就说明这个网页已经被爬取过了;原创 2024-01-09 10:28:37 · 1616 阅读 · 3 评论 -
数据结构与算法之美学习笔记:44 | 最短路径:地图软件是如何计算出最优出行路径的?
本节课程思维导图:我们学习了图的两种搜索算法,深度优先搜索和广度优先搜索。这两种算法主要是针对无权图的搜索算法。针对有权图,也就是图中的每条边都有一个权重,我们该如何计算两点之间的最短路径(经过的边的权重和最小)呢?今天,我就从地图软件的路线规划问题讲起,带你看看常用的最短路径算法(Shortest Path Algorithm)。像 Google 地图、百度地图、高德地图这样的地图软件,我想你应该经常使用吧?如果想从家开车到公司,你只需要输入起始、结束地址,地图就会给你规划一条最优出行路线。原创 2024-01-04 17:17:21 · 1731 阅读 · 0 评论 -
数据结构与算法之美学习笔记:43 | 拓扑排序:如何确定代码源文件的编译依赖关系?
本节课程思维导图现在,我们就进入高级篇的第一节,如何确定代码源文件的编译依赖关系?我们知道,一个完整的项目往往会包含很多代码源文件。编译器在编译整个项目的时候,需要按照依赖关系,依次编译每个源文件。比如,A.cpp 依赖 B.cpp,那在编译的时候,编译器需要先编译 B.cpp,才能编译 A.cpp。编译器通过分析源文件或者程序员事先写好的编译配置文件(比如 Makefile 文件),来获取这种局部的依赖关系。那编译器又该如何通过源文件两两之间的局部依赖关系,确定一个全局的编译顺序呢?原创 2024-01-03 15:13:09 · 1305 阅读 · 0 评论 -
数据结构与算法之美学习笔记:42 | 动态规划实战:如何实现搜索引擎中的拼写纠错功能?
本节课程思维导图:利用 Trie 树,可以实现搜索引擎的关键词提示功能,这样可以节省用户输入搜索关键词的时间。实际上,搜索引擎在用户体验方面的优化还有很多,比如你可能经常会用的拼写纠错功能。当你在搜索框中,一不小心输错单词时,搜索引擎会非常智能地检测出你的拼写错误,并且用对应的正确单词来进行搜索。作为一名软件开发工程师,你是否想过,这个功能是怎么实现的呢?原创 2023-12-29 14:46:48 · 1038 阅读 · 0 评论 -
数据结构与算法之美学习笔记:41 | 动态规划理论:一篇文章带你彻底搞懂最优子结构、无后效性和重复子问题
本节课程思维导图:今天,我主要讲动态规划的一些理论知识。学完这节内容,可以帮你解决这样几个问题:什么样的问题可以用动态规划解决?解决动态规划问题的一般思考过程是什么样的?贪心、分治、回溯、动态规划这四种算法思想又有什么区别和联系?我个人觉得,解决动态规划问题,一般有两种思路。我把它们分别叫作,状态转移表法和状态转移方程法。状态转移表法一般能用动态规划解决的问题,都可以使用回溯算法的暴力搜索解决。原创 2023-12-28 10:13:24 · 1494 阅读 · 0 评论 -
数据结构与算法之美学习笔记:40 | 初识动态规划:如何巧妙解决“双十一”购物时的凑单问题?
本节课程思维导图:淘宝的“双十一”购物节有各种促销活动,比如“满 200 元减 50 元”。假设你女朋友的购物车中有 n 个(n>100)想买的商品,她希望从里面选几个,在凑够满减条件的前提下,让选出来的商品价格总和最大程度地接近满减条件(200 元),这样就可以极大限度地“薅羊毛”。作为程序员的你,能不能编个代码来帮她搞定呢?这就要用到我们今天讲的动态规划(Dynamic Programming)。原创 2023-12-26 17:47:14 · 1068 阅读 · 0 评论 -
数据结构与算法之美学习笔记:39 | 回溯算法:从电影《蝴蝶效应》中学习回溯算法的核心思想
本节课程思维导图:我们在前面深度优先搜索算法利用的是回溯算法思想。这个算法思想非常简单,但是应用却非常广泛。它除了用来指导像深度优先搜索这种经典的算法设计之外,还可以用在很多实际的软件开发场景中,比如正则表达式匹配、编译原理中的语法分析等。除此之外,很多经典的数学问题都可以用回溯算法解决,比如数独、八皇后、0-1 背包、图的着色、旅行商问题、全排列等等。既然应用如此广泛,我们今天就来学习一下这个算法思想,看看它是如何指导我们解决问题的。原创 2023-12-21 20:07:37 · 841 阅读 · 0 评论 -
数据结构与算法之美学习笔记:38 | 分治算法:谈一谈大规模计算框架MapReduce中的分治思想
本节课程思维导图:MapReduce 是 Google 大数据处理的三驾马车之一,另外两个是 GFS(hdfs) 和 Bigtable(hbase)。它在倒排索引、PageRank 计算、网页分析等搜索引擎相关的技术中都有大量的应用。MapReduce 的本质就是我们今天要学的这种算法思想,分治算法。原创 2023-12-20 19:25:04 · 1289 阅读 · 0 评论 -
数据结构与算法之美学习笔记:37 | 贪心算法:如何用贪心算法实现Huffman压缩编码?
本节课程思维导图:接下来几节,我会讲几种更加基本的算法。它们分别是贪心算法、分治算法、回溯算法、动态规划。更加确切地说,它们应该是算法思想,并不是具体的算法,常用来指导我们设计具体的算法和编码等。贪心、分治、回溯、动态规划这 4 个算法思想,原理解释起来都很简单,但是要真正掌握且灵活应用,并不是件容易的事情。今天,我们先来学习一下贪心算法(greedy algorithm)。原创 2023-12-19 17:23:32 · 1137 阅读 · 0 评论 -
数据结构与算法之美学习笔记:36 | AC自动机:如何用多模式串匹配实现敏感词过滤功能?
本节课程思维导图:很多支持用户发表文本内容的网站,比如 BBS,大都会有敏感词过滤功能,用来过滤掉用户输入的一些淫秽、反动、谩骂等内容。你有没有想过,这个功能是怎么实现的呢?实际上,这些功能最基本的原理就是字符串匹配算法,也就是通过维护一个敏感词的字典,当用户输入一段文字内容之后,通过字符串匹配算法,来查找用户输入的这段文字,是否包含敏感词。如果有,就用“***”把它替代掉。那如何才能实现一个高性能的敏感词过滤系统呢?这就要用到今天的多模式串匹配算法。原创 2023-12-15 17:46:22 · 120 阅读 · 0 评论 -
数据结构与算法之美学习笔记:35 | Trie树:如何实现搜索引擎的搜索关键词提示功能?
本节课程思维导图:搜索引擎的搜索关键词提示功能,我想你应该不陌生吧?为了方便快速输入,当你在搜索引擎的搜索框中,输入要搜索的文字的某一部分的时候,搜索引擎就会自动弹出下拉框,里面是各种关键词提示。你是否思考过,它是怎么实现的呢?它底层使用的是哪种数据结构和算法呢?其底层最基本的原理就是今天要讲的这种数据结构:Trie 树。Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。Trie 树到底长什么样子?原创 2023-12-14 11:42:16 · 946 阅读 · 0 评论 -
数据结构与算法之美学习笔记:34 | 字符串匹配基础(下):如何借助BM算法轻松理解KMP算法?
本节课程思维导图:BM 算法,是工程中非常常用的一种高效字符串匹配算法。不过,在所有的字符串匹配算法里,要说最知名的一种的话,那就非 KMP 算法莫属。很多时候,提到字符串匹配,我们首先想到的就是 KMP 算法。实际上,KMP 算法跟 BM 算法的本质是一样的。上一节,我们讲了好后缀和坏字符规则,今天,我们就看下,如何借助上一节 BM 算法的讲解思路,让你能更好地理解 KMP 算法?原创 2023-12-11 17:00:47 · 109 阅读 · 0 评论 -
数据结构与算法之美学习笔记:33 | 字符串匹配基础(中):如何实现文本编辑器中的查找功能?
本节课程思维导图:文本编辑器中的查找替换功能,我想你应该不陌生吧?比如,我们在 Word 中把一个单词统一替换成另一个,用的就是这个功能。你有没有想过,它是怎么实现的呢?对于查找功能是重要功能的软件来说,比如一些文本编辑器,它们的查找功能都是用哪种算法来实现的呢?有没有比 BF 算法和 RK 算法更加高效的字符串匹配算法呢?今天,我们就来学习 BM(Boyer-Moore)算法。它是一种非常高效的字符串匹配算法。原创 2023-12-08 17:46:50 · 201 阅读 · 0 评论 -
数据结构与算法之美学习笔记:32 | 字符串匹配基础(上):如何借助哈希算法实现高效字符串匹配?
本节课程思维导图:从今天开始,我们来学习字符串匹配算法。我们用的最多的比如 Java 中的 indexOf(),Python 中的 find() 函数等,它们底层就是依赖接下来要讲的字符串匹配算法。今天讲的两个算法,它们分别是:BF 算法和 RK 算法。其中RK 算法是 BF 算法的改进,它巧妙借助了我们前面讲过的哈希算法,让匹配的效率有了很大的提升。那RK 算法是如何借助哈希算法来实现高效字符串匹配的呢?原创 2023-12-06 19:39:59 · 679 阅读 · 0 评论 -
数据结构与算法之美学习笔记:31 | 深度和广度优先搜索:如何找出社交网络中的三度好友关系?
本节课程思维导图:社交网络中,有一个六度分割理论,具体是说,你与世界上的另一个人间隔的关系不会超过六度,也就是说平均只需要六步就可以联系到任何两个互不相识的人。一个用户的一度连接用户很好理解,就是他的好友,二度连接用户就是他好友的好友,三度连接用户就是他好友的好友的好友。在社交网络中,我们往往通过用户之间的连接关系,来实现推荐“可能认识的人”这么一个功能。今天的开篇问题就是,给你一个用户,如何找出这个用户的所有三度(其中包含一度、二度和三度)好友关系?原创 2023-12-05 16:25:33 · 234 阅读 · 0 评论 -
数据结构与算法之美学习笔记:30 | 图的表示:如何存储微博、微信等社交网络中的好友关系?
本节课程思维导图:微博、微信这些社交软件我想你肯定都玩过吧。在微博中,两个人可以互相关注;在微信中,两个人可以互加好友。那你知道,如何存储微博、微信等这些社交网络的好友关系吗?原创 2023-12-04 19:18:00 · 169 阅读 · 0 评论 -
数据结构与算法之美学习笔记:29 | 堆的应用:如何快速获取到Top 10最热门的搜索关键词?
本节课程思维导图:搜索引擎的热门搜索排行榜功能你用过吗?搜索引擎每天会接收大量的用户搜索请求,它会把这些用户输入的搜索关键词记录下来,然后再离线地统计分析,得到最热门的 Top 10 搜索关键词。那请你思考下,假设现在我们有一个包含 10 亿个搜索关键词的日志文件,如何能快速获取到热门榜 Top 10 的搜索关键词呢?这个问题就可以用堆来解决,今天我们就来讲一讲,堆这种数据结构几个非常重要的应用:优先级队列、求 Top K 和求中位数。原创 2023-12-01 10:45:23 · 343 阅读 · 0 评论 -
数据结构与算法之美学习笔记:28 | 堆和堆排序:为什么说堆排序没有快速排序快?
本节课程思维导图:我们今天讲另外一种特殊的树,“堆”(Heap)。堆这种数据结构的应用场景非常多,最经典的莫过于堆排序了。堆排序是一种原地的、时间复杂度为 O(nlogn) 的排序算法。快速排序和堆排序这两种排序算法的时间复杂度都是 O(nlogn),甚至堆排序比快速排序的时间复杂度还要稳定,但是,在实际的软件开发中,快速排序的性能要比堆排序好,这是为什么呢?原创 2023-11-29 16:47:12 · 176 阅读 · 0 评论 -
数据结构与算法之美学习笔记:27 | 递归树:如何借助树来求解递归算法的时间复杂度?
本节课程思维导图:今天,我们来讲这种数据结构的一种特殊应用,递归树。我们都知道,递归代码的时间复杂度分析起来很麻烦。除了用递推公式这种比较复杂的分析方法,有没有更简单的方法呢?今天,我们就来学习另外一种方法,借助递归树来分析递归算法的时间复杂度。原创 2023-11-28 20:18:23 · 494 阅读 · 0 评论 -
数据结构与算法之美学习笔记:26 | 红黑树(下):掌握这些技巧,你也可以实现一个红黑树
本节课程思维导图:红黑树是一个让我又爱又恨的数据结构,“爱”是因为它稳定、高效的性能,“恨”是因为实现起来实在太难了。对于绝大部分开发工程师来说,这辈子你可能都用不着亲手写一个红黑树,所以没必要去死磕它。上一节,我们讲到红黑树定义的时候,提到红黑树的叶子节点都是黑色的空节点。当时我只是粗略地解释了,这是为了代码实现方便,那更加确切的原因是什么呢?原创 2023-11-27 19:46:43 · 44 阅读 · 0 评论 -
数据结构与算法之美学习笔记:25 | 红黑树(上):为什么工程中都用红黑树这种二叉树?
本节课程思维导图:二叉查找树是最常用的一种二叉树,它支持快速插入、删除、查找操作,各个操作的时间复杂度跟树的高度成正比,理想情况下,时间复杂度是 O(logn)。不过,二叉查找树在频繁的动态更新过程中,可能会出现树的高度远大于 log2n 的情况,从而导致各个操作的效率下降。极端情况下,二叉树会退化为链表,时间复杂度会退化到 O(n)。我们需要设计一种平衡二叉查找树。很多书籍里,但凡讲到平衡二叉查找树,就会拿红黑树作为例子。原创 2023-11-24 11:26:21 · 68 阅读 · 0 评论 -
数据结构与算法之美学习笔记:24 | 二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树?
本节课程思维导图:二叉查找树最大的特点就是,支持动态数据集合的快速插入、删除、查找操作。我们之前说过,散列表也是支持这些操作的,并且散列表的这些操作比二叉查找树更高效,时间复杂度是 O(1)。既然有了这么高效的散列表,使用二叉树的地方是不是都可以替换成散列表呢?有没有哪些地方是散列表做不了,必须要用二叉树来做的呢?原创 2023-11-21 16:48:37 · 193 阅读 · 0 评论 -
数据结构与算法之美学习笔记:23 | 二叉树基础(上):什么样的二叉树适合用数组来存储?
本节课程思维导图:前面我们讲的都是线性表结构,栈、队列、链表等等。今天我们讲一种非线性表结构,树。问题:二叉树有哪几种存储方式?什么样的二叉树适合用数组来存储?原创 2023-11-20 17:25:28 · 246 阅读 · 0 评论 -
数据结构与算法之美学习笔记:22 | 哈希算法(下):哈希算法在分布式系统中有哪些应用?
本节课程思维导图今天,我们再来看剩余三种应用:负载均衡、数据分片、分布式存储。你可能已经发现,这三个应用都跟分布式系统有关。没错,今天我就带你看下,哈希算法是如何解决这些分布式问题的。原创 2023-11-19 18:55:28 · 180 阅读 · 0 评论