Merge pull request #4 from CyC2018/master

update
This commit is contained in:
onefansofworld 2018-04-25 12:13:51 +08:00 committed by GitHub
commit 1a473b45be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 1373 additions and 1083 deletions

View File

@ -2,13 +2,10 @@
| | Ⅱ | Ⅲ | Ⅳ | | Ⅵ | Ⅶ | Ⅷ | Ⅸ | |
| :--------: | :---------: | :---------: | :---------: | :---------: | :---------:| :---------: | :-------: | :-------:| :------:|
| 算法[:pencil2:](#算法-pencil2) | 操作系统[:computer:](#操作系统-computer)|网络[:cloud:](#网络-cloud) | 面向对象[:couple:](#面向对象-couple) |数据库[:floppy_disk:](#数据库-floppy_disk)| Java [:coffee:](#java-coffee)| 分布式[:sweat_drops:](#分布式-sweat_drops)| 工具[:hammer:](#工具-hammer)| 编码实践[:speak_no_evil:](#编码实践-speak_no_evil)| 后记[:memo:](#后记-memo) |
本仓库不参与商业行为,不向读者收取任何费用。(This repository is not engaging in business activities, and does not charge readers any fee.)
</br>
:loudspeaker: 本仓库不参与商业行为,不向读者收取任何费用。
:loudspeaker: This repository is not engaging in business activities, and does not charge readers any fee.
</br></br>
## 算法 :pencil2:

View File

@ -63,15 +63,15 @@
## Web 基础
- HTTPHyperText Transfer Protocol超文本传输协议
- WWWWorld Wide Web的三种技术HTML、HTTP、URL
- HTTPHyperText Transfer Protocol超文本传输协议
- WWWWorld Wide Web的三种技术HTML、HTTP、URL
- RFCRequest for Comments征求修正意见书互联网的设计文档。
## URL
- URIUniform Resource Indentifier统一资源标识符
- URLUniform Resource Locator统一资源定位符
- URNUniform Resource Name统一资源名称例如 urn:isbn:0-486-27557-4
- URNUniform Resource Name统一资源名称例如 urn:isbn:0-486-27557-4。
URI 包含 URL 和 URN目前 WEB 只有 URL 比较流行,所以见到的基本都是 URL。

View File

@ -747,7 +747,6 @@ run..run..run..run..run..run..run..run..run..run..end
```java
public class CyclicBarrierExample {
public static void main(String[] args) throws InterruptedException {
final int totalThread = 10;
CyclicBarrier cyclicBarrier = new CyclicBarrier(totalThread);

File diff suppressed because it is too large Load Diff

View File

@ -36,11 +36,11 @@ InnoDB 是 MySQL 默认的事务型存储引擎,只有在需要 InnoDB 不支
内部做了很多优化,包括从磁盘读取数据时采用的可预测性读、能够自动在内存中创建哈希索引以加速读操作的自适应哈希索引、能够加速插入操作的插入缓冲区等。
通过一些机制和工具支持真正的热备份其它存储引擎不支持热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能也意味着停止读取。
通过一些机制和工具支持真正的热备份其它存储引擎不支持热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能也意味着停止读取。
## MyISAM
提供了大量的特性包括全文索引、压缩表、空间数据索引等。应该注意的是MySQL 5.6.4 添加了对 InnoDB 引擎的全文索引支持。
MyISAM 提供了大量的特性包括全文索引、压缩表、空间数据索引等。应该注意的是MySQL 5.6.4 添加了对 InnoDB 存储引擎的全文索引支持。
不支持事务。
@ -140,7 +140,12 @@ B+Tree 索引是大多数 MySQL 存储引擎的默认索引类型。
InnoDB 引擎有一个特殊的功能叫“自适应哈希索引”,当某个索引值被使用的非常频繁时,会在 B+Tree 索引之上再创建一个哈希索引,这样就让 B+Tree 索引具有哈希索引的一些优点,比如快速的哈希查找。
限制:哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。不过,访问内存中的行的速度很快,所以大部分情况下这一点对性能影响并不明显;无法用于分组与排序;只支持精确查找,无法用于部分查找和范围查找;如果哈希冲突很多,查找速度会变得很慢。
限制:
- 哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。不过,访问内存中的行的速度很快,所以大部分情况下这一点对性能影响并不明显;
- 无法用于分组与排序;
- 只支持精确查找,无法用于部分查找和范围查找;
- 如果哈希冲突很多,查找速度会变得很慢。
### 3. 空间数据索引R-Tree
@ -162,7 +167,7 @@ MyISAM 存储引擎支持全文索引,用于查找文本中的关键词,而
- 帮助服务器避免进行排序和创建临时表B+Tree 索引是有序的,可以用来做 ORDER BY 和 GROUP BY 操作);
- 将随机 I/O 变为顺序 I/OB+Tree 索引是有序的,也就将相的列值都存储在一起)。
- 将随机 I/O 变为顺序 I/OB+Tree 索引是有序的,也就将相的列值都存储在一起)。
## 索引优化

View File

@ -2498,6 +2498,8 @@ public double countProbability(int n, int s) {
## 题目描述
[NowCoder](https://www.nowcoder.com/practice/762836f4d43d43ca9deb273b3de8e1f4?tpId=13&tqId=11198&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking)
五张牌,其中大小鬼为癞子,牌面大小为 0。判断是否能组成顺子。
## 解题思路
@ -2510,11 +2512,9 @@ public boolean isContinuous(int[] nums) {
for (int num : nums) if (num == 0) cnt++;
for (int i = cnt; i < nums.length - 1; i++) {
if (nums[i + 1] == nums[i]) return false;
int interval = nums[i + 1] - nums[i] - 1;
if (interval > cnt) return false;
cnt -= interval;
cnt -= nums[i + 1] - nums[i] - 1;
}
return true;
return cnt >= 0;
}
```
@ -2522,6 +2522,8 @@ public boolean isContinuous(int[] nums) {
## 题目描述
[NowCoder](https://www.nowcoder.com/practice/f78a359491e64a50bce2d89cff857eb6?tpId=13&tqId=11199&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking)
让小朋友们围成一个大圈。然后,他随机指定一个数 m让编号为 0 的小朋友开始报数。每次喊到 m-1 的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续 0...m-1 报数 .... 这样下去 .... 直到剩下最后一个小朋友,可以不用表演。
## 解题思路
@ -2540,6 +2542,8 @@ public int LastRemaining_Solution(int n, int m) {
## 题目描述
[Leetcode](https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/)
可以有一次买入和一次卖出,买入必须在前。求最大收益。
## 解题思路
@ -2548,15 +2552,15 @@ public int LastRemaining_Solution(int n, int m) {
```java
public int maxProfit(int[] prices) {
if (prices == null || prices.length == 0) return 0;
int n = prices.length;
if(n == 0) return 0;
int soFarMin = prices[0];
int max = 0;
for(int i = 1; i < n; i++) {
if(soFarMin > prices[i]) soFarMin = prices[i];
else max = Math.max(max, prices[i] - soFarMin);
int maxProfit = 0;
for (int i = 1; i < n; i++) {
soFarMin = Math.min(soFarMin, prices[i]);
maxProfit = Math.max(maxProfit, prices[i] - soFarMin);
}
return max;
return maxProfit;
}
```
@ -2564,10 +2568,18 @@ public int maxProfit(int[] prices) {
## 题目描述
[NowCoder](https://www.nowcoder.com/practice/7a0da8fc483247ff8800059e12d7caf1?tpId=13&tqId=11200&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking)
求 1+2+3+...+n要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句A?B:C
## 解题思路
使用递归解法最重要的是指定返回条件,但是本题无法直接使用 if 语句来指定返回条件。
条件与 && 具有短路原则,即在第一个条件语句为 false 的情况下不会去执行第二个条件语句。利用这一特性,将递归的返回条件取非然后作为 && 的第一个条件语句,递归的主体转换为第二个条件语句,那么当递归的返回条件为 true 的情况下就不会执行递归的主体部分,递归返回。
以下实现中,递归的返回条件为 n <= 0取非后就是 n > 0递归的主体部分为 sum += Sum_Solution(n - 1),转换为条件语句后就是 (sum += Sum_Solution(n - 1)) > 0。
```java
public int Sum_Solution(int n) {
int sum = n;
@ -2578,6 +2590,12 @@ public int Sum_Solution(int n) {
# 65. 不用加减乘除做加法
## 题目描述
[NowCoder](https://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215?tpId=13&tqId=11201&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking)
写一个函数,求两个整数之和,要求在函数体内不得使用 +、-、\*、/ 四则运算符号。
## 解题思路
a ^ b 表示没有考虑进位的情况下两数的和,(a & b) << 1 就是进位
@ -2585,9 +2603,8 @@ a ^ b 表示没有考虑进位的情况下两数的和,(a & b) << 1 就是进
递归会终止的原因是 (a & b) << 1 最右边会多一个 0那么继续递归进位最右边的 0 会慢慢增多最后进位会变为 0递归终止
```java
public int Add(int num1, int num2) {
if(num2 == 0) return num1;
return Add(num1 ^ num2, (num1 & num2) << 1);
public int Add(int num1,int num2) {
return num2 == 0 ? num1 : Add(num1 ^ num2, (num1 & num2) << 1);
}
```
@ -2595,6 +2612,8 @@ public int Add(int num1, int num2) {
## 题目描述
[NowCoder](https://www.nowcoder.com/practice/94a4d381a68b47b7a8bed86f2975db46?tpId=13&tqId=11204&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking)
给定一个数组 A[0, 1,..., n-1], 请构建一个数组 B[0, 1,..., n-1], 其中 B 中的元素 B[i]=A[0]\*A[1]\*...\*A[i-1]\*A[i+1]\*...\*A[n-1]。不能使用除法。
## 解题思路
@ -2615,6 +2634,22 @@ public int[] multiply(int[] A) {
# 67. 把字符串转换成整数
## 题目描述
[NowCoder](https://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26e?tpId=13&tqId=11202&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking)
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0。
```html
Iuput:
+2147483647
1a33
Output:
2147483647
0
```
## 解题思路
```java
@ -2640,12 +2675,15 @@ public int StrToInt(String str) {
<div align="center"> <img src="../pics//293d2af9-de1d-403e-bed0-85d029383528.png" width="300"/> </div><br>
[Leetcode : 235. Lowest Common Ancestor of a Binary Search Tree](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/)
二叉查找树中,两个节点 p, q 的公共祖先 root 满足 p.val <= root.val && root.val <= q.val只要找到满足这个条件的最低层节点即可。换句话说应该先考虑子树的解而不是根节点的解二叉树的后序遍历操作满足这个特性。在本题中我们可以利用后序遍历的特性先在左右子树中查找解最后再考虑根节点的解。
```java
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q);
if(root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q);
if (root == null) return root;
if (root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q);
if (root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q);
return root;
}
```
@ -2654,6 +2692,8 @@ public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
<div align="center"> <img src="../pics//37a72755-4890-4b42-9eab-b0084e0c54d9.png" width="300"/> </div><br>
[Leetcode : 236. Lowest Common Ancestor of a Binary Tree](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/)
在左右子树中查找两个节点的最低公共祖先,如果在其中一颗子树中查找到,那么就返回这个解,否则可以认为根节点就是最低公共祖先。
```java

View File

@ -235,7 +235,7 @@ lock-x(A)...lock-s(B)...lock-s(C)...unlock(A)...unlock(C)...unlock(B)
但不是必要条件,例如以下操作不满足两段锁协议,但是它还是可串行化调度。
```html
lock-x(A)...unlock(A)...lock-s(B)...unlock(B)...lock-s(C)...unlock(C)...
lock-x(A)...unlock(A)...lock-s(B)...unlock(B)...lock-s(C)...unlock(C)
```
# 四、隔离级别
@ -318,7 +318,7 @@ InnoDB 的 MVCC 使用到的快照存储在 Undo 日志中,该日志通过回
读取快照中的数据,可以减少加锁所带来的开销。
```sql
select * from table ....;
select * from table ...;
```
### 2. 当前读
@ -428,15 +428,13 @@ SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE;
以上学生课程关系中,{Sno, Cname} 为键码,有如下函数依赖:
- Sno, Cname -> Sname, Sdept, Mname
- Sno -> Sname, Sdept
- Sdept -> Mname
- Sno -> Mname
- Sno, Cname-> Grade
Grade 完全函数依赖于键码,它没有任何冗余数据,每个学生的每门课都有特定的成绩。
Sname, Sdept 和 Mname 都函数依赖于 Sno而部分依赖于键码。当一个学生选修了多门课时,这些数据就会出现多次,造成大量冗余数据。
Sname, Sdept 和 Mname 都部分依赖于键码,当一个学生选修了多门课时,这些数据就会出现多次,造成大量冗余数据。
<font size=4> **分解后** </font><br>

View File

@ -61,19 +61,19 @@
网络把主机连接起来,而互联网是把多种不同的网络连接起来,因此互联网是网络的网络。
<div align="center"> <img src="../pics//network-of-networks.gif"/> </div><br>
<div align="center"> <img src="../pics//network-of-networks.gif" width=""/> </div><br>
## ISP
互联网服务提供商 ISP 可以从互联网管理机构获得许多 IP 地址,同时拥有通信线路以及路由器等联网设备,个人或机构向 ISP 缴纳一定的费用就可以接入互联网。
<div align="center"> <img src="../pics//46cec213-3048-4a80-aded-fdd577542801.jpg"/> </div><br>
<div align="center"> <img src="../pics//46cec213-3048-4a80-aded-fdd577542801.jpg" width=""/> </div><br>
目前的互联网是一种多层次 ISP 结构ISP 根据覆盖面积的大小分为主干 ISP、地区 ISP 和本地 ISP。
目前的互联网是一种多层次 ISP 结构ISP 根据覆盖面积的大小分为第一层 ISP、区域 ISP 和接入 ISP。
互联网交换点 IXP 允许两个 ISP 直接相连而不用经过第三个 ISP。
<div align="center"> <img src="../pics//Technology-ComputerNetworking-Internet-ISPs.png"/> </div><br>
<div align="center"> <img src="../pics//Technology-ComputerNetworking-Internet-ISPs.png" width=""/> </div><br>
## 主机之间的通信方式
@ -82,11 +82,11 @@
2. 对等P2P不区分客户和服务器。
<div align="center"> <img src="../pics//2ad244f5-939c-49fa-9385-69bc688677ab.jpg"/> </div><br>
<div align="center"> <img src="../pics//2ad244f5-939c-49fa-9385-69bc688677ab.jpg" width=""/> </div><br>
## 电路交换与分组交换
<div align="center"> <img src="../pics//5e8d3c04-d93b-48a7-875e-41ababed00e0.jpg"/> </div><br>
<div align="center"> <img src="../pics//5e8d3c04-d93b-48a7-875e-41ababed00e0.jpg" width=""/> </div><br>
(以上分别为:电路交换、报文交换以及分组交换)
@ -140,14 +140,7 @@
<div align="center"> <img src="../pics//426df589-6f97-4622-b74d-4a81fcb1da8e.png" width="800"/> </div><br>
### 1. 七层协议
如图 a 所示,其中表示层和会话层用途如下:
1. 表示层:信息的语法、语义以及它们的关联,如加密解密、转换翻译、压缩解压缩;
2. 会话层:不同机器上的用户之间建立及管理会话。
### 2. 五层协议
### 1. 五层协议
1. 应用层:为特定应用程序提供数据传输服务,例如 HTTP、DNS 等。数据单位为报文。
@ -159,6 +152,15 @@
5. 物理层:考虑的是怎样在传输媒体上传输数据比特流,而不是指具体的传输媒体。物理层的作用是尽可能屏蔽传输媒体和通信手段的差异,使数据链路层感觉不到这些差异。
### 2. 七层协议
其中表示层和会话层用途如下:
1. 表示层:数据压缩、加密以及数据描述。这使得应用程序不必担心在各台主机中表示/存储的内部格式不同的问题。
2. 会话层:建立及管理会话。
五层协议没有表示层和会话层,而是将这些功能留给应用程序开发者处理。
### 3. 数据在各层之间的传递过程
在向下的过程中,需要添加下层协议所需要的首部或者尾部,而在向上的过程中不断拆开首部和尾部。