Skip to content

Commit 6f7a516

Browse files
committed
update:4 articles
1 parent 264c507 commit 6f7a516

File tree

5 files changed

+190
-4
lines changed

5 files changed

+190
-4
lines changed

README.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -358,10 +358,10 @@
358358

359359
# 海量数据处理
360360

361-
* bitmap
362-
* Map-Reduce原理
363-
* BloomFilter原理
364-
* Trie树原理
361+
* [bitmap](./problems/bitmap.md)
362+
* [Map-Reduce原理](./problems/Map-Reduce原理.md)
363+
* [BloomFilter原理](./problems/BloomFilter原理.md)
364+
* [Trie树原理](./problems/Trie树原理.md)
365365
* LSM树原理
366366

367367
# linux下操作命令以及工具

problems/BloomFilter原理.md

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
BloomFilter(布隆过滤器)是一种用于判断元素是否属于集合的概率数据结构。它具有空间效率高和查询时间快的特点,但是存在一定的误判率。下面我将详细介绍BloomFilter的原理。
2+
3+
## BloomFilter的基本概念
4+
5+
1. 位数组(Bit Array):
6+
- BloomFilter使用一个固定大小的位数组来表示集合。
7+
- 位数组中的每个比特位初始化为0,表示集合为空。
8+
- 位数组的大小与期望的元素数量和误判率有关。
9+
2. 哈希函数(Hash Functions):
10+
- BloomFilter使用多个哈希函数将元素映射到位数组中的不同位置。
11+
- 每个哈希函数将元素映射到一个固定范围内的整数,对应位数组中的一个索引。
12+
- 哈希函数的选择应该尽量独立和均匀,以减小冲突的概率。
13+
3. 添加元素(Add Element):
14+
- 将一个元素添加到BloomFilter中时,使用所有的哈希函数计算该元素的哈希值。
15+
- 将位数组中对应哈希值的比特位设置为1,表示该元素已经添加到集合中。
16+
4. 查询元素(Query Element):
17+
- 查询一个元素是否属于BloomFilter表示的集合时,使用相同的哈希函数计算该元素的哈希值。
18+
- 检查位数组中对应哈希值的比特位是否都为1。
19+
- 如果所有对应的比特位都为1,则认为该元素可能属于集合(存在误判)。
20+
- 如果任意一个对应的比特位为0,则确定该元素不属于集合(不存在漏判)。
21+
22+
## BloomFilter的工作原理
23+
24+
1. 初始化:
25+
- 创建一个固定大小的位数组,并将所有比特位初始化为0。
26+
- 选择适当数量的哈希函数,用于将元素映射到位数组中。
27+
2. 添加元素:
28+
- 对于要添加的每个元素,使用所有的哈希函数计算其哈希值。
29+
- 将位数组中对应哈希值的比特位设置为1。
30+
- 重复以上步骤,直到所有元素都添加到BloomFilter中。
31+
3. 查询元素:
32+
- 对于要查询的元素,使用相同的哈希函数计算其哈希值。
33+
- 检查位数组中对应哈希值的比特位是否都为1。
34+
- 如果所有对应的比特位都为1,则认为该元素可能属于集合。
35+
- 如果任意一个对应的比特位为0,则确定该元素不属于集合。
36+
4. 误判率:
37+
- BloomFilter存在一定的误判率,即将不属于集合的元素判断为属于集合。
38+
- 误判率与位数组的大小、元素数量和哈希函数的数量有关。
39+
- 通过增加位数组的大小和哈希函数的数量,可以降低误判率,但会增加空间开销。
40+
41+
## BloomFilter的优缺点
42+
43+
优点:
44+
45+
1. 空间效率高:BloomFilter使用位数组存储信息,占用空间小于直接存储元素。
46+
2. 查询时间快:BloomFilter的查询时间与哈希函数的数量成正比,与元素数量无关。
47+
3. 插入时间快:将元素添加到BloomFilter中的时间与哈希函数的数量成正比。
48+
49+
缺点:
50+
51+
1. 存在误判:BloomFilter存在将不属于集合的元素判断为属于集合的可能性。
52+
2. 无法删除元素:BloomFilter不支持删除已添加的元素,因为删除可能影响其他元素的判断。
53+
3. 不能确定元素的具体信息:BloomFilter只能判断元素是否属于集合,无法获取元素的具体值。

problems/Map-Reduce原理.md

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
Map-Reduce是一种用于处理大规模数据集的并行计算模型和框架。它由Google公司提出,旨在简化大规模数据处理任务的编程和执行。下面我将详细介绍Map-Reduce的原理。
2+
3+
## Map-Reduce的基本概念
4+
5+
1. Map阶段:
6+
- 将输入数据分割成多个独立的子问题,每个子问题可以并行处理。
7+
- 对每个子问题应用Map函数,将其转换为一组中间的键值对(key-value pairs)。
8+
- Map函数的输出结果是一组中间键值对,其中键(key)用于后续的Reduce阶段。
9+
2. Shuffle阶段:
10+
- 将Map阶段输出的中间键值对按照键(key)进行分组和排序。
11+
- 将具有相同键的值组合在一起,形成<key, list(values)>的形式。
12+
- Shuffle阶段通常由Map-Reduce框架自动完成,无需用户干预。
13+
3. Reduce阶段:
14+
- 对每个键(key)及其对应的值列表(list(values))应用Reduce函数。
15+
- Reduce函数对值列表进行合并、聚合或转换操作,生成最终的结果。
16+
- 每个Reduce任务的输出结果是一组最终的键值对,表示问题的解。
17+
18+
## Map-Reduce的工作流程
19+
20+
1. 数据分割:
21+
- 将大规模的输入数据集分割成多个独立的数据块(splits)。
22+
- 每个数据块可以在不同的机器上并行处理,提高计算效率。
23+
2. Map任务:
24+
- 为每个数据块创建一个Map任务,并将其分配给集群中的工作节点。
25+
- 每个Map任务读取其对应的数据块,对每个数据项应用Map函数,生成中间键值对。
26+
- Map函数的输出结果暂时存储在本地磁盘或内存中。
27+
3. Shuffle和排序:
28+
- Map任务完成后,Map-Reduce框架对中间键值对进行分组和排序。
29+
- 具有相同键的值被组合在一起,形成<key, list(values)>的形式。
30+
- Shuffle过程通常在Map任务和Reduce任务之间进行,由框架自动完成。
31+
4. Reduce任务:
32+
- 为每个唯一的键创建一个Reduce任务,并将其分配给集群中的工作节点。
33+
- 每个Reduce任务读取属于其键的所有值,对值列表应用Reduce函数,生成最终结果。
34+
- Reduce函数的输出结果通常写入到分布式文件系统或数据库中。
35+
5. 结果合并:
36+
- 所有Reduce任务完成后,将它们的输出结果合并成最终的结果集。
37+
- 最终结果可以存储在分布式文件系统中,或者返回给用户进行后续处理。
38+
39+
## Map-Reduce的优点
40+
41+
1. 可扩展性:Map-Reduce可以轻松地扩展到大规模集群,处理PB级别的数据。
42+
2. 容错性:Map-Reduce框架自动处理节点故障和任务失败,确保计算的可靠性。
43+
3. 易用性:用户只需编写Map和Reduce函数,无需关心分布式计算的细节。
44+
4. 灵活性:Map-Reduce可以应用于各种数据处理场景,如数据分析、机器学习等。

problems/Trie树原理.md

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
Trie树,也称为前缀树或字典树,是一种用于存储和检索字符串集合的树形数据结构。它利用字符串的公共前缀来节省存储空间和加速查询操作。下面我将详细介绍Trie树的原理。
2+
3+
## Trie树的基本概念
4+
5+
1. 节点(Node):
6+
- Trie树由一个根节点和多个子节点组成。
7+
- 每个节点表示一个字符,从根节点到某一节点的路径表示一个字符串的前缀。
8+
- 节点通常包含一个字符、一个布尔标志(表示是否为字符串的结尾)和多个子节点指针。
9+
2. 边(Edge):
10+
- Trie树中的边表示字符之间的关系。
11+
- 每条边连接一个父节点和一个子节点,表示从父节点到子节点的字符。
12+
- 边的数量取决于字符集的大小,通常使用数组或哈希表来存储子节点指针。
13+
3. 字符串插入(String Insertion):
14+
- 将一个字符串插入到Trie树中时,从根节点开始,沿着字符串的字符逐个遍历。
15+
- 如果当前字符在当前节点的子节点中不存在,则创建一个新的子节点。
16+
- 重复以上步骤,直到字符串的所有字符都插入到Trie树中。
17+
- 在字符串的最后一个字符对应的节点上,将布尔标志设置为true,表示该字符串存在于Trie树中。
18+
4. 字符串查询(String Query):
19+
- 查询一个字符串是否存在于Trie树中时,从根节点开始,沿着字符串的字符逐个遍历。
20+
- 如果在某个节点上无法找到对应的子节点,则说明该字符串不存在于Trie树中。
21+
- 如果成功遍历完字符串的所有字符,并且最后一个字符对应的节点的布尔标志为true,则说明该字符串存在于Trie树中。
22+
23+
## Trie树的工作原理
24+
25+
1. 插入字符串:
26+
- 从根节点开始,依次处理字符串的每个字符。
27+
- 对于当前字符,检查当前节点是否有对应的子节点:
28+
- 如果有,则移动到该子节点,继续处理下一个字符。
29+
- 如果没有,则创建一个新的子节点,将当前字符作为该节点的字符,然后移动到新创建的子节点。
30+
- 重复以上步骤,直到字符串的所有字符都处理完毕。
31+
- 在最后一个字符对应的节点上,将布尔标志设置为true,表示该字符串存在于Trie树中。
32+
2. 查询字符串:
33+
- 从根节点开始,依次处理字符串的每个字符。
34+
- 对于当前字符,检查当前节点是否有对应的子节点:
35+
- 如果有,则移动到该子节点,继续处理下一个字符。
36+
- 如果没有,则说明该字符串不存在于Trie树中,返回false。
37+
- 如果成功遍历完字符串的所有字符,检查最后一个字符对应的节点的布尔标志:
38+
- 如果为true,则说明该字符串存在于Trie树中,返回true。
39+
- 如果为false,则说明该字符串是某个字符串的前缀,但本身不存在于Trie树中,返回false。
40+
3. 查找前缀:
41+
- Trie树还支持查找以给定字符串为前缀的所有字符串。
42+
- 从根节点开始,沿着给定字符串的字符遍历Trie树,直到无法继续遍历或到达字符串的末尾。
43+
- 从当前节点开始,通过深度优先搜索或广度优先搜索遍历所有子节点,收集以当前节点为前缀的所有字符串。
44+
45+
## Trie树的优缺点
46+
47+
优点:
48+
49+
1. 查询效率高:Trie树的查询时间复杂度与字符串的长度成正比,与字符串的数量无关。
50+
2. 前缀查询:Trie树支持高效地查找以给定字符串为前缀的所有字符串。
51+
3. 节省空间:Trie树利用字符串的公共前缀来减少重复存储,节省了空间。
52+
53+
缺点:
54+
55+
1. 空间占用:尽管Trie树节省了重复存储的空间,但是由于需要存储大量的节点和边,空间占用仍然较大。
56+
2. 插入和删除操作:在Trie树中插入和删除字符串可能需要创建或删除多个节点,操作相对复杂。
57+
3. 字符集大小:Trie树的空间复杂度与字符集的大小有关,对于大字符集(如Unicode)的情况,空间占用会更加显著。

problems/bitmap.md

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
在处理海量数据时,bitmap是一种常用的数据结构,它以位为单位来表示数据,可以高效地进行某些操作,如查询、去重和压缩等。
2+
3+
## Bitmap的原理
4+
5+
1. 位图表示:
6+
- 每个数据项用一个比特(bit)表示其状态或属性。
7+
- 通常用0表示不存在或false,用1表示存在或true。
8+
- 多个数据项可以组成一个bitmap,每个比特的位置对应数据项的编号或键值。
9+
2. 数据存储:
10+
- Bitmap通常以紧凑的方式存储在内存中,每个字节(byte)存储8个比特。
11+
- 可以使用C++中的`bitset``vector<bool>`或自定义的位操作函数来实现bitmap。
12+
- bitmap的大小与数据项的数量有关,需要根据实际情况选择合适的存储方式。
13+
3. 常见操作:
14+
- 设置位(set):将指定位置的比特设为1,表示该数据项存在或为true。
15+
- 清除位(clear):将指定位置的比特设为0,表示该数据项不存在或为false。
16+
- 查询位(test):检查指定位置的比特是否为1,判断该数据项是否存在或为true。
17+
- 压缩存储:由于bitmap中通常包含大量的0,可以使用压缩算法(如行程编码)减小存储空间。
18+
19+
## 在C++中使用Bitmap处理海量数据
20+
21+
1. 去重和判重:
22+
- 将每个数据项映射到bitmap中的一个比特位,通过设置位来标记数据的存在性。
23+
- 判断数据是否存在时,只需查询对应的比特位即可,时间复杂度为O(1)。
24+
- bitmap可以高效地完成海量数据的去重和判重操作,节省存储空间和查询时间。
25+
2. 数据压缩:
26+
- 将原始数据转换为bitmap表示,可以大大减小数据规模。
27+
- 使用压缩算法对bitmap进行编码,进一步减小存储空间。
28+
- 压缩后的bitmap在进行某些操作时,无需完全解压,可以直接在压缩数据上进行位操作。
29+
3. 快速查询和统计:
30+
- 通过遍历bitmap,可以快速统计数据的基数(cardinality),即不同数据项的数量。
31+
- 对bitmap进行位运算,如与(AND)、或(OR)、异或(XOR)等,可以实现多个集合之间的交、并、差等操作。
32+
- bitmap的查询和统计操作通常具有较低的时间复杂度,适用于实时性要求较高的场景。

0 commit comments

Comments
 (0)