本文为面试笔记整理。以前看八股总是随缘,没有系统的整理。现在秋招,正好有机会把各种八股和以前学过的东西都串联起来,给笔记清清灰。
看到海量数据的处理问题,可以按以下思想考虑:
本文将针对处理海量数据的不同场景,引出相应的数据结构或算法:
需要注意的是。对于海量数据的处理,我们会综合使用多种数据结构进行处理,每一种数据结构不一定只会解决同一种问题。
哈希映射的特点就是,同一个关键字将映射到相同的位置。
找出两个巨大文件的共同的关键字
给定 a、b 两个文件,各存放 50 亿个关键字,每个关键字各占 64 字节,内存限制是 4G,找出 a、b 文件共同的关键字。
步骤:
a[i];将文件 b 中的关键字通过哈希映射到 1000 个小文件,每个文件记为 b[i]。a[i] 或 b[i] 中。i 求相同关键字:
a[i] 文件中的关键字放入哈希表 H 中;b[i] 逐个关键字 k 判断是否在哈希表 H 中;k 在 H 中出现,那么将 k 加入结果中。如果判重允许一定错误率,可考虑布隆过滤器。
哈希 Map、字典树可以对小型集合的数据进行去重。
Trie 树适合数据量大,重复多,但是数据种类小可以放进内存的情景。
对 1000 万字符串进行去重
对 1000 万字符串进行去重
步骤:
位图是一种特殊的散列表。
统计大文件中不同数字的个数
已知某个文件内包含一些数字号码,每个号码为 8 位数字,统计不同号码的个数。
解法:使用 Bit-map,从 0-99999999 的数字,每个数字对应一个 Bit 位。
找出不重复的整数的个数
2.5 亿个整数中找出不重复的整数的个数,内存空间不足以容纳这 2.5 亿个整数。
解法 1:
解法 2:
使用位图判断存在性
给 40 亿个不重复的 unsigned int 的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那 40 亿个数当中?
解决方案:使用位图申请 512M 的内存,一个 bit 位代表一个 unsigned int 值。读入 40 亿个数,设置相应的 bit 位,读入要查询的数,查看相应 bit 位是否为 1,为 1 表示存在,为 0 表示不存在。
布隆过滤器基于位图。
它的数据结构由两部分组成:
优缺点:
Counting Bloom Filter 解决布隆过滤器无法删除的弊端
Counting Bloom Filter 将标准 Bloom Filter 位数组的每一位扩展为一个小的计数器(Counter):

Counting Bloom Filter 通过多占用几倍的存储空间的代价, 给 Bloom Filter 增加了删除操作。
看图读原理:

使用场景:
核心思想:将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。
假设要排序的对象有 n 个,划分到 m 个桶中。时间复杂度 :
桶排序对要排序数据的要求是非常苛刻:
桶排序适合用在外部排序中。
海量订单数据的排序
假设有 10GB 的订单金额数据需要排序,金额均为正整数,但我们的内存只有 500MB。应该如何排序?
步骤:
解决订单不均匀分布:
计数排序是由额外空间的辅助和元素本身的值决定的。 计数排序过程中不存在元素之间的比较和交换操作, 根据元素本身的值, 将每个元素出现的次数记录到辅助空间后, 通过对辅助空间内数据的计算, 即可确定每一个元素最终的位置。
计数排序是稳定的。
算法过程:
从某些角度来看,计数排序是桶排序的特殊情况。相当于同一个元素值放到 1 个桶中。
根据年龄给 100 万用户排序
假设年龄的范围最小 1 岁,最大不超过 120 岁,请根据年龄给 100 万用户排序。
我们可以遍历这 100 万用户,根据年龄将其划分到这 120 个桶里,然后依次顺序遍历这 120 个桶中的元素。这样就得到了按照年龄排序的 100 万用户数据。
同类问题:按照成绩给 50 万考生排序。
1 | COUNTING-SORT(A,B,k) |
案例:计数排序
以输入数组 [95,94,91,98,99,93,91,92] 为例。

复杂度分析:
计数排序适用于数据范围 k 不大的场景中。计数排序只能给非负整数排序,如果要排序的数据是其他类型的,要将其在不改变相对大小的情况下,转化为非负整数。
基数排序是一种非比较型整数排序算法,它是基于关键字各位大小来排序。它的基本思想是将整数按位数切割成不同的数字,然后按每个位数分别比较。
设长度为 n 的线性表中每个结点 的关键字由 d 元组 组成
对于不等长的排序数据,可以对数据前/后进行补齐。
算法:
基数排序是稳定的排序算法。
基数排序一般使用 LSD 对数据进行排序的原因
因为数字大小本身就是高位的权重更大,排序轮数越靠后,相当于其权重越高。
可以使用 MSD,不过会更加复杂。使用 MSD 时,需要按照高位分桶。每个桶继续分小桶,形成递归。
时间复杂度:
空间效率:
基数排序适用于对整数或可以表示为固定长度数字序列的对象进行排序。特别是当待排序的数据范围比较固定,且位数相对较少时,它的效率很高:
本小节整理自笔记,更具体的证明与性质详看本地知识库。
(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树。
二叉堆的两种形式:
我的简记:小顶堆装大数、大顶堆装小数。
对堆(大顶堆)操作算法快速回忆:
| 堆的操作 | 时间复杂度 | 算法概述 |
|---|---|---|
| 堆化 | 对一个结点进行「下沉」 | |
| 建堆 | 从中间往前,进行堆化 | |
| 弹出堆顶 | 弹出后,最后一个元素放堆顶,再堆化,防止空洞 | |
| 插入堆 | 放最后,「上浮」 | |
| 更新堆键值 | 更新键后,「上浮」 | |
| 堆排序 | 建堆;一个个弹出。原址排序的话,弹出位置放堆后,堆大小减减即可。 |
思想:如果能把原待排序的数组分解成若干个待排序的子数组,而这些子数组可以方便地排好序,并且通过合并这些子数组的解将能得到原问题的解,则整个数组将排好序。
2 路归并排序通过应用分治法解题的三个基本步骤为:
归并排序不能保证一趟结束后一定有元素放在最终位置上。可以说是基本算法中占用辅助空间最多的排序算法。有方法克服但代价是算法会很复杂,且时间复杂度会增加。
归并排序是一种稳定的算法。平均时间复杂度为 的稳定排序算法只有归并排序。
从单个记录起两两归并的做法不提倡,可以和直接插入排序结合,利用直接插入排序求得较长的有序文件,然后两两归并(两种算法都是稳定的排序算法,结合起来也是稳定的)。
归并排序一般用于外部排序使用。
外部排序在排序过程中根据要求不断在内、外存之间移动。
外部排序使用归并排序法:
磁盘 I/O 优化方法——减少排序趟数:
大文件排序
假定现在有一包含大量整数的文本文件存放于磁盘中,其文件大小为 10GB,而本机内存只有 1GB。如何对文件内容进行排序?
由于内存限制,我们无法一次性将文件读入内存进行排序。解决方法:
中间问题:有序小文件合并为有序大文件
假设我们有 100 个小文件,每个文件的大小是 100MB,每个文件中存储的都是有序的字符串。我们如何将这些 100 个小文件合并成一个有序的大文件?
解决方法:使用优先队列(小顶堆)进行有序序列的多路归并。
| 步骤 | 时间复杂度 |
|---|---|
| 从 100 个文件各取一个字符串,放入数组并建小顶堆。 | |
| 弹出堆顶元素,放入大文件中。 | |
| 再从堆顶元素所属的文件中取出字符串插入小顶堆 |
多路归并的过程可以找中位数。
相关算法题目:
根据集合的特点,将 Top K 问题分成两类:
Top K 问题可以的狭义理解可以理解为:
适合数据量小的数据集合。
在一个包含 n 个数据的静态数组中,查找前 K 大数据。
ME:小堆装大数,让大的下沉保留。
| 步骤 | 时间复杂度 |
|---|---|
| 维护一个大小为 K 的小顶堆 | |
| 顺序遍历数组 | |
| - 如果比堆顶元素大,我们就把堆顶元素删除,并且将这个元素插入到堆中 | |
| - 如果比堆顶元素小,则不做处理,继续遍历数组。 |
这样等数组中的数据都遍历完之后,堆中的数据就是前 K 大数据了。每次查询花费 。
对于数据量小的静态数据,可以使用快速排序解决问题。
要想知道实时 Top K,需要进行两个操作:
如果查询 Top K 时使用静态数据集合的方法,那么每次查询将花费 。
更高效的步骤:
| 步骤 | 时间复杂度 |
|---|---|
| 如果一开始没建堆,则维护一个大小为 K 的小顶堆 | |
| 当有数据被添加到集合中时,我们就拿它与堆顶的元素对比 | - |
| - 如果比堆顶元素大,我们就把堆顶元素删除,并且将这个元素插入到堆中 | |
| - 如果比堆顶元素小,则不做处理 |
使用有序数组维护 Top K 列表不会更加高效
使用有序数组维护 Top K 列表并不比堆高效。
相对于有序数组而言,堆的主要优势在于插入和删除数据效率较高。
相似问题:巨型数据集合 Top K
100w 个数中找出最大的 K 个数。
我们可以沿用使用堆处理动态数据集合 Top K 方法:
改进版的快速排序算法不会比堆高效
采用快速排序的思想,每次分割之后只考虑比轴大的一部分,知道比轴大的一部分在比 K 多的时候,采用传统排序算法排序,取前 K 个。
时间复杂度:
求一个大文件中的 Top K 关键词
现有一个包含 10 亿个关键词的日志文件,可用内存为 1G。求 Top 10 频数最多的关键词。
对应的 Top 1 问题:在海量数据中找出重复次数最多的一个关键词。
对应的 Top N 问题:词频排序。
步骤:
求分布在不同文件中的 Top K 关键词
现有多个不同的存储关键词的文件,每个关键词可能分布于多个文件中。求不同文件中的 Top K 关键词。
相似问法:不同机器中的 Top K 关键词
在前一个问题中,我们使用哈希算法取模分片保证了相同的词只会放在同一个小文件中。本问题稍微有些不同:一开始每个关键词可能分布于多个文件中。
解决方法:
静态数据的中位数是固定的,我们可以先排序,再直接取。对于动态数据集合,如果每次查询中位数前都要排序则效率不高。
正确的方法为利用两个堆:大顶堆中存储前半部分数据,小顶堆中存储后半部分数据,且小顶堆中的数据都大于大顶堆中的数据。

元素动态添加时:
查询中位数前,需保证大顶堆元素和小顶堆元素数量比例正确:
取出中位数的方式 :
如果要求任意百分位的数,原理是相似的。
快速求接口的 99% 响应时间
如果将一组数据从小到大排列,这个 99 百分位数就是大于前面 99% 数据的那个数据。
做法:维护两个堆,一个大顶堆,一个小顶堆。假设当前总数据的个数是 n,大顶堆中保存 n⨯99% 个数据,小顶堆中保存 n⨯1% 个数据。数据的插入和查询前的调整规则类似前面中位数的要求。最后,每次查询大顶堆堆顶的数据就是我们要找的 99% 响应时间。
从海量整数中找到中位数
求 5 亿个 int 的中位数。
步骤:
如果整数的范围更大,我们可以进行多层次的划分,使每个区域降到可接受的程度。
适用范围:大数据量的增删改查
基本原理及要点:利用数据的设计实现方法,对海量数据的增删改查进行处理。
适用范围:搜索引擎,关键字查询。
倒排索引是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。
1 | # 下面是被索引的文本 |
正向索引开发出来用来存储每个文档的单词的列表。正向索引的查询往往满足每个文档有序频繁的全文查询和每个单词在校验文档中的验证这样的查询。在正向索引中,文档占据了中心的位置,每个文档指向了一个它所包含的索引项的序列。也就是说文档指向了它包含的那些单词,而反向索引则是单词指向了包含它的文档,很容易看到这个反向的关系。
常见问题:文档检索系统,查询那些文件包含了某单词,比如常见的学术论文的关键字搜索。
可以看成大量数据被分为小文件的场景。
类似归并排序。
MapReduce 是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。
任务被分解后,可以通过大量机器进行并行计算,减少整个操作的时间。
相关问题:
多机器的海量数据查找中位数
一共有 N 个机器,每个机器上有 N 个数。每个机器最多存 个数并对它们操作。如何找到 个数的中位数?
方法 1:分片统计法
方案 2:
本文为面试笔记整理。以前看八股总是随缘,没有系统的整理。现在秋招,正好有机会把各种八股和以前学过的东西都串联起来,给笔记清清灰。
看到海量数据的处理问题,可以按以下思想考虑:
本文将针对处理海量数据的不同场景,引出相应的数据结构或算法:
需要注意的是。对于海量数据的处理,我们会综合使用多种数据结构进行处理,每一种数据结构不一定只会解决同一种问题。
哈希映射的特点就是,同一个关键字将映射到相同的位置。
找出两个巨大文件的共同的关键字
给定 a、b 两个文件,各存放 50 亿个关键字,每个关键字各占 64 字节,内存限制是 4G,找出 a、b 文件共同的关键字。
步骤:
a[i];将文件 b 中的关键字通过哈希映射到 1000 个小文件,每个文件记为 b[i]。a[i] 或 b[i] 中。i 求相同关键字:
a[i] 文件中的关键字放入哈希表 H 中;b[i] 逐个关键字 k 判断是否在哈希表 H 中;k 在 H 中出现,那么将 k 加入结果中。如果判重允许一定错误率,可考虑布隆过滤器。
哈希 Map、字典树可以对小型集合的数据进行去重。
Trie 树适合数据量大,重复多,但是数据种类小可以放进内存的情景。
对 1000 万字符串进行去重
对 1000 万字符串进行去重
步骤:
位图是一种特殊的散列表。
统计大文件中不同数字的个数
已知某个文件内包含一些数字号码,每个号码为 8 位数字,统计不同号码的个数。
解法:使用 Bit-map,从 0-99999999 的数字,每个数字对应一个 Bit 位。
找出不重复的整数的个数
2.5 亿个整数中找出不重复的整数的个数,内存空间不足以容纳这 2.5 亿个整数。
解法 1:
解法 2:
使用位图判断存在性
给 40 亿个不重复的 unsigned int 的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那 40 亿个数当中?
解决方案:使用位图申请 512M 的内存,一个 bit 位代表一个 unsigned int 值。读入 40 亿个数,设置相应的 bit 位,读入要查询的数,查看相应 bit 位是否为 1,为 1 表示存在,为 0 表示不存在。
布隆过滤器基于位图。
它的数据结构由两部分组成:
优缺点:
Counting Bloom Filter 解决布隆过滤器无法删除的弊端
Counting Bloom Filter 将标准 Bloom Filter 位数组的每一位扩展为一个小的计数器(Counter):

Counting Bloom Filter 通过多占用几倍的存储空间的代价, 给 Bloom Filter 增加了删除操作。
看图读原理:

使用场景:
核心思想:将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。
假设要排序的对象有 n 个,划分到 m 个桶中。时间复杂度 :
桶排序对要排序数据的要求是非常苛刻:
桶排序适合用在外部排序中。
海量订单数据的排序
假设有 10GB 的订单金额数据需要排序,金额均为正整数,但我们的内存只有 500MB。应该如何排序?
步骤:
解决订单不均匀分布:
计数排序是由额外空间的辅助和元素本身的值决定的。 计数排序过程中不存在元素之间的比较和交换操作, 根据元素本身的值, 将每个元素出现的次数记录到辅助空间后, 通过对辅助空间内数据的计算, 即可确定每一个元素最终的位置。
计数排序是稳定的。
算法过程:
从某些角度来看,计数排序是桶排序的特殊情况。相当于同一个元素值放到 1 个桶中。
根据年龄给 100 万用户排序
假设年龄的范围最小 1 岁,最大不超过 120 岁,请根据年龄给 100 万用户排序。
我们可以遍历这 100 万用户,根据年龄将其划分到这 120 个桶里,然后依次顺序遍历这 120 个桶中的元素。这样就得到了按照年龄排序的 100 万用户数据。
同类问题:按照成绩给 50 万考生排序。
1 | COUNTING-SORT(A,B,k) |
案例:计数排序
以输入数组 [95,94,91,98,99,93,91,92] 为例。

复杂度分析:
计数排序适用于数据范围 k 不大的场景中。计数排序只能给非负整数排序,如果要排序的数据是其他类型的,要将其在不改变相对大小的情况下,转化为非负整数。
基数排序是一种非比较型整数排序算法,它是基于关键字各位大小来排序。它的基本思想是将整数按位数切割成不同的数字,然后按每个位数分别比较。
设长度为 n 的线性表中每个结点 的关键字由 d 元组 组成
对于不等长的排序数据,可以对数据前/后进行补齐。
算法:
基数排序是稳定的排序算法。
基数排序一般使用 LSD 对数据进行排序的原因
因为数字大小本身就是高位的权重更大,排序轮数越靠后,相当于其权重越高。
可以使用 MSD,不过会更加复杂。使用 MSD 时,需要按照高位分桶。每个桶继续分小桶,形成递归。
时间复杂度:
空间效率:
基数排序适用于对整数或可以表示为固定长度数字序列的对象进行排序。特别是当待排序的数据范围比较固定,且位数相对较少时,它的效率很高:
本小节整理自笔记,更具体的证明与性质详看本地知识库。
(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树。
二叉堆的两种形式:
我的简记:小顶堆装大数、大顶堆装小数。
对堆(大顶堆)操作算法快速回忆:
| 堆的操作 | 时间复杂度 | 算法概述 |
|---|---|---|
| 堆化 | 对一个结点进行「下沉」 | |
| 建堆 | 从中间往前,进行堆化 | |
| 弹出堆顶 | 弹出后,最后一个元素放堆顶,再堆化,防止空洞 | |
| 插入堆 | 放最后,「上浮」 | |
| 更新堆键值 | 更新键后,「上浮」 | |
| 堆排序 | 建堆;一个个弹出。原址排序的话,弹出位置放堆后,堆大小减减即可。 |
思想:如果能把原待排序的数组分解成若干个待排序的子数组,而这些子数组可以方便地排好序,并且通过合并这些子数组的解将能得到原问题的解,则整个数组将排好序。
2 路归并排序通过应用分治法解题的三个基本步骤为:
归并排序不能保证一趟结束后一定有元素放在最终位置上。可以说是基本算法中占用辅助空间最多的排序算法。有方法克服但代价是算法会很复杂,且时间复杂度会增加。
归并排序是一种稳定的算法。平均时间复杂度为 的稳定排序算法只有归并排序。
从单个记录起两两归并的做法不提倡,可以和直接插入排序结合,利用直接插入排序求得较长的有序文件,然后两两归并(两种算法都是稳定的排序算法,结合起来也是稳定的)。
归并排序一般用于外部排序使用。
外部排序在排序过程中根据要求不断在内、外存之间移动。
外部排序使用归并排序法:
磁盘 I/O 优化方法——减少排序趟数:
大文件排序
假定现在有一包含大量整数的文本文件存放于磁盘中,其文件大小为 10GB,而本机内存只有 1GB。如何对文件内容进行排序?
由于内存限制,我们无法一次性将文件读入内存进行排序。解决方法:
中间问题:有序小文件合并为有序大文件
假设我们有 100 个小文件,每个文件的大小是 100MB,每个文件中存储的都是有序的字符串。我们如何将这些 100 个小文件合并成一个有序的大文件?
解决方法:使用优先队列(小顶堆)进行有序序列的多路归并。
| 步骤 | 时间复杂度 |
|---|---|
| 从 100 个文件各取一个字符串,放入数组并建小顶堆。 | |
| 弹出堆顶元素,放入大文件中。 | |
| 再从堆顶元素所属的文件中取出字符串插入小顶堆 |
多路归并的过程可以找中位数。
相关算法题目:
根据集合的特点,将 Top K 问题分成两类:
Top K 问题可以的狭义理解可以理解为:
适合数据量小的数据集合。
在一个包含 n 个数据的静态数组中,查找前 K 大数据。
ME:小堆装大数,让大的下沉保留。
| 步骤 | 时间复杂度 |
|---|---|
| 维护一个大小为 K 的小顶堆 | |
| 顺序遍历数组 | |
| - 如果比堆顶元素大,我们就把堆顶元素删除,并且将这个元素插入到堆中 | |
| - 如果比堆顶元素小,则不做处理,继续遍历数组。 |
这样等数组中的数据都遍历完之后,堆中的数据就是前 K 大数据了。每次查询花费 。
对于数据量小的静态数据,可以使用快速排序解决问题。
要想知道实时 Top K,需要进行两个操作:
如果查询 Top K 时使用静态数据集合的方法,那么每次查询将花费 。
更高效的步骤:
| 步骤 | 时间复杂度 |
|---|---|
| 如果一开始没建堆,则维护一个大小为 K 的小顶堆 | |
| 当有数据被添加到集合中时,我们就拿它与堆顶的元素对比 | - |
| - 如果比堆顶元素大,我们就把堆顶元素删除,并且将这个元素插入到堆中 | |
| - 如果比堆顶元素小,则不做处理 |
使用有序数组维护 Top K 列表不会更加高效
使用有序数组维护 Top K 列表并不比堆高效。
相对于有序数组而言,堆的主要优势在于插入和删除数据效率较高。
相似问题:巨型数据集合 Top K
100w 个数中找出最大的 K 个数。
我们可以沿用使用堆处理动态数据集合 Top K 方法:
改进版的快速排序算法不会比堆高效
采用快速排序的思想,每次分割之后只考虑比轴大的一部分,知道比轴大的一部分在比 K 多的时候,采用传统排序算法排序,取前 K 个。
时间复杂度:
求一个大文件中的 Top K 关键词
现有一个包含 10 亿个关键词的日志文件,可用内存为 1G。求 Top 10 频数最多的关键词。
对应的 Top 1 问题:在海量数据中找出重复次数最多的一个关键词。
对应的 Top N 问题:词频排序。
步骤:
求分布在不同文件中的 Top K 关键词
现有多个不同的存储关键词的文件,每个关键词可能分布于多个文件中。求不同文件中的 Top K 关键词。
相似问法:不同机器中的 Top K 关键词
在前一个问题中,我们使用哈希算法取模分片保证了相同的词只会放在同一个小文件中。本问题稍微有些不同:一开始每个关键词可能分布于多个文件中。
解决方法:
静态数据的中位数是固定的,我们可以先排序,再直接取。对于动态数据集合,如果每次查询中位数前都要排序则效率不高。
正确的方法为利用两个堆:大顶堆中存储前半部分数据,小顶堆中存储后半部分数据,且小顶堆中的数据都大于大顶堆中的数据。

元素动态添加时:
查询中位数前,需保证大顶堆元素和小顶堆元素数量比例正确:
取出中位数的方式 :
如果要求任意百分位的数,原理是相似的。
快速求接口的 99% 响应时间
如果将一组数据从小到大排列,这个 99 百分位数就是大于前面 99% 数据的那个数据。
做法:维护两个堆,一个大顶堆,一个小顶堆。假设当前总数据的个数是 n,大顶堆中保存 n⨯99% 个数据,小顶堆中保存 n⨯1% 个数据。数据的插入和查询前的调整规则类似前面中位数的要求。最后,每次查询大顶堆堆顶的数据就是我们要找的 99% 响应时间。
从海量整数中找到中位数
求 5 亿个 int 的中位数。
步骤:
如果整数的范围更大,我们可以进行多层次的划分,使每个区域降到可接受的程度。
适用范围:大数据量的增删改查
基本原理及要点:利用数据的设计实现方法,对海量数据的增删改查进行处理。
适用范围:搜索引擎,关键字查询。
倒排索引是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。
1 | # 下面是被索引的文本 |
正向索引开发出来用来存储每个文档的单词的列表。正向索引的查询往往满足每个文档有序频繁的全文查询和每个单词在校验文档中的验证这样的查询。在正向索引中,文档占据了中心的位置,每个文档指向了一个它所包含的索引项的序列。也就是说文档指向了它包含的那些单词,而反向索引则是单词指向了包含它的文档,很容易看到这个反向的关系。
常见问题:文档检索系统,查询那些文件包含了某单词,比如常见的学术论文的关键字搜索。
可以看成大量数据被分为小文件的场景。
类似归并排序。
MapReduce 是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。
任务被分解后,可以通过大量机器进行并行计算,减少整个操作的时间。
相关问题:
多机器的海量数据查找中位数
一共有 N 个机器,每个机器上有 N 个数。每个机器最多存 个数并对它们操作。如何找到 个数的中位数?
方法 1:分片统计法
方案 2: