66 - data-structure
77 - algorithm
88 - bloom-filter
9- - probability
9+ - deep-search
1010language : ' 中文'
1111ai-model :
1212 - gemini-2.5-pro
@@ -15,13 +15,339 @@ heroImage:
1515 color : ' #047677'
1616---
1717
18+ import Paper from ' @/custom/components/pages/Paper.astro'
19+
20+ import { Steps , Timeline } from ' astro-pure/user'
21+
1822> [ !quote] Bloom Filter 简介
1923> 布隆过滤器(Bloom Filter)是一种开创性的概率型数据结构,其核心价值在于提供了一种在空间和时间上都极具效率的近似集合成员关系测试方法。
2024> 自问世以来,它已成为处理大规模数据集时不可或缺的工具。本文旨在深入探讨布隆过滤器的原理、实现方式以及在实际应用中的优势和局限性。
2125
26+ ## 演变历程
27+
28+ <Timeline
29+ events = { [
30+ {
31+ date: ' 1970s' ,
32+ content: ' Burton Howard Bloom 提出了布隆过滤器的概念。'
33+ },
34+ {
35+ date: ' 1990s' ,
36+ content: ' 布隆过滤器开始被广泛应用于缓存系统和网络协议中。'
37+ },
38+ {
39+ date: ' 2000s' ,
40+ content: ' 布隆过滤器的变种和优化算法陆续被提出,如计数布隆过滤器、分布式布隆过滤器等。'
41+ },
42+ {
43+ date: ' 2010s' ,
44+ content:
45+ ' 布隆过滤器在大数据处理、机器学习等领域得到了更广泛的应用,如 Apache Hadoop、Apache Spark 等大数据框架中都集成了布隆过滤器。'
46+ },
47+ {
48+ date: ' 2020s' ,
49+ content:
50+ ' 随着云计算和边缘计算的发展,布隆过滤器在分布式系统中的应用越来越普遍,成为处理大规模数据集时的重要工具。'
51+ }
52+ ]}
53+ />
54+
55+ ## 历史背景
56+
57+ > 硬件发展驱动软件, 软件设计反作用于硬件
58+
59+ 在1960 年代, 所有程序员不得不面对两个现实:
60+
61+ - 内存(核心存储器)极其宝贵
62+ - 磁盘访问速度极慢
63+
64+ 所以, 工程师们必须想尽一切办法来减少对磁盘的访问,并最大限度地节省宝贵的内存资源。
65+
66+ <Aside type = ' note' icon = ' heart' title = ' 野史/沉浸式胡说八道' >
67+
68+ 1 . (Burton Howard Bloom)遇到了一个具体问题。他需要设计一个系统来高效地查询一个元素是否存在于一个庞大的集合中,而这个集合因为太大而无法完全放入内存,只能存储在磁盘上
69+ 2 . 他敏锐地观察到一个关键现象:在许多应用场景中,` 绝大多数的查询都是针对那些根本不存在于集合中的元素 ` 。例如,在一个拼写检查系统中,绝大多数输入的单词都是正确的,因此查询“这个词是否在错误单词词典里?”的结果大多是“否”
70+ 3 . 传统做法是,每一次查询,无论元素是否存在,都必须启动一次昂贵的磁盘I/O来确认。这意味着系统将大量的时间和资源浪费在那些最终结果为“未找到”的无效查询上
71+
72+ </Aside >
73+
74+ <Aside type = " info" icon = " 💡" title = " 我是标题" open = " true" >这是一个带有灯泡图标的信息框。</Aside >
75+ <Aside type = " info" >这是一个带有灯泡图标的信息框。</Aside >
76+ <Aside type = " info" icon = " up" >up</Aside >
77+
78+ > [ !TIP] 野史/沉浸式胡说八道
79+ >
80+ > 1 . (Burton Howard Bloom)遇到了一个具体问题。他需要设计一个系统来高效地查询一个元素是否存在于一个庞大的集合中,而这个集合因为太大而无法完全放入内存,只能存储在磁盘上
81+ > 2 . 他敏锐地观察到一个关键现象:在许多应用场景中,` 绝大多数的查询都是针对那些根本不存在于集合中的元素 ` 。例如,在一个拼写检查系统中,绝大多数输入的单词都是正确的,因此查询“这个词是否在错误单词词典里?”的结果大多是“否”
82+ > 3 . 传统做法是,每一次查询,无论元素是否存在,都必须启动一次昂贵的磁盘I/O来确认。这意味着系统将大量的时间和资源浪费在那些最终结果为“未找到”的无效查询上
83+
84+
85+ ``` ansi
86+ [1;4mStandard ANSI colors:[0m
87+ - Dimmed: [2;30m Black [2;31m Red [2;32m Green [2;33m Yellow [2;34m Blue [2;35m Magenta [2;36m Cyan [2;37m White [0m
88+ - Foreground: [30m Black [31m Red [32m Green [33m Yellow [34m Blue [35m Magenta [36m Cyan [37m White [0m
89+ - Background: [40m Black [41m Red [42m Green [43m Yellow [44m Blue [45m Magenta [46m Cyan [47m White [0m
90+ - Reversed: [7;30m Black [7;31m Red [7;32m Green [7;33m Yellow [7;34m Blue [7;35m Magenta [7;36m Cyan [7;37m White [0m
91+
92+ [1;4m8-bit colors (showing colors 160-171 as an example):[0m
93+ - Dimmed: [2;38;5;160m 160 [2;38;5;161m 161 [2;38;5;162m 162 [2;38;5;163m 163 [2;38;5;164m 164 [2;38;5;165m 165 [2;38;5;166m 166 [2;38;5;167m 167 [2;38;5;168m 168 [2;38;5;169m 169 [2;38;5;170m 170 [2;38;5;171m 171 [0m
94+ - Foreground: [38;5;160m 160 [38;5;161m 161 [38;5;162m 162 [38;5;163m 163 [38;5;164m 164 [38;5;165m 165 [38;5;166m 166 [38;5;167m 167 [38;5;168m 168 [38;5;169m 169 [38;5;170m 170 [38;5;171m 171 [0m
95+ - Background: [48;5;160m 160 [48;5;161m 161 [48;5;162m 162 [48;5;163m 163 [48;5;164m 164 [48;5;165m 165 [48;5;166m 166 [48;5;167m 167 [48;5;168m 168 [48;5;169m 169 [48;5;170m 170 [48;5;171m 171 [0m
96+ - Reversed: [7;38;5;160m 160 [7;38;5;161m 161 [7;38;5;162m 162 [7;38;5;163m 163 [7;38;5;164m 164 [7;38;5;165m 165 [7;38;5;166m 166 [7;38;5;167m 167 [7;38;5;168m 168 [7;38;5;169m 169 [7;38;5;170m 170 [7;38;5;171m 171 [0m
97+
98+ [1;4m24-bit colors (full RGB):[0m
99+ - Dimmed: [2;38;2;34;139;34m ForestGreen - RGB(34,139,34) [2;38;2;102;51;153m RebeccaPurple - RGB(102,51,153) [0m
100+ - Foreground: [38;2;34;139;34m ForestGreen - RGB(34,139,34) [38;2;102;51;153m RebeccaPurple - RGB(102,51,153) [0m
101+ - Background: [48;2;34;139;34m ForestGreen - RGB(34,139,34) [48;2;102;51;153m RebeccaPurple - RGB(102,51,153) [0m
102+ - Reversed: [7;38;2;34;139;34m ForestGreen - RGB(34,139,34) [7;38;2;102;51;153m RebeccaPurple - RGB(102,51,153) [0m
103+
104+ [1;4mFont styles:[0m
105+ - Default
106+ - [1mBold[0m
107+ - [2mDimmed[0m
108+ - [3mItalic[0m
109+ - [4mUnderline[0m
110+ - [7mReversed[0m
111+ - [9mStrikethrough[0m
112+ ```
113+
114+
115+ import Aside from ' @/custom/components/user/Aside.astro'
116+
117+ import { MdxRepl , TabItem , Tabs } from ' astro-pure/user'
118+
119+ Components let you easily reuse a piece of UI or styling consistently. You can use them not just in ` .astro ` files, but also in ` .mdx ` files.
120+
121+ <Aside type = ' note' icons = ' caution' title = ' 自定义信息' >
122+ 1 . [ MDX] ( https://mdxjs.com/ ) is a format that lets you write JSX embedded inside Markdown. And it has no difference with markdown files in other ways.
123+ 2 . 1
124+ 3 . 4
125+
126+ ``` java
127+ public class HelloWorld {
128+ public static void main (String [] args ) {
129+ System . out. println(" Hello, World!" );
130+ }
131+ }
132+ ```
133+
134+ </Aside >
135+
136+ <Aside type = ' note' icons = ' caution' title = ' 自定义信息' >
137+ 1 . [ MDX] ( https://mdxjs.com/ ) is a format that lets you write JSX embedded inside Markdown. And it has no difference with markdown files in other ways.
138+ 2 . 1
139+ 3 . 4
140+
141+ ``` java
142+ public class HelloWorld {
143+ public static void main (String [] args ) {
144+ System . out. println(" Hello, World!" );
145+ }
146+ }
147+ ```
148+
149+ </Aside >
150+
151+ //[ 'important', 'info', 'note', 'tip', 'warning', 'caution']
152+
153+ <Aside type = ' important' icons = ' important' title = ' 自定义信息' >
154+ 1
155+ </Aside >
156+ <Aside type = ' info' icons = ' info' title = ' 自定义信息' >
157+ 2
158+ </Aside >
159+ <Aside type = ' note' icons = ' note' title = ' 自定义信息' >
160+ 3
161+ </Aside >
162+ <Aside type = ' tip' icons = ' tip' title = ' 自定义信息' >
163+ 4
164+ </Aside >
165+ <Aside type = ' warning' icons = ' warning' title = ' 自定义信息' >
166+ 5
167+ </Aside >
168+ <Aside type = ' caution' icons = ' caution' title = ' 自定义信息' >
169+ 6
170+ </Aside >
171+
172+ ``` ts
173+ import LinkPreview from ' @/components/LinkPreview.astro' // [!code --]
174+ import { LinkPreview } from ' astro-pure/advanced' // [!code ++]
175+
176+ < LinkPreview href = ' https://www.baidu.com/' / >
177+ ```
178+
179+ import { LinkPreview } from ' astro-pure/advanced' // [!code ++]
180+
181+ <LinkPreview href = ' https://www.baidu.com/' />
182+
183+ import { GithubCard } from ' astro-pure/advanced'
184+ import { Button } from ' astro-pure/user'
185+
186+ The astro-theme-pure theme is open source under the [ Apache 2.0] ( https://github.com/cworld1/astro-theme-pure/blob/main/LICENSE ) license. Please abide by this license for any further development.
187+
188+
189+
190+ 基于这样的条件限制, 又加上对现实世界的观察: ` 绝大多数的查询都是针对那些根本不存在于集合中的元素 ` .
191+ 1970年,布隆过滤器由 ` Burton Howard Bloom ` 提出,旨在解决大规模数据集中的集合成员关系测试问题。随着互联网和大数据技术的发展,布隆过滤器逐渐被广泛应用于缓存系统、数据库、网络安全等领域。
192+
193+ <Paper
194+ paper = { {
195+ id: ' Space/Time Trade-offs in Hash Coding with Allowable Errors' ,
196+ data: {
197+ title: ' Space/Time Trade-offs in Hash Coding with Allowable Errors' ,
198+ publishDate: ' 01 July 1970' ,
199+ doi: ' 10.1145/362686.362692' ,
200+ citations: 5642 ,
201+ paperUrl: ' https://dl.acm.org/doi/10.1145/362686.362692' ,
202+ star: 5 ,
203+ tags: [' Bloom Filter' , ' Data Structure' , ' Algorithm' ],
204+ author: [' Burton Howard Bloom' ]
205+ },
206+ index: 1
207+ }}
208+ />
209+
210+ <Paper
211+ paper = { {
212+ id: ' Space/Time Trade-offs in Hash Coding with Allowable Errors' ,
213+ data: {
214+ title: ' Space/Time Trade-offs in Hash Coding with Allowable Errors' ,
215+ publishDate: ' 01 July 1970' ,
216+ isbn: ' 10.1145/362686.362692' ,
217+ citations: 5642 ,
218+ paperUrl: ' https://dl.acm.org/doi/10.1145/362686.362692' ,
219+ star: 5 ,
220+ tags: [' Bloom Filter' , ' Data Structure' , ' Algorithm' ],
221+ author: [' 上野千鹤子' , ' 山田太郎' ]
222+ },
223+ index: 1
224+ }}
225+ />
226+
227+ 1 . 为什么布隆过滤器会被发明?
228+
229+ - 在处理大规模数据集时,传统的集合数据结构(如哈希表、树等)在空间和时间上都存在一定的局限性。布隆过滤器通过使用多个哈希函数和位数组来实现高效的集合成员关系测试。
230+
231+ 2 . 布隆过滤器的核心思想是什么?
232+
233+ - 布隆过滤器的核心思想是使用多个哈希函数将元素映射到一个位数组中,通过检查位数组中的位来判断元素是否在集合中。
234+
235+ 3 . 布隆过滤器的主要应用场景有哪些?
236+
237+ - 布隆过滤器广泛应用于缓存系统、数据库、网络安全、分布式系统等领域,尤其是在处理大规模数据集时,可以显著提高空间效率和查询速度。
238+
239+ 4 . 布隆过滤器的局限性是什么?
240+
241+ - 布隆过滤器的主要局限性在于它允许一定的误判率,即可能会错误地判断一个元素在集合中,但绝不会漏掉一个实际存在的元素。
242+ - 此外,布隆过滤器无法删除元素,因为删除操作可能会导致误判率增加。
243+
244+ 5 . 布隆过滤器的变种有哪些?
245+
246+ - 布隆过滤器有多种变种,如计数布隆过滤器(支持删除操作)、分布式布隆过滤器(适用于分布式系统)等。这些变种在原有布隆过滤器的基础上进行了优化和扩展。
247+
248+ 6 . 布隆过滤器在实际应用中有哪些优势?
249+
250+ - 布隆过滤器在实际应用中具有以下优势:
251+ - ** 空间效率高** :相比于传统的集合数据结构,布隆过滤器使用更少的内存来存储相同数量的元素。
252+ - ** 查询速度快** :布隆过滤器的查询操作非常快速,通常是常数时间复杂度。
253+ - ** 适用于大规模数据集** :布隆过滤器特别适合处理大规模数据集,可以显著提高查询效率和空间利用率。
254+
255+ 7 . 布隆过滤器的未来发展方向是什么?
256+
257+ - 随着大数据和云计算技术的发展,布隆过滤器的应用领域将继续扩展。未来的研究可能集中在以下几个方面:
258+ - ** 误判率优化** :研究如何降低布隆过滤器的误判率,提高查询准确性。
259+ - ** 动态调整** :开发动态调整布隆过滤器大小和哈希函数数量的算法,以适应数据集的变化。
260+ - ** 分布式应用** :研究如何在分布式系统中高效地实现布隆过滤器,以支持大规模数据处理和查询。
261+
262+ 8 . 布隆过滤器在机器学习中的应用有哪些?
263+
264+ - 在机器学习中,布隆过滤器可以用于特征选择、数据预处理等任务。例如,在处理大规模文本数据时,可以使用布隆过滤器来快速判断某个词是否在特定的词汇表中,从而提高特征提取的
265+
22266## 什么是 Bloom Filter
23267
24268布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于测试一个元素是否属于一个集合。它允许一定的误判率,即可能会错误地判断一个元素在集合中,但绝不会漏掉一个实际存在的元素。布隆过滤器的主要特点是:
25269
26270- ** 空间效率高** :相比于传统的集合数据结构,布隆过滤器使用更少的内存来存储相同数量的元素。
27271- ** 查询速度快** :布隆过滤器的查询操作非常快速,通常是常数时间复杂度。
272+
273+
274+ ``` js collapse={1-5, 12-14, 21-24} showLineNumbers
275+ // All this boilerplate setup code will be collapsed
276+ import { someBoilerplateEngine } from ' @example/some-boilerplate'
277+ import { evenMoreBoilerplate } from ' @example/even-more-boilerplate'
278+
279+ const engine = someBoilerplateEngine (evenMoreBoilerplate ())
280+
281+ // This part of the code will be visible by default
282+ engine .doSomething (1 , 2 , 3 , calcFn)
283+
284+ function calcFn () {
285+ // You can have multiple collapsed sections
286+ const a = 1
287+ const b = 2
288+ const c = a + b
289+
290+ // This will remain visible
291+ console .log (` Calculation result: ${ a} + ${ b} = ${ c} ` )
292+ return c
293+ }
294+
295+ // All this code until the end of the block will be collapsed again
296+ engine .closeConnection ()
297+ engine .freeMemory ()
298+ engine .shutdown ({ reason: ' End of example boilerplate code' })
299+ ```
300+
301+ ``` js {1, 4, 7-8}
302+ // Line 1 - targeted by line number
303+ // Line 2
304+ // Line 3
305+ // Line 4 - targeted by line number
306+ // Line 5
307+ // Line 6
308+ // Line 7 - targeted by range "7-8"
309+ // Line 8 - targeted by range "7-8"
310+ ```
311+
312+ ``` jsx {"1":5} del={"2":7-8} ins={"3":10-12} showLineNumbers /button/
313+ // labeled-line-markers.jsx
314+ < button
315+ role= " button"
316+ {... props}
317+ value= {value}
318+ className= {buttonClassName}
319+ disabled= {disabled}
320+ active= {active}
321+ >
322+ {children &&
323+ ! active &&
324+ (typeof children === ' string' ? < span> {children}< / span> : children)}
325+ < / button>
326+ ```
327+
328+ ``` js showLineNumbers
329+ // This code block will show line numbers
330+ console .log (' Greetings from line 2!' )
331+ console .log (' I am on line 3' )
332+ ```
333+
334+ ``` js showLineNumbers=false
335+ // Line numbers are disabled for this block
336+ console .log (' Hello?' )
337+ console .log (' Sorry, do you know what line I am on?' )
338+ ```
339+
340+ <Tabs >
341+ <TabItem label = ' Astro' >
342+ ``` js showLineNumbers=false
343+ // Line numbers are disabled for this block
344+ console .log (' Hello?' )
345+ console .log (' Sorry, do you know what line I am on?' )
346+ ```
347+ </TabItem >
348+ <TabItem label = ' MDX' >
349+ ``` tsx
350+ import { MdxRepl } from ' astro-pure/user'
351+ ```
352+ </TabItem >
353+ </Tabs >
0 commit comments