update
This commit is contained in:
@@ -314,14 +314,14 @@ final Node<K,V>[] resize() {
|
||||
|
||||
### JDK7 和 8 HashMap 有什么区别?
|
||||
|
||||
* JDK8 实现引入红黑树,优化链表过长的查询效率
|
||||
* 1.7 采用头插法,1.8采用尾插法; 解决多线程中出出现链表成环的问题 ; (hashmap本来就是非线程安全的,为啥要在多线程中使用hashmap)
|
||||
* JDK8 实现引入红黑树,优化链表过长的查询效率;当链表长度大于8是链表的存储结构会被修改成红黑树的形式, 查询效率从O(N)提升到O(logN)。链表长度小于6时,红黑树的方式退化成链表。
|
||||
* 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
|
||||
|
||||
动态规划(英语: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. 划分问题
|
||||
@@ -31,3 +53,13 @@
|
||||
* 最短路径
|
||||
* 0-1 背包问题
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -13,6 +13,23 @@
|
||||
回溯法求解问题时,一般是一边建树,一边遍历该树;且采用非递归方法。
|
||||
|
||||
|
||||
## 代码框架
|
||||
|
||||
```
|
||||
result = []
|
||||
def backtrack(路径, 选择列表):
|
||||
if 满足结束条件:
|
||||
result.add(路径)
|
||||
return
|
||||
|
||||
for 选择 in 选择列表:
|
||||
做选择
|
||||
backtrack(路径, 选择列表)
|
||||
撤销选择
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 全排列问题
|
||||
|
||||
> n 个不重复的数,全排列共有 n! 个
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
> 自顶向下的递归,自底向上是迭代
|
||||
|
||||
|
||||
递归运行效率较低,因为有函数调用的开销,递归多次也可能造成栈溢出。
|
||||
|
||||
|
||||
|
||||
## 斐波那契数列
|
||||
|
||||
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