Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
9761a40
feat: create sync actions
yanglbme Mar 28, 2020
b413740
feat: update sync.yml
yanglbme Mar 28, 2020
16c1309
update docs/distributed-system/distributed-transaction.md.
yanwankun Mar 28, 2020
97e1005
fix:update docs/distributed-system/distributed-transaction.md.
yanglbme Mar 29, 2020
7a70e53
feat: update sync.yml
yanglbme Mar 29, 2020
70d7136
Fix typo
chenqimiao Mar 31, 2020
fa803c9
Polish Javadoc in LRUCache
chenqimiao Apr 1, 2020
bf8ab59
Polishing
chenqimiao Apr 1, 2020
d497fff
fix: update documents description
yanglbme Apr 4, 2020
ee7f18e
feat: update duplicate files and generate pagination
yanglbme Apr 5, 2020
fe95536
fix: add alias for summary document
yanglbme Apr 6, 2020
458181a
Fix typo
chenqimiao Apr 7, 2020
a5c30ac
fix: upgrade sync version
yanglbme Apr 11, 2020
c219012
docs: add sites for advanced-java project
yanglbme Apr 17, 2020
95a35f2
Polishing
chenqimiao Apr 18, 2020
421f9f1
Polishing
chenqimiao Apr 18, 2020
5e0a6fd
Fix missing word
chenqimiao Apr 19, 2020
2faab87
更正ShardingSphere和Sharding-JDBC之前的关系
ZhenghaeHo Apr 20, 2020
933a3ac
更正ShardingSphere和Sharding-JDBC之前的关系
chenqimiao Apr 20, 2020
d7756c7
docs: link redis-consistence.md to #54
yanglbme Apr 20, 2020
05e18a6
Update migrating-from-a-monolithic-architecture-to-a-microservices-ar…
tonywangcn Apr 21, 2020
954735a
Merge pull request #162 from tonywangcn/patch-1
yanglbme Apr 21, 2020
c4cad8a
fix: update why-cache.md
yanglbme Apr 26, 2020
baee77b
Update dubbo-serialization-protocol.md
ZhenghaeHo Apr 28, 2020
9e3699d
Update distributed-lock-redis-vs-zookeeper.md
ZhenghaeHo Apr 29, 2020
2d7423f
Update distributed-lock-redis-vs-zookeeper.md
ZhenghaeHo Apr 29, 2020
fc36ecc
Update distributed-lock-redis-vs-zookeeper.md
ZhenghaeHo Apr 29, 2020
66a8ff1
Update distributed-lock-redis-vs-zookeeper.md
ZhenghaeHo Apr 29, 2020
0efe120
Update distributed-lock-redis-vs-zookeeper.md
ZhenghaeHo Apr 29, 2020
d3c4fbe
docs: update distributed-lock-redis-vs-zookeeper.md
yanglbme Apr 30, 2020
e34548d
Merge pull request #163 from ZhenghaeHo/master
yanglbme Apr 30, 2020
d1e7119
feat: add markdown formatter
yanglbme May 6, 2020
36e13c9
Merge branch 'master' of github.com:doocs/advanced-java
yanglbme May 6, 2020
9e50672
feat: add `Edit on GitHub` button for pages
yanglbme May 6, 2020
a14b732
docs: fix typo in dubbo-load-balancing, close #165
yanglbme May 9, 2020
ce70118
fix: update documents about Redis
yanglbme May 9, 2020
1bb316e
fix: update documents about Redis and ElasticSearch
yanglbme May 9, 2020
6338744
Merge pull request #3 from doocs/master
May 9, 2020
7437371
add an article
May 9, 2020
32f9c08
fix picture display problem
May 9, 2020
ac7cdaa
Merge pull request #166 from lihangqi/master
yanglbme May 10, 2020
7f1e528
add CAP theorem
CarpCap May 14, 2020
e24a954
Merge pull request #167 from caiquan-github/distributed-system-cap
chenqimiao May 14, 2020
c50e14d
docs: update distributed-system-cap.md
yanglbme May 21, 2020
a0e7ac6
docs: update README.md
yanglbme May 31, 2020
3ae0429
feat: update index.html
yanglbme May 31, 2020
0bac5bc
docs: update README and index.html
yanglbme Jun 1, 2020
303a5c6
feat: update README.md
yanglbme Jun 12, 2020
b42c5b4
docs: update README.md
yanglbme Jun 12, 2020
c12ade2
docs: update README.md
yanglbme Jun 12, 2020
d109c3e
Merge branch 'master' of https://github.com/doocs/advanced-java
yanglbme Jun 16, 2020
cb033cf
fix: update index.html and README.md
yanglbme Jun 17, 2020
e041316
feat: update index and README
yanglbme Jun 18, 2020
18d5d4f
fix: update index.html
yanglbme Jun 18, 2020
ffeb346
补充 分布式事务解决方案Saga
AmyliaY Jun 27, 2020
4b5e79b
fix: update distributed-transaction.md
yanglbme Jun 27, 2020
84b0542
Merge branch 'master' into master
yanglbme Jun 27, 2020
109abf5
Merge pull request #171 from AmyliaY/master
yanglbme Jun 27, 2020
c1ea74b
[ImgBot] Optimize images
ImgBotApp Jun 27, 2020
e08c603
Merge pull request #172 from doocs/imgbot
chenqimiao Jun 27, 2020
7ca4222
docs: update redis-single-thread-model, close #176
yanglbme Jul 5, 2020
c27e0e6
fix: update index and README
yanglbme Jul 12, 2020
7066665
fix: update redis-production-environment.md
yanglbme Jul 19, 2020
50a8086
fix: update micro-services-technology-stack.md
yanglbme Jul 30, 2020
af79543
docs: update README.md
yanglbme Aug 2, 2020
3502c01
fix: update how-microservice-communicate
yanglbme Aug 11, 2020
cd3e2e0
Merge branch 'master' of github.com:doocs/advanced-java
yanglbme Aug 11, 2020
2c3b60e
fix: change to cdn resources
yanglbme Aug 13, 2020
a5c95cf
fix: update es-introduction.md
yanglbme Aug 22, 2020
b061955
fix: change urls to make export to pdf works
franklingu Aug 30, 2020
5f000b4
Merge pull request #185 from franklingu/patch-1
yanglbme Aug 30, 2020
7c1548e
feat: add plugin 'docsify-to-pdf-converter'(#185)
yanglbme Aug 30, 2020
1779798
fix: update README.md
yanglbme Aug 30, 2020
b0975ea
fix: update README.md
yanglbme Aug 30, 2020
17252a8
[ImgBot] Optimize images
ImgBotApp Aug 30, 2020
336aafe
Merge pull request #186 from doocs/imgbot
yanglbme Aug 30, 2020
c5ea4eb
docs: add redis-master-slave.md
yanglbme Sep 7, 2020
572fd3e
feat: add branch-merge action
yanglbme Sep 13, 2020
a38ffd0
fix: update dubbo-load-balancing(#190)
yanglbme Sep 16, 2020
ffb727b
feat: update dubbo-load-balancing
yanglbme Sep 17, 2020
dd27407
docs: format document with prettier
yanglbme Sep 24, 2020
33dcf1b
docs: improve docs and close #193
yanglbme Oct 2, 2020
e51b033
docs: improve document and close #194
yanglbme Oct 3, 2020
3d409e3
docs: improve document
yanglbme Oct 12, 2020
1df021f
feat: update sync workflow
yanglbme Oct 13, 2020
86683c3
Update distributed-system-cap.md
hai046 Oct 13, 2020
4f22be0
Update distributed-system-cap.md
hai046 Oct 13, 2020
ba2f131
Update distributed-system-cap.md
hai046 Oct 13, 2020
ecdbfed
docs: add cap framework(#196)
yanglbme Oct 13, 2020
ada8138
Merge pull request #196 from hai046/master
yanglbme Oct 13, 2020
cc4305c
feat: update mq-time-delay-and-expired-failure
yanglbme Oct 13, 2020
3a1c910
Merge branch 'master' of github.com:doocs/advanced-java
yanglbme Oct 13, 2020
7e226b9
feat: improve document
yanglbme Oct 15, 2020
7b706af
feat: improve document and close #199
yanglbme Oct 16, 2020
5f73bb3
feat: add if statement in sync workflow
yanglbme Oct 18, 2020
8e3bd40
feat: add prettier workflow
yanglbme Oct 20, 2020
9251cc4
Prettified Code!
yanglbme Oct 20, 2020
12695ba
feat: update prettier workflow
yanglbme Oct 20, 2020
0f58984
feat: improve document and update workflows
yanglbme Oct 21, 2020
9b3e1e2
docs: prettify code
yanglbme Oct 21, 2020
1fafc71
feat: improve README
yanglbme Oct 21, 2020
d8ae1ae
fix: update kafka offsets description
yanglbme Oct 26, 2020
d1c2a58
docs: add pangolin-tracing recommendation
yanglbme Oct 28, 2020
b255977
feat: minor changes in micro-services module
yanglbme Nov 4, 2020
26d0939
Merge branch 'master' of github.com:doocs/advanced-java
yanglbme Nov 4, 2020
b012de2
fix: update dubbo protocol and close #201
yanglbme Nov 11, 2020
aaa12b7
docs: update REAMDE file
yanglbme Nov 17, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .docsifytopdfrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module.exports = {
contents: ["summary.md"],
pathToPublic: "pdf/advanced-java.pdf",
pdfOptions: "<options for puppeteer.pdf()>",
removeTemp: true,
emulateMedia: "screen",
};
18 changes: 18 additions & 0 deletions .github/workflows/branch-merge.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: Merge Branch

on:
push:
branches: [ imgbot ]

jobs:
merge-branch:
runs-on: ubuntu-latest
if: github.repository == 'doocs/advanced-java'
steps:
- uses: actions/checkout@v2
- uses: everlytic/branch-merge@1.1.0
with:
github_token: ${{ github.token }}
source_ref: ${{ github.ref }}
target_branch: 'master'
commit_message_template: '[Automated] Merged {source_ref} into {target_branch}'
25 changes: 25 additions & 0 deletions .github/workflows/prettier.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Prettier

on:
pull_request:
push:
branches:
- master

jobs:
prettier:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v2
with:
ref: ${{ github.head_ref }}

- name: Prettify code
uses: creyD/prettier_action@v3.0
with:
prettier_options: --write **/*.{html,js,md}
commit_message: 'docs: prettify code'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
25 changes: 25 additions & 0 deletions .github/workflows/sync.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: Sync

on:
push:
branches: [ master ]

jobs:
build:
runs-on: ubuntu-latest
if: github.repository == 'doocs/advanced-java'
steps:
- name: Sync To Gitee
uses: wearerequired/git-mirror-action@master
env:
SSH_PRIVATE_KEY: ${{ secrets.GITEE_RSA_PRIVATE_KEY }}
with:
source-repo: git@github.com:doocs/advanced-java.git
destination-repo: git@gitee.com:Doocs/advanced-java.git

- name: Build Gitee Pages
uses: yanglbme/gitee-pages-action@master
with:
gitee-username: yanglbme
gitee-password: ${{ secrets.GITEE_PASSWORD }}
gitee-repo: doocs/advanced-java
44 changes: 43 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,44 @@

# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# production
/build

# misc
.DS_Store
.vscode
.env.local
.env.development.local
.env.test.local
.env.production.local
.vscode

npm-debug.log*
yarn-debug.log*
yarn-error.log*

dist
package-lock.json
lib

node_modules

# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Editor directories and files
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
142 changes: 102 additions & 40 deletions README.md

Large diffs are not rendered by default.

38 changes: 22 additions & 16 deletions docs/big-data/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# 海量数据处理

- [如何从大量的 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)
Expand All @@ -13,21 +14,26 @@
---

## 公众号
GitHub 技术社区 Doocs 旗下唯一公众号“Doocs 开源社区”,欢迎关注,专注于分享有价值的文章;当然,也可以加我个人微信(备注:GitHub)。

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

<table>
<tr>
<td align="center" style="width: 200px;">
<a href="https://github.com/doocs">
<img src="./images/qrcode-for-doocs.jpg" style="width: 400px;"><br>
<sub>公众平台</sub>
</a><br>
</td>
<td align="center" style="width: 200px;">
<a href="https://github.com/yanglbme">
<img src="./images/qrcode-for-yanglbme.jpg" style="width: 400px;"><br>
<sub>个人微信</sub>
</a><br>
</td>
</tr>
</table>
<tr>
<td align="center" style="width: 200px;">
<a href="https://github.com/doocs">
<img src="./images/qrcode-for-doocs.jpg" style="width: 400px;"><br>
<sub>公众平台</sub>
</a><br>
</td>
<td align="center" style="width: 200px;">
<a href="https://github.com/yanglbme">
<img src="./images/qrcode-for-yanglbme.jpg" style="width: 400px;"><br>
<sub>个人微信</sub>
</a><br>
</td>
</tr>
</table>

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

![](./images/pdf.png)
5 changes: 4 additions & 1 deletion docs/big-data/count-different-phone-numbers.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
## 如何统计不同电话号码的个数?

### 题目描述

已知某个文件内包含一些电话号码,每个号码为 8 位数字,统计不同号码的个数。

### 解答思路

这道题本质还是求解**数据重复**的问题,对于这类问题,一般首先考虑位图法。

对于本题,8 位电话号码可以表示的号码个数为 10<sup>8</sup> 个,即 1 亿个。我们每个号码用一个 bit 来表示,则总共需要 1 亿个 bit,内存占用约 100M。
Expand All @@ -13,4 +15,5 @@
申请一个位图数组,长度为 1 亿,初始化为 0。然后遍历所有电话号码,把号码对应的位图中的位置置为 1。遍历完成后,如果 bit 为 1,则表示这个电话号码在文件中存在,否则不存在。bit 值为 1 的数量即为 不同电话号码的个数。

### 方法总结
求解数据重复问题,记得考虑位图法。

求解数据重复问题,记得考虑位图法。
8 changes: 6 additions & 2 deletions docs/big-data/find-a-number-if-exists.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
## 如何在大量的数据中判断一个数是否存在?

### 题目描述

给定 40 亿个不重复的没排过序的 unsigned int 型整数,然后再给定一个数,如何快速判断这个数是否在这 40 亿个整数当中?

### 解答思路

#### 方法一:分治法

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

#### 方法二:位图法
40 亿个不重复整数,我们用 40 亿个 bit 来表示,初始位均为 0,那么总共需要内存:4,000,000,000b≈512M。

40 亿个不重复整数,我们用 40 亿个 bit 来表示,初始位均为 0,那么总共需要内存:4, 000, 000, 000b≈512M。

我们读取这 40 亿个整数,将对应的 bit 设置为 1。接着读取要查询的数,查看相应位是否为 1,如果为 1 表示存在,如果为 0 表示不存在。

### 方法总结
**判断数字是否存在、判断数字是否重复的问题**,位图法是一种非常高效的方法。

**判断数字是否存在、判断数字是否重复的问题**,位图法是一种非常高效的方法。
13 changes: 8 additions & 5 deletions docs/big-data/find-common-urls.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
## 如何从大量的 URL 中找出相同的 URL?

### 题目描述

给定 a、b 两个文件,各存放 50 亿个 URL,每个 URL 各占 64B,内存限制是 4G。请找出 a、b 两个文件共同的 URL。

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

> 5,000,000,000 * 64B ≈ 5GB * 64 = 320GB
每个 URL 占 64B,那么 50 亿个 URL 占用的空间大小约为 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,对遍历到的 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 保存到一个单独的文件中。

### 方法总结

1. 分而治之,进行哈希取余;
2. 对每个子文件进行 HashSet 统计。
2. 对每个子文件进行 HashSet 统计。
12 changes: 9 additions & 3 deletions docs/big-data/find-hotest-query-string.md
Original file line number Diff line number Diff line change
@@ -1,32 +1,37 @@
## 如何查询最热门的查询串?

### 题目描述

搜索引擎会通过日志文件把用户每次检索使用的所有查询串都记录下来,每个查询串的长度不超过 255 字节。

假设目前有 1000w 个记录(这些查询串的重复度比较高,虽然总数是 1000w,但如果除去重复后,则不超过 300w 个)。请统计最热门的 10 个查询串,要求使用的内存不能超过 1G。(一个查询串的重复度越高,说明查询它的用户越多,也就越热门。)

### 解答思路

每个查询串最长为 255B,1000w 个串需要占用 约 2.55G 内存,因此,我们无法将所有字符串全部读入到内存中处理。

#### 方法一:分治法

分治法依然是一个非常实用的方法。

划分为多个小文件,保证单个小文件中的字符串能被直接加载到内存中处理,然后求出每个文件中出现次数最多的 10 个字符串;最后通过一个小顶堆统计出所有文件中出现最多的 10 个字符串。

方法可行,但不是最好,下面介绍其他方法。

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

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

**思路如下**:

首先,遍历字符串,若不在 map 中,直接存入 map,value 记为 1;若在 map 中,则把对应的 value 加 1,这一步时间复杂度 `O(N)`。
首先,遍历字符串,若不在 map 中,直接存入 map,value 记为 1;若在 map 中,则把对应的 value 加 1,这一步时间复杂度 `O(N)`

接着遍历 map,构建一个 10 个元素的小顶堆,若遍历到的字符串的出现次数大于堆顶字符串的出现次数,则进行替换,并将堆调整为小顶堆。

遍历结束后,堆中 10 个字符串就是出现次数最多的字符串。这一步时间复杂度 `O(Nlog10)`。
遍历结束后,堆中 10 个字符串就是出现次数最多的字符串。这一步时间复杂度 `O(Nlog10)`

#### 方法三:前缀树法

方法二使用了 HashMap 来统计次数,当这些字符串有大量相同前缀时,可以考虑使用前缀树来统计字符串出现的次数,树的结点保存字符串出现次数,0 表示没有出现。

**思路如下**:
Expand All @@ -36,4 +41,5 @@
最后依然使用小顶堆来对字符串的出现次数进行排序。

### 方法总结

前缀树经常被用来统计字符串的出现次数。它的另外一个大的用途是字符串查找,判断是否有重复的字符串等。
19 changes: 12 additions & 7 deletions docs/big-data/find-mid-value-in-500-millions.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
## 如何从 5 亿个数中找出中位数?

### 题目描述

从 5 亿个数中找出中位数。数据排序后,位置在最中间的数就是中位数。当样本数为奇数时,中位数为 第 `(N+1)/2` 个数;当样本数为偶数时,中位数为 第 `N/2` 个数与第 `1+N/2` 个数的均值。

### 解答思路
如果这道题没有内存大小限制,则可以把所有数读到内存中排序后找出中位数。但是最好的排序算法的时间复杂度都为 `O(NlogN)`。这里使用其他方法。

如果这道题没有内存大小限制,则可以把所有数读到内存中排序后找出中位数。但是最好的排序算法的时间复杂度都为 `O(NlogN)` 。这里使用其他方法。

#### 方法一:双堆法

维护两个堆,一个大顶堆,一个小顶堆。大顶堆中最大的数**小于等于**小顶堆中最小的数;保证这两个堆中的元素个数的差不超过 1。

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

```java
class MedianFinder {

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

Expand All @@ -22,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 @@ -38,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 All @@ -55,6 +58,7 @@ class MedianFinder {
以上这种方法,需要把所有数据都加载到内存中。当数据量很大时,就不能这样了,因此,这种方法**适用于数据量较小的情况**。5 亿个数,每个数字占用 4B,总共需要 2G 内存。如果可用内存不足 2G,就不能使用这种方法了,下面介绍另一种方法。

#### 方法二:分治法

分治法的思想是把一个大的问题逐渐转换为规模较小的问题来求解。

对于这道题,顺序读取这 5 亿个数字,对于读取到的数字 num,如果它对应的二进制中最高位为 1,则把这个数字写到 f1 中,否则写入 f0 中。通过这一步,可以把这 5 亿个数划分为两部分,而且 f0 中的数都大于 f1 中的数(最高位是符号位)。
Expand All @@ -68,4 +72,5 @@ class MedianFinder {
> **注意**,当数据总数为偶数,如果划分后两个文件中的数据有相同个数,那么中位数就是数据较小的文件中的最大值与数据较大的文件中的最小值的平均值。

### 方法总结

分治法,真香!
Loading