Skip to content

Commit

Permalink
docs: format document with prettier
Browse files Browse the repository at this point in the history
全面整理项目内容,可读性更佳
  • Loading branch information
yanglbme committed Sep 24, 2020
1 parent ffb727b commit dd27407
Show file tree
Hide file tree
Showing 85 changed files with 1,072 additions and 922 deletions.
202 changes: 100 additions & 102 deletions README.md

Large diffs are not rendered by default.

24 changes: 12 additions & 12 deletions docs/big-data/README.md
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
# 海量数据处理

* [如何从大量的 URL 中找出相同的 URL?](/docs/big-data/find-common-urls.md)
* [如何从大量数据中找出高频词?](/docs/big-data/find-top-100-words.md)
* [如何找出某一天访问百度网站最多的 IP?](/docs/big-data/find-top-1-ip.md)
* [如何在大量的数据中找出不重复的整数?](/docs/big-data/find-no-repeat-number.md)
* [如何在大量的数据中判断一个数是否存在?](/docs/big-data/find-a-number-if-exists.md)
* [如何查询最热门的查询串?](/docs/big-data/find-hotest-query-string.md)
* [如何统计不同电话号码的个数?](/docs/big-data/count-different-phone-numbers.md)
* [如何从 5 亿个数中找出中位数?](/docs/big-data/find-mid-value-in-500-millions.md)
* [如何按照 query 的频度排序?](/docs/big-data/sort-the-query-strings-by-counts.md)
* [如何找出排名前 500 的数?](/docs/big-data/find-rank-top-500-numbers.md)
- [如何从大量的 URL 中找出相同的 URL?](/docs/big-data/find-common-urls.md)
- [如何从大量数据中找出高频词?](/docs/big-data/find-top-100-words.md)
- [如何找出某一天访问百度网站最多的 IP?](/docs/big-data/find-top-1-ip.md)
- [如何在大量的数据中找出不重复的整数?](/docs/big-data/find-no-repeat-number.md)
- [如何在大量的数据中判断一个数是否存在?](/docs/big-data/find-a-number-if-exists.md)
- [如何查询最热门的查询串?](/docs/big-data/find-hotest-query-string.md)
- [如何统计不同电话号码的个数?](/docs/big-data/count-different-phone-numbers.md)
- [如何从 5 亿个数中找出中位数?](/docs/big-data/find-mid-value-in-500-millions.md)
- [如何按照 query 的频度排序?](/docs/big-data/sort-the-query-strings-by-counts.md)
- [如何找出排名前 500 的数?](/docs/big-data/find-rank-top-500-numbers.md)

---

## 公众号

GitHub 技术社区 [Doocs](https://github.com/doocs) 旗下唯一公众号「**Doocs开源社区**」​,欢迎扫码关注,**专注分享技术领域相关知识及行业最新资讯**。当然,也可以加我个人微信(备注:GitHub),拉你进技术交流群。
GitHub 技术社区 [Doocs](https://github.com/doocs) 旗下唯一公众号「**Doocs 开源社区**」​,欢迎扫码关注,**专注分享技术领域相关知识及行业最新资讯**。当然,也可以加我个人微信(备注:GitHub),拉你进技术交流群。

关注「**Doocs开源社区**」公众号,回复 **PDF**,即可获取本项目离线 PDF 文档(283 页精华),学习更加方便!
关注「**Doocs 开源社区**」公众号,回复 **PDF**,即可获取本项目离线 PDF 文档(283 页精华),学习更加方便!

![](./images/pdf.png)

Expand Down
1 change: 1 addition & 0 deletions docs/big-data/find-a-number-if-exists.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
### 解答思路

#### 方法一:分治法

依然可以用分治法解决,方法与前面类似,就不再次赘述了。

#### 方法二:位图法
Expand Down
6 changes: 3 additions & 3 deletions docs/big-data/find-common-urls.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,17 @@

### 解答思路

每个 URL 占 64B,那么 50 亿个 URL占用的空间大小约为 320GB。
每个 URL 占 64B,那么 50 亿个 URL 占用的空间大小约为 320GB。

> 5, 000, 000, 000 * 64B ≈ 5GB * 64 = 320GB
> 5, 000, 000, 000 _ 64B ≈ 5GB _ 64 = 320GB
由于内存大小只有 4G,因此,我们不可能一次性把所有 URL 加载到内存中处理。对于这种类型的题目,一般采用**分治策略**,即:把一个文件中的 URL 按照某个特征划分为多个小文件,使得每个小文件大小不超过 4G,这样就可以把这个小文件读到内存中进行处理了。

**思路如下**

首先遍历文件 a,对遍历到的 URL 求 `hash(URL) % 1000` ,根据计算结果把遍历到的 URL 存储到 a<sub>0</sub>, a<sub>1</sub>, a<sub>2</sub>, ..., a<sub>999</sub>,这样每个大小约为 300MB。使用同样的方法遍历文件 b,把文件 b 中的 URL 分别存储到文件 b<sub>0</sub>, b<sub>1</sub>, b<sub>2</sub>, ..., b<sub>999</sub> 中。这样处理过后,所有可能相同的 URL 都在对应的小文件中,即 a<sub>0</sub> 对应 b<sub>0</sub>, ..., a<sub>999</sub> 对应 b<sub>999</sub>,不对应的小文件不可能有相同的 URL。那么接下来,我们只需要求出这 1000 对小文件中相同的 URL 就好了。

接着遍历 a<sub>i</sub>( `i∈[0,999]` ),把 URL 存储到一个 HashSet 集合中。然后遍历 b<sub>i</sub> 中每个 URL,看在 HashSet 集合中是否存在,若存在,说明这就是共同的 URL,可以把这个 URL 保存到一个单独的文件中。
接着遍历 a<sub>i</sub>( `i∈[0,999]` ),把 URL 存储到一个 HashSet 集合中。然后遍历 b<sub>i</sub> 中每个 URL,看在 HashSet 集合中是否存在,若存在,说明这就是共同的 URL,可以把这个 URL 保存到一个单独的文件中。

### 方法总结

Expand Down
2 changes: 1 addition & 1 deletion docs/big-data/find-hotest-query-string.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

#### 方法二:HashMap 法

虽然字符串总数比较多,但去重后不超过 300w,因此,可以考虑把所有字符串及出现次数保存在一个 HashMap 中,所占用的空间为 300w*(255+4)≈777M(其中,4表示整数占用的4个字节)。由此可见,1G 的内存空间完全够用。
虽然字符串总数比较多,但去重后不超过 300w,因此,可以考虑把所有字符串及出现次数保存在一个 HashMap 中,所占用的空间为 300w\*(255+4)≈777M(其中,4 表示整数占用的 4 个字节)。由此可见,1G 的内存空间完全够用。

**思路如下**

Expand Down
14 changes: 7 additions & 7 deletions docs/big-data/find-mid-value-in-500-millions.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@

若数据总数为**偶数**,当这两个堆建好之后,**中位数就是这两个堆顶元素的平均值**。当数据总数为**奇数**时,根据两个堆的大小,**中位数一定在数据多的堆的堆顶**

``` java
```java
class MedianFinder {

private PriorityQueue<Integer> maxHeap;
private PriorityQueue<Integer> minHeap;

Expand All @@ -25,14 +25,14 @@ class MedianFinder {
maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
minHeap = new PriorityQueue<>(Integer::compareTo);
}

public void addNum(int num) {
if (maxHeap.isEmpty() || maxHeap.peek() > num) {
maxHeap.offer(num);
} else {
minHeap.offer(num);
}

int size1 = maxHeap.size();
int size2 = minHeap.size();
if (size1 - size2 > 1) {
Expand All @@ -41,12 +41,12 @@ class MedianFinder {
maxHeap.offer(minHeap.poll());
}
}

public double findMedian() {
int size1 = maxHeap.size();
int size2 = minHeap.size();
return size1 == size2

return size1 == size2
? (maxHeap.peek() + minHeap.peek()) * 1.0 / 2
: (size1 > size2 ? maxHeap.peek() : minHeap.peek());
}
Expand Down
17 changes: 9 additions & 8 deletions docs/big-data/find-no-repeat-number.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
### 解答思路

#### 方法一:分治法

与前面的题目方法类似,先将 2.5 亿个数划分到多个小文件,用 HashSet/HashMap 找出每个小文件中不重复的整数,再合并每个子结果,即为最终结果。

#### 方法二:位图法
Expand All @@ -17,25 +18,25 @@

假设我们要对 `[0,7]` 中的 5 个元素 (6, 4, 2, 1, 5) 进行排序,可以采用位图法。0~7 范围总共有 8 个数,只需要 8bit,即 1 个字节。首先将每个位都置 0:

```
```
0 0 0 0 0 0 0 0
```

然后遍历 5 个元素,首先遇到 6,那么将下标为 6 的位的 0 置为 1;接着遇到 4,把下标为 4 的位 的 0 置为 1:

```
```
0 0 0 0 1 0 1 0
```

依次遍历,结束后,位数组是这样的:

```
```
0 1 1 0 1 1 1 0
```

每个为 1 的位,它的下标都表示了一个数:

```
```
for i in range(8):
if bits[i] == 1:
print(i)
Expand All @@ -47,11 +48,11 @@ for i in range(8):

**那么对于这道题**,我们用 2 个 bit 来表示各个数字的状态:

* 00 表示这个数字没出现过;
* 01 表示这个数字出现过一次(即为题目所找的不重复整数);
* 10 表示这个数字出现了多次。
- 00 表示这个数字没出现过;
- 01 表示这个数字出现过一次(即为题目所找的不重复整数);
- 10 表示这个数字出现了多次。

那么这 2<sup>32</sup> 个整数,总共所需内存为 2<sup>32</sup>*2b=1GB。因此,当可用内存超过 1GB 时,可以采用位图法。假设内存满足位图法需求,进行下面的操作:
那么这 2<sup>32</sup> 个整数,总共所需内存为 2<sup>32</sup>\*2b=1GB。因此,当可用内存超过 1GB 时,可以采用位图法。假设内存满足位图法需求,进行下面的操作:

遍历 2.5 亿个整数,查看位图中对应的位,如果是 00,则变为 01,如果是 01 则变为 10,如果是 10 则保持不变。遍历结束后,查看位图,把对应位是 01 的整数输出即可。

Expand Down
4 changes: 2 additions & 2 deletions docs/big-data/find-rank-top-500-numbers.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

### 题目描述

有 20 个数组,每个数组有 500 个元素,并且有序排列。如何在这 20*500 个数中找出前 500 的数?
有 20 个数组,每个数组有 500 个元素,并且有序排列。如何在这 20\*500 个数中找出前 500 的数?

### 解答思路

Expand All @@ -16,7 +16,7 @@

> 为了在堆中取出一个数据后,能知道它是从哪个数组中取出的,从而可以从这个数组中取下一个值,可以把数组的指针存放到堆中,对这个指针提供比较大小的方法。
``` java
```java
import lombok.Data;

import java.util.Arrays;
Expand Down
2 changes: 1 addition & 1 deletion docs/big-data/find-top-100-words.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

**思路如下**

首先遍历大文件,对遍历到的每个词x,执行 `hash(x) % 5000` ,将结果为 i 的词存放到文件 a<sub>i</sub> 中。遍历结束后,我们可以得到 5000 个小文件。每个小文件的大小为 200KB 左右。如果有的小文件大小仍然超过 1MB,则采用同样的方式继续进行分解。
首先遍历大文件,对遍历到的每个词 x,执行 `hash(x) % 5000` ,将结果为 i 的词存放到文件 a<sub>i</sub> 中。遍历结束后,我们可以得到 5000 个小文件。每个小文件的大小为 200KB 左右。如果有的小文件大小仍然超过 1MB,则采用同样的方式继续进行分解。

接着统计每个小文件中出现频数最高的 100 个词。最简单的方式是使用 HashMap 来实现。其中 key 为词,value 为该词出现的频率。具体方法是:对于遍历到的词 x,如果在 map 中不存在,则执行 `map.put(x, 1)` ;若存在,则执行 `map.put(x, map.get(x)+1)` ,将该词频数加 1。

Expand Down
4 changes: 2 additions & 2 deletions docs/big-data/sort-the-query-strings-by-counts.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@

### 方法总结

* 内存若够,直接读入进行排序;
* 内存不够,先划分为小文件,小文件排好序后,整理使用外排序进行归并。
- 内存若够,直接读入进行排序;
- 内存不够,先划分为小文件,小文件排好序后,整理使用外排序进行归并。
32 changes: 16 additions & 16 deletions docs/distributed-system/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,40 +4,40 @@

## 系统拆分

* [为什么要进行系统拆分?如何进行系统拆分?拆分后不用 Dubbo 可以吗?](/docs/distributed-system/why-dubbo.md)
- [为什么要进行系统拆分?如何进行系统拆分?拆分后不用 Dubbo 可以吗?](/docs/distributed-system/why-dubbo.md)

## 分布式服务框架

* [说一下 Dubbo 的工作原理?注册中心挂了可以继续通信吗?](/docs/distributed-system/dubbo-operating-principle.md)
* [Dubbo 支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的?](/docs/distributed-system/dubbo-serialization-protocol.md)
* [Dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢?](/docs/distributed-system/dubbo-load-balancing.md)
* [Dubbo 的 SPI 思想是什么?](/docs/distributed-system/dubbo-spi.md)
* [如何基于 Dubbo 进行服务治理、服务降级、失败重试以及超时重试?](/docs/distributed-system/dubbo-service-management.md)
* [分布式服务接口的幂等性如何设计(比如不能重复扣款)?](/docs/distributed-system/distributed-system-idempotency.md)
* [分布式服务接口请求的顺序性如何保证?](/docs/distributed-system/distributed-system-request-sequence.md)
* [如何自己设计一个类似 Dubbo 的 RPC 框架?](/docs/distributed-system/dubbo-rpc-design.md)
* [CAP定理的P是什么](/docs/distributed-system/distributed-system-cap.md)
- [说一下 Dubbo 的工作原理?注册中心挂了可以继续通信吗?](/docs/distributed-system/dubbo-operating-principle.md)
- [Dubbo 支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的?](/docs/distributed-system/dubbo-serialization-protocol.md)
- [Dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢?](/docs/distributed-system/dubbo-load-balancing.md)
- [Dubbo 的 SPI 思想是什么?](/docs/distributed-system/dubbo-spi.md)
- [如何基于 Dubbo 进行服务治理、服务降级、失败重试以及超时重试?](/docs/distributed-system/dubbo-service-management.md)
- [分布式服务接口的幂等性如何设计(比如不能重复扣款)?](/docs/distributed-system/distributed-system-idempotency.md)
- [分布式服务接口请求的顺序性如何保证?](/docs/distributed-system/distributed-system-request-sequence.md)
- [如何自己设计一个类似 Dubbo 的 RPC 框架?](/docs/distributed-system/dubbo-rpc-design.md)
- [CAP 定理的 P 是什么](/docs/distributed-system/distributed-system-cap.md)

## 分布式锁

* [Zookeeper 都有哪些应用场景?](/docs/distributed-system/zookeeper-application-scenarios.md)
* [使用 Redis 如何设计分布式锁?使用 Zookeeper 来设计分布式锁可以吗?以上两种分布式锁的实现方式哪种效率比较高?](/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md)
- [Zookeeper 都有哪些应用场景?](/docs/distributed-system/zookeeper-application-scenarios.md)
- [使用 Redis 如何设计分布式锁?使用 Zookeeper 来设计分布式锁可以吗?以上两种分布式锁的实现方式哪种效率比较高?](/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md)

## 分布式事务

* [分布式事务了解吗?你们如何解决分布式事务问题的?TCC 如果出现网络连不通怎么办?XA 的一致性如何保证?](/docs/distributed-system/distributed-transaction.md)
- [分布式事务了解吗?你们如何解决分布式事务问题的?TCC 如果出现网络连不通怎么办?XA 的一致性如何保证?](/docs/distributed-system/distributed-transaction.md)

## 分布式会话

* [集群部署时的分布式 Session 如何实现?](/docs/distributed-system/distributed-session.md)
- [集群部署时的分布式 Session 如何实现?](/docs/distributed-system/distributed-session.md)

---

## 公众号

GitHub 技术社区 [Doocs](https://github.com/doocs) 旗下唯一公众号「**Doocs开源社区**」​,欢迎扫码关注,**专注分享技术领域相关知识及行业最新资讯**。当然,也可以加我个人微信(备注:GitHub),拉你进技术交流群。
GitHub 技术社区 [Doocs](https://github.com/doocs) 旗下唯一公众号「**Doocs 开源社区**」​,欢迎扫码关注,**专注分享技术领域相关知识及行业最新资讯**。当然,也可以加我个人微信(备注:GitHub),拉你进技术交流群。

关注「**Doocs开源社区**」公众号,回复 **PDF**,即可获取本项目离线 PDF 文档(283 页精华),学习更加方便!
关注「**Doocs 开源社区**」公众号,回复 **PDF**,即可获取本项目离线 PDF 文档(283 页精华),学习更加方便!

![](./images/pdf.png)

Expand Down
Loading

0 comments on commit dd27407

Please sign in to comment.