update
This commit is contained in:
@@ -314,14 +314,14 @@ final Node<K,V>[] resize() {
|
|||||||
|
|
||||||
### JDK7 和 8 HashMap 有什么区别?
|
### JDK7 和 8 HashMap 有什么区别?
|
||||||
|
|
||||||
* JDK8 实现引入红黑树,优化链表过长的查询效率
|
* JDK8 实现引入红黑树,优化链表过长的查询效率;当链表长度大于8是链表的存储结构会被修改成红黑树的形式, 查询效率从O(N)提升到O(logN)。链表长度小于6时,红黑树的方式退化成链表。
|
||||||
* 1.7 采用头插法,1.8采用尾插法; 解决多线程中出出现链表成环的问题 ; (hashmap本来就是非线程安全的,为啥要在多线程中使用hashmap)
|
* 1.7 采用头插法, 链表插入是从链表头部插入 ; 1.8采用尾插法, 因此在resize的时候仍然保持原来的顺序; 解决并发多线程中出出现链表成环的问题 ; (hashmap本来就是非线程安全的,为啥要在多线程中使用hashmap)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### 链表上使用的头插还是尾插方式?
|
### 链表上使用的头插还是尾插方式?
|
||||||
|
|
||||||
1.7 采用头插法,1.8采用尾插法; 解决多线程中出出现链表成环的问题
|
1.7 采用头插法,1.8采用尾插法; 解决多线程中出出现链表成环的问题, 因此在resize的时候仍然保持原来的顺序
|
||||||
|
|
||||||
|
|
||||||
### 多线程下死循环问题
|
### 多线程下死循环问题
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
#### 大整数乘法
|
#### 大整数乘法
|
||||||
|
|
||||||
如 26542123532213598*345987342245553677884
|
如 `26542123532213598*345987342245553677884`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,40 @@
|
|||||||
# 动态规划DP
|
# 动态规划DP
|
||||||
|
|
||||||
动态规划(英语:Dynamic programming,简称 DP),通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
|
动态规划(英语:Dynamic programming,简称 DP),通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。复杂问题不能分解成几个子问题,而分解成一系列子问题 ;
|
||||||
|
|
||||||
复杂问题不能分解成几个子问题,而分解成一系列子问题;DP通常基于一个递推公式及一个(或多个)初始状态,当前子问题解由上一次子问题解推出。
|
DP通常基于一个递推公式及一个(或多个)初始状态,当前子问题解由上一次子问题解推出。
|
||||||
|
|
||||||
状态
|
|
||||||
状态转移方程
|
|
||||||
递推关系
|
|
||||||
|
|
||||||
动态规划算法的关键在于解决冗余,以空间换时间的技术,需要存储过程中的各种状态。可以看着是`分治算法`+`解决冗余`
|
动态规划算法的关键在于解决冗余,以空间换时间的技术,需要存储过程中的各种状态。可以看着是`分治算法`+`解决冗余`
|
||||||
|
|
||||||
使用动态规划算法的问题的特征是`子问题的重叠性`,否则动态规划算法不具备优势
|
使用动态规划算法的问题的特征是`子问题的重叠性`,否则动态规划算法不具备优势
|
||||||
|
|
||||||
|
|
||||||
|
动态规划的核心思想就是穷举求最值; 动态规划问题的一般形式就是求最值,动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说让你求最长递增子序列呀,最小编辑距离呀等等。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
* 状态
|
||||||
|
* 状态转移方程, 这一步最为困难
|
||||||
|
* 状态压缩
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### DP 解题模板
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
# 初始化 base case
|
||||||
|
dp[0][0][...] = base
|
||||||
|
|
||||||
|
# 进行状态转移
|
||||||
|
for 状态1 in 状态1的所有取值:
|
||||||
|
for 状态2 in 状态2的所有取值:
|
||||||
|
for ...
|
||||||
|
dp[状态1][状态2][...] = 求最值(选择1,选择2...)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
####基本步骤
|
####基本步骤
|
||||||
|
|
||||||
1. 划分问题
|
1. 划分问题
|
||||||
@@ -31,3 +53,13 @@
|
|||||||
* 最短路径
|
* 最短路径
|
||||||
* 0-1 背包问题
|
* 0-1 背包问题
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,23 @@
|
|||||||
回溯法求解问题时,一般是一边建树,一边遍历该树;且采用非递归方法。
|
回溯法求解问题时,一般是一边建树,一边遍历该树;且采用非递归方法。
|
||||||
|
|
||||||
|
|
||||||
|
## 代码框架
|
||||||
|
|
||||||
|
```
|
||||||
|
result = []
|
||||||
|
def backtrack(路径, 选择列表):
|
||||||
|
if 满足结束条件:
|
||||||
|
result.add(路径)
|
||||||
|
return
|
||||||
|
|
||||||
|
for 选择 in 选择列表:
|
||||||
|
做选择
|
||||||
|
backtrack(路径, 选择列表)
|
||||||
|
撤销选择
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 全排列问题
|
## 全排列问题
|
||||||
|
|
||||||
> n 个不重复的数,全排列共有 n! 个
|
> n 个不重复的数,全排列共有 n! 个
|
||||||
|
|||||||
@@ -11,6 +11,10 @@
|
|||||||
> 自顶向下的递归,自底向上是迭代
|
> 自顶向下的递归,自底向上是迭代
|
||||||
|
|
||||||
|
|
||||||
|
递归运行效率较低,因为有函数调用的开销,递归多次也可能造成栈溢出。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 斐波那契数列
|
## 斐波那契数列
|
||||||
|
|
||||||
fib(n)=fib(n-1)+fib(n-2)
|
fib(n)=fib(n-1)+fib(n-2)
|
||||||
@@ -134,5 +138,6 @@ public static LinkedNode mergeSeqLink(LinkedNode l1, LinkedNode l2){
|
|||||||
快速排序
|
快速排序
|
||||||
|
|
||||||
|
|
||||||
递归运行效率较低,因为有函数调用的开销,递归多次也可能造成栈溢出。
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user