自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(573)
  • 收藏
  • 关注

原创 集群分发脚本

【代码】集群分发脚本。

2024-12-24 23:02:12 137

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

刚刚我们讲了,短网址服务的一个核心功能,就是把原始的长网址转化成短网址。除了这个功能之外,短网址服务还有另外一个必不可少的功能。那就是,当用户点击短网址的时候,短网址服务会将浏览器重定向为原始网址。这个过程是如何实现的呢?为了方便你理解,我画了一张对比图,你可以看下。从图中我们可以看出,浏览器会先访问短网址服务,通过短网址获取到原始网址,再通过原始网址访问到页面。不过这部分功能并不是我们今天要讲的重点。我们重点来看,如何将长网址转化成短网址?今天,我们讲了短网址服务的两种实现方法。我现在来稍微总结一下。

2024-07-21 20:16:58 837

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

以防你之前可能对微服务没有太多了解,所以我对鉴权的背景做了简化。假设我们有一个微服务叫用户服务(User Service)。它提供很多用户相关的接口,比如获取用户信息、注册、登录等,给公司内部的其他应用使用。但是,并不是公司内部所有应用,都可以访问这个用户服务,也并不是每个有访问权限的应用,都可以访问用户服务的所有接口。我举了一个例子给你讲解一下,你可以看我画的这幅图。这里面,只有 A、B、C、D 四个应用可以访问用户服务,并且,每个应用只能访问用户服务的部分接口。

2024-07-21 20:16:22 929

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

今天,我讲了如何实现一个高性能的并发队列。这里的“并发”两个字,实际上就是多线程安全的意思。常见的内存队列往往采用循环队列来实现。这种实现方法,对于只有一个生产者和一个消费者的场景,已经足够了。但是,当存在多个生产者或者多个消费者的时候,单纯的循环队列的实现方式,就无法正确工作了。这主要是因为,多个生产者在同时往队列中写入数据的时候,在某些情况下,会存在数据覆盖的问题。而多个消费者同时消费数据,在某些情况下,会存在消费重复数据的问题。针对这个问题,最简单、暴力的解决方法就是,对写入和读取过程加锁。

2024-07-21 20:15:49 1024

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

像 Google 这样的大型商用搜索引擎,有成千上万的工程师,十年如一日地对它进行优化改进,所以,它所包含的技术细节非常多。我很难、也没有这个能力,通过一篇文章把所有细节都讲清楚,当然这也不是我们专栏所专注的内容。所以,接下来的讲解,我主要给你展示,如何在一台机器上(假设这台机器的内存是 8GB, 硬盘是 100 多 GB),通过少量的代码,实现一个小型搜索引擎。不过,麻雀虽小,五脏俱全。跟大型搜索引擎相比,实现这样一个小型搜索引擎所用到的理论基础是相通的。搜集分析索引查询。

2024-07-21 20:15:01 756

原创 数据结构与算法52丨算法实战(一):剖析Redis常用数据类型对应的数据结构

Redis 是一种键值(Key-Value)数据库。相对于关系型数据库(比如 MySQL),Redis 也被叫作非关系型数据库。像 MySQL 这样的关系型数据库,表的结构比较复杂,会包含很多字段,可以通过 SQL 语句,来实现非常复杂的查询需求。而 Redis 中只包含“键”和“值”两部分,只能通过“键”来查询“值”。正是因为这样简单的存储结构,也让 Redis 的读写效率非常高。除此之外,Redis 主要是作为内存数据库来使用,也就是说,数据是存储在内存中的。

2024-07-21 20:14:20 854

原创 数据结构与算法51丨并行算法:如何利用并行处理提高算法的执行效率?

上一节,我们通过实际软件开发中的“索引”这一技术点,回顾了之前学过的一些支持动态数据集合的数据结构。今天,我们又通过“并行算法”这个话题,回顾了之前学过的一些算法。今天的内容比较简单,没有太复杂的知识点。我通过一些例子,比如并行排序、查找、搜索、字符串匹配,给你展示了并行处理的实现思路,也就是对数据进行分片,对没有依赖关系的任务,并行地执行。并行计算是一个工程上的实现思路,尽管跟算法关系不大,但是,在实际的软件开发中,它确实可以非常巧妙地提高程序的运行效率,是一种非常好用的性能优化手段。

2024-07-21 20:13:40 313

原创 数据结构与算法50丨索引:如何在海量数据中快速查找某个数据?

索引的概念不难理解,我想你应该已经搞明白。接下来,我们就分析一下,在设计索引的过程中,需要考虑到的一些因素,换句话说就是,我们该如何定义清楚需求呢?对于系统设计需求,我们一般可以从功能性需求和非功能性需求两方面来分析,这个我们之前也说过。因此,这个问题也不例外。今天这节算是一节总结课。我从索引这个非常常用的技术方案,给你展示了散列表、红黑树、跳表、位图、布隆过滤器、有序数组这些数据结构的应用场景。学习完这节课之后,不知道你对这些数据结构以及索引,有没有更加清晰的认识呢?

2024-07-21 20:13:02 879

原创 数据结构与算法49丨搜索:如何用A搜索算法实现游戏中的寻路功能?

我们今天讲的 A* 算法属于一种启发式搜索算法实际上,启发式搜索算法并不仅仅只有 A* 算法,还有很多其他算法,比如 IDA* 算法、蚁群算法、遗传算法、模拟退火算法等。如果感兴趣,你可以自行研究下。启发式搜索算法利用估价函数,避免“跑偏”,贪心地朝着最有可能到达终点的方向前进。这种算法找出的路线,并不是最短路线。但是,实际的软件开发中的路线规划问题,我们往往并不需要非得找最短路线。所以,鉴于启发式搜索算法能很好地平衡路线质量和执行效率,它在实际的软件开发中的应用更加广泛。

2024-07-21 20:12:19 1462

原创 数据结构与算法48丨B+树:MySQL数据库索引是如何实现的?

如何定义清楚问题呢?除了对问题进行详细的调研,还有一个办法,那就是,通过对一些模糊的需求进行假设,来限定要解决的问题的范围。如果你对数据库的操作非常了解,针对我们现在这个问题,你就能把索引的需求定义得非常清楚。但是,对于大部分软件工程师来说,我们可能只了解一小部分常用的 SQL 语句,所以,这里我们假设要解决的问题,只包含这样两个常用的需求:根据某个值查找数据,比如 select * from user where id=1234;

2024-07-21 20:11:33 899

原创 数据结构与算法47丨向量空间:如何实现一个简单的音乐推荐系统?

很多人都喜爱听歌,以前我们用 MP3 听歌,现在直接通过音乐 App 在线就能听歌。而且,各种音乐 App 的功能越来越强大,不仅可以自己选歌听,还可以根据你听歌的口味偏好,给你推荐可能会喜爱的音乐,而且有时候,推荐的音乐还非常适合你的口味,甚至会惊艳到你!如此智能的一个功能,你知道它是怎么实现的吗?

2024-07-21 20:10:38 468

原创 数据结构与算法46丨概率统计:如何利用朴素贝叶斯算法过滤垃圾短信?

今天,我们讲了基于黑名单、规则、概率统计三种垃圾短信的过滤方法,实际上,今天讲的这三种方法,还可以应用到很多类似的过滤、拦截的领域,比如垃圾邮件的过滤等等。在讲黑名单过滤的时候,我讲到布隆过滤器可能会存在误判情况,可能会导致用户投诉。实际上,我们可以结合三种不同的过滤方式的结果,对同一个短信处理,如果三者都表明这个短信是垃圾短信,我们才把它当作垃圾短信拦截过滤,这样就会更精准。当然,在实际的工程中,我们还需要结合具体的场景,以及大量的实验,不断去调整策略,权衡垃圾短信判定的准确率。

2024-07-21 20:09:58 807

原创 数据结构与算法45丨位图:如何实现网页爬虫中的URL去重功能?

今天,关于搜索引擎爬虫网页去重问题的解决,我们从散列表讲到位图,再讲到布隆过滤器。布隆过滤器非常适合这种不需要 100% 准确的、允许存在小概率误判的大规模判重场景。除了爬虫网页去重这个例子,还有比如统计一个大型网站的每天的 UV 数,也就是每天有多少用户访问了网站,我们就可以使用布隆过滤器,对重复访问的用户,进行去重。我们前面讲到,布隆过滤器的误判率,主要跟哈希函数的个数、位图的大小有关。当我们往布隆过滤器中不停地加入数据之后,位图中不是 true 的位置就越来越少了,误判率就越来越高了。

2024-07-21 20:09:07 1182

原创 数据结构与算法44丨最短路径:地图软件是如何计算出最优出行路径的?

今天,我们学习了一种非常重要的图算法,Dijkstra 最短路径算法。实际上,最短路径算法还有很多,比如 Bellford 算法、Floyd 算法等等。如果感兴趣,你可以自己去研究。关于 Dijkstra 算法,我只讲了原理和代码实现。对于正确性,我没有去证明。之所以这么做,是因为证明过程会涉及比较复杂的数学推导。这个并不是我们的重点,你只要掌握这个算法的思路就可以了。这些算法实现思路非常经典,掌握了这些思路,我们可以拿来指导、解决其他问题。

2024-07-21 20:08:18 931

原创 数据结构与算法43丨拓扑排序:如何确定代码源文件的编译依赖关系?

在基础篇中,关于“图”,我们讲了图的定义和存储、图的广度和深度优先搜索。今天,我们又讲了一个关于图的算法,拓扑排序。拓扑排序应用非常广泛,解决的问题的模型也非常一致。凡是需要通过局部顺序来推导全局顺序的,一般都能用拓扑排序来解决。除此之外,拓扑排序还能检测图中环的存在。对于 Kahn 算法来说,如果最后输出出来的顶点个数,少于图中顶点个数,图中还有入度不是 0 的顶点,那就说明,图中存在环。关于图中环的检测,我们在递归。

2024-07-21 20:07:31 1014

原创 数据结构与算法42丨动态规划实战:如何实现搜索引擎中的拼写纠错功能?

在那节我们讲过,利用 Trie 树,可以实现搜索引擎的关键词提示功能,这样可以节省用户输入搜索关键词的时间。实际上,搜索引擎在用户体验方面的优化还有很多,比如你可能经常会用的拼写纠错功能。当你在搜索框中,一不小心输错单词时,搜索引擎会非常智能地检测出你的拼写错误,并且用对应的正确单词来进行搜索。作为一名软件开发工程师,你是否想过,这个功能是怎么实现的呢?

2024-07-21 20:05:58 734

原创 数据结构与算法41丨动态规划理论:一篇文章带你彻底搞懂最优子结构、无后效性和重复子问题

刚刚我讲了,如何鉴别一个问题是否可以用动态规划来解决。现在,我再总结一下,动态规划解题的一般思路,让你面对动态规划问题的时候,能够有章可循,不至于束手无策。我个人觉得,解决动态规划问题,一般有两种思路。我把它们分别叫作,状态转移表法和状态转移方程法。

2024-07-15 14:22:28 1048

原创 数据结构与算法40丨初识动态规划:如何巧妙解决“双十一”购物时的凑单问题?

淘宝的“双十一”购物节有各种促销活动,比如“满 200 元减 50 元”。假设你女朋友的购物车中有 n 个(n>100)想买的商品,她希望从里面选几个,在凑够满减条件的前提下,让选出来的商品价格总和最大程度地接近满减条件(200 元),这样就可以极大限度地“薅羊毛”。作为程序员的你,能不能编个代码来帮她搞定呢?要想高效地解决这个问题,就要用到我们今天讲的动态规划(Dynamic Programming)。

2024-07-15 14:21:47 933

原创 数据结构与算法39丨回溯算法:从电影《蝴蝶效应》中学习回溯算法的核心思想

我们在提到,深度优先搜索算法利用的是回溯算法思想。这个算法思想非常简单,但是应用却非常广泛。它除了用来指导像深度优先搜索这种经典的算法设计之外,还可以用在很多实际的软件开发场景中,比如正则表达式匹配、编译原理中的语法分析等。除此之外,很多经典的数学问题都可以用回溯算法解决,比如数独、八皇后、0-1 背包、图的着色、旅行商问题、全排列等等。既然应用如此广泛,我们今天就来学习一下这个算法思想,看看它是如何指导我们解决问题的。

2024-07-15 14:20:37 850

原创 数据结构与算法38丨分治算法:谈一谈大规模计算框架MapReduce中的分治思想

MapReduce 是 Google 大数据处理的三驾马车之一,另外两个是 GFS 和 Bigtable。它在倒排索引、PageRank 计算、网页分析等搜索引擎相关的技术中都有大量的应用。尽管开发一个 MapReduce 看起来很高深,感觉跟我们遥不可及。实际上,万变不离其宗,它的本质就是我们今天要学的这种算法思想,分治算法。

2024-07-15 14:19:13 1418

原创 数据结构与算法37丨贪心算法:如何用贪心算法实现Huffman压缩编码?

基础的数据结构和算法我们基本上学完了,接下来几节,我会讲几种更加基本的算法。它们分别是贪心算法、分治算法、回溯算法、动态规划。更加确切地说,它们应该是算法思想,并不是具体的算法,常用来指导我们设计具体的算法和编码等。贪心、分治、回溯、动态规划这 4 个算法思想,原理解释起来都很简单,但是要真正掌握且灵活应用,并不是件容易的事情。所以,接下来的这 4 个算法思想的讲解,我依旧不会长篇大论地去讲理论,而是结合具体的问题,让你自己感受这些算法是怎么工作的,是如何解决问题的,带你在问题中体会这些算法的本质。

2024-07-15 14:18:34 1045

原创 数据结构与算法36丨AC自动机:如何用多模式串匹配实现敏感词过滤功能?

很多支持用户发表文本内容的网站,比如 BBS,大都会有敏感词过滤功能,用来过滤掉用户输入的一些淫秽、反动、谩骂等内容。你有没有想过,这个功能是怎么实现的呢?实际上,这些功能最基本的原理就是字符串匹配算法,也就是通过维护一个敏感词的字典,当用户输入一段文字内容之后,通过字符串匹配算法,来查找用户输入的这段文字,是否包含敏感词。如果有,就用“***”把它替代掉。我们前面讲过好几种字符串匹配算法了,它们都可以处理这个问题。但是,对于访问量巨大的网站来说,比如淘宝,用户每天的评论数有几亿、甚至几十亿。

2024-07-15 14:17:58 859

原创 数据结构与算法35丨Trie树:如何实现搜索引擎的搜索关键词提示功能?

Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。当然,这样一个问题可以有多种解决方法,比如散列表、红黑树,或者我们前面几节讲到的一些字符串匹配算法,但是,Trie 树在这个问题的解决上,有它特有的优点。不仅如此,Trie 树能解决的问题也不限于此,我们一会儿慢慢分析。现在,我们先来看下,Trie 树到底长什么样子。我举个简单的例子来说明一下。

2024-07-15 14:16:59 1129

原创 数据结构与算法34丨字符串匹配基础(下):如何借助BM算法轻松理解KMP算法?

上一节我们讲了 BM 算法,尽管它很复杂,也不好理解,但却是工程中非常常用的一种高效字符串匹配算法。有统计说,它是最高效、最常用的字符串匹配算法。不过,在所有的字符串匹配算法里,要说最知名的一种的话,那就非 KMP 算法莫属。很多时候,提到字符串匹配,我们首先想到的就是 KMP 算法。尽管在实际的开发中,我们几乎不大可能自己亲手实现一个 KMP 算法。但是,学习这个算法的思想,作为让你开拓眼界、锻炼下逻辑思维,也是极好的,所以我觉得有必要拿出来给你讲一讲。不过,KMP 算法是出了名的不好懂。

2024-07-15 14:16:22 931

原创 数据结构与算法33丨字符串匹配基础(中):如何实现文本编辑器中的查找功能?

文本编辑器中的查找替换功能,我想你应该不陌生吧?比如,我们在 Word 中把一个单词统一替换成另一个,用的就是这个功能。你有没有想过,它是怎么实现的呢?当然,你用上一节讲的 BF 算法和 RK 算法,也可以实现这个功能,但是在某些极端情况下,BF 算法性能会退化的比较严重,而 RK 算法需要用到哈希算法,而设计一个可以应对各种类型字符的哈希算法并不简单。对于工业级的软件开发来说,我们希望算法尽可能的高效,并且在极端情况下,性能也不要退化的太严重。那么,

2024-07-15 14:15:14 817

原创 数据结构与算法32丨字符串匹配基础(上):如何借助哈希算法实现高效字符串匹配?

从今天开始,我们来学习字符串匹配算法。字符串匹配这样一个功能,我想对于任何一个开发工程师来说,应该都不会陌生。我们用的最多的就是编程语言提供的字符串查找函数,比如 Java 中的 indexOf(),Python 中的 find() 函数等,它们底层就是依赖接下来要讲的字符串匹配算法。字符串匹配算法很多,我会分四节来讲解。今天我会讲两种比较简单的、好理解的,它们分别是:BF 算法和 RK 算法。下一节,我会讲两种比较难理解、但更加高效的,它们是:BM 算法和 KMP 算法。

2024-07-15 14:14:21 799

原创 数据结构与算法31丨深度和广度优先搜索:如何找出社交网络中的三度好友关系?

我们知道,算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。这是因为,图这种数据结构的表达能力很强,大部分涉及搜索的场景都可以抽象成“图”。图上的搜索算法,最直接的理解就是,在图中找出从一个顶点出发,到另一个顶点的路径。具体方法有很多,比如今天要讲的两种最简单、最“暴力”的深度优先、广度优先搜索,还有 A*、IDA* 等启发式搜索算法。我们上一节讲过,图有两种主要存储方法,邻接表和邻接矩阵。今天我会用邻接表来存储图。我这里先给出图的代码实现。

2024-07-15 14:12:42 939

原创 数据结构与算法30丨图的表示:如何存储微博、微信等社交网络中的好友关系?

微博、微信、LinkedIn 这些社交软件我想你肯定都玩过吧。在微博中,两个人可以互相关注;在微信中,两个人可以互加好友。那你知道,这就要用到我们今天要讲的这种数据结构:图。实际上,涉及图的算法有很多,也非常复杂,比如图的搜索、最短路径、最小生成树、二分图等等。我们今天聚焦在图存储这一方面,后面会分好几节来依次讲解图相关的算法。

2024-07-15 14:12:04 932

原创 数据结构与算法29丨堆的应用:如何快速获取到Top10最热门的搜索关键词?

搜索引擎的热门搜索排行榜功能你用过吗?你知道这个功能是如何实现的吗?实际上,它的实现并不复杂。搜索引擎每天会接收大量的用户搜索请求,它会把这些用户输入的搜索关键词记录下来,然后再离线地统计分析,得到最热门的 Top 10 搜索关键词。那请你思考下,这个问题就可以用堆来解决,这也是堆这种数据结构一个非常典型的应用。上一节我们讲了堆和堆排序的一些理论知识,今天我们就来讲一讲,堆这种数据结构几个非常重要的应用:优先级队列、求 Top K 和求中位数。

2024-07-15 14:11:20 725

原创 数据结构与算法28丨堆和堆排序:为什么说堆排序没有快速排序快?

我们今天讲另外一种特殊的树,“堆”(Heap𝐻𝑒𝑎𝑝)。堆这种数据结构的应用场景非常多,最经典的莫过于堆排序了。堆排序是一种原地的、时间复杂度为 O(nlogn)𝑂(𝑛log⁡𝑛) 的排序算法。前面我们学过快速排序,平均情况下,它的时间复杂度为 O(nlogn)𝑂(𝑛log⁡𝑛)。尽管这两种排序算法的时间复杂度都是 O(nlogn)𝑂(𝑛log⁡𝑛),甚至堆排序比快速排序的时间复杂度还要稳定,但是,现在,你可能还无法回答,甚至对问题本身还有点疑惑。没关系,带着这个问题,我们来学习今天的内容。

2024-07-15 14:10:33 733

原创 数据结构与算法27丨递归树:如何借助树来求解递归算法的时间复杂度?

今天,我们来讲树这种数据结构的一种特殊应用,递归树。我们都知道,递归代码的时间复杂度分析起来很麻烦。我们在那里讲过,如何利用递推公式,求解归并排序、快速排序的时间复杂度,但是,有些情况,比如快排的平均时间复杂度的分析,用递推公式的话,会涉及非常复杂的数学推导。除了用递推公式这种比较复杂的分析方法,有没有更简单的方法呢?今天,我们就来学习另外一种方法,。

2024-07-15 14:08:23 787

原创 数据结构与算法26丨红黑树(下):掌握这些技巧,你也可以实现一个红黑树

我们这节就来说一说。

2024-07-14 20:09:27 882

原创 数据结构与算法25丨红黑树(上):为什么工程中都用红黑树这种二叉树?

平衡二叉树的严格定义是这样的:二叉树中任意一个节点的左右子树的高度相差不能大于 1。从这个定义来看,上一节我们讲的完全二叉树、满二叉树其实都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树。平衡二叉查找树不仅满足上面平衡二叉树的定义,还满足二叉查找树的特点。最先被发明的平衡二叉查找树是AVL 树,它严格符合我刚讲到的平衡二叉查找树的定义,即任何节点的左右子树高度相差不超过 1,是一种高度平衡的二叉查找树。

2024-07-14 20:08:47 1023

原创 数据结构与算法24丨二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树?

上一节我们学习了树、二叉树以及二叉树的遍历,今天我们再来学习一种特殊的的二叉树,二叉查找树。二叉查找树最大的特点就是,支持动态数据集合的快速插入、删除、查找操作。我们之前说过,散列表也是支持这些操作的,并且散列表的这些操作比二叉查找树更高效,时间复杂度是 O(1)。带着这些问题,我们就来学习今天的内容,二叉查找树!

2024-07-14 20:08:11 743

原创 数据结构与算法23丨二叉树基础(上):什么样的二叉树适合用数组来存储?

前面我们讲的都是线性表结构,栈、队列等等。今天我们讲一种非线性表结构,树。树这种数据结构比线性表的数据结构要复杂得多,内容也比较多,所以我会分四节来讲解。带着这些问题,我们就来学习今天的内容,树!

2024-07-14 20:07:36 568

原创 数据结构与算法22丨哈希算法(下):哈希算法在分布式系统中有哪些应用?

上一节,我讲了哈希算法的四个应用,它们分别是:安全加密、数据校验、唯一标识、散列函数。。你可能已经发现,这三个应用都跟分布式系统有关。没错,今天我就带你看下,。

2024-07-14 20:06:37 974

原创 数据结构与算法21丨哈希算法(上):如何防止数据库中的用户信息被脱库?

我们前面几节讲到“散列表”“散列函数”,这里又讲到“哈希算法”,你是不是有点一头雾水?实际上,不管是“散列”还是“哈希”,这都是中文翻译的差别,英文其实就是“Hash所以,我们常听到有人把“散列表”叫作“哈希表”“Hash 表”,把“哈希算法”叫作“Hash 算法”或者“散列算法”。那到底什么是哈希算法呢?哈希算法的定义和原理非常简单,基本上一句话就可以概括了。将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。

2024-07-14 20:06:05 901

原创 数据结构与算法20丨散列表(下):为什么散列表和链表经常会一起使用?

我们已经学习了 20 节内容,你有没有发现,有两种数据结构,散列表和链表,经常会被放在一起使用。你还记得,前面的章节中都有哪些地方讲到散列表和链表的组合使用吗?我带你一起回忆一下。在链表那一节,我讲到如何用链表来实现 LRU 缓存淘汰算法,但是链表实现的 LRU 缓存淘汰算法的时间复杂度是 O(n),当时我也提到了,通过散列表可以将这个时间复杂度降低到 O(1)。在跳表那一节,我提到 Redis 的有序集合是使用跳表来实现的,跳表可以看作一种改进版的链表。

2024-07-14 20:05:30 898

原创 数据结构与算法19丨散列表(中):如何打造一个工业级水平的散列表?

通过上一节的学习,我们知道,散列表的查询效率并不能笼统地说成是 O(1)。它跟散列函数、装载因子、散列冲突等都有关系。如果散列函数设计得不好,或者装载因子过高,都可能导致散列冲突发生的概率升高,查询效率下降。在极端情况下,有些恶意的攻击者,还有可能通过精心构造的数据,使得所有的数据经过散列函数之后,都散列到同一个槽里。如果我们使用的是基于链表的冲突解决方法,那这个时候,散列表就会退化为链表,查询的时间复杂度就从 O(1) 急剧退化为 O(n)。如果散列表中有 10 万个数据,退化后的散列表查询的效率就下降了

2024-07-14 20:04:44 725

原创 数据结构与算法18丨散列表(上):Word文档中的单词拼写检查功能是如何实现的?

散列函数计算得到的散列值是一个非负整数;如果 key1 = key2,那 hash(key1) == hash(key2);如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2)。我来解释一下这三点。其中,第一点理解起来应该没有任何问题。因为数组下标是从 0 开始的,所以散列函数生成的散列值也要是非负整数。第二点也很好理解。相同的 key,经过散列函数得到的散列值也应该是相同的。第三点理解起来可能会有问题,我着重说一下。

2024-07-14 20:04:05 642

电子学会2023年3月图形化(一、二、三、四级)

电子学会2023年3月图形化(一、二、三、四级)

2024-06-02

电子学会202305真题-图形化(一、二、三、四级)

电子学会202305真题-图形化

2024-06-02

Scratch-NOC竞赛-图形化-低年级组

Scratch-NOC竞赛-图形化-低年级组

2024-04-11

NOC竞赛-图形化-高年级组

NOC竞赛-图形化-高年级组

2024-04-11

1.10-函数的参数和变量的作用域

1.10-函数的参数和变量的作用域

2024-04-01

1.9-集合的应用和函数入门

1.9-集合的应用和函数入门

2024-04-01

1.8-元组和字典的应用(代码加笔记)

1.8-元组和字典的应用(代码加笔记)

2024-04-01

1.6-列表使用入门(代码加笔记)

1.6-列表使用入门(代码加笔记)

2024-04-01

1.5-字符串的应用 以及内建函数

1.5-字符串的应用 以及内建函数

2024-03-29

1.4-循环结构 笔记代码

1.4-循环结构 笔记代码

2024-03-29

1.3-运算符的应用和分支结构

1.3-运算符的应用和分支结构

2024-03-29

1.2-输入输出和运算符入门

1.2-输入输出和运算符入门

2024-03-28

1.1-Python概述和基本语法

1.1-Python概述和基本语法

2024-03-28

mysql常用函数MD文档(详细版)

mysql常用函数MD文档(详细版)

2023-09-25

JUC并发编程学习笔记(硅谷)

JUC并发编程学习笔记(硅谷)

2023-07-23

Easy-Code代码生成配置文件

Easy-Code代码生成配置文件

2023-07-10

Spring-day04(md文档+代码)

Spring-day04(md文档+代码) 超详细

2023-05-14

Spring-day03(md文档+代码)

Spring-day03(md文档+代码) 超详细

2023-05-14

Spring-day02(md文档+代码)

Spring-day02(md文档+代码) 超详细

2023-05-14

Spring-day01(md文档+代码)

Spring-day01(md文档+代码) 超详细

2023-05-14

本科生毕业论文库存管理系统的设计与开发

本科生毕业论文库存管理系统的设计与开发 库存管理,数据库,信息管理,VB

2023-05-14

多线程02(md文档+代码)

多线程02(md文档+代码) 超详细 物有所值

2023-05-14

多线程01(md文档+代码)多线程01(md文档+代码)(超详细)

多线程01(md文档+代码)多线程01(md文档+代码)(超详细)

2023-05-14

一线互联网企业面试题(仅参考未整理答案)

一线互联网企业面试题(仅参考未整理答案)

2023-05-12

23种设计模式知识要点整理

23种设计模式知识要点整理23种设计模式知识要点整理

2023-05-12

UML2.0实战教程(Trufun)

UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufun) (1)UML2.0实战教程(Trufu

2023-05-02

MySQL面试题1 MySQL面试题1

MySQL面试题1MySQL面试题1MySQL面试题1

2023-04-19

mybatis中文文档

mybatis中文文档(详细)

2023-04-19

JDBC学习笔记(精华版)-1

JDBC学习笔记(精华版)-1 很详细

2023-04-19

jquery文档、API

jquery英文文档--------------------------------------------

2023-04-18

MySQL面试题-BAT的MySQL面试题

MySQL面试题

2023-04-05

Java实习生常见面试题

Java实习生常见面试题

2023-04-05

大一下期网页设计课程作业(课程作业)

大一下期网页设计课程作业(课程作业)

2023-04-05

matlab复习题资料

matlab复习题资料

2023-04-04

计算机(Java方向简历模板)

(Java方向简历模板)

2023-04-04

python学习笔记(入门笔记,很详细)

1.1-Python概述和基本语法 1.2-输入输出和运算符入门 1.3-循环结构

2023-04-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除