Skip to content

Commit dd27407

Browse files
committed
docs: format document with prettier
全面整理项目内容,可读性更佳
1 parent ffb727b commit dd27407

File tree

85 files changed

+1072
-922
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+1072
-922
lines changed

Diff for: README.md

+100-102
Large diffs are not rendered by default.

Diff for: docs/big-data/README.md

+12-12
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
# 海量数据处理
22

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

1414
---
1515

1616
## 公众号
1717

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

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

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

Diff for: docs/big-data/find-a-number-if-exists.md

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
### 解答思路
88

99
#### 方法一:分治法
10+
1011
依然可以用分治法解决,方法与前面类似,就不再次赘述了。
1112

1213
#### 方法二:位图法

Diff for: docs/big-data/find-common-urls.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@
66

77
### 解答思路
88

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

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

1515
**思路如下**
1616

1717
首先遍历文件 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 就好了。
1818

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

2121
### 方法总结
2222

Diff for: docs/big-data/find-hotest-query-string.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
#### 方法二:HashMap 法
2222

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

2525
**思路如下**
2626

Diff for: docs/big-data/find-mid-value-in-500-millions.md

+7-7
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414

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

17-
``` java
17+
```java
1818
class MedianFinder {
19-
19+
2020
private PriorityQueue<Integer> maxHeap;
2121
private PriorityQueue<Integer> minHeap;
2222

@@ -25,14 +25,14 @@ class MedianFinder {
2525
maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
2626
minHeap = new PriorityQueue<>(Integer::compareTo);
2727
}
28-
28+
2929
public void addNum(int num) {
3030
if (maxHeap.isEmpty() || maxHeap.peek() > num) {
3131
maxHeap.offer(num);
3232
} else {
3333
minHeap.offer(num);
3434
}
35-
35+
3636
int size1 = maxHeap.size();
3737
int size2 = minHeap.size();
3838
if (size1 - size2 > 1) {
@@ -41,12 +41,12 @@ class MedianFinder {
4141
maxHeap.offer(minHeap.poll());
4242
}
4343
}
44-
44+
4545
public double findMedian() {
4646
int size1 = maxHeap.size();
4747
int size2 = minHeap.size();
48-
49-
return size1 == size2
48+
49+
return size1 == size2
5050
? (maxHeap.peek() + minHeap.peek()) * 1.0 / 2
5151
: (size1 > size2 ? maxHeap.peek() : minHeap.peek());
5252
}

Diff for: docs/big-data/find-no-repeat-number.md

+9-8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
### 解答思路
88

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

1213
#### 方法二:位图法
@@ -17,25 +18,25 @@
1718

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

20-
```
21+
```
2122
0 0 0 0 0 0 0 0
2223
```
2324

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

26-
```
27+
```
2728
0 0 0 0 1 0 1 0
2829
```
2930

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

32-
```
33+
```
3334
0 1 1 0 1 1 1 0
3435
```
3536

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

38-
```
39+
```
3940
for i in range(8):
4041
if bits[i] == 1:
4142
print(i)
@@ -47,11 +48,11 @@ for i in range(8):
4748

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

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

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

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

Diff for: docs/big-data/find-rank-top-500-numbers.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
### 题目描述
44

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

77
### 解答思路
88

@@ -16,7 +16,7 @@
1616

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

2222
import java.util.Arrays;

Diff for: docs/big-data/find-top-100-words.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
**思路如下**
1212

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

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

Diff for: docs/big-data/sort-the-query-strings-by-counts.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@
2020

2121
### 方法总结
2222

23-
* 内存若够,直接读入进行排序;
24-
* 内存不够,先划分为小文件,小文件排好序后,整理使用外排序进行归并。
23+
- 内存若够,直接读入进行排序;
24+
- 内存不够,先划分为小文件,小文件排好序后,整理使用外排序进行归并。

Diff for: docs/distributed-system/README.md

+16-16
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,40 @@
44

55
## 系统拆分
66

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

99
## 分布式服务框架
1010

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

2121
## 分布式锁
2222

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

2626
## 分布式事务
2727

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

3030
## 分布式会话
3131

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

3434
---
3535

3636
## 公众号
3737

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

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

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

0 commit comments

Comments
 (0)