Merge pull request #1 from CyC2018/master

常规更新主仓库最新更新
This commit is contained in:
Wenxiang Gao 2019-09-24 16:09:53 +08:00 committed by GitHub
commit 424c9d9d82
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 26 additions and 37 deletions

View File

@ -56,7 +56,7 @@
- HashMap基于哈希表实现
- HashTable HashMap 类似但它是线程安全的这意味着同一时刻多个线程可以同时写入 HashTable 并且不会导致数据不一致它是遗留类不应该去使用它现在可以使用 ConcurrentHashMap 来支持线程安全并且 ConcurrentHashMap 的效率会更高因为 ConcurrentHashMap 引入了分段锁
- Hashtable HashMap 类似但它是线程安全的这意味着同一时刻多个线程可以同时写入 Hashtable 并且不会导致数据不一致它是遗留类不应该去使用它现在可以使用 ConcurrentHashMap 来支持线程安全并且 ConcurrentHashMap 的效率会更高因为 ConcurrentHashMap 引入了分段锁
- LinkedHashMap使用双向链表来维护元素的顺序顺序为插入顺序或者最近最少使用LRU顺序
@ -810,9 +810,9 @@ static final int tableSizeFor(int cap) {
JDK 1.8 开始一个桶存储的链表长度大于等于 8 时会将链表转换为红黑树
### 9. HashTable 的比较
### 9. Hashtable 的比较
- HashTable 使用 synchronized 来进行同步
- Hashtable 使用 synchronized 来进行同步
- HashMap 可以插入键为 null Entry
- HashMap 的迭代器是 fail-fast 迭代器
- HashMap 不能保证随着时间的推移 Map 中的元素次序是不变的

View File

@ -134,7 +134,7 @@ private int rob(int[] nums, int first, int last) {
定义一个数组 dp 存储错误方式数量dp[i] 表示前 i 个信和信封的错误方式数量假设第 i 个信装到第 j 个信封里面而第 j 个信装到第 k 个信封里面根据 i k 是否相等有两种情况
- i==k交换 i k 的信后它们的信和信封在正确的位置但是其余 i-2 封信有 dp[i-2] 种错误装信的方式由于 j i-1 种取值因此共有 (i-1)\*dp[i-2] 种错误装信方式
- i==k交换 i j 的信后它们的信和信封在正确的位置但是其余 i-2 封信有 dp[i-2] 种错误装信的方式由于 j i-1 种取值因此共有 (i-1)\*dp[i-2] 种错误装信方式
- i != k交换 i j 的信后 i 个信和信封在正确的位置其余 i-1 封信有 dp[i-1] 种错误装信方式由于 j i-1 种取值因此共有 (i-1)\*dp[i-1] 种错误装信方式
综上所述错误装信数量方式数量为
@ -869,22 +869,18 @@ return -1.
```java
public int coinChange(int[] coins, int amount) {
if (amount == 0 || coins == null || coins.length == 0) {
public int change(int amount, int[] coins) {
if (coins == null) {
return 0;
}
int[] dp = new int[amount + 1];
dp[0] = 1;
for (int coin : coins) {
for (int i = coin; i <= amount; i++) { //将逆序遍历改为正序遍历
if (i == coin) {
dp[i] = 1;
} else if (dp[i] == 0 && dp[i - coin] != 0) {
dp[i] = dp[i - coin] + 1;
} else if (dp[i - coin] != 0) {
dp[i] = Math.min(dp[i], dp[i - coin] + 1);
}
for (int i = coin; i <= amount; i++) {
dp[i] += dp[i - coin];
}
}
return dp[amount] == 0 ? -1 : dp[amount];
return dp[amount];
}
```
@ -906,9 +902,6 @@ Explanation: there are four ways to make up the amount:
```java
public int change(int amount, int[] coins) {
if (amount == 0 || coins == null || coins.length == 0) {
return 0;
}
int[] dp = new int[amount + 1];
dp[0] = 1;
for (int coin : coins) {

View File

@ -316,7 +316,7 @@ SELECT ... FOR UPDATE;
MVCC 在每行记录后面都保存着两个隐藏的列用来存储两个版本号
- 创建版本号指示创建一个数据行的快照时的系统版本号
- 删除版本号如果该快照的删除版本号大于当前事务版本号表示该快照有效否则表示该快照已经被删除了
- 删除版本号如果该快照的删除版本未定义或删除版本号大于当前事务版本号表示该快照有效
## Undo 日志
@ -392,14 +392,14 @@ SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE;
## Next-Key Locks
它是 Record Locks Gap Locks 的结合不仅锁定一个记录上的索引也锁定索引之间的间隙例如一个索引包含以下值10, 11, 13, and 20那么就需要锁定以下区间
它是 Record Locks Gap Locks 的结合不仅锁定一个记录上的索引也锁定索引之间的间隙是一个前开后闭区间例如一个索引包含以下值10, 11, 13, and 20那么就需要锁定以下区间
```sql
(-, 10]
(10, 11]
(11, 13]
(13, 20]
(20, +)
(20, +supremum)
```
# 关系数据库设计理论

View File

@ -56,7 +56,7 @@
- HashMap基于哈希表实现
- HashTable HashMap 类似但它是线程安全的这意味着同一时刻多个线程可以同时写入 HashTable 并且不会导致数据不一致它是遗留类不应该去使用它现在可以使用 ConcurrentHashMap 来支持线程安全并且 ConcurrentHashMap 的效率会更高因为 ConcurrentHashMap 引入了分段锁
- Hashtable HashMap 类似但它是线程安全的这意味着同一时刻多个线程可以同时写入 Hashtable 并且不会导致数据不一致它是遗留类不应该去使用它现在可以使用 ConcurrentHashMap 来支持线程安全并且 ConcurrentHashMap 的效率会更高因为 ConcurrentHashMap 引入了分段锁
- LinkedHashMap使用双向链表来维护元素的顺序顺序为插入顺序或者最近最少使用LRU顺序
@ -810,9 +810,9 @@ static final int tableSizeFor(int cap) {
JDK 1.8 开始一个桶存储的链表长度大于等于 8 时会将链表转换为红黑树
### 9. HashTable 的比较
### 9. Hashtable 的比较
- HashTable 使用 synchronized 来进行同步
- Hashtable 使用 synchronized 来进行同步
- HashMap 可以插入键为 null Entry
- HashMap 的迭代器是 fail-fast 迭代器
- HashMap 不能保证随着时间的推移 Map 中的元素次序是不变的

View File

@ -134,7 +134,7 @@ private int rob(int[] nums, int first, int last) {
定义一个数组 dp 存储错误方式数量dp[i] 表示前 i 个信和信封的错误方式数量假设第 i 个信装到第 j 个信封里面而第 j 个信装到第 k 个信封里面根据 i k 是否相等有两种情况
- i==k交换 i k 的信后它们的信和信封在正确的位置但是其余 i-2 封信有 dp[i-2] 种错误装信的方式由于 j i-1 种取值因此共有 (i-1)\*dp[i-2] 种错误装信方式
- i==k交换 i j 的信后它们的信和信封在正确的位置但是其余 i-2 封信有 dp[i-2] 种错误装信的方式由于 j i-1 种取值因此共有 (i-1)\*dp[i-2] 种错误装信方式
- i != k交换 i j 的信后 i 个信和信封在正确的位置其余 i-1 封信有 dp[i-1] 种错误装信方式由于 j i-1 种取值因此共有 (i-1)\*dp[i-1] 种错误装信方式
综上所述错误装信数量方式数量为
@ -869,22 +869,18 @@ return -1.
```java
public int coinChange(int[] coins, int amount) {
if (amount == 0 || coins == null || coins.length == 0) {
public int change(int amount, int[] coins) {
if (coins == null) {
return 0;
}
int[] dp = new int[amount + 1];
dp[0] = 1;
for (int coin : coins) {
for (int i = coin; i <= amount; i++) { //将逆序遍历改为正序遍历
if (i == coin) {
dp[i] = 1;
} else if (dp[i] == 0 && dp[i - coin] != 0) {
dp[i] = dp[i - coin] + 1;
} else if (dp[i - coin] != 0) {
dp[i] = Math.min(dp[i], dp[i - coin] + 1);
}
for (int i = coin; i <= amount; i++) {
dp[i] += dp[i - coin];
}
}
return dp[amount] == 0 ? -1 : dp[amount];
return dp[amount];
}
```

View File

@ -316,7 +316,7 @@ SELECT ... FOR UPDATE;
MVCC 在每行记录后面都保存着两个隐藏的列用来存储两个版本号
- 创建版本号指示创建一个数据行的快照时的系统版本号
- 删除版本号如果该快照的删除版本号大于当前事务版本号表示该快照有效否则表示该快照已经被删除了
- 删除版本号如果该快照的删除版本未定义或删除版本号大于当前事务版本号表示该快照有效
## Undo 日志
@ -392,14 +392,14 @@ SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE;
## Next-Key Locks
它是 Record Locks Gap Locks 的结合不仅锁定一个记录上的索引也锁定索引之间的间隙例如一个索引包含以下值10, 11, 13, and 20那么就需要锁定以下区间
它是 Record Locks Gap Locks 的结合不仅锁定一个记录上的索引也锁定索引之间的间隙是一个前开后闭区间例如一个索引包含以下值10, 11, 13, and 20那么就需要锁定以下区间
```sql
(-, 10]
(10, 11]
(11, 13]
(13, 20]
(20, +)
(20, +supremum)
```
# 关系数据库设计理论