- 博客(299)
- 资源 (12)
- 收藏
- 关注
原创 数据库参数设置优化
我们一般可以将MySQL的结构分为四层,最上层为客户端连接器,主要包括了数据库连接、授权认证、安全管理等,该层引用了线程池,为接入的连接请求提高线程处理效率。第二层是Server层,主要实现SQL的一些基础功能,包括SQL解析、优化、执行以及等。第三层包括了各种存储引擎,主要负责数据的存取,这一层涉及到的。最下面一层是数据存储层,主要负责将数据存储在文件系统中,并完成与存储引擎的交互。
2025-01-14 13:50:41
712
原创 学习-电商系统表设计优化案例分析
这一讲,我们结合电商系统实战练习了如何进行表设计,可以总结为以下几个要点:● 在字段比较复杂、易变动、不方便统一的情况下,建议使用键值对来代替关系数据库表存储;● 在高并发情况下的查询操作,可以使用缓存代替数据库操作,提高并发性能;● 数据量叠加比较快的表,需要考虑水平分表或分库,避免单表操作的性能瓶颈;● 除此之外,我们应该通过一些优化,尽量避免比较复杂的JOIN查询操作,例如冗余一些字段,减少JOIN查询;创建一些中间表,减少JOIN查询。
2024-12-23 11:32:34
638
原创 Java性能调优 - JVM性能监测及调优
堆是JVM内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Survivor和To Survivor组成。在Java6版本中,永久代在非堆内存区;到了Java7版本,永久代的静态变量和运行时常量池被合并到了堆中;而到了Java8,永久代被元空间取代了。
2024-12-17 13:57:07
1262
原创 Java性能调优 - 多线程性能调优
在读大于写的场景下,读写锁RRW的性能最佳。在写大于读的场景下,乐观锁的性能是最好的,剩下的读写锁RRW的性能则相差不多;在读和写差不多的场景下,读写锁RRW以及乐观锁的性能要优于和。严格一致性(强一致性):所有的读写操作都按照全局时钟下的顺序执行,且任何时刻线程读取到的缓存数据都是一样的,Hashtable就是严格一致性;顺序一致性。
2024-12-13 18:01:17
785
原创 Java性能调优 - 编码优化
因为常量池的实现是类似于一个HashTable的实现方式,HashTable存储的数据越大,遍历的时间复杂度就会增加。我们在平时处理大数据的集合时,应该尽量考虑将应用部署在多核CPU环境下,并且使用Stream的并行迭代方式进行处理。方法使用了正则表达式,而正则表达式的性能是非常不稳定的,使用不恰当会引起回溯问题,很可能导致CPU居高不下。,可以使重复性非常高的字符串(例如地址信息存储),重复使用常量池中相同值的对象,进而节约内存。会让堆中的字符串先存在字符串常量池,再让引用指向同一个常量池的地址。
2024-12-13 17:59:40
613
原创 记一次使用GenericObjectPool的体验,避免自己重复造轮子
是 Apache Commons Pool 库中的一个类,它提供了一个通用的对象池的实现,主要用于复用昂贵或稀缺资源,通过维护一组已创建的对象实例来减少创建和销毁对象的开销,从而提高系统性能。GenericObjectPool 允许用户配置和管理一个对象池,包括设置池的最大和最小对象数量、空闲对象过期时间、borrow(获取)和return(归还)对象时的行为策略等。这个类是高度可配置和灵活的,可以适用于多种不同类型的对象和使用场景。对象回收与复用。
2024-07-26 15:01:58
1341
原创 数据结构与算法笔记:实战篇 - 如何用学过的数据结构和算法来实现一个短网址系统?
刚刚讲了,短网址服务的一个核心功能,就是把原始的长网址转化成短网址。除了这个功能之外,短网址服务还有另外一个必不可少的功能。那就是,当用户点击短网址的时候,短网址服务就会将浏览器重定向为原始网址。这个过程是如何实现的呢?为了方便你理解,我画了一张图。从图中可以看出,浏览器会先访问短网址服务,通过短网址获取到原始网址,在通过原始网址访问到页面。不过这部分功能并不是本章要将的重点。我们重点来看,如何将长网址转化成短网址?本章,讲了短网址服务的两种实现方法。第一种实现思路是通过哈希算法生成短网址。
2024-07-04 10:48:10
837
原创 数据结构与算法笔记:实战篇 - 剖析微服务接口鉴权限流背后的数据结构和算法
以防你之前可能对微服务不了解,所以我对鉴权的背景做了简化。假设我们有一个微服务叫用户服务(User Service)。它提供很多用户相关的接口,比如获取用户信息、注册、登录等等,给公司内部的其他应用使用。但是,并不是公司内部所有应用,都可以访问这个用户服务,也并不是每个有权限访问的应用,都可以访问用户的所有接口。给你举个例子。下图只有 A、B、C、D 四个应用可以访问用户服务,并且,每个应用只能访问用户服务的部分接口。要求实现鉴权功能,我们需要事先将应用对接口的访问权限规则设置好。
2024-07-03 21:44:03
1080
原创 数据结构与算法笔记:实战篇 - 剖析高性能队列 Disruptor 背后的数据结构和算法
本章,讲解了如何实现一个高性能的并发队列。这里的 “并发”,实际上就是多线程安全的意思。场景的内存队列往往采用循环队列来实现。这种实现方法,对于只有一个生产者和一个消费者的场景,已经足够了。但是,当存在多个生产者和多个消费者时,单纯的循环队列的实现方式,就无法正确工作了。主要是因为,多个生产者同时往队列中写入数据时,在某些情况下,会存在数据覆盖的问题。而多个消费者同时消费数据,在某些情况下,会存在消费重复的问题。针对这个问题,最简单、最暴力的解决方法就是,对写入和读取过程加锁。
2024-07-02 23:03:27
761
原创 数据结构与算法笔记:实战篇 - 剖析搜索引擎背后的经典数据结构和算法
像 Google 这样的大型商用搜索引擎,有成千上万的工程师,十年如一日地对它进行优化改进,所以,它所包含的技术细节非常多。很难通过一篇文章讲所有的细节都给讲清楚。所以接下来的讲解,主要给你展示,如何在一台机器上(假设这台机器的内存是 8GB,应用是 100 多 GB),通过少量的代码,实现一个小型搜索引擎。不过,麻雀虽小,五脏俱全。跟大型搜索引擎相比,实现这样一个小的搜索引擎的理论基础是相通的。搜集分析索引查询。其中,搜集,就是我们常说的爬虫爬取网页。
2024-07-02 09:54:48
789
原创 数据结构与算法笔记:实战篇 - 剖析Redis常用数据类型对应的数据结构
Redis 是一种键值(key-value)数据库。相对于关系型数据库(比如 MySQL),Redis 也被叫作非关系型数据库。关于 Redis 数据库,本人也学习过Redis 核心技术教程,感兴趣的朋友可以去看下专栏。像 MySQL 这样的关系型数据库,表的结构比较复杂,会包含很多字段,可以通过 SQL 语句,来实现非常复杂的查询需求。而 Redis 中只包含 “键” 和 “值” 两部分,只能通过 “键” 来查询值。真实因为这样简单的存储结构,也让 Redis 的读写效率非常高。
2024-06-30 15:06:35
867
原创 数据结构与算法笔记:高级篇 - 并行算法:如何利用并行处理提高算法的执行效率?
上篇文章,我们通过实际软件开发中的 “索引” 这一技术点,回顾了之前学过的一些支持动态数据集合的数据结构。本章,又通过 “并行算法” 这个话题,回顾了之前学过的一些算法。本章的内容比较简单,没有太复杂的知识点。我通过一些例子,比如并行排序、查找、搜索、字符串匹配,给你展示了并行处理的实现思路,也就是对数据进行分片,对没有依赖关系的任务,并行地执行。并行计算是一个工程上的实现思路,尽管跟算法的关系不大,但是,在实际的软件开发中,它确实可以非常巧妙地提高程序的运行效率,是一种非常好的性能优化手段。
2024-06-29 11:49:02
1357
原创 数据结构与算法笔记:高级篇 - 索引:如何在海量数据中快速查找某个数据?
索引的概念不难理解,我想你应该已经搞明白。接下来,我们就分析一下,在设计索引的过程中,需要考虑到的一些因素,换句话说,我们该如何定义清楚需求呢?对于系统设计需求,我们一般可以从功能性需求和非功能性需求两方面来分析。因此,这个问题也不例外。本章是一个总结课。从索引这个非常常用的技术方案,给你展示了散列表、红黑树、跳表、B+ 树、位图、布隆过滤器、有序数组这些数据结构的应用场景。学习完这篇文章后,不知道你对数据结构以及索引,有没有更加清晰的认识呢?
2024-06-28 18:27:46
1265
原创 数据结构与算法笔记:高级篇 - 搜索:如何用 A* 搜索算法实现游戏中的寻路功能?
本章讲的A* 算法属于一种启发式搜索算法实际上,启发式搜索算法并不仅仅只有A* 算法,还有很多其他算法,比如 IDA* 算法、蚁群算法、遗传算法、模拟退火算法等。如果感兴趣,可以自行研究下。启发式搜索算法利用估价函数,避免 “跑偏”,贪心地朝着最有可能到达终点的方向前进。这种算法炸出的路线,并不是最短路线。但是,实际的软件开发中的路线规划问题,我们往往并不需要非得找最短距离。所以,鉴于启发式搜索算法能很好地平衡路线质量和执行效率,它在实际的软件开发中的应用更加广泛。实际上,最短路径章节。
2024-06-28 11:08:03
1915
原创 数据结构与算法笔记:高级篇 - B+树:MySql数据库索引是如何实现的?
如何定义清楚问题呢?除了对问题进行详细的调研,还有一个办法,那就是,通过对一些模糊的需求进行假设,来限定要解决的问题的范围。如果你对数据库的操作非常了解,针对我们现在这个问题,你就能把索引的需求定义得非常清楚。根据某个值查找数据,比如。根据区间来查找某些数据,比如。除了这些功能性需求之外,这种问题往往还会涉及一些非功能性需求,比如安全、性能、用户体验等等。限于本章要讨论的是数据结构和算法,对于非功能性需求,我们着重考虑性能方面的需求。性能方面的需求,我们主要考察时间和空间两方面,也就是。
2024-06-27 22:29:26
1282
原创 数据结构与算法笔记:高级篇 - 向量空间:如何实现一个简单的音乐推荐系统?
实际上,这个问题是推荐系统(Recomendation System)里最典型的一类问题。之所以讲这部分内容,主要还是给你展示,算法的强大之处,利用简单的向量空间的欧几里得距离,就能解决如此复杂的问题。不过,本章只讲解了基础理论,实践中遇到的问题还有很多,比如冷启动问题,产品初期积累的数据不多,不足以做推荐等等。这些更加深奥的内容,你可以之后自己在实践中慢慢探索。
2024-06-27 10:01:52
1095
原创 数据结构与算法笔记:高级篇 - 概率统计:如何利用朴素贝叶斯算法过滤垃圾短信?
本章,讲解了基于黑名单、规则、概率统计三种垃圾短信的过滤方法,实际上,本章讲的这三种方法,还可以应用到很多类似过滤、拦截的领域,比如垃圾邮件的过滤等等。在讲黑名单过滤的时,我讲到 布隆过滤器可能会存在误判,可能会导致用户投诉。实际上,我们可以结合三种不同过滤方式的结果,对同一个短信处理,如果三种都标明这个短信是垃圾短信,我们才把它当做垃圾短信拦截过滤,这样就会更精准。当然,在实际的工程中,我们还需要结合具体的场景,以及大量的实验,不断去调整策略,权衡垃圾短信判定的准确率。
2024-06-26 19:13:10
1225
原创 数据结构与算法笔记:高级篇 - 位图:如何实现网页爬虫中的URL去重功能?
本章,关于搜索引擎爬虫网页去重问题的解决,我们从散列表讲到位图,再讲到布隆过滤器。布隆过滤器非常适合这种不需要 100% 准确、允许存在小概率误判的大规模判重场景。除了爬虫去重这个例子,还有比如统计一个大型网址每条的 UV 数,也就是每天有多少用户访问了网站,我们可以使用布隆过滤器,对重复访问的用户进行去重。前面讲到,布隆过滤器的误判率,主要跟哈希函数的个数、位图的大小有关。当我们往布隆过滤器中不停地加入数据之后,位图中不是 true 的位置就越来越少了,误判率就越来越高了。
2024-06-26 10:02:24
876
原创 数据结构与算法笔记:高级篇 - 最短路径:地图软件是如何计算出最优出行路径的?
本章,我们学习了一种非常重要的图算法,Dijkstra 最短路径算法。实际上,最短路径算法还有很多,比如 Bellford 算法、Floyd 算法等等。如果感兴趣,你可以自己去研究。关于 Dijkstra 算法,只讲了原理和代码实现。对于正确性,并没有去证明。之所以这么做是因为证明过程设计比较复杂度的数学推导。这个并不是我们的重点,你只要掌握这个算法的思路就可以了。这些算法实现思路非常经典,掌握了这些思路,我们可以拿来指导、解决其他问题。
2024-06-24 20:09:58
1185
原创 数据结构与算法笔记:高级篇 - 拓扑排序:如何确定代码源文件的编译依赖关系?
在基础篇中,关于 “图”,我们讲了图的定义和存储图的广度和深度优先搜索。本章,我们又讲了一个关于图的算法,拓扑排序。拓扑排序应用非常广泛,解决的问题的模型也非常一直。凡是需要通过局部顺序来推导全局顺序的,一般都能用拓扑排序来解决。此外,拓扑排序还能检测图中环的存在。对于 Kahn 算法来说,如果最后输出出来的顶点个数,少于图中顶点个数,图中还有入度不是 0 的顶点,那就说明,图中存在环。关于图中环的检测,我们在递归。
2024-06-22 11:22:12
944
原创 数据结构与算法笔记:基础篇 - 动态规划实战:如何实现搜索引擎中的拼写纠错功能?
在我们讲过,利用 Trie 树,可以实现搜索引擎的关键词提示功能,这样可以节省用户输入搜索关键词的时间。实际上,搜索引擎在用户体验方面的优化还有很多,比如你可能经常会用的拼写纠错功能。当你在搜索框中,一不小心输错时,搜索引擎会非常智能地检测出你的拼写错误,并且用对应地正确的单词来进行搜索。作为一名软件工程师,你是否想过,这个功能是怎么实现的?
2024-06-21 19:29:44
747
原创 数据结构与算法笔记:基础篇 - 动态规划理论
刚刚讲了,如何鉴别一个问题是否可以用动态规划来解决。现在,我再总结一下,动态规划解题的一般思路,让你面对动态规划问题时,能够有章可循,不至于束手无策。
2024-06-20 22:43:17
662
原创 数据结构与算法笔记:基础篇 - 初始动态规划:如何巧妙解决“双十一”购物时的凑单问题?
淘宝的 “双十一” 购物节有各种促销活动,比如 “满 200 元减 50元”。假设你女朋友购物车中有 n 个(n > 100)想买的商品,它希望从里面选几个,在凑够满减条件的前提下,让选出来的商品价格总和最长成都接近满减条件(200 元),这样就可以极大限度地 “薅羊毛”。作为程序员的你,能不能编个代码来帮她搞定?要想高效地解决这个问题,就要用到本章讲的动态规划(Dynamic Programming)。
2024-06-20 09:38:41
1170
原创 数据结构与算法笔记:基础篇 - 回溯算法:从电影《蝴蝶效应》中学习回溯算法的核心思想
我们在利用的是回溯算法思想。这个算法思想非常简单,但是应用却非常广泛。它除了用来指导像深度优先搜索这种经典的算法设计之外,还可以用在很多实际的软件开发场景中,比如正则表达式、编译原理中的语法分析等。此外,很多经典的数学问题都可以用回溯算法解决,比如数独、八皇后、0-1 背包、图的着色、旅行商问题、全排列等等。既然应用如此广泛,本章就来学习一下这个算法思想,看看它是如何指导我们解决问题的。
2024-06-19 21:05:40
645
原创 数据结构与算法笔记:基础篇 - 分治算法:谈一谈大规模计算框架MapReduce中的分治思想
MapReduce 是 Google 大数据处理的三姐马车之一,另外两个事 GFS 和 Bigtable。它在倒排索引、PageRank 计算、网页分析等搜索引擎相关的技术中都有大量的应用。尽管开发一个 MapReduce 看起来很高深。实际上,万变不离其宗,它的本质就是本章要学的这种算法思想,分支算法。
2024-06-19 12:06:19
871
原创 数据结构与算法笔记:基础篇 - 贪心算法:如何用贪心算法实现 Huffman压缩编码
基础的数据结构和算法基本上学完了,接下来几篇文章,会将更加基本的算法。它们分别是贪心算法、分治算法、回溯算法、动态规划。更加确切的说,它们应该是算法思想,并不是具体的算法,常用来指导我们设计具体的算法和编码等。贪心、分治、回溯、动态这 4 个算法思想,原理解释起来都很简单,但是要正确掌握且灵活应用,并不是一件容易得事情。所以,接下来的这 4 个算法思想的讲解,依旧不会长篇大论的去讲理论,而是结合具体的问题,让你自己感受这些算法时怎么工作的,是如何解决问题的,带你在问题中体会这些算法的本质。
2024-06-18 21:43:19
669
原创 数据结构与算法笔记:基础篇 -AC自动机:如何用多模式串匹配实现敏感词过滤功能?
很多支持用户发表文本内容的网站,比如 BBS,大都会有敏感词过滤功能,用来过滤掉用户输入的一些淫秽、反动、谩骂等内容。你有没有想过,这个功能是怎么实现的呢?实际上,这些功能最基本的原理就是字符串匹配算法,也就是通过维护一个敏感词字典,当用户输入一段文字内容之后,通过字符串匹配算法,来查找用户输入的这段文字,是否包含敏感词。如果有,就用 “***” 把它替换掉。我们讲过讲过好几种字符串匹配算法了,它们都可以处理这个问题。但是,对于访问量巨大的网站来说,比如淘宝,用户每天的评论数有几亿、甚至十几亿。
2024-06-18 12:51:06
857
原创 数据结构与算法笔记:基础篇 -Trie树:如何实现搜索引擎的搜索关键词提示功能?
Trie 树也叫 “字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。当然,这样一个问题可以有多种解决方法,比如散列表、红黑树,或者前面几篇文章讲到的一些字符串匹配算法,但是 Trie 树在这个问题的解决上,有它特有的优点。不仅如此,Trie 树能解决的问题也不限于此,一会再慢慢分析。现在,先来看下,Trie 树到底长什么样子。我举个简单的例子来说明下。
2024-06-17 22:22:24
1104
原创 数据结构与算法笔记:基础篇 -字符串匹配(下):如何借助BM算法轻松理解KMP算法?
讲了 BM 算法,尽管他复杂,也不好理解,但确实工程中非常好用的一种高效字符串匹配算法。有统计说,它是最搞笑、最常用的字符串匹配算法。不过,在所有的字符串匹配算法里,要说最知名的一种的话,那就非 KMP 算法莫属。很多时候,提到字符串匹配,我们首先想到的就是 KMP 算法。尽管在实际的开发中,我们几乎不大可能自己亲手实现一个 KMP 算法。但是,学习这个算法的思想,作为你开拓眼界、锻炼下思维逻辑,也是极好的,所以有必要拿出来讲一讲。不过 KMP 算法是出了名的不好懂。
2024-06-17 19:00:37
885
原创 数据结构与算法笔记:基础篇 -字符串匹配(中):BM算法 - 如何实现文本编辑器中的查找功能?
文本表及其中的查找替换功能,我像你应该不陌生吧?比如,我们在 Word 中把一个单词统一替换为另一个,用的就是这个功能。当然,你用上篇文章的 BF 算法和 RK 算法,也可以实现这个功能,但是在某些极端情况下,BF 算法性能会退化的比较严重,而 RK 算法需要利用到哈希算法,设计一个可以应对各种类型字符串的哈希算法并不简单。对于工业级的软件开发来说,我们希望算法尽可能的高效,并且在极端情况下,性能也不要退化的太严重。那么,本章来学习 BM(Boyer-Moore) 算法。
2024-06-16 22:21:08
936
原创 数据结构与算法笔记:基础篇 -字符串匹配(上):如何借助哈希算法实现高效字符串匹配?
从本章开始,我们开始学习字符串匹配算法。字符串匹配这样一个功能,我想对于任何一个开发人员来说,应该都不陌生。我们用的最多的就是编程语言中提供的字符串查找函数,比如 Java 中的indexOf()函数等,它们底层就是依赖下面要将的字符串匹配算法。字符串匹配算法很多,会分成好几篇篇文章来讲解。本章会将两种比较简单的、好理解的,它们分别是:BF 算法和 RK 算法。这两个算法中, RK 算法是 BF 算法的改进,它巧妙借助了前面讲过的哈希算法,让匹配效率有了很大的提升。那。
2024-06-15 11:47:16
1286
原创 数据结构与算法笔记:基础篇 -深度和广度优先搜索:如何查找出社交网络中的三度好友关系?
我们知道,算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于 “图” 这种数据结构的。这是因为,图这种数据结构的表达能力很强,大部分涉及搜索的场景都可以抽象成 “图”。图上的搜索算法,最直接的理解就是,在图中找出一个顶点出发,到另一个顶点的路径。具体方法有很多,比如今天要将的两种最简单、最 “暴力” 的深度优先、广度优先搜索,还有A*IDA*等启发式搜索算法。上篇文章讲过,图有两种主要存储方法,邻接表和邻接矩阵。本章我会用邻接表来存储图。这里先给出图的代码实现。
2024-06-14 23:31:44
1146
原创 数据结构与算法笔记:基础篇 -图的表示:如何存储微博、微信等社交网络中的好友关系?
微博、微信这些社交软件你肯定玩过吧。在微博中,两个人可以互相关注;在微信中,两个人可以互加好友。那你知道,。实际上,设计图的算法有很多,也非常复杂,比如图的搜索、最短路径、最小生成树、二分图等等。本章聚焦在图存储这一方面,后面会分好几个章节一次讲解图相关的算法。
2024-06-14 12:48:39
1072
原创 数据结构与算法笔记:基础篇 -堆的应用:如何快速获取到Top 10最热门的搜索关键词
搜索引擎的热门搜索排行榜的功能你用过吗?你知道这个功能是如何实现的吗?实际上,它的实现并不复杂。搜索引擎每天会接收大量的用户搜索请求,它会把这些用户输入的搜索关键词记录下来,然后再离线地统计分析,得到最热门的 Top 10 搜索关键词。那请你思考下,这个问题就可以用堆来解决,这也是堆这种数据结构一个非常典型的应用。我们讲了堆和堆排序的一些理论知识,本章我们就来讲讲,堆这种数据结构几个非常重要的应用:优先级队列、求 Top K和求中位数。
2024-06-13 22:51:40
644
原创 数据结构与算法笔记:基础篇 -堆和堆排序:为什么说堆排序没有快速排序快?
本章讲另外一种特殊的树,“堆” (Heap)。堆这种数据结构的应用场景非常多,最经典的莫过于堆排序了。堆排序是一种原地、时间复杂度为Onlogn的排序算法。前面学过快速排序,平均情况下,它的时间复杂度为Onlogn。尽管这两种排序算法的时间复杂度都是Onlogn,甚至堆排序比快速排序的时间复杂度还要稳定,但是,
2024-06-13 15:40:34
1046
原创 数据结构与算法笔记:基础篇 -递归树:如何借助树来求解递归算法的时间复杂度?
我们都知道,递归代码的时间复杂度分析起来很麻烦。在《》哪里讲过,如何用递推公式,求解归并排序、快速排序的时间复杂度,但是有些情况,比如快排的平均时间复杂度的分析,用递推公式的话,会设计非常复杂的数据推到。除了用递推公式这种比较复杂的分析方法,有没有更简单的方法呢?本章就来学习另外一种方法,
2024-06-12 12:28:46
1913
原创 数据结构与算法笔记:基础篇 - 红黑树(下):掌握这些技巧,你也可以实现一个红黑树
其实是为了实现方便。只要满足这一条要求,那在任何时刻,红黑树的平衡操作都可以归结为刚刚讲的几种情况。还是有点不理解,下面通过一个例子来解释下。假设红黑树的定义中不包含刚刚提到的那一条 “叶子节点必须是黑色的空节点”,我们往红黑树中插入一个数据,新插入节点的父节点也是红色,两个红色的节点相邻,这个时候,红黑树的定义就被破坏了。我们应该如何调整呢?你会发现,这个时候,我们前面在讲插入时,三种情况下平衡调整规则,没有一种是适用的。
2024-06-11 20:53:24
857
原创 数据结构与算法笔记:基础篇 - 红黑树(上):为什么工程中都用红黑树这种二叉树?
平衡二叉树的严格定义是这样的:二叉树中任意一个结点的左右子树的高度相差不能大于 1。从这个定义来看,上篇文章讲的完全二叉树、满二叉树其实都是平衡二叉树,但是非并完全二叉树也有可能是平衡二叉树。平衡二叉查找树不仅满足上面平衡二叉树的定义,还满足二叉查找树的特点。最先被发明的平衡二叉查找树是 AVL 树,它严格符合刚刚讲到的平衡二叉查找树的定义,即任何子节点的左右子树的高度相差不超过 1,是一种高度平衡的二叉查找树。但是很多平衡二叉查找树其实并没有严格符合上面的定义,所以,我感觉没必要去死抠定义。
2024-06-10 21:59:06
912
WSL(Windows Subsystem for Linux)更新程序
2024-01-30
网页版进销存2.0系统文件.zip
2021-06-15
Android天气预报app源码
2017-12-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人